@datamoc/mw_games 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -18
- package/dist/actors/Appearances.js +1 -1
- package/dist/actors/Resource.d.ts.map +1 -1
- package/dist/actors/Resource.js +13 -5
- package/dist/actors/Resource.js.map +1 -1
- package/dist/actors/craft.d.ts.map +1 -1
- package/dist/actors/craft.js +6 -2
- package/dist/actors/craft.js.map +1 -1
- package/dist/assets/index.d.ts +1 -1
- package/dist/battle/Party.d.ts.map +1 -1
- package/dist/battle/Party.js +2 -0
- package/dist/battle/Party.js.map +1 -1
- package/dist/board/Classics.d.ts.map +1 -1
- package/dist/board/Classics.js +14 -6
- package/dist/board/Classics.js.map +1 -1
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +12 -6
- package/dist/board/Tactics.js.map +1 -1
- package/dist/core/Game.d.ts +16 -1
- package/dist/core/Game.d.ts.map +1 -1
- package/dist/core/Game.js +7 -5
- package/dist/core/Game.js.map +1 -1
- package/dist/core/Input.d.ts +1 -1
- package/dist/core/Random.d.ts +2 -2
- package/dist/core/Random.js +2 -2
- package/dist/core/Session.d.ts +21 -0
- package/dist/core/Session.d.ts.map +1 -0
- package/dist/core/Session.js +11 -0
- package/dist/core/Session.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/mw_games.global.js +6 -6
- package/dist/render/Camera.d.ts +3 -2
- package/dist/render/Camera.d.ts.map +1 -1
- package/dist/render/Camera.js +19 -13
- package/dist/render/Camera.js.map +1 -1
- package/dist/render/ColorTransformBatcher.d.ts +9 -0
- package/dist/render/ColorTransformBatcher.d.ts.map +1 -1
- package/dist/render/ColorTransformBatcher.js +131 -19
- package/dist/render/ColorTransformBatcher.js.map +1 -1
- package/dist/render/TileMap.d.ts +2 -2
- package/dist/render/TileMap.d.ts.map +1 -1
- package/dist/render/TileMap.js +12 -12
- package/dist/render/TileMap.js.map +1 -1
- package/dist/render/TintedSprite.d.ts +1 -8
- package/dist/render/TintedSprite.d.ts.map +1 -1
- package/dist/render/TintedSprite.js +3 -111
- package/dist/render/TintedSprite.js.map +1 -1
- package/dist/roguelike/FieldOfView.d.ts +1 -1
- package/dist/roguelike/Level.d.ts +2 -2
- package/dist/roguelike/Level.d.ts.map +1 -1
- package/dist/roguelike/Level.js +1 -1
- package/dist/roguelike/Level.js.map +1 -1
- package/dist/roguelike/Pathfinder.d.ts +3 -3
- package/dist/roguelike/Pathfinder.js +2 -2
- package/dist/roguelike/Scheduler.d.ts +1 -1
- package/dist/roguelike/Scheduler.js +1 -1
- package/dist/roguelike/generate.d.ts +3 -3
- package/dist/roguelike/generate.js +1 -1
- package/dist/roguelike/generate.js.map +1 -1
- package/dist/stage/DialogueStage.d.ts +1 -1
- package/dist/stage/DialogueStage.d.ts.map +1 -1
- package/dist/stage/DialogueStage.js +14 -8
- package/dist/stage/DialogueStage.js.map +1 -1
- package/dist/stage/script.d.ts +3 -3
- package/dist/stage/script.js +2 -2
- package/dist/ui/Label.d.ts +1 -1
- package/dist/ui/Label.js +1 -1
- package/dist/ui/ListView.d.ts +1 -1
- package/dist/ui/ListView.js +1 -1
- package/dist/ui/MessageBox.d.ts +1 -1
- package/dist/ui/MessageBox.js +1 -1
- package/package.json +1 -1
package/dist/mw_games.global.js
CHANGED
|
@@ -963,7 +963,7 @@ ${n}`);throw n instanceof Error&&n.stack&&(u.stack=n.stack),u}}};OC.defaultOptio
|
|
|
963
963
|
};
|
|
964
964
|
|
|
965
965
|
})();
|
|
966
|
-
`,rw=null,iw=class{constructor(){rw||=URL.createObjectURL(new Blob([nw],{type:`application/javascript`})),this.worker=new Worker(rw)}};iw.revokeObjectURL=function(){rw&&=(URL.revokeObjectURL(rw),null)};var aw=0,ow,sw=new class{constructor(){this._initialized=!1,this._createdWorkers=0,this._workerPool=[],this._queue=[],this._resolveHash={}}isImageBitmapSupported(){return this._isImageBitmapSupported===void 0&&(this._isImageBitmapSupported=new Promise(e=>{let{worker:t}=new tw;t.addEventListener(`message`,n=>{t.terminate(),tw.revokeObjectURL(),e(n.data)})})),this._isImageBitmapSupported}loadImageBitmap(e,t){return this._run(`loadImageBitmap`,[e,t?.data?.alphaMode])}async _initWorkers(){this._initialized||=!0}_getWorker(){ow===void 0&&(ow=navigator.hardwareConcurrency||4);let e=this._workerPool.pop();return!e&&this._createdWorkers<ow&&(this._createdWorkers++,e=new iw().worker,e.addEventListener(`message`,e=>{this._complete(e.data),this._returnWorker(e.target),this._next()})),e}_returnWorker(e){this._workerPool.push(e)}_complete(e){this._resolveHash[e.uuid]&&(e.error===void 0?this._resolveHash[e.uuid].resolve(e.data):this._resolveHash[e.uuid].reject(e.error),delete this._resolveHash[e.uuid])}async _run(e,t){await this._initWorkers();let n=new Promise((n,r)=>{this._queue.push({id:e,arguments:t,resolve:n,reject:r})});return this._next(),n}_next(){if(!this._queue.length)return;let e=this._getWorker();if(!e)return;let t=this._queue.pop(),n=t.id;this._resolveHash[aw]={resolve:t.resolve,reject:t.reject},e.postMessage({data:t.arguments,uuid:aw++,id:n})}reset(){this._workerPool.forEach(e=>e.terminate()),this._workerPool.length=0,Object.values(this._resolveHash).forEach(({reject:e})=>{e?.(Error(`WorkerManager has been reset before completion`))}),this._resolveHash={},this._queue.length=0,this._initialized=!1,this._createdWorkers=0}};J(),g(),aa(),li();var cw=[`.jpeg`,`.jpg`,`.png`,`.webp`,`.avif`],lw=[`image/jpeg`,`image/png`,`image/webp`,`image/avif`];async function uw(e,t){let n=await q.get().fetch(e);if(!n.ok)throw Error(`[loadImageBitmap] Failed to fetch ${e}: ${n.status} ${n.statusText}`);let r=await n.blob();return t?.data?.alphaMode===`premultiplied-alpha`?createImageBitmap(r,{premultiplyAlpha:`none`}):createImageBitmap(r)}var dw={name:`loadTextures`,id:`texture`,extension:{type:f.LoadParser,priority:ci.High,name:`loadTextures`},config:{preferWorkers:!0,preferCreateImageBitmap:!0,crossOrigin:`anonymous`},test(e){return AC(e,lw)||jC(e,cw)},async load(e,t,n){let r=null;return r=globalThis.createImageBitmap&&this.config.preferCreateImageBitmap?this.config.preferWorkers&&await sw.isImageBitmapSupported()?await sw.loadImageBitmap(e,t):await uw(e,t):await new Promise((t,n)=>{r=q.get().createImage(),r.crossOrigin=this.config.crossOrigin,r.src=e,r.complete?t(r):(r.onload=()=>{t(r)},r.onerror=n)}),qC(new ia({resource:r,alphaMode:`premultiply-alpha-on-upload`,resolution:t.data?.resolution||KC(e),...t.data}),n,e)},unload(e){e.destroy(!0)}};g(),da(),ca();var fw=[`.mp4`,`.m4v`,`.webm`,`.ogg`,`.ogv`,`.h264`,`.avi`,`.mov`],pw,mw;function hw(e,t,n){n===void 0&&!t.startsWith(`data:`)?e.crossOrigin=_w(t):n!==!1&&(e.crossOrigin=typeof n==`string`?n:`anonymous`)}function gw(e){return new Promise((t,n)=>{e.addEventListener(`canplaythrough`,r),e.addEventListener(`error`,i),e.load();function r(){a(),t()}function i(e){a(),n(e)}function a(){e.removeEventListener(`canplaythrough`,r),e.removeEventListener(`error`,i)}})}function _w(e,t=globalThis.location){if(e.startsWith(`data:`))return``;t||=globalThis.location;let n=new URL(e,document.baseURI);return n.hostname!==t.hostname||n.port!==t.port||n.protocol!==t.protocol?`anonymous`:``}function vw(){let e=[],t=[];for(let n of fw){let r=ua.MIME_TYPES[n.substring(1)]||`video/${n.substring(1)}`;CC(r)&&(e.push(n),t.includes(r)||t.push(r))}return{validVideoExtensions:e,validVideoMime:t}}var yw={name:`loadVideo`,id:`video`,extension:{type:f.LoadParser,name:`loadVideo`},test(e){if(!pw||!mw){let{validVideoExtensions:e,validVideoMime:t}=vw();pw=e,mw=t}let t=AC(e,mw),n=jC(e,pw);return t||n},async load(e,t,n){let r={...ua.defaultOptions,resolution:t.data?.resolution||KC(e),alphaMode:t.data?.alphaMode||await oa(),...t.data},i=document.createElement(`video`),a={preload:r.autoLoad===!1?void 0:`auto`,"webkit-playsinline":r.playsinline===!1?void 0:``,playsinline:r.playsinline===!1?void 0:``,muted:r.muted===!0?``:void 0,loop:r.loop===!0?``:void 0,autoplay:r.autoPlay===!1?void 0:``};Object.keys(a).forEach(e=>{let t=a[e];t!==void 0&&i.setAttribute(e,t)}),r.muted===!0&&(i.muted=!0),hw(i,e,r.crossorigin);let o=document.createElement(`source`),s;if(r.mime)s=r.mime;else if(e.startsWith(`data:`))s=e.slice(5,e.indexOf(`;`));else if(!e.startsWith(`blob:`)){let t=e.split(`?`)[0].slice(e.lastIndexOf(`.`)+1).toLowerCase();s=ua.MIME_TYPES[t]||`video/${t}`}return o.src=e,s&&(o.type=s),new Promise((a,s)=>{r.preload&&!r.autoPlay&&i.load(),i.addEventListener(`canplay`,c),i.addEventListener(`error`,l),o.addEventListener(`error`,l),i.appendChild(o);async function c(){let o=new ua({...r,resource:i});u(),t.data.preload&&await gw(i),a(qC(o,n,e))}function l(e){u(),s(e)}function u(){i.removeEventListener(`canplay`,c),i.removeEventListener(`error`,l),o.removeEventListener(`error`,l)}})},unload(e){e.destroy(!0)}};g(),ki();var bw={extension:{type:f.ResolveParser,name:`resolveTexture`},test:dw.test,parse:e=>({resolution:parseFloat(Oi.RETINA_PREFIX.exec(e)?.[1]??`1`),format:e.split(`.`).pop(),src:e})};g(),ki();var xw={extension:{type:f.ResolveParser,priority:-2,name:`resolveJson`},test:e=>Oi.RETINA_PREFIX.test(e)&&e.endsWith(`.json`),parse:bw.parse};g(),V(),pa(),ki(),xi(),Ei();var Sw=new class{constructor(){this._detections=[],this._initialized=!1,this.resolver=new Oi,this.loader=new kC,this.cache=Y,this._backgroundLoader=new gC(this.loader),this._backgroundLoader.active=!0,this.reset()}async init(e={}){if(this._initialized){B(`[Assets]AssetManager already initialized, did you load before calling this Assets.init()?`);return}if(this._initialized=!0,e.defaultSearchParams&&this.resolver.setDefaultSearchParams(e.defaultSearchParams),e.basePath&&(this.resolver.basePath=e.basePath),e.bundleIdentifier&&this.resolver.setBundleIdentifier(e.bundleIdentifier),e.manifest){let t=e.manifest;typeof t==`string`&&(t=await this.load(t)),this.resolver.addManifest(t)}let t=e.texturePreference?.resolution??1,n=typeof t==`number`?[t]:t,r=await this._detectFormats({preferredFormats:e.texturePreference?.format,skipDetections:e.skipDetections,detections:this._detections});this.resolver.prefer({params:{format:r,resolution:n}}),e.preferences&&this.setPreferences(e.preferences),e.loadOptions&&(this.loader.loadOptions={...this.loader.loadOptions,...e.loadOptions})}add(e){this.resolver.add(e)}async load(e,t){this._initialized||await this.init();let n=Ti(e),r=bi(e).map(e=>{if(typeof e!=`string`){let t=this.resolver.getAlias(e);return t.some(e=>!this.resolver.hasKey(e))&&this.add(e),Array.isArray(t)?t[0]:t}return this.resolver.hasKey(e)||this.add({alias:e,src:e}),e}),i=this.resolver.resolve(r),a=await this._mapLoadToResolve(i,t);return n?a[r[0]]:a}addBundle(e,t){this.resolver.addBundle(e,t)}async loadBundle(e,t){this._initialized||await this.init();let n=!1;typeof e==`string`&&(n=!0,e=[e]);let r=this.resolver.resolveBundle(e),i={},a=Object.keys(r),o=0,s=[],c=()=>{t?.(s.reduce((e,t)=>e+t,0)/o)},l=a.map((e,t)=>{let n=r[e],a=Object.values(n),l=[...new Set(a.flat())].reduce((e,t)=>e+(t.progressSize||1),0);return s.push(0),o+=l,this._mapLoadToResolve(n,e=>{s[t]=e*l,c()}).then(t=>{i[e]=t})});return await Promise.all(l),n?i[e[0]]:i}async backgroundLoad(e){this._initialized||await this.init(),typeof e==`string`&&(e=[e]);let t=this.resolver.resolve(e);this._backgroundLoader.add(Object.values(t))}async backgroundLoadBundle(e){this._initialized||await this.init(),typeof e==`string`&&(e=[e]);let t=this.resolver.resolveBundle(e);Object.values(t).forEach(e=>{this._backgroundLoader.add(Object.values(e))})}reset(){this.resolver.reset(),this.loader.reset(),this.cache.reset(),this._initialized=!1}get(e){if(typeof e==`string`)return Y.get(e);let t={};for(let n=0;n<e.length;n++)t[n]=Y.get(e[n]);return t}async _mapLoadToResolve(e,t){let n=[...new Set(Object.values(e))];this._backgroundLoader.active=!1;let r=await this.loader.load(n,t);this._backgroundLoader.active=!0;let i={};return n.forEach(e=>{let t=r[e.src],n=[e.src];e.alias&&n.push(...e.alias),n.forEach(e=>{i[e]=t}),Y.set(n,t)}),i}async unload(e){this._initialized||await this.init();let t=bi(e).map(e=>typeof e==`string`?e:e.src),n=this.resolver.resolve(t);await this._unloadFromResolved(n)}async unloadBundle(e){this._initialized||await this.init(),e=bi(e);let t=this.resolver.resolveBundle(e),n=Object.keys(t).map(e=>this._unloadFromResolved(t[e]));await Promise.all(n)}async _unloadFromResolved(e){let t=Object.values(e);t.forEach(e=>{Y.remove(e.src)}),await this.loader.unload(t)}async _detectFormats(e){let t=[];e.preferredFormats&&(t=Array.isArray(e.preferredFormats)?e.preferredFormats:[e.preferredFormats]);for(let n of e.detections)e.skipDetections||await n.test()?t=await n.add(t):e.skipDetections||(t=await n.remove(t));return t=t.filter((e,n)=>t.indexOf(e)===n),t}get detections(){return this._detections}setPreferences(e){this.loader.parsers.forEach(t=>{t.config&&Object.keys(t.config).filter(t=>t in e).forEach(n=>{t.config[n]=e[n]})})}};h.handleByList(f.LoadParser,Sw.loader.parsers).handleByList(f.ResolveParser,Sw.resolver.parsers).handleByList(f.CacheParser,Sw.cache.parsers).handleByList(f.DetectionParser,Sw.detections),h.add(_C,xC,yC,DC,wC,TC,EC,PC,LC,GC,XC,dw,yw,hC,mC,bw,xw);var Cw={loader:f.LoadParser,resolver:f.ResolveParser,cache:f.CacheParser,detection:f.DetectionParser};h.handle(f.Asset,e=>{let t=e.ref;Object.entries(Cw).filter(([e])=>!!t[e]).forEach(([e,n])=>h.add(Object.assign(t[e],{extension:t[e].extension??n})))},e=>{let t=e.ref;Object.keys(Cw).filter(e=>!!t[e]).forEach(e=>h.remove(t[e]))}),Ls(),Fs(),Ws(),z();var ww=class e extends Us{constructor(...t){let n=t[0]??{};n instanceof Float32Array&&(R(L,`use new MeshGeometry({ positions, uvs, indices }) instead`),n={positions:n,uvs:t[1],indices:t[2]}),n={...e.defaultOptions,...n};let r=n.positions||new Float32Array([0,0,1,0,1,1,0,1]),i=n.uvs;i||=n.positions?new Float32Array(r.length):new Float32Array([0,0,1,0,1,1,0,1]);let a=n.indices||new Uint32Array([0,1,2,0,2,3]),o=n.shrinkBuffersToFit,s=new Is({data:r,label:`attribute-mesh-positions`,shrinkToFit:o,usage:Z.VERTEX|Z.COPY_DST}),c=new Is({data:i,label:`attribute-mesh-uvs`,shrinkToFit:o,usage:Z.VERTEX|Z.COPY_DST}),l=new Is({data:a,label:`index-mesh-buffer`,shrinkToFit:o,usage:Z.INDEX|Z.COPY_DST});super({attributes:{aPosition:{buffer:s,format:`float32x2`,stride:8,offset:0},aUV:{buffer:c,format:`float32x2`,stride:8,offset:0}},indexBuffer:l,topology:n.topology}),this.batchMode=`auto`}get positions(){return this.attributes.aPosition.buffer.data}set positions(e){this.attributes.aPosition.buffer.data=e}get uvs(){return this.attributes.aUV.buffer.data}set uvs(e){this.attributes.aUV.buffer.data=e}get indices(){return this.indexBuffer.data}set indices(e){this.indexBuffer.data=e}};ww.defaultOptions={topology:`triangle-list`,shrinkBuffersToFit:!1};var Tw=ww,Ew=class{constructor(){this.batcherName=`default`,this.packAsQuad=!1,this.indexOffset=0,this.attributeOffset=0,this.roundPixels=0,this._batcher=null,this._batch=null,this._textureMatrixUpdateId=-1,this._uvUpdateId=-1}get blendMode(){return this.renderable.groupBlendMode}get topology(){return this._topology||this.geometry.topology}set topology(e){this._topology=e}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.geometry=null,this._uvUpdateId=-1,this._textureMatrixUpdateId=-1}setTexture(e){this.texture!==e&&(this.texture=e,this._textureMatrixUpdateId=-1)}get uvs(){let e=this.geometry.getBuffer(`aUV`),t=e.data,n=t,r=this.texture.textureMatrix;return r.isSimple||(n=this._transformedUvs,(this._textureMatrixUpdateId!==r._updateID||this._uvUpdateId!==e._updateID)&&((!n||n.length<t.length)&&(n=this._transformedUvs=new Float32Array(t.length)),this._textureMatrixUpdateId=r._updateID,this._uvUpdateId=e._updateID,r.multiplyUvs(t,n))),n}get positions(){return this.geometry.positions}get indices(){return this.geometry.indices}get color(){return this.renderable.groupColorAlpha}get groupTransform(){return this.renderable.groupTransform}get attributeSize(){return this.geometry.positions.length/2}get indexSize(){return this.geometry.indices.length}};Pe(),z(),Rr();var Dw=class extends Lr{constructor(e,t){let{text:n,resolution:r,style:i,anchor:a,width:o,height:s,roundPixels:c,...l}=e;super({...l}),this.batched=!0,this._resolution=null,this._autoResolution=!0,this._didTextUpdate=!0,this._styleClass=t,this.text=n??``,this.style=i,this.resolution=r??null,this.allowChildren=!1,this._anchor=new Ne({_onUpdate:()=>{this.onViewUpdate()}}),a&&(this.anchor=a),this.roundPixels=c??!1,o!==void 0&&(this.width=o),s!==void 0&&(this.height=s)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}set text(e){e=e.toString(),this._text!==e&&(this._text=e,this.onViewUpdate())}get text(){return this._text}set resolution(e){this._autoResolution=e===null,this._resolution=e,this.onViewUpdate()}get resolution(){return this._resolution}get style(){return this._style}set style(e){e||={},this._style?.off(`update`,this.onViewUpdate,this),this._style=e instanceof this._styleClass?e:new this._styleClass(e),this._style.on(`update`,this.onViewUpdate,this),this.onViewUpdate()}get width(){return Math.abs(this.scale.x)*this.bounds.width}set width(e){this._setWidth(e,this.bounds.width)}get height(){return Math.abs(this.scale.y)*this.bounds.height}set height(e){this._setHeight(e,this.bounds.height)}getSize(e){return e||={},e.width=Math.abs(this.scale.x)*this.bounds.width,e.height=Math.abs(this.scale.y)*this.bounds.height,e}setSize(e,t){typeof e==`object`?(t=e.height??e.width,e=e.width):t??=e,e!==void 0&&this._setWidth(e,this.bounds.width),t!==void 0&&this._setHeight(t,this.bounds.height)}containsPoint(e){let t=this.bounds.width,n=this.bounds.height,r=-t*this.anchor.x,i=0;return e.x>=r&&e.x<=r+t&&(i=-n*this.anchor.y,e.y>=i&&e.y<=i+n)}onViewUpdate(){this.didViewUpdate||(this._didTextUpdate=!0),super.onViewUpdate()}destroy(e=!1){this._style?.off(`update`,this.onViewUpdate,this),super.destroy(e),this.owner=null,this._bounds=null,this._anchor=null,(typeof e==`boolean`?e:e?.style)&&this._style.destroy(e),this._style=null,this._text=null}get styleKey(){return`${this._text}:${this._style.styleKey}:${this._resolution}`}};function Ow(e,t){let n=e[0]??{};return(typeof n==`string`||e[1])&&(R(L,`use new ${t}({ text: "hi!", style }) instead`),n={text:n,style:e[1]}),n}J(),en(),pt();var kw=null,Aw=null;function jw(e,t){kw||(kw=q.get().createCanvas(256,128),Aw=kw.getContext(`2d`,{willReadFrequently:!0}),Aw.globalCompositeOperation=`copy`,Aw.globalAlpha=1),(kw.width<e||kw.height<t)&&(kw.width=Qt(e),kw.height=Qt(t))}function Mw(e,t,n){for(let r=0,i=4*n*t;r<t;++r,i+=4)if(e[i+3]!==0)return!1;return!0}function Nw(e,t,n,r,i){let a=4*t;for(let t=r,o=r*a+4*n;t<=i;++t,o+=a)if(e[o+3]!==0)return!1;return!0}function Pw(...e){let t=e[0];t.canvas||(t={canvas:e[0],resolution:e[1]});let{canvas:n}=t,r=Math.min(t.resolution??1,1),i=t.width??n.width,a=t.height??n.height,o=t.output;if(jw(i,a),!Aw)throw TypeError(`Failed to get canvas 2D context`);Aw.drawImage(n,0,0,i,a,0,0,i*r,a*r);let s=Aw.getImageData(0,0,i,a).data,c=0,l=0,u=i-1,d=a-1;for(;l<a&&Mw(s,i,l);)++l;if(l===a)return H.EMPTY;for(;Mw(s,i,d);)--d;for(;Nw(s,i,c,l,d);)++c;for(;Nw(s,i,u,l,d);)--u;return++u,++d,Aw.globalCompositeOperation=`source-over`,Aw.strokeRect(c,l,u-c,d-l),Aw.globalCompositeOperation=`copy`,o??=new H,o.set(c/r,l/r,(u-c)/r,(d-l)/r),o}xe(),pt(),Da(),zS(),HS(),YS();var Fw=new H;function Iw(e){let t=0;for(let n=0;n<e.length;n++)e.charCodeAt(n)===32&&t++;return t}var Lw=new class{getCanvasAndContext(e){let{text:t,style:n,resolution:r=1}=e,i=n._getFinalPadding(),a=RS.measureText(t||` `,n),o=Math.ceil(Math.ceil(Math.max(1,a.width)+i*2)*r),s=Math.ceil(Math.ceil(Math.max(1,a.height)+i*2)*r),c=Ea.getOptimalCanvasAndContext(o,s);return this._renderTextToCanvas(n,i,r,c,a),{canvasAndContext:c,frame:n.trim?Pw({canvas:c.canvas,width:o,height:s,resolution:1,output:Fw}):Fw.set(0,0,o,s)}}returnCanvasAndContext(e){Ea.returnCanvasAndContext(e)}_renderTextToCanvas(e,t,n,r,i){if(i.runsByLine&&i.runsByLine.length>0){this._renderTaggedTextToCanvas(i,e,t,n,r);return}let{canvas:a,context:o}=r,s=BS(e),c=i.lines,l=i.lineHeight,u=i.lineWidths,d=i.maxLineWidth,f=i.fontProperties,p=a.height;if(o.resetTransform(),o.scale(n,n),o.textBaseline=e.textBaseline,e._stroke?.width){let t=e._stroke;o.lineWidth=t.width,o.miterLimit=t.miterLimit,o.lineJoin=t.join,o.lineCap=t.cap}o.font=s;let m,h,g=e.dropShadow?2:1,_=(e._stroke?.width??0)/2,v=(l-f.fontSize)/2;l-f.fontSize<0&&(v=0);for(let a=0;a<g;++a){let s=e.dropShadow&&a===0,g=s?Math.ceil(Math.max(1,p)+t*2):0,y=g*n;if(s)this._setupDropShadow(o,e,n,y);else{let n=e._gradientBounds,r=e._gradientOffset;if(n){let a={width:n.width,height:n.height,lineHeight:n.height,lines:i.lines};this._setFillAndStrokeStyles(o,e,a,t,_,r?.x??0,r?.y??0)}else r?this._setFillAndStrokeStyles(o,e,i,t,_,r.x,r.y):this._setFillAndStrokeStyles(o,e,i,t,_);o.shadowColor=`rgba(0,0,0,0)`}for(let n=0;n<c.length;n++){m=_,h=_+n*l+f.ascent+v,m+=this._getAlignmentOffset(u[n],d,e.align);let i=0;if(e.align===`justify`&&e.wordWrap&&n<c.length-1){let e=Iw(c[n]);e>0&&(i=(d-u[n])/e)}e._stroke?.width&&this._drawLetterSpacing(c[n],e,r,m+t,h+t-g,!0,i),e._fill!==void 0&&this._drawLetterSpacing(c[n],e,r,m+t,h+t-g,!1,i)}}}_renderTaggedTextToCanvas(e,t,n,r,i){let{canvas:a,context:o}=i,{runsByLine:s,lineWidths:c,maxLineWidth:l,lineAscents:u,lineHeights:d,hasDropShadow:f}=e,p=a.height;o.resetTransform(),o.scale(r,r),o.textBaseline=t.textBaseline;let m=f?2:1,h=t._stroke?.width??0;for(let e of s)for(let t of e){let e=t.style._stroke?.width??0;e>h&&(h=e)}let g=h/2,_=[];for(let e=0;e<s.length;e++){let t=s[e],n=[];for(let e of t){let t=BS(e.style);o.font=t,n.push({width:RS._measureText(e.text,e.style.letterSpacing,o),font:t})}_.push(n)}for(let e=0;e<m;++e){let a=f&&e===0,m=a?Math.ceil(Math.max(1,p)+n*2):0,h=m*r;a||(o.shadowColor=`rgba(0,0,0,0)`);let v=g;for(let e=0;e<s.length;e++){let f=s[e],p=c[e],y=u[e],b=d[e],x=_[e],S=g;S+=this._getAlignmentOffset(p,l,t.align);let C=0;if(t.align===`justify`&&t.wordWrap&&e<s.length-1){let e=0;for(let t of f)e+=Iw(t.text);e>0&&(C=(l-p)/e)}let w=v+y,T=S+n;for(let e=0;e<f.length;e++){let t=f[e],{width:s,font:c}=x[e];if(o.font=c,o.textBaseline=t.style.textBaseline,t.style._stroke?.width){let e=t.style._stroke;if(o.lineWidth=e.width,o.miterLimit=e.miterLimit,o.lineJoin=e.join,o.lineCap=e.cap,a){if(t.style.dropShadow)this._setupDropShadow(o,t.style,r,h);else{let e=Iw(t.text);T+=s+e*C;continue}}else{let r=RS.measureFont(c),i=t.style.lineHeight||r.fontSize;o.strokeStyle=qS(e,o,{width:s,height:i,lineHeight:i,lines:[t.text]},n*2,T-n,v)}this._drawLetterSpacing(t.text,t.style,i,T,w+n-m,!0,C)}let l=Iw(t.text);T+=s+l*C}T=S+n;for(let e=0;e<f.length;e++){let t=f[e],{width:s,font:c}=x[e];if(o.font=c,o.textBaseline=t.style.textBaseline,t.style._fill!==void 0){if(a){if(t.style.dropShadow)this._setupDropShadow(o,t.style,r,h);else{let e=Iw(t.text);T+=s+e*C;continue}}else{let e=RS.measureFont(c),r=t.style.lineHeight||e.fontSize,i={width:s,height:r,lineHeight:r,lines:[t.text]};o.fillStyle=qS(t.style._fill,o,i,n*2,T-n,v)}this._drawLetterSpacing(t.text,t.style,i,T,w+n-m,!1,C)}let l=Iw(t.text);T+=s+l*C}v+=b}}}_setFillAndStrokeStyles(e,t,n,r,i,a=0,o=0){if(e.fillStyle=t._fill?qS(t._fill,e,n,r*2,a,o):null,t._stroke?.width){let s=i+r*2;e.strokeStyle=qS(t._stroke,e,n,s,a,o)}}_setupDropShadow(e,t,n,r){e.fillStyle=`black`,e.strokeStyle=`black`;let i=t.dropShadow,a=i.color,o=i.alpha;e.shadowColor=N.shared.setValue(a).setAlpha(o).toRgbaString();let s=i.blur*n,c=i.distance*n;e.shadowBlur=s,e.shadowOffsetX=Math.cos(i.angle)*c,e.shadowOffsetY=Math.sin(i.angle)*c+r}_getAlignmentOffset(e,t,n){return n===`right`?t-e:n===`center`?(t-e)/2:0}_drawLetterSpacing(e,t,n,r,i,a=!1,o=0){let{context:s}=n,c=t.letterSpacing,l=!1;if(RS.experimentalLetterSpacingSupported&&(RS.experimentalLetterSpacing?(s.letterSpacing=`${c}px`,s.textLetterSpacing=`${c}px`,l=!0):(s.letterSpacing=`0px`,s.textLetterSpacing=`0px`)),(c===0||l)&&o===0){a?s.strokeText(e,r,i):s.fillText(e,r,i);return}if(o!==0&&(c===0||l)){let t=e.split(` `),n=r,c=s.measureText(` `).width;for(let e=0;e<t.length;e++)a?s.strokeText(t[e],n,i):s.fillText(t[e],n,i),n+=s.measureText(t[e]).width+c+o;return}let u=r,d=RS.graphemeSegmenter(e),f=s.measureText(e).width,p=0;for(let e=0;e<d.length;++e){let t=d[e];a?s.strokeText(t,u,i):s.fillText(t,u,i);let n=``;for(let t=e+1;t<d.length;++t)n+=d[t];p=s.measureText(n).width,u+=f-p+c,t===` `&&(u+=o),f=p}}};Vi();function Rw(e,t){let{texture:n,bounds:r}=e,i=t._style._getFinalPadding();Bi(r,t._anchor,n);let a=t._anchor._x*i*2,o=t._anchor._y*i*2;r.minX-=i-a,r.minY-=i-o,r.maxX-=i-a,r.maxY-=i-o}Fu();var zw=class extends Pu{};g(),hp();var Bw=class{constructor(e){this._renderer=e,e.runners.resolutionChange.add(this),this._managedTexts=new mp({renderer:e,type:`renderable`,onUnload:this.onTextUnload.bind(this),name:`canvasText`})}resolutionChange(){for(let e in this._managedTexts.items){let t=this._managedTexts.items[e];t?._autoResolution&&t.onViewUpdate()}}validateRenderable(e){let t=this._getGpuText(e),n=e.styleKey;return t.currentKey!==n||e._didTextUpdate}addRenderable(e,t){let n=this._getGpuText(e);if(e._didTextUpdate){let t=e._autoResolution?this._renderer.resolution:e.resolution;(n.currentKey!==e.styleKey||e._resolution!==t)&&this._updateGpuText(e),e._didTextUpdate=!1,Rw(n,e)}this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuText(e);t._batcher.updateElement(t)}_updateGpuText(e){let t=this._getGpuText(e);t.texture&&this._renderer.canvasText.decreaseReferenceCount(t.currentKey),e._resolution=e._autoResolution?this._renderer.resolution:e.resolution,t.texture=this._renderer.canvasText.getManagedTexture(e),t.currentKey=e.styleKey}_getGpuText(e){return e._gpuData[this._renderer.uid]||this.initGpuText(e)}initGpuText(e){let t=new zw;return t.currentKey=`--`,t.renderable=e,t.transform=e.groupTransform,t.bounds={minX:0,maxX:1,minY:0,maxY:0},t.roundPixels=this._renderer._roundPixels|e._roundPixels,e._gpuData[this._renderer.uid]=t,this._managedTexts.add(e),t}onTextUnload(e){let t=e._gpuData[this._renderer.uid];if(!t)return;let{canvasText:n}=this._renderer;n.getReferenceCount(t.currentKey)>0?n.decreaseReferenceCount(t.currentKey):t.texture&&n.returnTexture(t.texture)}destroy(){this._managedTexts.destroy(),this._renderer=null}};Bw.extension={type:[f.WebGLPipes,f.WebGPUPipes,f.CanvasPipes],name:`text`},jn(),cn(),z(),KS(),Ja();var Vw=class{constructor(e,t){this._activeTextures={},this._renderer=e,this._retainCanvasContext=t}getTexture(e,t,n,r){typeof e==`string`&&(R(`8.0.0`,`CanvasTextSystem.getTexture: Use object TextOptions instead of separate arguments`),e={text:e,style:n,resolution:t}),e.style instanceof GS||(e.style=new GS(e.style)),e.textureStyle instanceof sn||(e.textureStyle=new sn(e.textureStyle)),typeof e.text!=`string`&&(e.text=e.text.toString());let{text:i,style:a,textureStyle:o,autoGenerateMipmaps:s}=e,c=e.resolution??this._renderer.resolution,{frame:l,canvasAndContext:u}=Lw.getCanvasAndContext({text:i,style:a,resolution:c}),d=Ka(u.canvas,l.width,l.height,c,s);if(o&&(d.source.style=o),a.trim&&(l.pad(a.padding),d.frame.copyFrom(l),d.frame.scale(1/c),d.updateUvs()),a.filters){let e=this._applyFilters(d,a.filters);return this.returnTexture(d),Lw.returnCanvasAndContext(u),e}return this._renderer.texture.initSource(d._source),this._retainCanvasContext||Lw.returnCanvasAndContext(u),d}returnTexture(e){let t=e.source,n=t.resource;if(this._retainCanvasContext&&n?.getContext){let e=n.getContext(`2d`);e&&Lw.returnCanvasAndContext({canvas:n,context:e})}t.resource=null,t.uploadMethodId=`unknown`,t.alphaMode=`no-premultiply-alpha`,An.returnTexture(e,!0)}renderTextToCanvas(){R(`8.10.0`,`CanvasTextSystem.renderTextToCanvas: no longer supported, use CanvasTextSystem.getTexture instead`)}getManagedTexture(e){e._resolution=e._autoResolution?this._renderer.resolution:e.resolution;let t=e.styleKey;if(this._activeTextures[t])return this._increaseReferenceCount(t),this._activeTextures[t].texture;let n=this.getTexture({text:e.text,style:e.style,resolution:e._resolution,textureStyle:e.textureStyle,autoGenerateMipmaps:e.autoGenerateMipmaps});return this._activeTextures[t]={texture:n,usageCount:1},n}decreaseReferenceCount(e){let t=this._activeTextures[e];t&&(t.usageCount--,t.usageCount===0&&(this.returnTexture(t.texture),this._activeTextures[e]=null))}getReferenceCount(e){return this._activeTextures[e]?.usageCount??0}_increaseReferenceCount(e){this._activeTextures[e].usageCount++}_applyFilters(e,t){let n=this._renderer.renderTarget.renderTarget,r=this._renderer.filter.generateFilteredTexture({texture:e,filters:t});return this._renderer.renderTarget.bind({target:n,clear:!1}),r}destroy(){this._renderer=null;for(let e in this._activeTextures)this._activeTextures[e]&&this.returnTexture(this._activeTextures[e].texture);this._activeTextures=null}};g();var Hw=class extends Vw{constructor(e){super(e,!0)}};Hw.extension={type:[f.CanvasSystem],name:`canvasText`},g();var Uw=class extends Vw{constructor(e){super(e,!1)}};Uw.extension={type:[f.WebGLSystem,f.WebGPUSystem],name:`canvasText`},g(),h.add(Hw),h.add(Uw),h.add(Bw),dn(),cn(),zS(),KS();var Ww=class extends Dw{constructor(...e){let t=Ow(e,`Text`);super(t,GS),this.renderPipeId=`text`,t.textureStyle&&(this.textureStyle=t.textureStyle instanceof sn?t.textureStyle:new sn(t.textureStyle)),this.autoGenerateMipmaps=t.autoGenerateMipmaps??un.defaultOptions.autoGenerateMipmaps}updateBounds(){let e=this._bounds,t=this._anchor,n=0,r=0;if(this._style.trim){let{frame:e,canvasAndContext:t}=Lw.getCanvasAndContext({text:this.text,style:this._style,resolution:1});Lw.returnCanvasAndContext(t),n=e.width,r=e.height}else{let e=RS.measureText(this._text,this._style);n=e.width,r=e.height}e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};z();var Gw=class e extends Tw{constructor(...e){super({});let t=e[0]??{};typeof t==`number`&&(R(L,`PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead`),t={width:t,height:e[1],verticesX:e[2],verticesY:e[3]}),this.build(t)}build(t){t={...e.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;let n=this.verticesX*this.verticesY,r=[],i=[],a=[],o=this.verticesX-1,s=this.verticesY-1,c=this.width/o,l=this.height/s;for(let e=0;e<n;e++){let t=e%this.verticesX,n=e/this.verticesX|0;r.push(t*c,n*l),i.push(t/o,n/s)}let u=o*s;for(let e=0;e<u;e++){let t=e%o,n=e/o|0,r=n*this.verticesX+t,i=n*this.verticesX+t+1,s=(n+1)*this.verticesX+t,c=(n+1)*this.verticesX+t+1;a.push(r,i,s,i,c,s)}this.buffers[0].data=new Float32Array(r),this.buffers[1].data=new Float32Array(i),this.indexBuffer.data=new Uint32Array(a),this.buffers[0].update(),this.buffers[1].update(),this.indexBuffer.update()}};Gw.defaultOptions={width:100,height:100,verticesX:10,verticesY:10};var Kw=Gw;g(),wa(),Pt(),Ot();var qw=class{constructor(e){this._renderer=e}validateRenderable(e){return!1}addRenderable(e,t){this._renderer.renderPipes.batch.break(t),t.add(e)}updateRenderable(e){}execute(e){let t=this._renderer,n=t.canvasContext,r=n.activeContext;r.save();let i=e.groupTransform,a=t._roundPixels|e._roundPixels;n.setContextTransform(i,a===1),n.setBlendMode(e.groupBlendMode);let o=t.globalUniforms.globalUniformData?.worldColor??4294967295,s=e.groupColorAlpha,c=(o>>>24&255)/255,l=(s>>>24&255)/255,u=t.filter?.alphaMultiplier??1,d=c*l*u;if(d<=0){r.restore();return}r.globalAlpha=d;let f=o&16777215,p=Mt(Dt(s&16777215,f)),m=e.texture,h=X.getCanvasSource(m);if(!h){r.restore();return}let g=n.smoothProperty,_=m.source.style.scaleMode!==`nearest`;r[g]!==_&&(r[g]=_);let v=p!==16777215||m.rotate!==0,y=v?X.getTintedCanvas({texture:m},p):h,{leftWidth:b,topHeight:x,rightWidth:S,bottomHeight:C,width:w,height:T}=e,E=b+S,D=x+C,O=Math.min(E>w?w/E:1,D>T?T/D:1,1),k=b*O,ee=S*O,te=x*O,A=C*O,j=Math.max(0,w-k-ee),ne=Math.max(0,T-te-A),re=e.anchor,ie=m.source._resolution??m.source.resolution??1,ae=m.frame.x*ie,oe=m.frame.y*ie,M=-re.x*w,se=-re.y*T,ce=b*ie,le=x*ie,ue=S*ie,de=C*ie,fe=m.frame.width*ie,pe=m.frame.height*ie;v&&(ae=0,oe=0,fe=y.width,pe=y.height),r.drawImage(y,ae,oe,ce,le,M,se,k,te),r.drawImage(y,ae+ce,oe,fe-ce-ue,le,M+k,se,j,te),r.drawImage(y,ae+fe-ue,oe,ue,le,M+w-ee,se,ee,te),r.drawImage(y,ae,oe+le,ce,pe-le-de,M,se+te,k,ne),r.drawImage(y,ae+ce,oe+le,fe-ce-ue,pe-le-de,M+k,se+te,j,ne),r.drawImage(y,ae+fe-ue,oe+le,ue,pe-le-de,M+w-ee,se+te,ee,ne),r.drawImage(y,ae,oe+pe-de,ce,de,M,se+T-A,k,A),r.drawImage(y,ae+ce,oe+pe-de,fe-ce-ue,de,M+k,se+T-A,j,A),r.drawImage(y,ae+fe-ue,oe+pe-de,ue,de,M+w-ee,se+T-A,ee,A),r.restore()}destroy(){this._renderer=null}};qw.extension={type:[f.CanvasPipes],name:`nineSliceSprite`};var Jw=class e extends Kw{constructor(t={}){t={...e.defaultOptions,...t},super({width:t.width,height:t.height,verticesX:4,verticesY:4}),this._trimX=0,this._trimY=0,this._trimWidth=t.originalWidth??e.defaultOptions.originalWidth,this._trimHeight=t.originalHeight??e.defaultOptions.originalHeight,this.update(t)}update(e){this.width=e.width??this.width,this.height=e.height??this.height,this._originalWidth=e.originalWidth??this._originalWidth,this._originalHeight=e.originalHeight??this._originalHeight,this._leftWidth=e.leftWidth??this._leftWidth,this._rightWidth=e.rightWidth??this._rightWidth,this._topHeight=e.topHeight??this._topHeight,this._bottomHeight=e.bottomHeight??this._bottomHeight,this._anchorX=e.anchor?.x,this._anchorY=e.anchor?.y,e.trim===void 0?(this._trimWidth=this._originalWidth,this._trimHeight=this._originalHeight):(this._trimX=e.trim?.x??0,this._trimY=e.trim?.y??0,this._trimWidth=e.trim?.width??this._originalWidth,this._trimHeight=e.trim?.height??this._originalHeight),this.updateUvs(),this.updatePositions()}updatePositions(){let e=this.positions,{width:t,height:n,_leftWidth:r,_rightWidth:i,_topHeight:a,_bottomHeight:o,_anchorX:s,_anchorY:c}=this,l=r+i,u=t>l?1:t/l,d=a+o,f=n>d?1:n/d,p=Math.min(u,f),m=s*t,h=c*n;e[0]=e[8]=e[16]=e[24]=-m,e[2]=e[10]=e[18]=e[26]=r*p-m,e[4]=e[12]=e[20]=e[28]=t-i*p-m,e[6]=e[14]=e[22]=e[30]=t-m,e[1]=e[3]=e[5]=e[7]=-h,e[9]=e[11]=e[13]=e[15]=a*p-h,e[17]=e[19]=e[21]=e[23]=n-o*p-h,e[25]=e[27]=e[29]=e[31]=n-h,this.getBuffer(`aPosition`).update()}updateUvs(){let e=this.uvs,t=this._originalWidth,n=this._originalHeight,r=this._trimX/t,i=this._trimY/n,a=(this._trimX+this._trimWidth)/t,o=(this._trimY+this._trimHeight)/n;e[0]=e[8]=e[16]=e[24]=r,e[1]=e[3]=e[5]=e[7]=i,e[6]=e[14]=e[22]=e[30]=a,e[25]=e[27]=e[29]=e[31]=o;let s=1/t,c=1/n;e[2]=e[10]=e[18]=e[26]=r+s*this._leftWidth,e[9]=e[11]=e[13]=e[15]=i+c*this._topHeight,e[4]=e[12]=e[20]=e[28]=a-s*this._rightWidth,e[17]=e[19]=e[21]=e[23]=o-c*this._bottomHeight,this.getBuffer(`aUV`).update()}};Jw.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};var Yw=Jw;g(),hp();var Xw=class extends Ew{constructor(){super(),this.geometry=new Yw}destroy(){this.geometry.destroy()}},Zw=class{constructor(e){this._renderer=e,this._managedSprites=new mp({renderer:e,type:`renderable`,name:`nineSliceSprite`})}addRenderable(e,t){let n=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,n),this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this._getGpuSprite(e);return!t._batcher.checkAndUpdateTexture(t,e._texture)}_updateBatchableSprite(e,t){t.geometry.update(e),t.setTexture(e._texture)}_getGpuSprite(e){return e._gpuData[this._renderer.uid]||this._initGPUSprite(e)}_initGPUSprite(e){let t=e._gpuData[this._renderer.uid]=new Xw,n=t;return n.renderable=e,n.transform=e.groupTransform,n.texture=e._texture,n.roundPixels=this._renderer._roundPixels|e._roundPixels,this._managedSprites.add(e),e.didViewUpdate||this._updateBatchableSprite(e,n),t}destroy(){this._managedSprites.destroy(),this._renderer=null}};Zw.extension={type:[f.WebGLPipes,f.WebGPUPipes],name:`nineSliceSprite`},g(),h.add(qw),h.add(Zw),Pe(),G(),Rr();var Qw=class e extends Lr{constructor(t){t instanceof W&&(t={texture:t});let{width:n,height:r,anchor:i,leftWidth:a,rightWidth:o,topHeight:s,bottomHeight:c,texture:l,roundPixels:u,...d}=t;super({label:`NineSliceSprite`,...d}),this.renderPipeId=`nineSliceSprite`,this.batched=!0,this._leftWidth=a??l?.defaultBorders?.left??Yw.defaultOptions.leftWidth,this._topHeight=s??l?.defaultBorders?.top??Yw.defaultOptions.topHeight,this._rightWidth=o??l?.defaultBorders?.right??Yw.defaultOptions.rightWidth,this._bottomHeight=c??l?.defaultBorders?.bottom??Yw.defaultOptions.bottomHeight,this._width=n??l.width??Yw.defaultOptions.width,this._height=r??l.height??Yw.defaultOptions.height,this.allowChildren=!1,this.texture=l??e.defaultOptions.texture,this.roundPixels=u??!1,this._anchor=new Ne({_onUpdate:()=>{this.onViewUpdate()}}),i?this.anchor=i:this.texture.defaultAnchor&&(this.anchor=this.texture.defaultAnchor)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}get width(){return this._width}set width(e){this._width=e,this.onViewUpdate()}get height(){return this._height}set height(e){this._height=e,this.onViewUpdate()}setSize(e,t){typeof e==`object`&&(t=e.height??e.width,e=e.width),this._width=e,this._height=t??e,this.onViewUpdate()}getSize(e){return e||={},e.width=this._width,e.height=this._height,e}get leftWidth(){return this._leftWidth}set leftWidth(e){this._leftWidth=e,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(e){this._topHeight=e,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(e){this._rightWidth=e,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(e){this._bottomHeight=e,this.onViewUpdate()}get texture(){return this._texture}set texture(e){e||=W.EMPTY;let t=this._texture;t!==e&&(t&&t.dynamic&&t.off(`update`,this.onViewUpdate,this),e.dynamic&&e.on(`update`,this.onViewUpdate,this),this._texture=e,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}get trim(){return this._texture.trim??null}destroy(e){if(super.destroy(e),typeof e==`boolean`?e:e?.texture){let t=typeof e==`boolean`?e:e?.textureSource;this._texture.destroy(t)}this._texture=null}updateBounds(){let e=this._bounds,t=this._anchor,n=this._width,r=this._height;e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};Qw.defaultOptions={texture:W.EMPTY};var $w=Qw;g(),ya(),zi(),pt(),Nd(),ru(),ou(),mu(),xu(),Bd(),Ls(),Fs(),Ws(),fs(),dn(),G(),va(),Bn(),px(),Ui(),KS(),b(),h.add(Qs,tc);var eT=class{constructor(){this.scenes=[]}get current(){return this.scenes.length===0?null:this.scenes[this.scenes.length-1]}get depth(){return this.scenes.length}replace(e){for(let e of this.scenes)e.destroy();this.scenes=[e],e.create()}push(e){this.current?.onSuspend(),this.scenes.push(e),e.create()}pop(e){if(this.scenes.length<=1)throw Error(`cannot pop the last scene off the stack - switchScene somewhere instead`);this.scenes.pop()?.destroy(),this.current?.onResume(e)}update(e){this.current?.update(e)}resize(e,t){for(let n of this.scenes)n.resize(e,t)}destroy(){for(let e of this.scenes)e.destroy();this.scenes=[]}},tT=class{constructor(e=!1){this.listeners=[],this.stackMode=e}add(e){this.listeners.includes(e)||(this.stackMode?this.listeners.unshift(e):this.listeners.push(e))}remove(e){let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}removeAll(){this.listeners.length=0}get size(){return this.listeners.length}dispatch(e){let t=this.listeners.slice();for(let n of t)if(this.listeners.includes(n)&&n(e)===!0)return!0;return!1}},nT={name:`color-add-bit`,vertex:{header:`
|
|
966
|
+
`,rw=null,iw=class{constructor(){rw||=URL.createObjectURL(new Blob([nw],{type:`application/javascript`})),this.worker=new Worker(rw)}};iw.revokeObjectURL=function(){rw&&=(URL.revokeObjectURL(rw),null)};var aw=0,ow,sw=new class{constructor(){this._initialized=!1,this._createdWorkers=0,this._workerPool=[],this._queue=[],this._resolveHash={}}isImageBitmapSupported(){return this._isImageBitmapSupported===void 0&&(this._isImageBitmapSupported=new Promise(e=>{let{worker:t}=new tw;t.addEventListener(`message`,n=>{t.terminate(),tw.revokeObjectURL(),e(n.data)})})),this._isImageBitmapSupported}loadImageBitmap(e,t){return this._run(`loadImageBitmap`,[e,t?.data?.alphaMode])}async _initWorkers(){this._initialized||=!0}_getWorker(){ow===void 0&&(ow=navigator.hardwareConcurrency||4);let e=this._workerPool.pop();return!e&&this._createdWorkers<ow&&(this._createdWorkers++,e=new iw().worker,e.addEventListener(`message`,e=>{this._complete(e.data),this._returnWorker(e.target),this._next()})),e}_returnWorker(e){this._workerPool.push(e)}_complete(e){this._resolveHash[e.uuid]&&(e.error===void 0?this._resolveHash[e.uuid].resolve(e.data):this._resolveHash[e.uuid].reject(e.error),delete this._resolveHash[e.uuid])}async _run(e,t){await this._initWorkers();let n=new Promise((n,r)=>{this._queue.push({id:e,arguments:t,resolve:n,reject:r})});return this._next(),n}_next(){if(!this._queue.length)return;let e=this._getWorker();if(!e)return;let t=this._queue.pop(),n=t.id;this._resolveHash[aw]={resolve:t.resolve,reject:t.reject},e.postMessage({data:t.arguments,uuid:aw++,id:n})}reset(){this._workerPool.forEach(e=>e.terminate()),this._workerPool.length=0,Object.values(this._resolveHash).forEach(({reject:e})=>{e?.(Error(`WorkerManager has been reset before completion`))}),this._resolveHash={},this._queue.length=0,this._initialized=!1,this._createdWorkers=0}};J(),g(),aa(),li();var cw=[`.jpeg`,`.jpg`,`.png`,`.webp`,`.avif`],lw=[`image/jpeg`,`image/png`,`image/webp`,`image/avif`];async function uw(e,t){let n=await q.get().fetch(e);if(!n.ok)throw Error(`[loadImageBitmap] Failed to fetch ${e}: ${n.status} ${n.statusText}`);let r=await n.blob();return t?.data?.alphaMode===`premultiplied-alpha`?createImageBitmap(r,{premultiplyAlpha:`none`}):createImageBitmap(r)}var dw={name:`loadTextures`,id:`texture`,extension:{type:f.LoadParser,priority:ci.High,name:`loadTextures`},config:{preferWorkers:!0,preferCreateImageBitmap:!0,crossOrigin:`anonymous`},test(e){return AC(e,lw)||jC(e,cw)},async load(e,t,n){let r=null;return r=globalThis.createImageBitmap&&this.config.preferCreateImageBitmap?this.config.preferWorkers&&await sw.isImageBitmapSupported()?await sw.loadImageBitmap(e,t):await uw(e,t):await new Promise((t,n)=>{r=q.get().createImage(),r.crossOrigin=this.config.crossOrigin,r.src=e,r.complete?t(r):(r.onload=()=>{t(r)},r.onerror=n)}),qC(new ia({resource:r,alphaMode:`premultiply-alpha-on-upload`,resolution:t.data?.resolution||KC(e),...t.data}),n,e)},unload(e){e.destroy(!0)}};g(),da(),ca();var fw=[`.mp4`,`.m4v`,`.webm`,`.ogg`,`.ogv`,`.h264`,`.avi`,`.mov`],pw,mw;function hw(e,t,n){n===void 0&&!t.startsWith(`data:`)?e.crossOrigin=_w(t):n!==!1&&(e.crossOrigin=typeof n==`string`?n:`anonymous`)}function gw(e){return new Promise((t,n)=>{e.addEventListener(`canplaythrough`,r),e.addEventListener(`error`,i),e.load();function r(){a(),t()}function i(e){a(),n(e)}function a(){e.removeEventListener(`canplaythrough`,r),e.removeEventListener(`error`,i)}})}function _w(e,t=globalThis.location){if(e.startsWith(`data:`))return``;t||=globalThis.location;let n=new URL(e,document.baseURI);return n.hostname!==t.hostname||n.port!==t.port||n.protocol!==t.protocol?`anonymous`:``}function vw(){let e=[],t=[];for(let n of fw){let r=ua.MIME_TYPES[n.substring(1)]||`video/${n.substring(1)}`;CC(r)&&(e.push(n),t.includes(r)||t.push(r))}return{validVideoExtensions:e,validVideoMime:t}}var yw={name:`loadVideo`,id:`video`,extension:{type:f.LoadParser,name:`loadVideo`},test(e){if(!pw||!mw){let{validVideoExtensions:e,validVideoMime:t}=vw();pw=e,mw=t}let t=AC(e,mw),n=jC(e,pw);return t||n},async load(e,t,n){let r={...ua.defaultOptions,resolution:t.data?.resolution||KC(e),alphaMode:t.data?.alphaMode||await oa(),...t.data},i=document.createElement(`video`),a={preload:r.autoLoad===!1?void 0:`auto`,"webkit-playsinline":r.playsinline===!1?void 0:``,playsinline:r.playsinline===!1?void 0:``,muted:r.muted===!0?``:void 0,loop:r.loop===!0?``:void 0,autoplay:r.autoPlay===!1?void 0:``};Object.keys(a).forEach(e=>{let t=a[e];t!==void 0&&i.setAttribute(e,t)}),r.muted===!0&&(i.muted=!0),hw(i,e,r.crossorigin);let o=document.createElement(`source`),s;if(r.mime)s=r.mime;else if(e.startsWith(`data:`))s=e.slice(5,e.indexOf(`;`));else if(!e.startsWith(`blob:`)){let t=e.split(`?`)[0].slice(e.lastIndexOf(`.`)+1).toLowerCase();s=ua.MIME_TYPES[t]||`video/${t}`}return o.src=e,s&&(o.type=s),new Promise((a,s)=>{r.preload&&!r.autoPlay&&i.load(),i.addEventListener(`canplay`,c),i.addEventListener(`error`,l),o.addEventListener(`error`,l),i.appendChild(o);async function c(){let o=new ua({...r,resource:i});u(),t.data.preload&&await gw(i),a(qC(o,n,e))}function l(e){u(),s(e)}function u(){i.removeEventListener(`canplay`,c),i.removeEventListener(`error`,l),o.removeEventListener(`error`,l)}})},unload(e){e.destroy(!0)}};g(),ki();var bw={extension:{type:f.ResolveParser,name:`resolveTexture`},test:dw.test,parse:e=>({resolution:parseFloat(Oi.RETINA_PREFIX.exec(e)?.[1]??`1`),format:e.split(`.`).pop(),src:e})};g(),ki();var xw={extension:{type:f.ResolveParser,priority:-2,name:`resolveJson`},test:e=>Oi.RETINA_PREFIX.test(e)&&e.endsWith(`.json`),parse:bw.parse};g(),V(),pa(),ki(),xi(),Ei();var Sw=new class{constructor(){this._detections=[],this._initialized=!1,this.resolver=new Oi,this.loader=new kC,this.cache=Y,this._backgroundLoader=new gC(this.loader),this._backgroundLoader.active=!0,this.reset()}async init(e={}){if(this._initialized){B(`[Assets]AssetManager already initialized, did you load before calling this Assets.init()?`);return}if(this._initialized=!0,e.defaultSearchParams&&this.resolver.setDefaultSearchParams(e.defaultSearchParams),e.basePath&&(this.resolver.basePath=e.basePath),e.bundleIdentifier&&this.resolver.setBundleIdentifier(e.bundleIdentifier),e.manifest){let t=e.manifest;typeof t==`string`&&(t=await this.load(t)),this.resolver.addManifest(t)}let t=e.texturePreference?.resolution??1,n=typeof t==`number`?[t]:t,r=await this._detectFormats({preferredFormats:e.texturePreference?.format,skipDetections:e.skipDetections,detections:this._detections});this.resolver.prefer({params:{format:r,resolution:n}}),e.preferences&&this.setPreferences(e.preferences),e.loadOptions&&(this.loader.loadOptions={...this.loader.loadOptions,...e.loadOptions})}add(e){this.resolver.add(e)}async load(e,t){this._initialized||await this.init();let n=Ti(e),r=bi(e).map(e=>{if(typeof e!=`string`){let t=this.resolver.getAlias(e);return t.some(e=>!this.resolver.hasKey(e))&&this.add(e),Array.isArray(t)?t[0]:t}return this.resolver.hasKey(e)||this.add({alias:e,src:e}),e}),i=this.resolver.resolve(r),a=await this._mapLoadToResolve(i,t);return n?a[r[0]]:a}addBundle(e,t){this.resolver.addBundle(e,t)}async loadBundle(e,t){this._initialized||await this.init();let n=!1;typeof e==`string`&&(n=!0,e=[e]);let r=this.resolver.resolveBundle(e),i={},a=Object.keys(r),o=0,s=[],c=()=>{t?.(s.reduce((e,t)=>e+t,0)/o)},l=a.map((e,t)=>{let n=r[e],a=Object.values(n),l=[...new Set(a.flat())].reduce((e,t)=>e+(t.progressSize||1),0);return s.push(0),o+=l,this._mapLoadToResolve(n,e=>{s[t]=e*l,c()}).then(t=>{i[e]=t})});return await Promise.all(l),n?i[e[0]]:i}async backgroundLoad(e){this._initialized||await this.init(),typeof e==`string`&&(e=[e]);let t=this.resolver.resolve(e);this._backgroundLoader.add(Object.values(t))}async backgroundLoadBundle(e){this._initialized||await this.init(),typeof e==`string`&&(e=[e]);let t=this.resolver.resolveBundle(e);Object.values(t).forEach(e=>{this._backgroundLoader.add(Object.values(e))})}reset(){this.resolver.reset(),this.loader.reset(),this.cache.reset(),this._initialized=!1}get(e){if(typeof e==`string`)return Y.get(e);let t={};for(let n=0;n<e.length;n++)t[n]=Y.get(e[n]);return t}async _mapLoadToResolve(e,t){let n=[...new Set(Object.values(e))];this._backgroundLoader.active=!1;let r=await this.loader.load(n,t);this._backgroundLoader.active=!0;let i={};return n.forEach(e=>{let t=r[e.src],n=[e.src];e.alias&&n.push(...e.alias),n.forEach(e=>{i[e]=t}),Y.set(n,t)}),i}async unload(e){this._initialized||await this.init();let t=bi(e).map(e=>typeof e==`string`?e:e.src),n=this.resolver.resolve(t);await this._unloadFromResolved(n)}async unloadBundle(e){this._initialized||await this.init(),e=bi(e);let t=this.resolver.resolveBundle(e),n=Object.keys(t).map(e=>this._unloadFromResolved(t[e]));await Promise.all(n)}async _unloadFromResolved(e){let t=Object.values(e);t.forEach(e=>{Y.remove(e.src)}),await this.loader.unload(t)}async _detectFormats(e){let t=[];e.preferredFormats&&(t=Array.isArray(e.preferredFormats)?e.preferredFormats:[e.preferredFormats]);for(let n of e.detections)e.skipDetections||await n.test()?t=await n.add(t):e.skipDetections||(t=await n.remove(t));return t=t.filter((e,n)=>t.indexOf(e)===n),t}get detections(){return this._detections}setPreferences(e){this.loader.parsers.forEach(t=>{t.config&&Object.keys(t.config).filter(t=>t in e).forEach(n=>{t.config[n]=e[n]})})}};h.handleByList(f.LoadParser,Sw.loader.parsers).handleByList(f.ResolveParser,Sw.resolver.parsers).handleByList(f.CacheParser,Sw.cache.parsers).handleByList(f.DetectionParser,Sw.detections),h.add(_C,xC,yC,DC,wC,TC,EC,PC,LC,GC,XC,dw,yw,hC,mC,bw,xw);var Cw={loader:f.LoadParser,resolver:f.ResolveParser,cache:f.CacheParser,detection:f.DetectionParser};h.handle(f.Asset,e=>{let t=e.ref;Object.entries(Cw).filter(([e])=>!!t[e]).forEach(([e,n])=>h.add(Object.assign(t[e],{extension:t[e].extension??n})))},e=>{let t=e.ref;Object.keys(Cw).filter(e=>!!t[e]).forEach(e=>h.remove(t[e]))}),Ls(),Fs(),Ws(),z();var ww=class e extends Us{constructor(...t){let n=t[0]??{};n instanceof Float32Array&&(R(L,`use new MeshGeometry({ positions, uvs, indices }) instead`),n={positions:n,uvs:t[1],indices:t[2]}),n={...e.defaultOptions,...n};let r=n.positions||new Float32Array([0,0,1,0,1,1,0,1]),i=n.uvs;i||=n.positions?new Float32Array(r.length):new Float32Array([0,0,1,0,1,1,0,1]);let a=n.indices||new Uint32Array([0,1,2,0,2,3]),o=n.shrinkBuffersToFit,s=new Is({data:r,label:`attribute-mesh-positions`,shrinkToFit:o,usage:Z.VERTEX|Z.COPY_DST}),c=new Is({data:i,label:`attribute-mesh-uvs`,shrinkToFit:o,usage:Z.VERTEX|Z.COPY_DST}),l=new Is({data:a,label:`index-mesh-buffer`,shrinkToFit:o,usage:Z.INDEX|Z.COPY_DST});super({attributes:{aPosition:{buffer:s,format:`float32x2`,stride:8,offset:0},aUV:{buffer:c,format:`float32x2`,stride:8,offset:0}},indexBuffer:l,topology:n.topology}),this.batchMode=`auto`}get positions(){return this.attributes.aPosition.buffer.data}set positions(e){this.attributes.aPosition.buffer.data=e}get uvs(){return this.attributes.aUV.buffer.data}set uvs(e){this.attributes.aUV.buffer.data=e}get indices(){return this.indexBuffer.data}set indices(e){this.indexBuffer.data=e}};ww.defaultOptions={topology:`triangle-list`,shrinkBuffersToFit:!1};var Tw=ww,Ew=class{constructor(){this.batcherName=`default`,this.packAsQuad=!1,this.indexOffset=0,this.attributeOffset=0,this.roundPixels=0,this._batcher=null,this._batch=null,this._textureMatrixUpdateId=-1,this._uvUpdateId=-1}get blendMode(){return this.renderable.groupBlendMode}get topology(){return this._topology||this.geometry.topology}set topology(e){this._topology=e}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.geometry=null,this._uvUpdateId=-1,this._textureMatrixUpdateId=-1}setTexture(e){this.texture!==e&&(this.texture=e,this._textureMatrixUpdateId=-1)}get uvs(){let e=this.geometry.getBuffer(`aUV`),t=e.data,n=t,r=this.texture.textureMatrix;return r.isSimple||(n=this._transformedUvs,(this._textureMatrixUpdateId!==r._updateID||this._uvUpdateId!==e._updateID)&&((!n||n.length<t.length)&&(n=this._transformedUvs=new Float32Array(t.length)),this._textureMatrixUpdateId=r._updateID,this._uvUpdateId=e._updateID,r.multiplyUvs(t,n))),n}get positions(){return this.geometry.positions}get indices(){return this.geometry.indices}get color(){return this.renderable.groupColorAlpha}get groupTransform(){return this.renderable.groupTransform}get attributeSize(){return this.geometry.positions.length/2}get indexSize(){return this.geometry.indices.length}};Pe(),z(),Rr();var Dw=class extends Lr{constructor(e,t){let{text:n,resolution:r,style:i,anchor:a,width:o,height:s,roundPixels:c,...l}=e;super({...l}),this.batched=!0,this._resolution=null,this._autoResolution=!0,this._didTextUpdate=!0,this._styleClass=t,this.text=n??``,this.style=i,this.resolution=r??null,this.allowChildren=!1,this._anchor=new Ne({_onUpdate:()=>{this.onViewUpdate()}}),a&&(this.anchor=a),this.roundPixels=c??!1,o!==void 0&&(this.width=o),s!==void 0&&(this.height=s)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}set text(e){e=e.toString(),this._text!==e&&(this._text=e,this.onViewUpdate())}get text(){return this._text}set resolution(e){this._autoResolution=e===null,this._resolution=e,this.onViewUpdate()}get resolution(){return this._resolution}get style(){return this._style}set style(e){e||={},this._style?.off(`update`,this.onViewUpdate,this),this._style=e instanceof this._styleClass?e:new this._styleClass(e),this._style.on(`update`,this.onViewUpdate,this),this.onViewUpdate()}get width(){return Math.abs(this.scale.x)*this.bounds.width}set width(e){this._setWidth(e,this.bounds.width)}get height(){return Math.abs(this.scale.y)*this.bounds.height}set height(e){this._setHeight(e,this.bounds.height)}getSize(e){return e||={},e.width=Math.abs(this.scale.x)*this.bounds.width,e.height=Math.abs(this.scale.y)*this.bounds.height,e}setSize(e,t){typeof e==`object`?(t=e.height??e.width,e=e.width):t??=e,e!==void 0&&this._setWidth(e,this.bounds.width),t!==void 0&&this._setHeight(t,this.bounds.height)}containsPoint(e){let t=this.bounds.width,n=this.bounds.height,r=-t*this.anchor.x,i=0;return e.x>=r&&e.x<=r+t&&(i=-n*this.anchor.y,e.y>=i&&e.y<=i+n)}onViewUpdate(){this.didViewUpdate||(this._didTextUpdate=!0),super.onViewUpdate()}destroy(e=!1){this._style?.off(`update`,this.onViewUpdate,this),super.destroy(e),this.owner=null,this._bounds=null,this._anchor=null,(typeof e==`boolean`?e:e?.style)&&this._style.destroy(e),this._style=null,this._text=null}get styleKey(){return`${this._text}:${this._style.styleKey}:${this._resolution}`}};function Ow(e,t){let n=e[0]??{};return(typeof n==`string`||e[1])&&(R(L,`use new ${t}({ text: "hi!", style }) instead`),n={text:n,style:e[1]}),n}J(),en(),pt();var kw=null,Aw=null;function jw(e,t){kw||(kw=q.get().createCanvas(256,128),Aw=kw.getContext(`2d`,{willReadFrequently:!0}),Aw.globalCompositeOperation=`copy`,Aw.globalAlpha=1),(kw.width<e||kw.height<t)&&(kw.width=Qt(e),kw.height=Qt(t))}function Mw(e,t,n){for(let r=0,i=4*n*t;r<t;++r,i+=4)if(e[i+3]!==0)return!1;return!0}function Nw(e,t,n,r,i){let a=4*t;for(let t=r,o=r*a+4*n;t<=i;++t,o+=a)if(e[o+3]!==0)return!1;return!0}function Pw(...e){let t=e[0];t.canvas||(t={canvas:e[0],resolution:e[1]});let{canvas:n}=t,r=Math.min(t.resolution??1,1),i=t.width??n.width,a=t.height??n.height,o=t.output;if(jw(i,a),!Aw)throw TypeError(`Failed to get canvas 2D context`);Aw.drawImage(n,0,0,i,a,0,0,i*r,a*r);let s=Aw.getImageData(0,0,i,a).data,c=0,l=0,u=i-1,d=a-1;for(;l<a&&Mw(s,i,l);)++l;if(l===a)return H.EMPTY;for(;Mw(s,i,d);)--d;for(;Nw(s,i,c,l,d);)++c;for(;Nw(s,i,u,l,d);)--u;return++u,++d,Aw.globalCompositeOperation=`source-over`,Aw.strokeRect(c,l,u-c,d-l),Aw.globalCompositeOperation=`copy`,o??=new H,o.set(c/r,l/r,(u-c)/r,(d-l)/r),o}xe(),pt(),Da(),zS(),HS(),YS();var Fw=new H;function Iw(e){let t=0;for(let n=0;n<e.length;n++)e.charCodeAt(n)===32&&t++;return t}var Lw=new class{getCanvasAndContext(e){let{text:t,style:n,resolution:r=1}=e,i=n._getFinalPadding(),a=RS.measureText(t||` `,n),o=Math.ceil(Math.ceil(Math.max(1,a.width)+i*2)*r),s=Math.ceil(Math.ceil(Math.max(1,a.height)+i*2)*r),c=Ea.getOptimalCanvasAndContext(o,s);return this._renderTextToCanvas(n,i,r,c,a),{canvasAndContext:c,frame:n.trim?Pw({canvas:c.canvas,width:o,height:s,resolution:1,output:Fw}):Fw.set(0,0,o,s)}}returnCanvasAndContext(e){Ea.returnCanvasAndContext(e)}_renderTextToCanvas(e,t,n,r,i){if(i.runsByLine&&i.runsByLine.length>0){this._renderTaggedTextToCanvas(i,e,t,n,r);return}let{canvas:a,context:o}=r,s=BS(e),c=i.lines,l=i.lineHeight,u=i.lineWidths,d=i.maxLineWidth,f=i.fontProperties,p=a.height;if(o.resetTransform(),o.scale(n,n),o.textBaseline=e.textBaseline,e._stroke?.width){let t=e._stroke;o.lineWidth=t.width,o.miterLimit=t.miterLimit,o.lineJoin=t.join,o.lineCap=t.cap}o.font=s;let m,h,g=e.dropShadow?2:1,_=(e._stroke?.width??0)/2,v=(l-f.fontSize)/2;l-f.fontSize<0&&(v=0);for(let a=0;a<g;++a){let s=e.dropShadow&&a===0,g=s?Math.ceil(Math.max(1,p)+t*2):0,y=g*n;if(s)this._setupDropShadow(o,e,n,y);else{let n=e._gradientBounds,r=e._gradientOffset;if(n){let a={width:n.width,height:n.height,lineHeight:n.height,lines:i.lines};this._setFillAndStrokeStyles(o,e,a,t,_,r?.x??0,r?.y??0)}else r?this._setFillAndStrokeStyles(o,e,i,t,_,r.x,r.y):this._setFillAndStrokeStyles(o,e,i,t,_);o.shadowColor=`rgba(0,0,0,0)`}for(let n=0;n<c.length;n++){m=_,h=_+n*l+f.ascent+v,m+=this._getAlignmentOffset(u[n],d,e.align);let i=0;if(e.align===`justify`&&e.wordWrap&&n<c.length-1){let e=Iw(c[n]);e>0&&(i=(d-u[n])/e)}e._stroke?.width&&this._drawLetterSpacing(c[n],e,r,m+t,h+t-g,!0,i),e._fill!==void 0&&this._drawLetterSpacing(c[n],e,r,m+t,h+t-g,!1,i)}}}_renderTaggedTextToCanvas(e,t,n,r,i){let{canvas:a,context:o}=i,{runsByLine:s,lineWidths:c,maxLineWidth:l,lineAscents:u,lineHeights:d,hasDropShadow:f}=e,p=a.height;o.resetTransform(),o.scale(r,r),o.textBaseline=t.textBaseline;let m=f?2:1,h=t._stroke?.width??0;for(let e of s)for(let t of e){let e=t.style._stroke?.width??0;e>h&&(h=e)}let g=h/2,_=[];for(let e=0;e<s.length;e++){let t=s[e],n=[];for(let e of t){let t=BS(e.style);o.font=t,n.push({width:RS._measureText(e.text,e.style.letterSpacing,o),font:t})}_.push(n)}for(let e=0;e<m;++e){let a=f&&e===0,m=a?Math.ceil(Math.max(1,p)+n*2):0,h=m*r;a||(o.shadowColor=`rgba(0,0,0,0)`);let v=g;for(let e=0;e<s.length;e++){let f=s[e],p=c[e],y=u[e],b=d[e],x=_[e],S=g;S+=this._getAlignmentOffset(p,l,t.align);let C=0;if(t.align===`justify`&&t.wordWrap&&e<s.length-1){let e=0;for(let t of f)e+=Iw(t.text);e>0&&(C=(l-p)/e)}let w=v+y,T=S+n;for(let e=0;e<f.length;e++){let t=f[e],{width:s,font:c}=x[e];if(o.font=c,o.textBaseline=t.style.textBaseline,t.style._stroke?.width){let e=t.style._stroke;if(o.lineWidth=e.width,o.miterLimit=e.miterLimit,o.lineJoin=e.join,o.lineCap=e.cap,a){if(t.style.dropShadow)this._setupDropShadow(o,t.style,r,h);else{let e=Iw(t.text);T+=s+e*C;continue}}else{let r=RS.measureFont(c),i=t.style.lineHeight||r.fontSize;o.strokeStyle=qS(e,o,{width:s,height:i,lineHeight:i,lines:[t.text]},n*2,T-n,v)}this._drawLetterSpacing(t.text,t.style,i,T,w+n-m,!0,C)}let l=Iw(t.text);T+=s+l*C}T=S+n;for(let e=0;e<f.length;e++){let t=f[e],{width:s,font:c}=x[e];if(o.font=c,o.textBaseline=t.style.textBaseline,t.style._fill!==void 0){if(a){if(t.style.dropShadow)this._setupDropShadow(o,t.style,r,h);else{let e=Iw(t.text);T+=s+e*C;continue}}else{let e=RS.measureFont(c),r=t.style.lineHeight||e.fontSize,i={width:s,height:r,lineHeight:r,lines:[t.text]};o.fillStyle=qS(t.style._fill,o,i,n*2,T-n,v)}this._drawLetterSpacing(t.text,t.style,i,T,w+n-m,!1,C)}let l=Iw(t.text);T+=s+l*C}v+=b}}}_setFillAndStrokeStyles(e,t,n,r,i,a=0,o=0){if(e.fillStyle=t._fill?qS(t._fill,e,n,r*2,a,o):null,t._stroke?.width){let s=i+r*2;e.strokeStyle=qS(t._stroke,e,n,s,a,o)}}_setupDropShadow(e,t,n,r){e.fillStyle=`black`,e.strokeStyle=`black`;let i=t.dropShadow,a=i.color,o=i.alpha;e.shadowColor=N.shared.setValue(a).setAlpha(o).toRgbaString();let s=i.blur*n,c=i.distance*n;e.shadowBlur=s,e.shadowOffsetX=Math.cos(i.angle)*c,e.shadowOffsetY=Math.sin(i.angle)*c+r}_getAlignmentOffset(e,t,n){return n===`right`?t-e:n===`center`?(t-e)/2:0}_drawLetterSpacing(e,t,n,r,i,a=!1,o=0){let{context:s}=n,c=t.letterSpacing,l=!1;if(RS.experimentalLetterSpacingSupported&&(RS.experimentalLetterSpacing?(s.letterSpacing=`${c}px`,s.textLetterSpacing=`${c}px`,l=!0):(s.letterSpacing=`0px`,s.textLetterSpacing=`0px`)),(c===0||l)&&o===0){a?s.strokeText(e,r,i):s.fillText(e,r,i);return}if(o!==0&&(c===0||l)){let t=e.split(` `),n=r,c=s.measureText(` `).width;for(let e=0;e<t.length;e++)a?s.strokeText(t[e],n,i):s.fillText(t[e],n,i),n+=s.measureText(t[e]).width+c+o;return}let u=r,d=RS.graphemeSegmenter(e),f=s.measureText(e).width,p=0;for(let e=0;e<d.length;++e){let t=d[e];a?s.strokeText(t,u,i):s.fillText(t,u,i);let n=``;for(let t=e+1;t<d.length;++t)n+=d[t];p=s.measureText(n).width,u+=f-p+c,t===` `&&(u+=o),f=p}}};Vi();function Rw(e,t){let{texture:n,bounds:r}=e,i=t._style._getFinalPadding();Bi(r,t._anchor,n);let a=t._anchor._x*i*2,o=t._anchor._y*i*2;r.minX-=i-a,r.minY-=i-o,r.maxX-=i-a,r.maxY-=i-o}Fu();var zw=class extends Pu{};g(),hp();var Bw=class{constructor(e){this._renderer=e,e.runners.resolutionChange.add(this),this._managedTexts=new mp({renderer:e,type:`renderable`,onUnload:this.onTextUnload.bind(this),name:`canvasText`})}resolutionChange(){for(let e in this._managedTexts.items){let t=this._managedTexts.items[e];t?._autoResolution&&t.onViewUpdate()}}validateRenderable(e){let t=this._getGpuText(e),n=e.styleKey;return t.currentKey!==n||e._didTextUpdate}addRenderable(e,t){let n=this._getGpuText(e);if(e._didTextUpdate){let t=e._autoResolution?this._renderer.resolution:e.resolution;(n.currentKey!==e.styleKey||e._resolution!==t)&&this._updateGpuText(e),e._didTextUpdate=!1,Rw(n,e)}this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuText(e);t._batcher.updateElement(t)}_updateGpuText(e){let t=this._getGpuText(e);t.texture&&this._renderer.canvasText.decreaseReferenceCount(t.currentKey),e._resolution=e._autoResolution?this._renderer.resolution:e.resolution,t.texture=this._renderer.canvasText.getManagedTexture(e),t.currentKey=e.styleKey}_getGpuText(e){return e._gpuData[this._renderer.uid]||this.initGpuText(e)}initGpuText(e){let t=new zw;return t.currentKey=`--`,t.renderable=e,t.transform=e.groupTransform,t.bounds={minX:0,maxX:1,minY:0,maxY:0},t.roundPixels=this._renderer._roundPixels|e._roundPixels,e._gpuData[this._renderer.uid]=t,this._managedTexts.add(e),t}onTextUnload(e){let t=e._gpuData[this._renderer.uid];if(!t)return;let{canvasText:n}=this._renderer;n.getReferenceCount(t.currentKey)>0?n.decreaseReferenceCount(t.currentKey):t.texture&&n.returnTexture(t.texture)}destroy(){this._managedTexts.destroy(),this._renderer=null}};Bw.extension={type:[f.WebGLPipes,f.WebGPUPipes,f.CanvasPipes],name:`text`},jn(),cn(),z(),KS(),Ja();var Vw=class{constructor(e,t){this._activeTextures={},this._renderer=e,this._retainCanvasContext=t}getTexture(e,t,n,r){typeof e==`string`&&(R(`8.0.0`,`CanvasTextSystem.getTexture: Use object TextOptions instead of separate arguments`),e={text:e,style:n,resolution:t}),e.style instanceof GS||(e.style=new GS(e.style)),e.textureStyle instanceof sn||(e.textureStyle=new sn(e.textureStyle)),typeof e.text!=`string`&&(e.text=e.text.toString());let{text:i,style:a,textureStyle:o,autoGenerateMipmaps:s}=e,c=e.resolution??this._renderer.resolution,{frame:l,canvasAndContext:u}=Lw.getCanvasAndContext({text:i,style:a,resolution:c}),d=Ka(u.canvas,l.width,l.height,c,s);if(o&&(d.source.style=o),a.trim&&(l.pad(a.padding),d.frame.copyFrom(l),d.frame.scale(1/c),d.updateUvs()),a.filters){let e=this._applyFilters(d,a.filters);return this.returnTexture(d),Lw.returnCanvasAndContext(u),e}return this._renderer.texture.initSource(d._source),this._retainCanvasContext||Lw.returnCanvasAndContext(u),d}returnTexture(e){let t=e.source,n=t.resource;if(this._retainCanvasContext&&n?.getContext){let e=n.getContext(`2d`);e&&Lw.returnCanvasAndContext({canvas:n,context:e})}t.resource=null,t.uploadMethodId=`unknown`,t.alphaMode=`no-premultiply-alpha`,An.returnTexture(e,!0)}renderTextToCanvas(){R(`8.10.0`,`CanvasTextSystem.renderTextToCanvas: no longer supported, use CanvasTextSystem.getTexture instead`)}getManagedTexture(e){e._resolution=e._autoResolution?this._renderer.resolution:e.resolution;let t=e.styleKey;if(this._activeTextures[t])return this._increaseReferenceCount(t),this._activeTextures[t].texture;let n=this.getTexture({text:e.text,style:e.style,resolution:e._resolution,textureStyle:e.textureStyle,autoGenerateMipmaps:e.autoGenerateMipmaps});return this._activeTextures[t]={texture:n,usageCount:1},n}decreaseReferenceCount(e){let t=this._activeTextures[e];t&&(t.usageCount--,t.usageCount===0&&(this.returnTexture(t.texture),this._activeTextures[e]=null))}getReferenceCount(e){return this._activeTextures[e]?.usageCount??0}_increaseReferenceCount(e){this._activeTextures[e].usageCount++}_applyFilters(e,t){let n=this._renderer.renderTarget.renderTarget,r=this._renderer.filter.generateFilteredTexture({texture:e,filters:t});return this._renderer.renderTarget.bind({target:n,clear:!1}),r}destroy(){this._renderer=null;for(let e in this._activeTextures)this._activeTextures[e]&&this.returnTexture(this._activeTextures[e].texture);this._activeTextures=null}};g();var Hw=class extends Vw{constructor(e){super(e,!0)}};Hw.extension={type:[f.CanvasSystem],name:`canvasText`},g();var Uw=class extends Vw{constructor(e){super(e,!1)}};Uw.extension={type:[f.WebGLSystem,f.WebGPUSystem],name:`canvasText`},g(),h.add(Hw),h.add(Uw),h.add(Bw),dn(),cn(),zS(),KS();var Ww=class extends Dw{constructor(...e){let t=Ow(e,`Text`);super(t,GS),this.renderPipeId=`text`,t.textureStyle&&(this.textureStyle=t.textureStyle instanceof sn?t.textureStyle:new sn(t.textureStyle)),this.autoGenerateMipmaps=t.autoGenerateMipmaps??un.defaultOptions.autoGenerateMipmaps}updateBounds(){let e=this._bounds,t=this._anchor,n=0,r=0;if(this._style.trim){let{frame:e,canvasAndContext:t}=Lw.getCanvasAndContext({text:this.text,style:this._style,resolution:1});Lw.returnCanvasAndContext(t),n=e.width,r=e.height}else{let e=RS.measureText(this._text,this._style);n=e.width,r=e.height}e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};z();var Gw=class e extends Tw{constructor(...e){super({});let t=e[0]??{};typeof t==`number`&&(R(L,`PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead`),t={width:t,height:e[1],verticesX:e[2],verticesY:e[3]}),this.build(t)}build(t){t={...e.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;let n=this.verticesX*this.verticesY,r=[],i=[],a=[],o=this.verticesX-1,s=this.verticesY-1,c=this.width/o,l=this.height/s;for(let e=0;e<n;e++){let t=e%this.verticesX,n=e/this.verticesX|0;r.push(t*c,n*l),i.push(t/o,n/s)}let u=o*s;for(let e=0;e<u;e++){let t=e%o,n=e/o|0,r=n*this.verticesX+t,i=n*this.verticesX+t+1,s=(n+1)*this.verticesX+t,c=(n+1)*this.verticesX+t+1;a.push(r,i,s,i,c,s)}this.buffers[0].data=new Float32Array(r),this.buffers[1].data=new Float32Array(i),this.indexBuffer.data=new Uint32Array(a),this.buffers[0].update(),this.buffers[1].update(),this.indexBuffer.update()}};Gw.defaultOptions={width:100,height:100,verticesX:10,verticesY:10};var Kw=Gw;g(),wa(),Pt(),Ot();var qw=class{constructor(e){this._renderer=e}validateRenderable(e){return!1}addRenderable(e,t){this._renderer.renderPipes.batch.break(t),t.add(e)}updateRenderable(e){}execute(e){let t=this._renderer,n=t.canvasContext,r=n.activeContext;r.save();let i=e.groupTransform,a=t._roundPixels|e._roundPixels;n.setContextTransform(i,a===1),n.setBlendMode(e.groupBlendMode);let o=t.globalUniforms.globalUniformData?.worldColor??4294967295,s=e.groupColorAlpha,c=(o>>>24&255)/255,l=(s>>>24&255)/255,u=t.filter?.alphaMultiplier??1,d=c*l*u;if(d<=0){r.restore();return}r.globalAlpha=d;let f=o&16777215,p=Mt(Dt(s&16777215,f)),m=e.texture,h=X.getCanvasSource(m);if(!h){r.restore();return}let g=n.smoothProperty,_=m.source.style.scaleMode!==`nearest`;r[g]!==_&&(r[g]=_);let v=p!==16777215||m.rotate!==0,y=v?X.getTintedCanvas({texture:m},p):h,{leftWidth:b,topHeight:x,rightWidth:S,bottomHeight:C,width:w,height:T}=e,E=b+S,D=x+C,O=Math.min(E>w?w/E:1,D>T?T/D:1,1),k=b*O,ee=S*O,te=x*O,A=C*O,j=Math.max(0,w-k-ee),ne=Math.max(0,T-te-A),re=e.anchor,ie=m.source._resolution??m.source.resolution??1,ae=m.frame.x*ie,oe=m.frame.y*ie,M=-re.x*w,se=-re.y*T,ce=b*ie,le=x*ie,ue=S*ie,de=C*ie,fe=m.frame.width*ie,pe=m.frame.height*ie;v&&(ae=0,oe=0,fe=y.width,pe=y.height),r.drawImage(y,ae,oe,ce,le,M,se,k,te),r.drawImage(y,ae+ce,oe,fe-ce-ue,le,M+k,se,j,te),r.drawImage(y,ae+fe-ue,oe,ue,le,M+w-ee,se,ee,te),r.drawImage(y,ae,oe+le,ce,pe-le-de,M,se+te,k,ne),r.drawImage(y,ae+ce,oe+le,fe-ce-ue,pe-le-de,M+k,se+te,j,ne),r.drawImage(y,ae+fe-ue,oe+le,ue,pe-le-de,M+w-ee,se+te,ee,ne),r.drawImage(y,ae,oe+pe-de,ce,de,M,se+T-A,k,A),r.drawImage(y,ae+ce,oe+pe-de,fe-ce-ue,de,M+k,se+T-A,j,A),r.drawImage(y,ae+fe-ue,oe+pe-de,ue,de,M+w-ee,se+T-A,ee,A),r.restore()}destroy(){this._renderer=null}};qw.extension={type:[f.CanvasPipes],name:`nineSliceSprite`};var Jw=class e extends Kw{constructor(t={}){t={...e.defaultOptions,...t},super({width:t.width,height:t.height,verticesX:4,verticesY:4}),this._trimX=0,this._trimY=0,this._trimWidth=t.originalWidth??e.defaultOptions.originalWidth,this._trimHeight=t.originalHeight??e.defaultOptions.originalHeight,this.update(t)}update(e){this.width=e.width??this.width,this.height=e.height??this.height,this._originalWidth=e.originalWidth??this._originalWidth,this._originalHeight=e.originalHeight??this._originalHeight,this._leftWidth=e.leftWidth??this._leftWidth,this._rightWidth=e.rightWidth??this._rightWidth,this._topHeight=e.topHeight??this._topHeight,this._bottomHeight=e.bottomHeight??this._bottomHeight,this._anchorX=e.anchor?.x,this._anchorY=e.anchor?.y,e.trim===void 0?(this._trimWidth=this._originalWidth,this._trimHeight=this._originalHeight):(this._trimX=e.trim?.x??0,this._trimY=e.trim?.y??0,this._trimWidth=e.trim?.width??this._originalWidth,this._trimHeight=e.trim?.height??this._originalHeight),this.updateUvs(),this.updatePositions()}updatePositions(){let e=this.positions,{width:t,height:n,_leftWidth:r,_rightWidth:i,_topHeight:a,_bottomHeight:o,_anchorX:s,_anchorY:c}=this,l=r+i,u=t>l?1:t/l,d=a+o,f=n>d?1:n/d,p=Math.min(u,f),m=s*t,h=c*n;e[0]=e[8]=e[16]=e[24]=-m,e[2]=e[10]=e[18]=e[26]=r*p-m,e[4]=e[12]=e[20]=e[28]=t-i*p-m,e[6]=e[14]=e[22]=e[30]=t-m,e[1]=e[3]=e[5]=e[7]=-h,e[9]=e[11]=e[13]=e[15]=a*p-h,e[17]=e[19]=e[21]=e[23]=n-o*p-h,e[25]=e[27]=e[29]=e[31]=n-h,this.getBuffer(`aPosition`).update()}updateUvs(){let e=this.uvs,t=this._originalWidth,n=this._originalHeight,r=this._trimX/t,i=this._trimY/n,a=(this._trimX+this._trimWidth)/t,o=(this._trimY+this._trimHeight)/n;e[0]=e[8]=e[16]=e[24]=r,e[1]=e[3]=e[5]=e[7]=i,e[6]=e[14]=e[22]=e[30]=a,e[25]=e[27]=e[29]=e[31]=o;let s=1/t,c=1/n;e[2]=e[10]=e[18]=e[26]=r+s*this._leftWidth,e[9]=e[11]=e[13]=e[15]=i+c*this._topHeight,e[4]=e[12]=e[20]=e[28]=a-s*this._rightWidth,e[17]=e[19]=e[21]=e[23]=o-c*this._bottomHeight,this.getBuffer(`aUV`).update()}};Jw.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};var Yw=Jw;g(),hp();var Xw=class extends Ew{constructor(){super(),this.geometry=new Yw}destroy(){this.geometry.destroy()}},Zw=class{constructor(e){this._renderer=e,this._managedSprites=new mp({renderer:e,type:`renderable`,name:`nineSliceSprite`})}addRenderable(e,t){let n=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,n),this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this._getGpuSprite(e);return!t._batcher.checkAndUpdateTexture(t,e._texture)}_updateBatchableSprite(e,t){t.geometry.update(e),t.setTexture(e._texture)}_getGpuSprite(e){return e._gpuData[this._renderer.uid]||this._initGPUSprite(e)}_initGPUSprite(e){let t=e._gpuData[this._renderer.uid]=new Xw,n=t;return n.renderable=e,n.transform=e.groupTransform,n.texture=e._texture,n.roundPixels=this._renderer._roundPixels|e._roundPixels,this._managedSprites.add(e),e.didViewUpdate||this._updateBatchableSprite(e,n),t}destroy(){this._managedSprites.destroy(),this._renderer=null}};Zw.extension={type:[f.WebGLPipes,f.WebGPUPipes],name:`nineSliceSprite`},g(),h.add(qw),h.add(Zw),Pe(),G(),Rr();var Qw=class e extends Lr{constructor(t){t instanceof W&&(t={texture:t});let{width:n,height:r,anchor:i,leftWidth:a,rightWidth:o,topHeight:s,bottomHeight:c,texture:l,roundPixels:u,...d}=t;super({label:`NineSliceSprite`,...d}),this.renderPipeId=`nineSliceSprite`,this.batched=!0,this._leftWidth=a??l?.defaultBorders?.left??Yw.defaultOptions.leftWidth,this._topHeight=s??l?.defaultBorders?.top??Yw.defaultOptions.topHeight,this._rightWidth=o??l?.defaultBorders?.right??Yw.defaultOptions.rightWidth,this._bottomHeight=c??l?.defaultBorders?.bottom??Yw.defaultOptions.bottomHeight,this._width=n??l.width??Yw.defaultOptions.width,this._height=r??l.height??Yw.defaultOptions.height,this.allowChildren=!1,this.texture=l??e.defaultOptions.texture,this.roundPixels=u??!1,this._anchor=new Ne({_onUpdate:()=>{this.onViewUpdate()}}),i?this.anchor=i:this.texture.defaultAnchor&&(this.anchor=this.texture.defaultAnchor)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}get width(){return this._width}set width(e){this._width=e,this.onViewUpdate()}get height(){return this._height}set height(e){this._height=e,this.onViewUpdate()}setSize(e,t){typeof e==`object`&&(t=e.height??e.width,e=e.width),this._width=e,this._height=t??e,this.onViewUpdate()}getSize(e){return e||={},e.width=this._width,e.height=this._height,e}get leftWidth(){return this._leftWidth}set leftWidth(e){this._leftWidth=e,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(e){this._topHeight=e,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(e){this._rightWidth=e,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(e){this._bottomHeight=e,this.onViewUpdate()}get texture(){return this._texture}set texture(e){e||=W.EMPTY;let t=this._texture;t!==e&&(t&&t.dynamic&&t.off(`update`,this.onViewUpdate,this),e.dynamic&&e.on(`update`,this.onViewUpdate,this),this._texture=e,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}get trim(){return this._texture.trim??null}destroy(e){if(super.destroy(e),typeof e==`boolean`?e:e?.texture){let t=typeof e==`boolean`?e:e?.textureSource;this._texture.destroy(t)}this._texture=null}updateBounds(){let e=this._bounds,t=this._anchor,n=this._width,r=this._height;e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};Qw.defaultOptions={texture:W.EMPTY};var $w=Qw;g(),ya(),zi(),pt(),Nd(),ru(),ou(),mu(),xu(),Bd(),Ls(),Fs(),Ws(),fs(),dn(),G(),va(),Bn(),px(),Ui(),KS(),b(),h.add(Qs,tc);var eT=class{constructor(){this.scenes=[]}get current(){return this.scenes.length===0?null:this.scenes[this.scenes.length-1]}get depth(){return this.scenes.length}replace(e){for(let e of this.scenes)e.destroy();this.scenes=[e],e.create()}push(e){this.current?.onSuspend(),this.scenes.push(e),e.create()}pop(e){if(this.scenes.length<=1)throw Error(`cannot pop the last scene off the stack - switchScene somewhere instead`);this.scenes.pop()?.destroy(),this.current?.onResume(e)}update(e){this.current?.update(e)}resize(e,t){for(let n of this.scenes)n.resize(e,t)}destroy(){for(let e of this.scenes)e.destroy();this.scenes=[]}},tT=class{constructor(e=!1){this.listeners=[],this.stackMode=e}add(e){this.listeners.includes(e)||(this.stackMode?this.listeners.unshift(e):this.listeners.push(e))}remove(e){let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}removeAll(){this.listeners.length=0}get size(){return this.listeners.length}dispatch(e){let t=this.listeners.slice();for(let n of t)if(this.listeners.includes(n)&&n(e)===!0)return!0;return!1}},nT=l({DEFAULT_BINDINGS:()=>uT,attach:()=>TT,bind:()=>dT,detach:()=>ET,endFrame:()=>xT,exportBindings:()=>mT,importBindings:()=>hT,isDown:()=>vT,justPressed:()=>yT,justReleased:()=>bT,keysFor:()=>pT,onAction:()=>sT,onKey:()=>cT,resetBindings:()=>gT,unbind:()=>fT}),rT=new Map,iT=new Set,aT=new Set,oT=new Set,sT=new tT(!0),cT=new tT(!0),lT=!1,uT={up:[`ArrowUp`,`KeyW`,`Numpad8`],down:[`ArrowDown`,`KeyS`,`Numpad2`],left:[`ArrowLeft`,`KeyA`,`Numpad4`],right:[`ArrowRight`,`KeyD`,`Numpad6`],upLeft:[`Numpad7`],upRight:[`Numpad9`],downLeft:[`Numpad1`],downRight:[`Numpad3`],wait:[`Numpad5`,`Period`],confirm:[`Enter`,`Space`,`NumpadEnter`],cancel:[`Escape`,`Backspace`],menu:[`KeyI`,`Tab`]};function dT(e,t){rT.set(e,new Set(t))}function fT(e){rT.delete(e)}function pT(e){return[...rT.get(e)??[]]}function mT(){let e={};for(let[t,n]of rT)e[t]=[...n];return e}function hT(e){rT.clear();for(let[t,n]of Object.entries(e))dT(t,n)}function gT(){hT(uT)}gT();function _T(e){let t=[];for(let[n,r]of rT)r.has(e)&&t.push(n);return t}function vT(e){let t=rT.get(e);if(!t)return!1;for(let e of t)if(iT.has(e))return!0;return!1}function yT(e){return aT.has(e)}function bT(e){return oT.has(e)}function xT(){aT.clear(),oT.clear()}function ST(e){if(e.repeat){cT.dispatch(e);return}iT.add(e.code);for(let t of _T(e.code))aT.add(t),sT.dispatch(t);cT.dispatch(e)}function CT(e){iT.delete(e.code);for(let t of _T(e.code))oT.add(t)}function wT(){iT.clear(),aT.clear(),oT.clear()}function TT(e=window){lT||(lT=!0,e.addEventListener(`keydown`,ST),e.addEventListener(`keyup`,CT),window.addEventListener(`blur`,wT))}function ET(e=window){lT&&(lT=!1,e.removeEventListener(`keydown`,ST),e.removeEventListener(`keyup`,CT),window.removeEventListener(`blur`,wT),wT())}var DT=`mwg-pixel-art`;function OT(){if(document.getElementById(DT))return;let e=document.createElement(`style`);e.id=DT,e.textContent=`.${DT} { image-rendering: pixelated; }`,document.head.appendChild(e)}var kT=class e{static{this.instance=null}constructor(t={}){this.app=new qx,this.elapsed=0,this.timeTotal=0,this.timeScale=1,this.onFrame=new tT,this.stack=new eT,this.pending=[],this.started=!1,this.options={canvas:t.canvas??document.createElement(`canvas`),background:t.background??0,maxDelta:t.maxDelta??.25,pixelArt:t.pixelArt??!0,resizeTo:t.resizeTo??window,extensions:t.extensions??[]},this.options.pixelArt&&(un.defaultOptions.scaleMode=`nearest`),e.instance=this}get width(){return this.app.renderer.screen.width}get height(){return this.app.renderer.screen.height}static get current(){if(!e.instance)throw Error(`no Game has been created yet`);return e.instance}async start(e){if(this.started)throw Error(`this Game has already been started`);this.started=!0;for(let e of this.options.extensions)e();TT(),await this.app.init({canvas:this.options.canvas,background:this.options.background,resizeTo:this.options.resizeTo,antialias:!1,preserveDrawingBuffer:!1,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.options.canvas.isConnected||document.body.appendChild(this.options.canvas),this.options.pixelArt&&(OT(),this.options.canvas.classList.add(DT)),this.app.renderer.on(`resize`,()=>{this.stack.resize(this.width,this.height)}),this.expose(),this.switchNow(e),this.app.ticker.add(e=>this.frame(e.deltaMS/1e3))}switchScene(e){this.pending.push({kind:`switch`,next:e})}pushScene(e){this.pending.push({kind:`push`,next:e})}popScene(e){this.pending.push({kind:`pop`,result:e})}get currentScene(){return this.stack.current}step(e){this.frame(e),this.app.renderer.render(this.app.stage)}expose(){let e=globalThis;e.__PIXI_APP__=this.app,e.__MWG__=this}frame(e){for(let e of this.pending)e.kind===`switch`?this.applySwitch(e.next):e.kind===`push`?this.applyPush(e.next):this.applyPop(e.result);this.pending.length=0,this.elapsed=Math.min(e,this.options.maxDelta)*this.timeScale,this.timeTotal+=this.elapsed,this.stack.update(this.elapsed),this.onFrame.dispatch(this.elapsed),xT()}switchNow(e){this.applySwitch(e)}applySwitch(e){let t=new e;this.stack.replace(t),this.app.stage.removeChildren(),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPush(e){let t=new e;this.stack.push(t),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPop(e){let t=this.stack.current;this.stack.pop(e),t&&this.app.stage.removeChild(t.stage)}destroy(){ET(),this.stack.destroy(),this.onFrame.removeAll(),this.app.destroy(!0,{children:!0}),e.instance===this&&(e.instance=null)}},AT=class{constructor(){this.stage=new K,this.onDestroy=new tT,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.stage.destroy({children:!0}))}get isDestroyed(){return this.destroyed}},jT={debug:0,info:1,warn:2,error:3},MT=class{constructor(e,t={}){if(!e)throw Error(`a logger needs a category`);this.category=e,this.level=t.level??`debug`,this.sink=t.sink??NT}setLevel(e){this.level=e}debug(e,t){this.write(`debug`,e,t)}info(e,t){this.write(`info`,e,t)}warn(e,t){this.write(`warn`,e,t)}error(e,t){this.write(`error`,e,t)}write(e,t,n){jT[e]<jT[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function NT(e){let t=`[${e.category}] ${e.message}`;e.level===`debug`?console.debug(t,e.data??``):e.level===`info`?console.info(t,e.data??``):e.level===`warn`?console.warn(t,e.data??``):console.error(t,e.data??``)}var PT=l({Generator:()=>IT,chance:()=>JT,element:()=>YT,float:()=>WT,int:()=>GT,normalRange:()=>qT,pop:()=>VT,push:()=>BT,range:()=>KT,reset:()=>UT,shuffle:()=>QT,weighted:()=>XT,weightedKey:()=>ZT,withSeed:()=>HT});function FT(e){let t=e>>>0;return()=>{t=t+2654435769>>>0;let e=t;return e=Math.imul(e^e>>>16,569420461),e=Math.imul(e^e>>>15,1935289751),(e^e>>>15)>>>0}}var IT=class{constructor(e){this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.seed=e===void 0?Math.random()*4294967296>>>0:e>>>0;let t=FT(this.seed);this.s0=t(),this.s1=t(),this.s2=t(),this.s3=t(),(this.s0|this.s1|this.s2|this.s3)===0&&(this.s0=1)}nextUint32(){let e=Math.imul(LT(Math.imul(this.s1,5),7),9)>>>0>>>0,t=this.s1<<9>>>0;return this.s2^=this.s0,this.s3^=this.s1,this.s1^=this.s2,this.s0^=this.s3,this.s2^=t,this.s3=LT(this.s3,11),e}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}getState(){return[this.s0,this.s1,this.s2,this.s3]}setState(e){[this.s0,this.s1,this.s2,this.s3]=e}};function LT(e,t){return(e<<t|e>>>32-t)>>>0}var RT=[new IT],zT=()=>RT[RT.length-1];function BT(e){let t=new IT(e);return RT.push(t),t}function VT(){if(RT.length===1)throw Error(`the base random generator cannot be popped`);RT.pop()}function HT(e,t){BT(e);try{return t()}finally{VT()}}function UT(){RT.length=0,RT.push(new IT)}function WT(e,t){return e===void 0?zT().float():t===void 0?zT().float()*e:e+zT().float()*(t-e)}function GT(e,t){return t===void 0?zT().int(e):e+zT().int(t-e)}function KT(e,t){return e+zT().int(t-e+1)}function qT(e,t){return e+Math.floor((zT().float()+zT().float())*(t-e+1)/2)}function JT(e){return zT().float()<e}function YT(e){return e.length>0?e[zT().int(e.length)]:void 0}function XT(e){let t=0;for(let n of e)t+=n;if(t<=0)return-1;let n=zT().float()*t;for(let t=0;t<e.length;t++)if(n-=e[t],n<0)return t;return e.length-1}function ZT(e){let t=[...e.keys()],n=XT(t.map(t=>e.get(t)??0));return n===-1?void 0:t[n]}function QT(e){for(let t=e.length-1;t>0;t--){let n=zT().int(t+1);[e[t],e[n]]=[e[n],e[t]]}return e}var $T=class{constructor(){this.data=new Map}read(e){return this.data.get(e)??null}write(e,t){this.data.set(e,t)}remove(e){this.data.delete(e)}keys(){return[...this.data.keys()]}};function eE(){return typeof localStorage>`u`?new $T:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var tE=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??eE()}key(e){return`mwg-save:${this.namespace}:${e}`}save(e,t,n){let r={meta:{version:this.version,savedAt:Date.now(),preview:n},state:t};this.storage.write(this.key(e),JSON.stringify(r))}load(e){let t=this.storage.read(this.key(e));if(!t)return null;let n=JSON.parse(t),r=n.state;for(let e=n.meta.version;e<this.version;e++)r=(this.migrations[e]??(e=>e))(r);return{meta:{...n.meta,version:this.version},state:r}}delete(e){this.storage.remove(this.key(e))}list(){let e=`mwg-save:${this.namespace}:`,t=[];for(let n of this.storage.keys()){if(!n.startsWith(e))continue;let r=this.storage.read(n);r&&t.push({slot:n.slice(e.length),meta:JSON.parse(r).meta})}return t}},nE=class{constructor(e,t={}){if(!e)throw Error(`a collection needs a name`);this.prefix=`mwg-db:${t.namespace??`default`}:${e}:`,this.storage=t.storage??eE()}get size(){return this.keys().length}all(){return this.keys().map(e=>this.read(e))}get(e){let t=this.storage.read(this.prefix+e);return t===null?void 0:JSON.parse(t)}put(e){if(typeof e!=`object`||!e||Array.isArray(e)||typeof e.id!=`string`||e.id===``)throw Error(`a record must be an object with a string id`);this.storage.write(this.prefix+e.id,JSON.stringify(e))}remove(e){this.storage.remove(this.prefix+e)}where(e){return this.all().filter(e)}clear(){for(let e of this.keys())this.storage.remove(e)}keys(){return this.storage.keys().filter(e=>e.startsWith(this.prefix))}read(e){return JSON.parse(this.storage.read(e))}},rE=class{constructor(e,t){this.frame=0,this.recorded=[],this.actions=e,this.frames=t,this.onAction=e=>{this.recorded.push({frame:this.frame,action:e})},this.onFrame=()=>{this.frame++},e.add(this.onAction),t.add(this.onFrame)}get events(){return this.recorded}toJSON(){return this.recorded.map(e=>({frame:e.frame,action:e.action}))}stop(){this.actions.remove(this.onAction),this.frames.remove(this.onFrame)}},iE=class{constructor(e,t,n){this.frame=0,this.index=0,this.events=e,this.dispatch=t,this.frames=n,this.onFrame=()=>this.pump(),n.add(this.onFrame)}get done(){return this.index>=this.events.length}stop(){this.frames.remove(this.onFrame)}pump(){for(;this.index<this.events.length&&this.events[this.index].frame<=this.frame;)this.dispatch(this.events[this.index].action),this.index++;this.frame++}};function aE(e){return JSON.stringify(e)}function oE(e){let t=JSON.parse(e);if(!Array.isArray(t))throw Error(`a replay must be an array of {frame, action}`);return t.map(e=>{if(typeof e!=`object`||!e||!Number.isInteger(e.frame)||e.frame<0||typeof e.action!=`string`)throw Error(`a replay entry must be {frame: a non-negative integer, action: a string}`);return{frame:e.frame,action:e.action}})}var sE=class e{constructor(){this.definitions=new Map,this.counts=new Map,this.fresh=[]}define(e){this.definitions.set(e.id,e)}count(e){return this.counts.get(e)??0}increment(e,t=1){let n=this.count(e);this.counts.set(e,n+t);let r=[];for(let i of this.definitions.values())i.counter===e&&n<i.target&&n+t>=i.target&&(r.push(i.id),this.fresh.push(i.id));return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return this.count(t.counter)>=t.target}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return{count:this.count(t.counter),target:t.target}}drainNew(){let e=this.fresh;return this.fresh=[],e}toJSON(){return{counts:[...this.counts]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.counts)r.counts.set(e,t);return r}},cE=class{constructor(e={}){let t=e.storage??eE(),n=`mwg-session:${e.namespace??`default`}`,r=Number(t.read(n)??`0`);this.launches=(Number.isFinite(r)?r:0)+1,t.write(n,String(this.launches))}};function lE(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function uE(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var dE=[{x:1,y:-1,z:0},{x:1,y:0,z:-1},{x:0,y:1,z:-1},{x:-1,y:1,z:0},{x:-1,y:0,z:1},{x:0,y:-1,z:1}];function fE(e,t){let n=lE(e,t);return dE.map(e=>uE({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function pE(e,t){let n=lE(e.x,e.y),r=lE(t.x,t.y);return Math.max(Math.abs(n.x-r.x),Math.abs(n.y-r.y),Math.abs(n.z-r.z))}function mE(e){let t=Math.round(e.x),n=Math.round(e.y),r=Math.round(e.z),i=Math.abs(t-e.x),a=Math.abs(n-e.y),o=Math.abs(r-e.z);return i>a&&i>o?t=-n-r:a>o?n=-t-r:r=-t-n,{x:t,y:n,z:r}}function hE(e,t){let n=pE(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=lE(e.x,e.y),i=lE(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(uE(mE({x:r.x+(i.x-r.x)*t,y:r.y+(i.y-r.y)*t,z:r.z+(i.z-r.z)*t})))}return a}function gE(e,t){let n=lE(e.x,e.y),r=[];for(let e=-t;e<=t;e++)for(let i=Math.max(-t,-e-t);i<=Math.min(t,-e+t);i++){let t=-e-i;r.push(uE({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function _E(e,t,n,r){return{x:e*n*.75+n/2,y:t*r+(e&1)*(r/2)+r/2}}function vE(e,t,n,r){let i=e-n/2,a=t-r/2,o=i/(n*.75),s=a/r-.5*o;return uE(mE({x:o,y:-o-s,z:s}))}var yE={name:`color-add-bit`,vertex:{header:`
|
|
967
967
|
in vec4 aColorAdd;
|
|
968
968
|
out vec4 vColorAdd;
|
|
969
969
|
`,main:`
|
|
@@ -976,7 +976,7 @@ ${n}`);throw n instanceof Error&&n.stack&&(u.stack=n.stack),u}}};OC.defaultOptio
|
|
|
976
976
|
// a coloured halo where the sprite is empty.
|
|
977
977
|
float addedAlpha = finalColor.a + vColorAdd.a;
|
|
978
978
|
finalColor = vec4(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
979
|
-
`}},
|
|
979
|
+
`}},bE={name:`color-add-bit`,vertex:{header:`
|
|
980
980
|
@in aColorAdd: vec4<f32>;
|
|
981
981
|
@out vColorAdd: vec4<f32>;
|
|
982
982
|
`,main:`
|
|
@@ -986,8 +986,8 @@ ${n}`);throw n instanceof Error&&n.stack&&(u.stack=n.stack),u}}};OC.defaultOptio
|
|
|
986
986
|
`,end:`
|
|
987
987
|
let addedAlpha = finalColor.a + vColorAdd.a;
|
|
988
988
|
finalColor = vec4<f32>(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
989
|
-
`}},iT=class extends ds{constructor(e){super({glProgram:nu({name:`color-transform-batch`,bits:[au,nT,du(e),bu]}),gpuProgram:tu({name:`color-transform-batch`,bits:[iu,rT,lu(e),yu]}),resources:{batchSamplers:Rd(e)}}),this.maxTextures=e}},aT=7,oT=class extends Us{constructor(){let e=new Is({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Z.VERTEX|Z.COPY_DST,shrinkToFit:!1}),t=new Is({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Z.INDEX|Z.COPY_DST,shrinkToFit:!1});super({attributes:{aPosition:{buffer:e,format:`float32x2`,stride:28,offset:0},aUV:{buffer:e,format:`float32x2`,stride:28,offset:8},aColor:{buffer:e,format:`unorm8x4`,stride:28,offset:16},aTextureIdAndRound:{buffer:e,format:`uint16x2`,stride:28,offset:20},aColorAdd:{buffer:e,format:`unorm8x4`,stride:28,offset:24}},indexBuffer:t})}},sT=0,cT=e=>e.colorAdd??sT,lT=class e extends Md{static{this.extension={type:[f.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new oT,this.name=e.extension.name,this.vertexSize=aT,this.shader=new iT(t.maxTextures)}packAttributes(e,t,n,r,i){let a=i<<16|e.roundPixels&65535,{a:o,b:s,c,d:l,tx:u,ty:d}=e.transform,{positions:f,uvs:p}=e,m=e.color,h=cT(e),g=e.attributeOffset,_=g+e.attributeSize;for(let e=g;e<_;e++){let i=e*2,g=f[i],_=f[i+1];t[r++]=o*g+c*_+u,t[r++]=l*_+s*g+d,t[r++]=p[i],t[r++]=p[i+1],n[r++]=m,n[r++]=a,n[r++]=h}}packQuadAttributes(e,t,n,r,i){let{a,b:o,c:s,d:c,tx:l,ty:u}=e.transform,{bounds:d}=e,f=e.texture.uvs,p=d.maxX,m=d.minX,h=d.maxY,g=d.minY,_=e.color,v=cT(e),y=i<<16|e.roundPixels&65535,b=[[m,g,f.x0,f.y0],[p,g,f.x1,f.y1],[p,h,f.x2,f.y2],[m,h,f.x3,f.y3]];for(let[e,i,d,f]of b)t[r]=a*e+s*i+l,t[r+1]=c*i+o*e+u,t[r+2]=d,t[r+3]=f,n[r+4]=_,n[r+5]=y,n[r+6]=v,r+=aT}_updateMaxTextures(e){this.shader.maxTextures!==e&&(this.shader.destroy(),this.shader=new iT(e))}destroy(){this.shader.destroy(),super.destroy()}};function uT(e,t,n,r=0){return(fT(r)<<24|fT(n)<<16|fT(t)<<8|fT(e))>>>0}function dT(e,t){return uT((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function fT(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var pT=sT,mT=`mwg-tinted-sprite`,hT=class extends Hi{constructor(e){super(e),this._colorAdd=0,this.renderPipeId=mT}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=uT(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=dT(e,t)}silhouette(e){this.tint=0,this.colorAdd=dT(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}},gT=class{static{this.extension={type:[f.WebGLPipes,f.WebGPUPipes,f.CanvasPipes],name:mT}}constructor(e){this.renderer=e}addRenderable(e,t){let n=this.element(e);e.didViewUpdate&&this.sync(e,n),this.renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this.element(e);e.didViewUpdate&&this.sync(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this.element(e);return!t._batcher.checkAndUpdateTexture(t,e.texture)}sync(e,t){t.bounds=e.visualBounds,t.texture=e.texture,t.colorAdd=e.colorAdd}element(e){let t=e._gpuData;return t[this.renderer.uid]??this.create(e,t)}create(e,t){let n=new _T;return n.renderable=e,n.transform=e.groupTransform,n.texture=e.texture,n.bounds=e.visualBounds,n.roundPixels=this.renderer._roundPixels|e._roundPixels,n.colorAdd=e.colorAdd,t[this.renderer.uid]=n,n}destroy(){this.renderer=null}},_T=class{constructor(){this.batcherName=lT.extension.name,this.topology=`triangle-list`,this.attributeSize=4,this.indexSize=6,this.packAsQuad=!0,this.roundPixels=0,this.colorAdd=0,this._attributeStart=0,this._textureId=0,this._indexStart=0,this._batcher=null,this._batch=null}get blendMode(){return this.renderable.groupBlendMode}get color(){return this.renderable.groupColorAlpha}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.bounds=null,this.colorAdd=0}destroy(){this.reset()}},vT=!1;function yT(){vT||(vT=!0,h.add(lT),h.add(gT))}var bT=l({DEFAULT_BINDINGS:()=>OT,attach:()=>UT,bind:()=>kT,detach:()=>WT,endFrame:()=>zT,exportBindings:()=>MT,importBindings:()=>NT,isDown:()=>IT,justPressed:()=>LT,justReleased:()=>RT,keysFor:()=>jT,onAction:()=>TT,onKey:()=>ET,resetBindings:()=>PT,unbind:()=>AT}),xT=new Map,ST=new Set,CT=new Set,wT=new Set,TT=new tT(!0),ET=new tT(!0),DT=!1,OT={up:[`ArrowUp`,`KeyW`,`Numpad8`],down:[`ArrowDown`,`KeyS`,`Numpad2`],left:[`ArrowLeft`,`KeyA`,`Numpad4`],right:[`ArrowRight`,`KeyD`,`Numpad6`],upLeft:[`Numpad7`],upRight:[`Numpad9`],downLeft:[`Numpad1`],downRight:[`Numpad3`],wait:[`Numpad5`,`Period`],confirm:[`Enter`,`Space`,`NumpadEnter`],cancel:[`Escape`,`Backspace`],menu:[`KeyI`,`Tab`]};function kT(e,t){xT.set(e,new Set(t))}function AT(e){xT.delete(e)}function jT(e){return[...xT.get(e)??[]]}function MT(){let e={};for(let[t,n]of xT)e[t]=[...n];return e}function NT(e){xT.clear();for(let[t,n]of Object.entries(e))kT(t,n)}function PT(){NT(OT)}PT();function FT(e){let t=[];for(let[n,r]of xT)r.has(e)&&t.push(n);return t}function IT(e){let t=xT.get(e);if(!t)return!1;for(let e of t)if(ST.has(e))return!0;return!1}function LT(e){return CT.has(e)}function RT(e){return wT.has(e)}function zT(){CT.clear(),wT.clear()}function BT(e){if(e.repeat){ET.dispatch(e);return}ST.add(e.code);for(let t of FT(e.code))CT.add(t),TT.dispatch(t);ET.dispatch(e)}function VT(e){ST.delete(e.code);for(let t of FT(e.code))wT.add(t)}function HT(){ST.clear(),CT.clear(),wT.clear()}function UT(e=window){DT||(DT=!0,e.addEventListener(`keydown`,BT),e.addEventListener(`keyup`,VT),window.addEventListener(`blur`,HT))}function WT(e=window){DT&&(DT=!1,e.removeEventListener(`keydown`,BT),e.removeEventListener(`keyup`,VT),window.removeEventListener(`blur`,HT),HT())}var GT=`mwg-pixel-art`;function KT(){if(document.getElementById(GT))return;let e=document.createElement(`style`);e.id=GT,e.textContent=`.${GT} { image-rendering: pixelated; }`,document.head.appendChild(e)}var qT=class e{static{this.instance=null}constructor(t={}){this.app=new qx,this.elapsed=0,this.timeTotal=0,this.timeScale=1,this.onFrame=new tT,this.stack=new eT,this.pending=[],this.started=!1,this.options={canvas:t.canvas??document.createElement(`canvas`),background:t.background??0,maxDelta:t.maxDelta??.25,pixelArt:t.pixelArt??!0,resizeTo:t.resizeTo??window},this.options.pixelArt&&(un.defaultOptions.scaleMode=`nearest`),e.instance=this}get width(){return this.app.renderer.screen.width}get height(){return this.app.renderer.screen.height}static get current(){if(!e.instance)throw Error(`no Game has been created yet`);return e.instance}async start(e){if(this.started)throw Error(`this Game has already been started`);this.started=!0,yT(),UT(),await this.app.init({canvas:this.options.canvas,background:this.options.background,resizeTo:this.options.resizeTo,antialias:!1,preserveDrawingBuffer:!1,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.options.canvas.isConnected||document.body.appendChild(this.options.canvas),this.options.pixelArt&&(KT(),this.options.canvas.classList.add(GT)),this.app.renderer.on(`resize`,()=>{this.stack.resize(this.width,this.height)}),this.expose(),this.switchNow(e),this.app.ticker.add(e=>this.frame(e.deltaMS/1e3))}switchScene(e){this.pending.push({kind:`switch`,next:e})}pushScene(e){this.pending.push({kind:`push`,next:e})}popScene(e){this.pending.push({kind:`pop`,result:e})}get currentScene(){return this.stack.current}step(e){this.frame(e),this.app.renderer.render(this.app.stage)}expose(){let e=globalThis;e.__PIXI_APP__=this.app,e.__MWG__=this}frame(e){for(let e of this.pending)e.kind===`switch`?this.applySwitch(e.next):e.kind===`push`?this.applyPush(e.next):this.applyPop(e.result);this.pending.length=0,this.elapsed=Math.min(e,this.options.maxDelta)*this.timeScale,this.timeTotal+=this.elapsed,this.stack.update(this.elapsed),this.onFrame.dispatch(this.elapsed),zT()}switchNow(e){this.applySwitch(e)}applySwitch(e){let t=new e;this.stack.replace(t),this.app.stage.removeChildren(),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPush(e){let t=new e;this.stack.push(t),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPop(e){let t=this.stack.current;this.stack.pop(e),t&&this.app.stage.removeChild(t.stage)}destroy(){WT(),this.stack.destroy(),this.onFrame.removeAll(),this.app.destroy(!0,{children:!0}),e.instance===this&&(e.instance=null)}},JT=class{constructor(){this.stage=new K,this.onDestroy=new tT,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.stage.destroy({children:!0}))}get isDestroyed(){return this.destroyed}},YT={debug:0,info:1,warn:2,error:3},XT=class{constructor(e,t={}){if(!e)throw Error(`a logger needs a category`);this.category=e,this.level=t.level??`debug`,this.sink=t.sink??ZT}setLevel(e){this.level=e}debug(e,t){this.write(`debug`,e,t)}info(e,t){this.write(`info`,e,t)}warn(e,t){this.write(`warn`,e,t)}error(e,t){this.write(`error`,e,t)}write(e,t,n){YT[e]<YT[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function ZT(e){let t=`[${e.category}] ${e.message}`;e.level===`debug`?console.debug(t,e.data??``):e.level===`info`?console.info(t,e.data??``):e.level===`warn`?console.warn(t,e.data??``):console.error(t,e.data??``)}var QT=l({Generator:()=>eE,chance:()=>fE,element:()=>pE,float:()=>cE,int:()=>lE,normalRange:()=>dE,pop:()=>aE,push:()=>iE,range:()=>uE,reset:()=>sE,shuffle:()=>gE,weighted:()=>mE,weightedKey:()=>hE,withSeed:()=>oE});function $T(e){let t=e>>>0;return()=>{t=t+2654435769>>>0;let e=t;return e=Math.imul(e^e>>>16,569420461),e=Math.imul(e^e>>>15,1935289751),(e^e>>>15)>>>0}}var eE=class{constructor(e){this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.seed=e===void 0?Math.random()*4294967296>>>0:e>>>0;let t=$T(this.seed);this.s0=t(),this.s1=t(),this.s2=t(),this.s3=t(),(this.s0|this.s1|this.s2|this.s3)===0&&(this.s0=1)}nextUint32(){let e=Math.imul(tE(Math.imul(this.s1,5),7),9)>>>0>>>0,t=this.s1<<9>>>0;return this.s2^=this.s0,this.s3^=this.s1,this.s1^=this.s2,this.s0^=this.s3,this.s2^=t,this.s3=tE(this.s3,11),e}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}getState(){return[this.s0,this.s1,this.s2,this.s3]}setState(e){[this.s0,this.s1,this.s2,this.s3]=e}};function tE(e,t){return(e<<t|e>>>32-t)>>>0}var nE=[new eE],rE=()=>nE[nE.length-1];function iE(e){let t=new eE(e);return nE.push(t),t}function aE(){if(nE.length===1)throw Error(`the base random generator cannot be popped`);nE.pop()}function oE(e,t){iE(e);try{return t()}finally{aE()}}function sE(){nE.length=0,nE.push(new eE)}function cE(e,t){return e===void 0?rE().float():t===void 0?rE().float()*e:e+rE().float()*(t-e)}function lE(e,t){return t===void 0?rE().int(e):e+rE().int(t-e)}function uE(e,t){return e+rE().int(t-e+1)}function dE(e,t){return e+Math.floor((rE().float()+rE().float())*(t-e+1)/2)}function fE(e){return rE().float()<e}function pE(e){return e.length>0?e[rE().int(e.length)]:void 0}function mE(e){let t=0;for(let n of e)t+=n;if(t<=0)return-1;let n=rE().float()*t;for(let t=0;t<e.length;t++)if(n-=e[t],n<0)return t;return e.length-1}function hE(e){let t=[...e.keys()],n=mE(t.map(t=>e.get(t)??0));return n===-1?void 0:t[n]}function gE(e){for(let t=e.length-1;t>0;t--){let n=rE().int(t+1);[e[t],e[n]]=[e[n],e[t]]}return e}var _E=class{constructor(){this.data=new Map}read(e){return this.data.get(e)??null}write(e,t){this.data.set(e,t)}remove(e){this.data.delete(e)}keys(){return[...this.data.keys()]}};function vE(){return typeof localStorage>`u`?new _E:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var yE=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??vE()}key(e){return`mwg-save:${this.namespace}:${e}`}save(e,t,n){let r={meta:{version:this.version,savedAt:Date.now(),preview:n},state:t};this.storage.write(this.key(e),JSON.stringify(r))}load(e){let t=this.storage.read(this.key(e));if(!t)return null;let n=JSON.parse(t),r=n.state;for(let e=n.meta.version;e<this.version;e++)r=(this.migrations[e]??(e=>e))(r);return{meta:{...n.meta,version:this.version},state:r}}delete(e){this.storage.remove(this.key(e))}list(){let e=`mwg-save:${this.namespace}:`,t=[];for(let n of this.storage.keys()){if(!n.startsWith(e))continue;let r=this.storage.read(n);r&&t.push({slot:n.slice(e.length),meta:JSON.parse(r).meta})}return t}},bE=class{constructor(e,t={}){if(!e)throw Error(`a collection needs a name`);this.prefix=`mwg-db:${t.namespace??`default`}:${e}:`,this.storage=t.storage??vE()}get size(){return this.keys().length}all(){return this.keys().map(e=>this.read(e))}get(e){let t=this.storage.read(this.prefix+e);return t===null?void 0:JSON.parse(t)}put(e){if(typeof e!=`object`||!e||Array.isArray(e)||typeof e.id!=`string`||e.id===``)throw Error(`a record must be an object with a string id`);this.storage.write(this.prefix+e.id,JSON.stringify(e))}remove(e){this.storage.remove(this.prefix+e)}where(e){return this.all().filter(e)}clear(){for(let e of this.keys())this.storage.remove(e)}keys(){return this.storage.keys().filter(e=>e.startsWith(this.prefix))}read(e){return JSON.parse(this.storage.read(e))}},xE=class{constructor(e,t){this.frame=0,this.recorded=[],this.actions=e,this.frames=t,this.onAction=e=>{this.recorded.push({frame:this.frame,action:e})},this.onFrame=()=>{this.frame++},e.add(this.onAction),t.add(this.onFrame)}get events(){return this.recorded}toJSON(){return this.recorded.map(e=>({frame:e.frame,action:e.action}))}stop(){this.actions.remove(this.onAction),this.frames.remove(this.onFrame)}},SE=class{constructor(e,t,n){this.frame=0,this.index=0,this.events=e,this.dispatch=t,this.frames=n,this.onFrame=()=>this.pump(),n.add(this.onFrame)}get done(){return this.index>=this.events.length}stop(){this.frames.remove(this.onFrame)}pump(){for(;this.index<this.events.length&&this.events[this.index].frame<=this.frame;)this.dispatch(this.events[this.index].action),this.index++;this.frame++}};function CE(e){return JSON.stringify(e)}function wE(e){let t=JSON.parse(e);if(!Array.isArray(t))throw Error(`a replay must be an array of {frame, action}`);return t.map(e=>{if(typeof e!=`object`||!e||!Number.isInteger(e.frame)||e.frame<0||typeof e.action!=`string`)throw Error(`a replay entry must be {frame: a non-negative integer, action: a string}`);return{frame:e.frame,action:e.action}})}var TE=class e{constructor(){this.definitions=new Map,this.counts=new Map,this.fresh=[]}define(e){this.definitions.set(e.id,e)}count(e){return this.counts.get(e)??0}increment(e,t=1){let n=this.count(e);this.counts.set(e,n+t);let r=[];for(let i of this.definitions.values())i.counter===e&&n<i.target&&n+t>=i.target&&(r.push(i.id),this.fresh.push(i.id));return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return this.count(t.counter)>=t.target}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return{count:this.count(t.counter),target:t.target}}drainNew(){let e=this.fresh;return this.fresh=[],e}toJSON(){return{counts:[...this.counts]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.counts)r.counts.set(e,t);return r}};function EE(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function DE(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var OE=[{x:1,y:-1,z:0},{x:1,y:0,z:-1},{x:0,y:1,z:-1},{x:-1,y:1,z:0},{x:-1,y:0,z:1},{x:0,y:-1,z:1}];function kE(e,t){let n=EE(e,t);return OE.map(e=>DE({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function AE(e,t){let n=EE(e.x,e.y),r=EE(t.x,t.y);return Math.max(Math.abs(n.x-r.x),Math.abs(n.y-r.y),Math.abs(n.z-r.z))}function jE(e){let t=Math.round(e.x),n=Math.round(e.y),r=Math.round(e.z),i=Math.abs(t-e.x),a=Math.abs(n-e.y),o=Math.abs(r-e.z);return i>a&&i>o?t=-n-r:a>o?n=-t-r:r=-t-n,{x:t,y:n,z:r}}function ME(e,t){let n=AE(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=EE(e.x,e.y),i=EE(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(DE(jE({x:r.x+(i.x-r.x)*t,y:r.y+(i.y-r.y)*t,z:r.z+(i.z-r.z)*t})))}return a}function NE(e,t){let n=EE(e.x,e.y),r=[];for(let e=-t;e<=t;e++)for(let i=Math.max(-t,-e-t);i<=Math.min(t,-e+t);i++){let t=-e-i;r.push(DE({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function PE(e,t,n,r){return{x:e*n*.75+n/2,y:t*r+(e&1)*(r/2)+r/2}}function FE(e,t,n,r){let i=e-n/2,a=t-r/2,o=i/(n*.75),s=a/r-.5*o;return DE(jE({x:o,y:-o-s,z:s}))}var IE=class{constructor(e,{fps:t=10,loop:n=!0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);this.frames=e,this.frameDuration=1/t,this.loop=n}get duration(){return this.frameDuration*this.frames.length}},LE=class extends hT{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.frameIndex=0,this.timer=0,this.finished=!1,this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new IE(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}play(e,t=!1){if(!t&&this.currentName===e&&!this.finished)return this;let n=this.animations.get(e);if(!n)throw Error(`no animation named "${e}" on this sprite`);return this.current=n,this.currentName=e,this.frameIndex=0,this.timer=0,this.finished=!1,this.texture=n.frames[0],this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;if(!(!t||this.paused||this.finished)){for(this.timer+=e;this.timer>=t.frameDuration;)if(this.timer-=t.frameDuration,this.frameIndex<t.frames.length-1)this.frameIndex++;else if(t.loop)this.frameIndex=0;else{this.finished=!0,this.onFinish?.(this.currentName);break}this.texture=t.frames[this.frameIndex]}}},RE=l({get:()=>JE,has:()=>WE,isCompiled:()=>HE,load:()=>KE,paths:()=>UE,resolve:()=>GE,setBase:()=>BE,texture:()=>qE}),zE=``;function BE(e){zE=e.endsWith(`/`)||e===``?e:e+`/`}function VE(){return typeof window>`u`?void 0:window.__MWG_ASSETS__}function HE(){return VE()!==void 0}function UE(){return Object.keys(VE()??{})}function WE(e){let t=VE();return!t||e in t}function GE(e){let t=VE();if(!t)return zE+e;let n=t[e];if(n===void 0)throw Error(`asset "${e}" is not in this build - check it is under the folder passed to compile-resources`);return n}async function KE(e){let t=e.filter(e=>!Sw.cache.has(e));if(t.length!==0){for(let e of t)Sw.add({alias:e,src:GE(e)});await Sw.load(t)}}function qE(e){if(!Sw.cache.has(e))throw Error(`texture "${e}" has not been loaded - pass it to load() first`);return Sw.get(e)}function JE(e){if(!Sw.cache.has(e))throw Error(`asset "${e}" has not been loaded - pass it to load() first`);return Sw.get(e)}var YE=class e{constructor(e,t,n){this.frames=new Map,this.names=new Map,this.texture=e,this.frameWidth=t,this.frameHeight=n,this.columns=Math.floor(e.width/t),this.rows=Math.floor(e.height/n)}static grid(t,n,r=n){return new e(qE(t),n,r)}static fromTexture(t,n,r=n){return new e(t,n,r)}get count(){return this.columns*this.rows}name(e,t){return this.names.set(e,t),this}nameAll(e){for(let[t,n]of Object.entries(e))this.names.set(t,n);return this}indexOf(e){let t=this.names.get(e);if(t===void 0)throw Error(`this sheet has no frame named "${e}"`);return t}get(e){let t=typeof e==`string`?this.indexOf(e):e,n=this.frames.get(t);if(n)return n;if(t<0||t>=this.count)throw Error(`frame ${t} is outside this sheet, which holds ${this.count}`);let r=new W({source:this.texture.source,frame:new H(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}range(e,t){let n=[];for(let r=e;r<=t;r++)n.push(this.get(r));return n}pick(...e){return e.map(e=>this.get(e))}},XE=class{constructor(e={}){this.world=new K,this.x=0,this.y=0,this.viewWidth=0,this.viewHeight=0,this.followTarget=null,this.followIntensity=0,this.shakeMagnitude=0,this.shakeRemaining=0,this.shakeDuration=1,this.shakeX=0,this.shakeY=0,this.bounds=null,this._zoom=e.zoom??1,this.deadzone=e.deadzone??0}get zoom(){return this._zoom}set zoom(e){this._zoom=Math.max(.01,e)}setViewport(e,t){this.viewWidth=e,this.viewHeight=t}get view(){let e=this.viewWidth/this._zoom,t=this.viewHeight/this._zoom;return{x:this.x-e/2,y:this.y-t/2,width:e,height:t}}setBounds(e){this.bounds=e}snapTo(e,t){this.x=e,this.y=t,this.followTarget=null,this.followIntensity=0,this.apply()}panTo(e,t,n=4){this.followTarget={x:e,y:t},this.followIntensity=n}follow(e,t=8){this.followTarget=e,this.followIntensity=t}stopFollowing(){this.followTarget=null,this.followIntensity=0}shake(e,t=.4){this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.view.width*this.deadzone/2,n=this.view.height*this.deadzone/2,r=this.followTarget.x-this.x,i=this.followTarget.y-this.y;r=r>t?r-t:r<-t?r+t:0,i=i>n?i-n:i<-n?i+n:0;let a=1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=cE(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=cE(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){return{x:(e-this.x)*this._zoom+this.viewWidth/2,y:(t-this.y)*this._zoom+this.viewHeight/2}}toWorld(e,t){return{x:(e-this.viewWidth/2)/this._zoom+this.x,y:(t-this.viewHeight/2)/this._zoom+this.y}}apply(){let e=this.x+this.shakeX,t=this.y+this.shakeY;if(this.bounds){let n=this.viewWidth/this._zoom/2,r=this.viewHeight/this._zoom/2,{minX:i,minY:a,maxX:o,maxY:s}=this.bounds;e=o-i<n*2?(i+o)/2:ZE(e,i+n,o-n),t=s-a<r*2?(a+s)/2:ZE(t,a+r,s-r)}this.world.scale.set(this._zoom),this.world.x=Math.round(this.viewWidth/2-e*this._zoom),this.world.y=Math.round(this.viewHeight/2-t*this._zoom)}};function ZE(e,t,n){return e<t?t:e>n?n:e}function QE(e={}){let t=new XE(e),n=qT.current;return t.setViewport(n.width,n.height),t}var $E=-1,eD=7237230,tD=10132122;function nD(e,t){if(!Number.isInteger(e)||e<0||e>=4096)throw Error(`tileFrame needs a sheet index from 0 to 4095, got ${e}`);if(!Number.isInteger(t)||t<0||t>=1<<20)throw Error(`tileFrame needs a frame index from 0 to ${(1<<20)-1}, got ${t}`);return e<<20|t}function rD(e){return e>>>20}function iD(e){return e&(1<<20)-1}var aD=class extends K{constructor(e){if(super(),this.layers=[],this.layersByName=new Map,this.chunks=[],this.widthInTiles=e.width,this.heightInTiles=e.height,this.sheets=Array.isArray(e.sheet)?[...e.sheet]:[e.sheet],this.sheets.length===0)throw Error(`a TileMap needs at least one sheet`);if(this.tileWidth=e.tileWidth??this.sheets[0].frameWidth,this.tileHeight=e.tileHeight??this.sheets[0].frameHeight,this.shape=e.shape??`square`,this.heightStep=e.heightStep??this.tileHeight/2,!(this.heightStep>0))throw Error(`a TileMap's heightStep must be a positive number, got ${e.heightStep}`);this.chunkSize=e.chunkSize??16,this.chunkColumns=Math.ceil(this.widthInTiles/this.chunkSize),this.chunkRows=Math.ceil(this.heightInTiles/this.chunkSize);let t=this.widthInTiles*this.heightInTiles;this.cellTint=new Uint32Array(t).fill(16777215),this.cellAdd=new Uint32Array(t),this.cellHeight=new Int32Array(t),this.faces=Array(t).fill(null)}get layerCount(){return this.layers.length}get worldWidth(){switch(this.shape){case`square`:return this.widthInTiles*this.tileWidth;case`hex`:return this.widthInTiles<=0?0:(this.widthInTiles-1)*this.tileWidth*.75+this.tileWidth;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileWidth/2);case`staggered`:return this.widthInTiles*this.tileWidth+this.tileWidth/2}}get worldHeight(){switch(this.shape){case`square`:return this.heightInTiles*this.tileHeight;case`hex`:return this.heightInTiles*this.tileHeight+this.tileHeight/2;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileHeight/2);case`staggered`:return this.heightInTiles*(this.tileHeight/2)+this.tileHeight/2}}inside(e,t){return e>=0&&t>=0&&e<this.widthInTiles&&t<this.heightInTiles}index(e,t){return t*this.widthInTiles+e}addLayer(e,t){if(this.layersByName.has(e))throw Error(`this map already has a layer named "${e}"`);let n=this.widthInTiles*this.heightInTiles;if(t&&t.length!==n)throw Error(`layer "${e}" has ${t.length} cells, but the map has ${n}`);let r=new K,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new K;i.push(e),r.addChild(e)}let a={name:e,data:t?Int32Array.from(t):new Int32Array(n).fill(-1),sprites:Array(n).fill(null),container:r};this.layers.push(a),this.layersByName.set(e,a),this.chunks.push(i),this.addChild(r);let o=this.layers.length===1;for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++){let n=a.data[this.index(t,e)];n!==-1&&this.buildSprite(a,t,e,n),o&&this.syncFaces(t,e)}return this}layerAt(e){let t=typeof e==`number`?this.layers[e]:this.layersByName.get(e);if(!t)throw Error(`no such layer: ${e}`);return t}chunkIndex(e,t){return Math.floor(t/this.chunkSize)*this.chunkColumns+Math.floor(e/this.chunkSize)}projectedCenter(e,t){switch(this.shape){case`square`:return{x:(e+.5)*this.tileWidth,y:(t+.5)*this.tileHeight};case`hex`:return PE(e,t,this.tileWidth,this.tileHeight);case`isometric`:return{x:(e-t+(this.heightInTiles-1))*(this.tileWidth/2)+this.tileWidth/2,y:(e+t)*(this.tileHeight/2)+this.tileHeight/2};case`staggered`:return{x:e*this.tileWidth+(t&1)*(this.tileWidth/2)+this.tileWidth/2,y:t*(this.tileHeight/2)+this.tileHeight/2}}}projectedTile(e,t){switch(this.shape){case`square`:return{x:Math.floor(e/this.tileWidth),y:Math.floor(t/this.tileHeight)};case`hex`:return FE(e,t,this.tileWidth,this.tileHeight);case`isometric`:{let n=(e-this.tileWidth/2)/(this.tileWidth/2)-(this.heightInTiles-1),r=(t-this.tileHeight/2)/(this.tileHeight/2);return{x:Math.round((n+r)/2),y:Math.round((r-n)/2)}}case`staggered`:{let n=Math.round((t-this.tileHeight/2)/(this.tileHeight/2));return{x:Math.round((e-this.tileWidth/2-(n&1)*(this.tileWidth/2))/this.tileWidth),y:n}}}}cellOrigin(e,t){let n=this.projectedCenter(e,t);return{x:n.x-this.tileWidth/2,y:n.y-this.tileHeight/2}}textureFor(e){let t=rD(e);if(t>=this.sheets.length)throw Error(`frame ${e} names sheet ${t}, but this map has ${this.sheets.length}`);return this.sheets[t].get(iD(e))}buildSprite(e,t,n,r){let i=new hT(this.textureFor(r)),a=this.cellOrigin(t,n);i.x=a.x,i.y=a.y-this.cellHeight[this.index(t,n)]*this.heightStep;let o=this.index(t,n);return i.tint=this.cellTint[o],i.colorAdd=this.cellAdd[o],e.sprites[o]=i,this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)].addChild(i),i}getTile(e,t,n){return this.inside(t,n)?this.layerAt(e).data[this.index(t,n)]:-1}setTile(e,t,n,r){if(!this.inside(t,n))return;let i=this.layerAt(e),a=this.index(t,n);if(i.data[a]===r)return;i.data[a]=r;let o=i.sprites[a];r===-1?(o?.destroy(),i.sprites[a]=null):o?o.texture=this.textureFor(r):this.buildSprite(i,t,n,r),this.layers[0]===i&&this.syncFaces(t,n)}setLayerData(e,t){this.layerAt(e);for(let n=0;n<this.heightInTiles;n++)for(let r=0;r<this.widthInTiles;r++)this.setTile(e,r,n,t[this.index(r,n)]??-1)}setCellColor(e,t,n,r=0){if(!this.inside(e,t))return;let i=this.index(e,t);if(this.cellTint[i]===n&&this.cellAdd[i]===r)return;this.cellTint[i]=n,this.cellAdd[i]=r;for(let e of this.layers){let t=e.sprites[i];t&&(t.tint=n,t.colorAdd=r)}let a=this.faces[i];a&&(a.tint=n)}getCellTint(e,t){return this.inside(e,t)?this.cellTint[this.index(e,t)]:0}clearColors(){for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)this.setCellColor(t,e,16777215,0)}setCellHeight(e,t,n){if(!this.inside(e,t))return;if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);let r=this.index(e,t);if(this.cellHeight[r]===n)return;this.cellHeight[r]=n;let i=n*this.heightStep;for(let n of this.layers){let a=n.sprites[r];a&&(a.y=this.cellOrigin(e,t).y-i)}this.syncFaces(e,t)}getCellHeight(e,t){return this.inside(e,t)?this.cellHeight[this.index(e,t)]:0}get faceCount(){return this.faces.filter(e=>e!==null).length}syncFaces(e,t){if(this.layers.length===0)return;let n=this.index(e,t),r=(this.shape===`isometric`||this.shape===`staggered`)&&this.cellHeight[n]>0&&this.layers[0].data[n]!==-1,i=this.faces[n];if(!r){i&&(i.destroy(),this.faces[n]=null);return}let a=i??new fx;if(this.drawFaces(a,e,t),a.tint=this.cellTint[n],!i){this.faces[n]=a;let r=this.chunks[0][this.chunkIndex(e,t)],i=this.layers[0].sprites[n];i?r.addChildAt(a,r.getChildIndex(i)):r.addChild(a)}}drawFaces(e,t,n){let r=this.cellOrigin(t,n),i=r.x,a=r.y,o=this.tileWidth/2,s=this.tileHeight/2,c=this.heightStep,l=this.cellHeight[this.index(t,n)];e.clear();for(let t=1;t<=l;t++){let n=t*c,r=(t-1)*c;e.poly([i,a+s-n,i+o,a+s*2-n,i+o,a+s*2-r,i,a+s-r]).fill(eD),e.poly([i+o,a+s*2-n,i+o*2,a+s-n,i+o*2,a+s-r,i+o,a+s*2-r]).fill(tD)}}toTile(e,t){return this.projectedTile(e,t)}tileCenter(e,t){let n=this.projectedCenter(e,t);return n.y-=this.getCellHeight(e,t)*this.heightStep,n}cull(e){let t=e.view,n=[this.projectedTile(t.x,t.y),this.projectedTile(t.x+t.width,t.y),this.projectedTile(t.x,t.y+t.height),this.projectedTile(t.x+t.width,t.y+t.height)],r=Math.min(...n.map(e=>e.x)),i=Math.max(...n.map(e=>e.x)),a=Math.min(...n.map(e=>e.y)),o=Math.max(...n.map(e=>e.y)),s=Math.floor(r/this.chunkSize)-1,c=Math.floor(i/this.chunkSize)+1,l=Math.floor(a/this.chunkSize)-1,u=Math.floor(o/this.chunkSize)+1;for(let e=0;e<this.chunkRows;e++){let t=e>=l&&e<=u;for(let n=0;n<this.chunkColumns;n++){let r=t&&n>=s&&n<=c,i=e*this.chunkColumns+n;for(let e of this.chunks)e[i].renderable=r}}}get visibleChunks(){return this.chunks.length===0?0:this.chunks[0].filter(e=>e.renderable).length}},oD=class extends K{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new hT(t);return this.layers.set(e,{sprite:r,order:n}),this.addChild(r),this.resort(),r}removeLayer(e){let t=this.layers.get(e);t&&(this.layers.delete(e),t.sprite.destroy())}layer(e){return this.layers.get(e)?.sprite}hasLayer(e){return this.layers.has(e)}setTexture(e,t){let n=this.layers.get(e);n&&(n.sprite.texture=t)}resort(){[...this.layers.values()].sort((e,t)=>e.order-t.order).forEach((e,t)=>this.setChildIndex(e.sprite,t))}},sD=class{constructor(e,t,n,r={}){this.elapsed=0,this.arrived=!1,this.sprite=e,this.fromX=t.x,this.fromY=t.y,this.toX=n.x,this.toY=n.y;let i=Math.hypot(n.x-t.x,n.y-t.y);this.duration=r.duration??i/(r.speed??400),this.duration<=0&&(this.duration=1e-6),e.x=t.x,e.y=t.y}get done(){return this.arrived}get progress(){return Math.min(1,this.elapsed/this.duration)}update(e){if(this.arrived)return!1;this.elapsed+=e;let t=this.progress;return this.sprite.x=this.fromX+(this.toX-this.fromX)*t,this.sprite.y=this.fromY+(this.toY-this.fromY)*t,t>=1&&(this.arrived=!0,!0)}},cD=class{constructor(e,t){this.idleOrMove=`idle`,this.inAction=!1,this.sprite=e,this.animationName=t.animationName,this.variant=t.variant??``,this.sprite.onFinish=()=>this.onSpriteFinish(),this.apply(this.idleOrMove)}get state(){return this.inAction?`action`:this.idleOrMove}get variantName(){return this.variant}setMoving(e,t){t!==void 0&&(this.variant=t),this.idleOrMove=e?`move`:`idle`,this.inAction||this.apply(this.idleOrMove)}playAction(e,t=!1){this.inAction&&!t||(e!==void 0&&(this.variant=e),this.inAction=!0,this.apply(`action`))}onSpriteFinish(){this.inAction&&(this.inAction=!1,this.apply(this.idleOrMove))}apply(e){let t=this.animationName(e,this.variant);this.sprite.has(t)&&this.sprite.play(t,e===`action`)}},lD=fD(),uD=new Map(lD.map((e,t)=>[dD(e),t]));function dD(e){let t=e.ne&&e.n&&e.e,n=e.se&&e.s&&e.e,r=e.sw&&e.s&&e.w,i=e.nw&&e.n&&e.w;return+!!e.n|(e.e?2:0)|(e.s?4:0)|(e.w?8:0)|(t?16:0)|(n?32:0)|(r?64:0)|(i?128:0)}function fD(){let e=new Set,t=[];for(let n=0;n<256;n++){let r={n:!!(n&1),e:!!(n&2),s:!!(n&4),w:!!(n&8),ne:!!(n&16),se:!!(n&32),sw:!!(n&64),nw:!!(n&128)},i=dD(r);e.has(i)||(e.add(i),t.push({mask:i,shape:{n:r.n,e:r.e,s:r.s,w:r.w,ne:r.ne&&r.n&&r.e,se:r.se&&r.s&&r.e,sw:r.sw&&r.s&&r.w,nw:r.nw&&r.n&&r.w}}))}return t.sort((e,t)=>e.mask-t.mask),t.map(e=>e.shape)}function pD(e){return uD.get(dD(e))}function mD(e,t,n,r){if(r.length!==lD.length)throw Error(`autotileFrames needs exactly ${lD.length} frames, got ${r.length}`);let i=new Int32Array(e*t);for(let a=0;a<t;a++)for(let t=0;t<e;t++){let o=a*e+t;if(!n(t,a)){i[o]=-1;continue}i[o]=r[pD({n:n(t,a-1),e:n(t+1,a),s:n(t,a+1),w:n(t-1,a),ne:n(t+1,a-1),se:n(t+1,a+1),sw:n(t-1,a+1),nw:n(t-1,a-1)})]}return i}var hD={panelBorder:4,padding:8,spacing:2,direction:`ltr`,font:{family:`ui-monospace, Consolas, "DejaVu Sans Mono", monospace`,size:12,lineHeight:1.4},color:{text:15263984,textDim:9079446,textHighlight:16770688,panelFill:1842214,panelBorder:4868702,selection:3820154,overlay:0},overlayAlpha:.5},gD=hD;function _D(){return gD}function vD(e){gD={...hD,...e,font:{...hD.font,...e.font},color:{...hD.color,...e.color}}}var yD=class extends Ww{constructor(e={}){let t=typeof e==`string`?{text:e}:e,n=_D();super({text:t.text??``,style:new GS({fontFamily:n.font.family,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:t.align??(n.direction===`rtl`?`right`:`left`),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})})}setColor(e){this.style.fill=e}setText(e){this.text!==e&&(this.text=e)}},bD=class extends K{constructor(e,t){super();let n=typeof t.border==`number`?{left:t.border,top:t.border,right:t.border,bottom:t.border}:t.border;this.sprite=new $w({texture:e,leftWidth:n.left,topHeight:n.top,rightWidth:n.right,bottomHeight:n.bottom}),this.addChild(this.sprite)}get border(){return{left:this.sprite.leftWidth,top:this.sprite.topHeight,right:this.sprite.rightWidth,bottom:this.sprite.bottomHeight}}resize(e,t){let n=this.border;this.sprite.width=Math.max(e,n.left+n.right),this.sprite.height=Math.max(t,n.top+n.bottom)}},xD=class extends K{constructor(e){super(),this.content=new K,this.onClose=new tT,this.titleLabel=null,this.innerWidth=0,this.innerHeight=0,this.delegate=null;let t=_D();this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,this.background=t.panel?new bD(t.panel,{border:t.panelBorder}):new fx,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new yD({text:e.title,color:t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel)),this.addChild(this.content),this.resize(e.width,e.height)}resize(e,t){let n=_D(),r=(this.background instanceof bD?this.background.border.left:2)+n.padding;this.background instanceof bD?this.background.resize(e,t):this.background.clear().roundRect(0,0,e,t,4).fill({color:n.color.panelFill}).stroke({color:n.color.panelBorder,width:1});let i=r;this.titleLabel&&(this.titleLabel.x=n.direction===`rtl`?e-r-this.titleLabel.width:r,this.titleLabel.y=r,i=r+this.titleLabel.height+n.padding),this.content.x=r,this.content.y=i,this.innerWidth=Math.max(0,e-r*2),this.innerHeight=Math.max(0,t-i-r)}get contentWidth(){return this.innerWidth}get contentHeight(){return this.innerHeight}setTitle(e){this.titleLabel?.setText(e)}handleAction(e){return this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}update(e){}close(){this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0})}place(e,t){let n=this.getLocalBounds(),r=_D().padding*2;this.x=Math.round((e-n.width)/2),this.y=this.anchor===`bottom`?Math.round(t-n.height-r):this.anchor===`top`?r:Math.round((t-n.height)/2)}},SD=class extends K{constructor(){super(),this.windows=[],this.overlay=new fx,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.overlay.visible=!1,this.addChild(this.overlay),TT.add(this.listener)}setViewport(e,t){this.viewportWidth=e,this.viewportHeight=t,this.drawOverlay();for(let n of this.windows)n.place(e,t)}get top(){return this.windows[this.windows.length-1]??null}get isEmpty(){return this.windows.length===0}get depth(){return this.windows.length}push(e){return this.windows.push(e),this.addChild(e),e.onClose.add(()=>(this.forget(e),!1)),e.place(this.viewportWidth,this.viewportHeight),this.updateOverlay(),e}pop(){this.top?.close()}closeAll(){for(let e of[...this.windows].reverse())e.close()}forget(e){let t=this.windows.indexOf(e);t!==-1&&this.windows.splice(t,1),this.updateOverlay()}updateOverlay(){let e=this.windows.findIndex(e=>e.dims);if(e===-1){this.overlay.visible=!1;return}this.overlay.visible=!0,this.setChildIndex(this.overlay,Math.max(0,this.getChildIndex(this.windows[e])-1))}drawOverlay(){let e=_D();this.overlay.clear().rect(0,0,this.viewportWidth,this.viewportHeight).fill({color:e.color.overlay,alpha:e.overlayAlpha})}handleAction(e){return this.top?.handleAction(e)??!1}get blocksWorld(){return this.windows.some(e=>e.modal)}update(e){this.top?.update(e)}destroy(e){TT.remove(this.listener),super.destroy(e)}},CD=class extends K{constructor(e){super(),this.items=[],this.rows=[],this.rowsLayer=new K,this.highlight=new fx,this.mask_=new fx,this.index=0,this.scroll=0;let t=_D();this.viewWidth=e.width,this.viewHeight=e.height,this.rowHeight=e.rowHeight??Math.ceil(t.font.size*t.font.lineHeight)+t.spacing,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.addChild(this.highlight),this.addChild(this.rowsLayer),this.addChild(this.mask_),this.rowsLayer.mask=this.mask_,this.drawMask(),this.setItems(e.items??[])}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.rowHeight))}get selectedIndex(){return this.index}get selected(){return this.items[this.index]??null}get length(){return this.items.length}setItems(e){this.items=e;for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=_D(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new K;i.y=r*this.rowHeight,e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.rowHeight:t.spacing,i.addChild(e.icon));let a=new yD({text:e.text,color:e.disabled?t.color.textDim:t.color.text}),o=t.spacing+(e.icon?this.rowHeight:0);a.x=n?this.viewWidth-o-a.width:o,a.y=Math.round((this.rowHeight-a.height)/2),i.addChild(a),this.rows.push(i),this.rowsLayer.addChild(i)}),this.index=this.items.findIndex(e=>!e.disabled),this.index===-1&&(this.index=0),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){if(this.items.length===0)return!1;let t=this.index;for(let n=0;n<this.items.length;n++)if(t=(t+e+this.items.length)%this.items.length,!this.items[t].disabled)return this.index=t,this.refresh(),this.onHighlight?.(this.items[t],t),!0;return!1}select(e){e<0||e>=this.items.length||this.items[e].disabled||(this.index=e,this.refresh(),this.onHighlight?.(this.items[e],e))}confirm(){let e=this.selected;return!e||e.disabled?!1:(this.onSelect?.(e,this.index),!0)}handleAction(e){switch(e){case`up`:return this.move(-1);case`down`:return this.move(1);case`confirm`:return this.confirm();default:return!1}}refresh(){let e=this.visibleRows;this.index<this.scroll?this.scroll=this.index:this.index>=this.scroll+e&&(this.scroll=this.index-e+1),this.scroll=Math.max(0,Math.min(this.scroll,Math.max(0,this.items.length-e))),this.rowsLayer.y=-this.scroll*this.rowHeight;let t=_D();if(this.items.length===0){this.highlight.clear();return}this.highlight.clear().rect(0,(this.index-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:t.color.selection})}},wD=class extends K{constructor(e){super(),this.items=[],this.cells=[],this.cellsLayer=new K,this.highlight=new fx,this.pickupHighlight=new fx,this.mask_=new fx,this.index=0,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.viewWidth=e.width,this.viewHeight=e.height,this.columns=Math.max(1,e.columns),this.cellSize=e.cellSize??Math.floor(this.viewWidth/this.columns),this.longPressDuration=e.longPressDuration??.6,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onQuickslot=e.onQuickslot??null,this.onReorder=e.onReorder??null,this.addChild(this.highlight),this.addChild(this.pickupHighlight),this.addChild(this.cellsLayer),this.addChild(this.mask_),this.cellsLayer.mask=this.mask_,this.drawMask(),this.setItems(e.items??[])}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.cellSize))}get rows(){return Math.max(1,Math.ceil(this.items.length/this.columns))}get selectedIndex(){return this.index}get selected(){return this.items[this.index]??null}get length(){return this.items.length}setItems(e){this.items=e,this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=_D();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new K;if(a.x=i*this.cellSize,a.y=r*this.cellSize,a.eventMode=`static`,a.cursor=e.disabled?`default`:`pointer`,e.icon.x=Math.round((this.cellSize-e.icon.width)/2),e.icon.y=Math.round((this.cellSize-e.icon.height)/2),e.disabled&&(e.icon.alpha=.4),a.addChild(e.icon),(e.quantity??1)>1){let n=new yD({text:String(e.quantity),size:10,color:t.color.textHighlight});n.x=this.cellSize-n.width-2,n.y=this.cellSize-n.height-1,a.addChild(n)}a.on(`pointerdown`,()=>{this.pressedIndex=n,this.pressTimer=0}),a.on(`pointerup`,()=>this.releaseCell(n)),a.on(`pointerupoutside`,()=>this.releaseCell(n)),this.cells.push(a),this.cellsLayer.addChild(a)}),this.index=this.items.findIndex(e=>!e.disabled),this.index===-1&&(this.index=0),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.items[e]?.disabled||this.tapCell(e))}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}update(e){if(this.pressedIndex===null||(this.pressTimer+=e,this.pressTimer<this.longPressDuration))return;let t=this.pressedIndex;this.pressedIndex=null;let n=this.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){if(e<0||e>=this.items.length)return;if(this.pickedUp===null){if(this.items[e].disabled)return;this.pickedUp=e,this.refresh();return}let t=this.pickedUp;this.pickedUp=null,t!==e&&(this.swapCells(t,e),this.onReorder?.(t,e)),this.refresh()}swapCells(e,t){[this.items[e],this.items[t]]=[this.items[t],this.items[e]];let n=this.cells[e],r=this.cells[t],i=n.removeChildren(),a=r.removeChildren();for(let e of a)n.addChild(e);for(let e of i)r.addChild(e);n.cursor=this.items[e].disabled?`default`:`pointer`,r.cursor=this.items[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){if(this.items.length===0)return!1;let n=this.items.length,r=this.rows,i=Math.floor(this.index/this.columns),a=this.index%this.columns;for(let o=0;o<r*this.columns;o++){a=(a+e+this.columns)%this.columns,i=(i+t+r)%r;let o=i*this.columns+a;if(o<n&&!this.items[o].disabled)return this.index=o,this.refresh(),this.onHighlight?.(this.items[o],o),!0}return!1}select(e){e<0||e>=this.items.length||this.items[e].disabled||(this.index=e,this.refresh(),this.onHighlight?.(this.items[e],e))}confirm(){let e=this.selected;return!e||e.disabled?!1:(this.onSelect?.(e,this.index),!0)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move(-1,0);case`right`:return this.move(1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:e%this.columns*this.cellSize,y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=Math.floor(this.index/this.columns);t<this.scrollRow?this.scrollRow=t:t>=this.scrollRow+e&&(this.scrollRow=t-e+1),this.scrollRow=Math.max(0,Math.min(this.scrollRow,Math.max(0,this.rows-e))),this.cellsLayer.y=-this.scrollRow*this.cellSize;let n=_D();if(this.pickupHighlight.clear(),this.pickedUp!==null){let{x:e,y:t}=this.cellRect(this.pickedUp);this.pickupHighlight.rect(e,t,this.cellSize,this.cellSize).stroke({color:n.color.textHighlight,width:2})}if(this.highlight.clear(),this.items.length>0){let{x:e,y:t}=this.cellRect(this.index);this.highlight.rect(e,t,this.cellSize,this.cellSize).fill({color:n.color.selection})}}},TD=class extends xD{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.revealed=0,this.portrait=null,this.portraitLayer=new K,this.choiceList=null,this.finished=!1,this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.choices=e.choices??[],this.onDone=e.onDone??null;let t=_D();this.content.addChild(this.portraitLayer),this.speakerLabel=new yD({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new yD({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new yD({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0)}showPage(e){let t=this.pages[e],n=_D(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new Hi(t.portrait),r&&(this.portrait.x=this.contentWidth-this.portrait.width),this.portraitLayer.addChild(this.portrait),a=this.contentWidth-this.portrait.width-n.padding,i=r?0:this.portrait.width+n.padding),this.speakerLabel.visible=t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=t.speaker===void 0?0:this.speakerLabel.height+n.spacing,this.body.style.wordWrapWidth=Math.max(16,a),this.revealed=this.speed>0?0:t.text.length,this.body.setText(t.text.slice(0,this.revealed)),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}get pageComplete(){return this.revealed>=this.pages[this.pageIndex].text.length}update(e){if(this.finished||this.pageComplete){this.prompt.visible=this.pageComplete&&!this.choiceList;return}this.revealed=Math.min(this.pages[this.pageIndex].text.length,this.revealed+this.speed*e),this.body.setText(this.pages[this.pageIndex].text.slice(0,Math.floor(this.revealed)))}handleAction(e){return this.delegate?super.handleAction(e):e===`confirm`?this.pageComplete?this.pageIndex<this.pages.length-1?(this.pageIndex++,this.showPage(this.pageIndex),!0):this.choices.length>0?(this.showChoices(),!0):(this.finish(void 0),!0):(this.revealed=this.pages[this.pageIndex].text.length,this.body.setText(this.pages[this.pageIndex].text),!0):!1}showChoices(){let e=_D(),t=this.choices.map(e=>({text:e.text,disabled:e.disabled,value:e.value??e.text})),n=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing,r=t.length*n,i=this.body.y+this.body.height+e.padding,a=i+r-this.contentHeight;a>0&&this.grow(a),this.choiceList=new CD({width:this.contentWidth,height:r,items:t,onSelect:e=>this.finish(e.value)}),this.choiceList.y=i,this.content.addChild(this.choiceList),this.delegate=this.choiceList,this.prompt.visible=!1}grow(e){let t=this.getLocalBounds();this.resize(t.width,t.height+e),this.y=Math.max(0,this.y-e)}finish(e){this.finished||(this.finished=!0,this.onDone?.(e),this.close())}},ED=/[A-Za-z0-9]/;function DD(e,t){let{lineHeight:n,columnHeight:r}=t,i=t.rotate??ED,a=[],o=0,s=0;for(let t of e){if(t===`
|
|
990
|
-
`){o++,s=0;continue}s*n>=r&&(o++,s=0);let e=i.test(t),c=o===0?0:-o*n;a.push({char:t,x:e?c-n/2:c,y:e?s*n+n/2:s*n,rotate:e}),s++}return a}var
|
|
989
|
+
`}},xE=class extends ds{constructor(e){super({glProgram:nu({name:`color-transform-batch`,bits:[au,yE,du(e),bu]}),gpuProgram:tu({name:`color-transform-batch`,bits:[iu,bE,lu(e),yu]}),resources:{batchSamplers:Rd(e)}}),this.maxTextures=e}},SE=7,CE=class extends Us{constructor(){let e=new Is({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Z.VERTEX|Z.COPY_DST,shrinkToFit:!1}),t=new Is({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Z.INDEX|Z.COPY_DST,shrinkToFit:!1});super({attributes:{aPosition:{buffer:e,format:`float32x2`,stride:28,offset:0},aUV:{buffer:e,format:`float32x2`,stride:28,offset:8},aColor:{buffer:e,format:`unorm8x4`,stride:28,offset:16},aTextureIdAndRound:{buffer:e,format:`uint16x2`,stride:28,offset:20},aColorAdd:{buffer:e,format:`unorm8x4`,stride:28,offset:24}},indexBuffer:t})}},wE=0,TE=e=>e.colorAdd??wE;function EE(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){e[n]=r*l+a*u+s,e[n+1]=o*u+i*l+c,e[n+2]=d,e[n+3]=f,t[n+4]=p,t[n+5]=m,t[n+6]=h}var DE=class e extends Md{static{this.extension={type:[f.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new CE,this.name=e.extension.name,this.vertexSize=SE,this.shader=new xE(t.maxTextures)}packAttributes(e,t,n,r,i){let a=i<<16|e.roundPixels&65535,{a:o,b:s,c,d:l,tx:u,ty:d}=e.transform,{positions:f,uvs:p}=e,m=e.color,h=TE(e),g=e.attributeOffset,_=g+e.attributeSize;for(let e=g;e<_;e++){let i=e*2,g=f[i],_=f[i+1];t[r++]=o*g+c*_+u,t[r++]=l*_+s*g+d,t[r++]=p[i],t[r++]=p[i+1],n[r++]=m,n[r++]=a,n[r++]=h}}packQuadAttributes(e,t,n,r,i){let{a,b:o,c:s,d:c,tx:l,ty:u}=e.transform,{bounds:d}=e,f=e.texture.uvs,p=d.maxX,m=d.minX,h=d.maxY,g=d.minY,_=e.color,v=TE(e),y=i<<16|e.roundPixels&65535;EE(t,n,r,a,o,s,c,l,u,m,g,f.x0,f.y0,_,y,v),r+=SE,EE(t,n,r,a,o,s,c,l,u,p,g,f.x1,f.y1,_,y,v),r+=SE,EE(t,n,r,a,o,s,c,l,u,p,h,f.x2,f.y2,_,y,v),r+=SE,EE(t,n,r,a,o,s,c,l,u,m,h,f.x3,f.y3,_,y,v)}_updateMaxTextures(e){this.shader.maxTextures!==e&&(this.shader.destroy(),this.shader=new xE(e))}destroy(){this.shader.destroy(),super.destroy()}},OE=`mwg-tinted-sprite`,kE=class{static{this.extension={type:[f.WebGLPipes,f.WebGPUPipes,f.CanvasPipes],name:OE}}constructor(e){this.renderer=e}addRenderable(e,t){let n=this.element(e);e.didViewUpdate&&this.sync(e,n),this.renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this.element(e);e.didViewUpdate&&this.sync(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this.element(e);return!t._batcher.checkAndUpdateTexture(t,e.texture)}sync(e,t){t.bounds=e.visualBounds,t.texture=e.texture,t.colorAdd=e.colorAdd}element(e){let t=e._gpuData;return t[this.renderer.uid]??this.create(e,t)}create(e,t){let n=new AE;return n.renderable=e,n.transform=e.groupTransform,n.texture=e.texture,n.bounds=e.visualBounds,n.roundPixels=this.renderer._roundPixels|e._roundPixels,n.colorAdd=e.colorAdd,t[this.renderer.uid]=n,n}destroy(){this.renderer=null}},AE=class{constructor(){this.batcherName=DE.extension.name,this.topology=`triangle-list`,this.attributeSize=4,this.indexSize=6,this.packAsQuad=!0,this.roundPixels=0,this.colorAdd=0,this._attributeStart=0,this._textureId=0,this._indexStart=0,this._batcher=null,this._batch=null}get blendMode(){return this.renderable.groupBlendMode}get color(){return this.renderable.groupColorAlpha}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.bounds=null,this.colorAdd=0}destroy(){this.reset()}},jE=!1;function ME(){jE||(jE=!0,h.add(DE),h.add(kE))}function NE(e,t,n,r=0){return(FE(r)<<24|FE(n)<<16|FE(t)<<8|FE(e))>>>0}function PE(e,t){return NE((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function FE(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var IE=wE,LE=class extends Hi{constructor(e){super(e),this._colorAdd=0,this.renderPipeId=OE}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=NE(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=PE(e,t)}silhouette(e){this.tint=0,this.colorAdd=PE(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}},RE=class{constructor(e,{fps:t=10,loop:n=!0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);this.frames=e,this.frameDuration=1/t,this.loop=n}get duration(){return this.frameDuration*this.frames.length}},zE=class extends LE{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.frameIndex=0,this.timer=0,this.finished=!1,this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new RE(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}play(e,t=!1){if(!t&&this.currentName===e&&!this.finished)return this;let n=this.animations.get(e);if(!n)throw Error(`no animation named "${e}" on this sprite`);return this.current=n,this.currentName=e,this.frameIndex=0,this.timer=0,this.finished=!1,this.texture=n.frames[0],this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;if(!(!t||this.paused||this.finished)){for(this.timer+=e;this.timer>=t.frameDuration;)if(this.timer-=t.frameDuration,this.frameIndex<t.frames.length-1)this.frameIndex++;else if(t.loop)this.frameIndex=0;else{this.finished=!0,this.onFinish?.(this.currentName);break}this.texture=t.frames[this.frameIndex]}}},BE=l({get:()=>XE,has:()=>KE,isCompiled:()=>WE,load:()=>JE,paths:()=>GE,resolve:()=>qE,setBase:()=>HE,texture:()=>YE}),VE=``;function HE(e){VE=e.endsWith(`/`)||e===``?e:e+`/`}function UE(){return typeof window>`u`?void 0:window.__MWG_ASSETS__}function WE(){return UE()!==void 0}function GE(){return Object.keys(UE()??{})}function KE(e){let t=UE();return!t||e in t}function qE(e){let t=UE();if(!t)return VE+e;let n=t[e];if(n===void 0)throw Error(`asset "${e}" is not in this build - check it is under the folder passed to compile-resources`);return n}async function JE(e){let t=e.filter(e=>!Sw.cache.has(e));if(t.length!==0){for(let e of t)Sw.add({alias:e,src:qE(e)});await Sw.load(t)}}function YE(e){if(!Sw.cache.has(e))throw Error(`texture "${e}" has not been loaded - pass it to load() first`);return Sw.get(e)}function XE(e){if(!Sw.cache.has(e))throw Error(`asset "${e}" has not been loaded - pass it to load() first`);return Sw.get(e)}var ZE=class e{constructor(e,t,n){this.frames=new Map,this.names=new Map,this.texture=e,this.frameWidth=t,this.frameHeight=n,this.columns=Math.floor(e.width/t),this.rows=Math.floor(e.height/n)}static grid(t,n,r=n){return new e(YE(t),n,r)}static fromTexture(t,n,r=n){return new e(t,n,r)}get count(){return this.columns*this.rows}name(e,t){return this.names.set(e,t),this}nameAll(e){for(let[t,n]of Object.entries(e))this.names.set(t,n);return this}indexOf(e){let t=this.names.get(e);if(t===void 0)throw Error(`this sheet has no frame named "${e}"`);return t}get(e){let t=typeof e==`string`?this.indexOf(e):e,n=this.frames.get(t);if(n)return n;if(t<0||t>=this.count)throw Error(`frame ${t} is outside this sheet, which holds ${this.count}`);let r=new W({source:this.texture.source,frame:new H(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}range(e,t){let n=[];for(let r=e;r<=t;r++)n.push(this.get(r));return n}pick(...e){return e.map(e=>this.get(e))}},QE=class{constructor(e={}){this.world=new K,this.x=0,this.y=0,this.viewWidth=0,this.viewHeight=0,this.followTarget=null,this.followIntensity=0,this.shakeMagnitude=0,this.shakeRemaining=0,this.shakeDuration=1,this.shakeX=0,this.shakeY=0,this.bounds=null,this._zoom=e.zoom??1,this.deadzone=e.deadzone??0}get zoom(){return this._zoom}set zoom(e){this._zoom=Math.max(.01,e)}setViewport(e,t){this.viewWidth=e,this.viewHeight=t}get view(){let e=this.viewWidth/this._zoom,t=this.viewHeight/this._zoom,{x:n,y:r}=this.clampedCentre(this.x,this.y);return{x:n-e/2,y:r-t/2,width:e,height:t}}setBounds(e){this.bounds=e}snapTo(e,t){this.x=e,this.y=t,this.followTarget=null,this.followIntensity=0,this.apply()}panTo(e,t,n=4){this.followTarget={x:e,y:t},this.followIntensity=n}follow(e,t=8){this.followTarget=e,this.followIntensity=t}stopFollowing(){this.followTarget=null,this.followIntensity=0}shake(e,t=.4){this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.view.width*this.deadzone/2,n=this.view.height*this.deadzone/2,r=this.followTarget.x-this.x,i=this.followTarget.y-this.y;r=r>t?r-t:r<-t?r+t:0,i=i>n?i-n:i<-n?i+n:0;let a=1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=WT(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=WT(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){return{x:(e-this.x)*this._zoom+this.viewWidth/2,y:(t-this.y)*this._zoom+this.viewHeight/2}}toWorld(e,t){return{x:(e-this.viewWidth/2)/this._zoom+this.x,y:(t-this.viewHeight/2)/this._zoom+this.y}}clampedCentre(e,t){if(!this.bounds)return{x:e,y:t};let n=this.viewWidth/this._zoom/2,r=this.viewHeight/this._zoom/2,{minX:i,minY:a,maxX:o,maxY:s}=this.bounds;return{x:o-i<n*2?(i+o)/2:$E(e,i+n,o-n),y:s-a<r*2?(a+s)/2:$E(t,a+r,s-r)}}apply(){let{x:e,y:t}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY);this.world.scale.set(this._zoom),this.world.x=Math.round(this.viewWidth/2-e*this._zoom),this.world.y=Math.round(this.viewHeight/2-t*this._zoom)}};function $E(e,t,n){return e<t?t:e>n?n:e}function eD(e={}){let t=new QE(e),n=kT.current;return t.setViewport(n.width,n.height),t}var tD=-1,nD=7237230,rD=10132122;function iD(e,t){if(!Number.isInteger(e)||e<0||e>=4096)throw Error(`tileFrame needs a sheet index from 0 to 4095, got ${e}`);if(!Number.isInteger(t)||t<0||t>=1<<20)throw Error(`tileFrame needs a frame index from 0 to ${(1<<20)-1}, got ${t}`);return e<<20|t}function aD(e){return e>>>20}function oD(e){return e&(1<<20)-1}var sD=class extends K{constructor(e){if(super(),this.layers=[],this.layersByName=new Map,this.chunks=[],this.widthInTiles=e.width,this.heightInTiles=e.height,this.sheets=Array.isArray(e.sheet)?[...e.sheet]:[e.sheet],this.sheets.length===0)throw Error(`a TileMap needs at least one sheet`);if(this.tileWidth=e.tileWidth??this.sheets[0].frameWidth,this.tileHeight=e.tileHeight??this.sheets[0].frameHeight,this.shape=e.shape??`square`,this.heightStep=e.heightStep??this.tileHeight/2,!(this.heightStep>0))throw Error(`a TileMap's heightStep must be a positive number, got ${e.heightStep}`);this.chunkSize=e.chunkSize??16,this.chunkColumns=Math.ceil(this.widthInTiles/this.chunkSize),this.chunkRows=Math.ceil(this.heightInTiles/this.chunkSize);let t=this.widthInTiles*this.heightInTiles;this.cellTint=new Uint32Array(t).fill(16777215),this.cellAdd=new Uint32Array(t),this.cellHeight=new Int32Array(t),this.faces=Array(t).fill(null)}get layerCount(){return this.layers.length}get worldWidth(){switch(this.shape){case`square`:return this.widthInTiles*this.tileWidth;case`hex`:return this.widthInTiles<=0?0:(this.widthInTiles-1)*this.tileWidth*.75+this.tileWidth;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileWidth/2);case`staggered`:return this.widthInTiles*this.tileWidth+this.tileWidth/2}}get worldHeight(){switch(this.shape){case`square`:return this.heightInTiles*this.tileHeight;case`hex`:return this.heightInTiles*this.tileHeight+this.tileHeight/2;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileHeight/2);case`staggered`:return this.heightInTiles*(this.tileHeight/2)+this.tileHeight/2}}inside(e,t){return e>=0&&t>=0&&e<this.widthInTiles&&t<this.heightInTiles}index(e,t){return t*this.widthInTiles+e}addLayer(e,t){if(this.layersByName.has(e))throw Error(`this map already has a layer named "${e}"`);let n=this.widthInTiles*this.heightInTiles;if(t&&t.length!==n)throw Error(`layer "${e}" has ${t.length} cells, but the map has ${n}`);let r=new K,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new K;i.push(e),r.addChild(e)}let a={name:e,data:t?Int32Array.from(t):new Int32Array(n).fill(-1),sprites:Array(n).fill(null),container:r};this.layers.push(a),this.layersByName.set(e,a),this.chunks.push(i),this.addChild(r);let o=this.layers.length===1;for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++){let n=a.data[this.index(t,e)];n!==-1&&this.buildSprite(a,t,e,n),o&&this.syncFaces(t,e)}return this}layerAt(e){let t=typeof e==`number`?this.layers[e]:this.layersByName.get(e);if(!t)throw Error(`no such layer: ${e}`);return t}chunkIndex(e,t){return Math.floor(t/this.chunkSize)*this.chunkColumns+Math.floor(e/this.chunkSize)}projectedCenter(e,t){switch(this.shape){case`square`:return{x:(e+.5)*this.tileWidth,y:(t+.5)*this.tileHeight};case`hex`:return _E(e,t,this.tileWidth,this.tileHeight);case`isometric`:return{x:(e-t+(this.heightInTiles-1))*(this.tileWidth/2)+this.tileWidth/2,y:(e+t)*(this.tileHeight/2)+this.tileHeight/2};case`staggered`:return{x:e*this.tileWidth+(t&1)*(this.tileWidth/2)+this.tileWidth/2,y:t*(this.tileHeight/2)+this.tileHeight/2}}}projectedTile(e,t){switch(this.shape){case`square`:return{x:Math.floor(e/this.tileWidth),y:Math.floor(t/this.tileHeight)};case`hex`:return vE(e,t,this.tileWidth,this.tileHeight);case`isometric`:{let n=(e-this.tileWidth/2)/(this.tileWidth/2)-(this.heightInTiles-1),r=(t-this.tileHeight/2)/(this.tileHeight/2);return{x:Math.round((n+r)/2),y:Math.round((r-n)/2)}}case`staggered`:{let n=Math.round((t-this.tileHeight/2)/(this.tileHeight/2));return{x:Math.round((e-this.tileWidth/2-(n&1)*(this.tileWidth/2))/this.tileWidth),y:n}}}}cellOrigin(e,t){let n=this.projectedCenter(e,t);return{x:n.x-this.tileWidth/2,y:n.y-this.tileHeight/2}}textureFor(e){let t=aD(e);if(t>=this.sheets.length)throw Error(`frame ${e} names sheet ${t}, but this map has ${this.sheets.length}`);return this.sheets[t].get(oD(e))}buildSprite(e,t,n,r){let i=new LE(this.textureFor(r)),a=this.cellOrigin(t,n);i.x=a.x,i.y=a.y-this.cellHeight[this.index(t,n)]*this.heightStep;let o=this.index(t,n);return i.tint=this.cellTint[o],i.colorAdd=this.cellAdd[o],e.sprites[o]=i,this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)].addChild(i),i}getTile(e,t,n){return this.inside(t,n)?this.layerAt(e).data[this.index(t,n)]:-1}setTile(e,t,n,r){if(!this.inside(t,n))return;let i=this.layerAt(e),a=this.index(t,n);if(i.data[a]===r)return;i.data[a]=r;let o=i.sprites[a];r===-1?(o?.destroy(),i.sprites[a]=null):o?o.texture=this.textureFor(r):this.buildSprite(i,t,n,r),this.layers[0]===i&&this.syncFaces(t,n)}setLayerData(e,t){this.layerAt(e);for(let n=0;n<this.heightInTiles;n++)for(let r=0;r<this.widthInTiles;r++)this.setTile(e,r,n,t[this.index(r,n)]??-1)}setCellColor(e,t,n,r=0){if(!this.inside(e,t))return;let i=this.index(e,t);if(this.cellTint[i]===n&&this.cellAdd[i]===r)return;this.cellTint[i]=n,this.cellAdd[i]=r;for(let e of this.layers){let t=e.sprites[i];t&&(t.tint=n,t.colorAdd=r)}let a=this.faces[i];a&&(a.tint=n)}getCellTint(e,t){return this.inside(e,t)?this.cellTint[this.index(e,t)]:0}clearColors(){for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)this.setCellColor(t,e,16777215,0)}setCellHeight(e,t,n){if(!this.inside(e,t))return;if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);let r=this.index(e,t);if(this.cellHeight[r]===n)return;this.cellHeight[r]=n;let i=n*this.heightStep;for(let n of this.layers){let a=n.sprites[r];a&&(a.y=this.cellOrigin(e,t).y-i)}this.syncFaces(e,t)}getCellHeight(e,t){return this.inside(e,t)?this.cellHeight[this.index(e,t)]:0}get faceCount(){return this.faces.filter(e=>e!==null).length}syncFaces(e,t){if(this.layers.length===0)return;let n=this.index(e,t),r=(this.shape===`isometric`||this.shape===`staggered`)&&this.cellHeight[n]>0&&this.layers[0].data[n]!==-1,i=this.faces[n];if(!r){i&&(i.destroy(),this.faces[n]=null);return}let a=i??new fx;if(this.drawFaces(a,e,t),a.tint=this.cellTint[n],!i){this.faces[n]=a;let r=this.chunks[0][this.chunkIndex(e,t)],i=this.layers[0].sprites[n];i?r.addChildAt(a,r.getChildIndex(i)):r.addChild(a)}}drawFaces(e,t,n){let r=this.cellOrigin(t,n),i=r.x,a=r.y,o=this.tileWidth/2,s=this.tileHeight/2,c=this.heightStep,l=this.cellHeight[this.index(t,n)];e.clear();for(let t=1;t<=l;t++){let n=t*c,r=(t-1)*c;e.poly([i,a+s-n,i+o,a+s*2-n,i+o,a+s*2-r,i,a+s-r]).fill(nD),e.poly([i+o,a+s*2-n,i+o*2,a+s-n,i+o*2,a+s-r,i+o,a+s*2-r]).fill(rD)}}toTile(e,t){return this.projectedTile(e,t)}tileCenter(e,t){let n=this.projectedCenter(e,t);return n.y-=this.getCellHeight(e,t)*this.heightStep,n}cull(e){let t=e.view,n=this.projectedTile(t.x,t.y),r=this.projectedTile(t.x+t.width,t.y),i=this.projectedTile(t.x,t.y+t.height),a=this.projectedTile(t.x+t.width,t.y+t.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y),u=Math.floor(o/this.chunkSize)-1,d=Math.floor(s/this.chunkSize)+1,f=Math.floor(c/this.chunkSize)-1,p=Math.floor(l/this.chunkSize)+1;for(let e=0;e<this.chunkRows;e++){let t=e>=f&&e<=p;for(let n=0;n<this.chunkColumns;n++){let r=t&&n>=u&&n<=d,i=e*this.chunkColumns+n;for(let e of this.chunks)e[i].renderable=r}}}get visibleChunks(){return this.chunks.length===0?0:this.chunks[0].filter(e=>e.renderable).length}},cD=class extends K{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new LE(t);return this.layers.set(e,{sprite:r,order:n}),this.addChild(r),this.resort(),r}removeLayer(e){let t=this.layers.get(e);t&&(this.layers.delete(e),t.sprite.destroy())}layer(e){return this.layers.get(e)?.sprite}hasLayer(e){return this.layers.has(e)}setTexture(e,t){let n=this.layers.get(e);n&&(n.sprite.texture=t)}resort(){[...this.layers.values()].sort((e,t)=>e.order-t.order).forEach((e,t)=>this.setChildIndex(e.sprite,t))}},lD=class{constructor(e,t,n,r={}){this.elapsed=0,this.arrived=!1,this.sprite=e,this.fromX=t.x,this.fromY=t.y,this.toX=n.x,this.toY=n.y;let i=Math.hypot(n.x-t.x,n.y-t.y);this.duration=r.duration??i/(r.speed??400),this.duration<=0&&(this.duration=1e-6),e.x=t.x,e.y=t.y}get done(){return this.arrived}get progress(){return Math.min(1,this.elapsed/this.duration)}update(e){if(this.arrived)return!1;this.elapsed+=e;let t=this.progress;return this.sprite.x=this.fromX+(this.toX-this.fromX)*t,this.sprite.y=this.fromY+(this.toY-this.fromY)*t,t>=1&&(this.arrived=!0,!0)}},uD=class{constructor(e,t){this.idleOrMove=`idle`,this.inAction=!1,this.sprite=e,this.animationName=t.animationName,this.variant=t.variant??``,this.sprite.onFinish=()=>this.onSpriteFinish(),this.apply(this.idleOrMove)}get state(){return this.inAction?`action`:this.idleOrMove}get variantName(){return this.variant}setMoving(e,t){t!==void 0&&(this.variant=t),this.idleOrMove=e?`move`:`idle`,this.inAction||this.apply(this.idleOrMove)}playAction(e,t=!1){this.inAction&&!t||(e!==void 0&&(this.variant=e),this.inAction=!0,this.apply(`action`))}onSpriteFinish(){this.inAction&&(this.inAction=!1,this.apply(this.idleOrMove))}apply(e){let t=this.animationName(e,this.variant);this.sprite.has(t)&&this.sprite.play(t,e===`action`)}},dD=mD(),fD=new Map(dD.map((e,t)=>[pD(e),t]));function pD(e){let t=e.ne&&e.n&&e.e,n=e.se&&e.s&&e.e,r=e.sw&&e.s&&e.w,i=e.nw&&e.n&&e.w;return+!!e.n|(e.e?2:0)|(e.s?4:0)|(e.w?8:0)|(t?16:0)|(n?32:0)|(r?64:0)|(i?128:0)}function mD(){let e=new Set,t=[];for(let n=0;n<256;n++){let r={n:!!(n&1),e:!!(n&2),s:!!(n&4),w:!!(n&8),ne:!!(n&16),se:!!(n&32),sw:!!(n&64),nw:!!(n&128)},i=pD(r);e.has(i)||(e.add(i),t.push({mask:i,shape:{n:r.n,e:r.e,s:r.s,w:r.w,ne:r.ne&&r.n&&r.e,se:r.se&&r.s&&r.e,sw:r.sw&&r.s&&r.w,nw:r.nw&&r.n&&r.w}}))}return t.sort((e,t)=>e.mask-t.mask),t.map(e=>e.shape)}function hD(e){return fD.get(pD(e))}function gD(e,t,n,r){if(r.length!==dD.length)throw Error(`autotileFrames needs exactly ${dD.length} frames, got ${r.length}`);let i=new Int32Array(e*t);for(let a=0;a<t;a++)for(let t=0;t<e;t++){let o=a*e+t;if(!n(t,a)){i[o]=-1;continue}i[o]=r[hD({n:n(t,a-1),e:n(t+1,a),s:n(t,a+1),w:n(t-1,a),ne:n(t+1,a-1),se:n(t+1,a+1),sw:n(t-1,a+1),nw:n(t-1,a-1)})]}return i}var _D={panelBorder:4,padding:8,spacing:2,direction:`ltr`,font:{family:`ui-monospace, Consolas, "DejaVu Sans Mono", monospace`,size:12,lineHeight:1.4},color:{text:15263984,textDim:9079446,textHighlight:16770688,panelFill:1842214,panelBorder:4868702,selection:3820154,overlay:0},overlayAlpha:.5},vD=_D;function yD(){return vD}function bD(e){vD={..._D,...e,font:{..._D.font,...e.font},color:{..._D.color,...e.color}}}var xD=class extends Ww{constructor(e={}){let t=typeof e==`string`?{text:e}:e,n=yD();super({text:t.text??``,style:new GS({fontFamily:n.font.family,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:t.align??(n.direction===`rtl`?`right`:`left`),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})})}setColor(e){this.style.fill=e}setText(e){this.text!==e&&(this.text=e)}},SD=class extends K{constructor(e,t){super();let n=typeof t.border==`number`?{left:t.border,top:t.border,right:t.border,bottom:t.border}:t.border;this.sprite=new $w({texture:e,leftWidth:n.left,topHeight:n.top,rightWidth:n.right,bottomHeight:n.bottom}),this.addChild(this.sprite)}get border(){return{left:this.sprite.leftWidth,top:this.sprite.topHeight,right:this.sprite.rightWidth,bottom:this.sprite.bottomHeight}}resize(e,t){let n=this.border;this.sprite.width=Math.max(e,n.left+n.right),this.sprite.height=Math.max(t,n.top+n.bottom)}},CD=class extends K{constructor(e){super(),this.content=new K,this.onClose=new tT,this.titleLabel=null,this.innerWidth=0,this.innerHeight=0,this.delegate=null;let t=yD();this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,this.background=t.panel?new SD(t.panel,{border:t.panelBorder}):new fx,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new xD({text:e.title,color:t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel)),this.addChild(this.content),this.resize(e.width,e.height)}resize(e,t){let n=yD(),r=(this.background instanceof SD?this.background.border.left:2)+n.padding;this.background instanceof SD?this.background.resize(e,t):this.background.clear().roundRect(0,0,e,t,4).fill({color:n.color.panelFill}).stroke({color:n.color.panelBorder,width:1});let i=r;this.titleLabel&&(this.titleLabel.x=n.direction===`rtl`?e-r-this.titleLabel.width:r,this.titleLabel.y=r,i=r+this.titleLabel.height+n.padding),this.content.x=r,this.content.y=i,this.innerWidth=Math.max(0,e-r*2),this.innerHeight=Math.max(0,t-i-r)}get contentWidth(){return this.innerWidth}get contentHeight(){return this.innerHeight}setTitle(e){this.titleLabel?.setText(e)}handleAction(e){return this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}update(e){}close(){this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0})}place(e,t){let n=this.getLocalBounds(),r=yD().padding*2;this.x=Math.round((e-n.width)/2),this.y=this.anchor===`bottom`?Math.round(t-n.height-r):this.anchor===`top`?r:Math.round((t-n.height)/2)}},wD=class extends K{constructor(){super(),this.windows=[],this.overlay=new fx,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.overlay.visible=!1,this.addChild(this.overlay),sT.add(this.listener)}setViewport(e,t){this.viewportWidth=e,this.viewportHeight=t,this.drawOverlay();for(let n of this.windows)n.place(e,t)}get top(){return this.windows[this.windows.length-1]??null}get isEmpty(){return this.windows.length===0}get depth(){return this.windows.length}push(e){return this.windows.push(e),this.addChild(e),e.onClose.add(()=>(this.forget(e),!1)),e.place(this.viewportWidth,this.viewportHeight),this.updateOverlay(),e}pop(){this.top?.close()}closeAll(){for(let e of[...this.windows].reverse())e.close()}forget(e){let t=this.windows.indexOf(e);t!==-1&&this.windows.splice(t,1),this.updateOverlay()}updateOverlay(){let e=this.windows.findIndex(e=>e.dims);if(e===-1){this.overlay.visible=!1;return}this.overlay.visible=!0,this.setChildIndex(this.overlay,Math.max(0,this.getChildIndex(this.windows[e])-1))}drawOverlay(){let e=yD();this.overlay.clear().rect(0,0,this.viewportWidth,this.viewportHeight).fill({color:e.color.overlay,alpha:e.overlayAlpha})}handleAction(e){return this.top?.handleAction(e)??!1}get blocksWorld(){return this.windows.some(e=>e.modal)}update(e){this.top?.update(e)}destroy(e){sT.remove(this.listener),super.destroy(e)}},TD=class extends K{constructor(e){super(),this.items=[],this.rows=[],this.rowsLayer=new K,this.highlight=new fx,this.mask_=new fx,this.index=0,this.scroll=0;let t=yD();this.viewWidth=e.width,this.viewHeight=e.height,this.rowHeight=e.rowHeight??Math.ceil(t.font.size*t.font.lineHeight)+t.spacing,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.addChild(this.highlight),this.addChild(this.rowsLayer),this.addChild(this.mask_),this.rowsLayer.mask=this.mask_,this.drawMask(),this.setItems(e.items??[])}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.rowHeight))}get selectedIndex(){return this.index}get selected(){return this.items[this.index]??null}get length(){return this.items.length}setItems(e){this.items=e;for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=yD(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new K;i.y=r*this.rowHeight,e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.rowHeight:t.spacing,i.addChild(e.icon));let a=new xD({text:e.text,color:e.disabled?t.color.textDim:t.color.text}),o=t.spacing+(e.icon?this.rowHeight:0);a.x=n?this.viewWidth-o-a.width:o,a.y=Math.round((this.rowHeight-a.height)/2),i.addChild(a),this.rows.push(i),this.rowsLayer.addChild(i)}),this.index=this.items.findIndex(e=>!e.disabled),this.index===-1&&(this.index=0),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){if(this.items.length===0)return!1;let t=this.index;for(let n=0;n<this.items.length;n++)if(t=(t+e+this.items.length)%this.items.length,!this.items[t].disabled)return this.index=t,this.refresh(),this.onHighlight?.(this.items[t],t),!0;return!1}select(e){e<0||e>=this.items.length||this.items[e].disabled||(this.index=e,this.refresh(),this.onHighlight?.(this.items[e],e))}confirm(){let e=this.selected;return!e||e.disabled?!1:(this.onSelect?.(e,this.index),!0)}handleAction(e){switch(e){case`up`:return this.move(-1);case`down`:return this.move(1);case`confirm`:return this.confirm();default:return!1}}refresh(){let e=this.visibleRows;this.index<this.scroll?this.scroll=this.index:this.index>=this.scroll+e&&(this.scroll=this.index-e+1),this.scroll=Math.max(0,Math.min(this.scroll,Math.max(0,this.items.length-e))),this.rowsLayer.y=-this.scroll*this.rowHeight;let t=yD();if(this.items.length===0){this.highlight.clear();return}this.highlight.clear().rect(0,(this.index-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:t.color.selection})}},ED=class extends K{constructor(e){super(),this.items=[],this.cells=[],this.cellsLayer=new K,this.highlight=new fx,this.pickupHighlight=new fx,this.mask_=new fx,this.index=0,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.viewWidth=e.width,this.viewHeight=e.height,this.columns=Math.max(1,e.columns),this.cellSize=e.cellSize??Math.floor(this.viewWidth/this.columns),this.longPressDuration=e.longPressDuration??.6,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onQuickslot=e.onQuickslot??null,this.onReorder=e.onReorder??null,this.addChild(this.highlight),this.addChild(this.pickupHighlight),this.addChild(this.cellsLayer),this.addChild(this.mask_),this.cellsLayer.mask=this.mask_,this.drawMask(),this.setItems(e.items??[])}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.cellSize))}get rows(){return Math.max(1,Math.ceil(this.items.length/this.columns))}get selectedIndex(){return this.index}get selected(){return this.items[this.index]??null}get length(){return this.items.length}setItems(e){this.items=e,this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=yD();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new K;if(a.x=i*this.cellSize,a.y=r*this.cellSize,a.eventMode=`static`,a.cursor=e.disabled?`default`:`pointer`,e.icon.x=Math.round((this.cellSize-e.icon.width)/2),e.icon.y=Math.round((this.cellSize-e.icon.height)/2),e.disabled&&(e.icon.alpha=.4),a.addChild(e.icon),(e.quantity??1)>1){let n=new xD({text:String(e.quantity),size:10,color:t.color.textHighlight});n.x=this.cellSize-n.width-2,n.y=this.cellSize-n.height-1,a.addChild(n)}a.on(`pointerdown`,()=>{this.pressedIndex=n,this.pressTimer=0}),a.on(`pointerup`,()=>this.releaseCell(n)),a.on(`pointerupoutside`,()=>this.releaseCell(n)),this.cells.push(a),this.cellsLayer.addChild(a)}),this.index=this.items.findIndex(e=>!e.disabled),this.index===-1&&(this.index=0),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.items[e]?.disabled||this.tapCell(e))}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}update(e){if(this.pressedIndex===null||(this.pressTimer+=e,this.pressTimer<this.longPressDuration))return;let t=this.pressedIndex;this.pressedIndex=null;let n=this.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){if(e<0||e>=this.items.length)return;if(this.pickedUp===null){if(this.items[e].disabled)return;this.pickedUp=e,this.refresh();return}let t=this.pickedUp;this.pickedUp=null,t!==e&&(this.swapCells(t,e),this.onReorder?.(t,e)),this.refresh()}swapCells(e,t){[this.items[e],this.items[t]]=[this.items[t],this.items[e]];let n=this.cells[e],r=this.cells[t],i=n.removeChildren(),a=r.removeChildren();for(let e of a)n.addChild(e);for(let e of i)r.addChild(e);n.cursor=this.items[e].disabled?`default`:`pointer`,r.cursor=this.items[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){if(this.items.length===0)return!1;let n=this.items.length,r=this.rows,i=Math.floor(this.index/this.columns),a=this.index%this.columns;for(let o=0;o<r*this.columns;o++){a=(a+e+this.columns)%this.columns,i=(i+t+r)%r;let o=i*this.columns+a;if(o<n&&!this.items[o].disabled)return this.index=o,this.refresh(),this.onHighlight?.(this.items[o],o),!0}return!1}select(e){e<0||e>=this.items.length||this.items[e].disabled||(this.index=e,this.refresh(),this.onHighlight?.(this.items[e],e))}confirm(){let e=this.selected;return!e||e.disabled?!1:(this.onSelect?.(e,this.index),!0)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move(-1,0);case`right`:return this.move(1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:e%this.columns*this.cellSize,y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=Math.floor(this.index/this.columns);t<this.scrollRow?this.scrollRow=t:t>=this.scrollRow+e&&(this.scrollRow=t-e+1),this.scrollRow=Math.max(0,Math.min(this.scrollRow,Math.max(0,this.rows-e))),this.cellsLayer.y=-this.scrollRow*this.cellSize;let n=yD();if(this.pickupHighlight.clear(),this.pickedUp!==null){let{x:e,y:t}=this.cellRect(this.pickedUp);this.pickupHighlight.rect(e,t,this.cellSize,this.cellSize).stroke({color:n.color.textHighlight,width:2})}if(this.highlight.clear(),this.items.length>0){let{x:e,y:t}=this.cellRect(this.index);this.highlight.rect(e,t,this.cellSize,this.cellSize).fill({color:n.color.selection})}}},DD=class extends CD{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.revealed=0,this.portrait=null,this.portraitLayer=new K,this.choiceList=null,this.finished=!1,this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.choices=e.choices??[],this.onDone=e.onDone??null;let t=yD();this.content.addChild(this.portraitLayer),this.speakerLabel=new xD({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new xD({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new xD({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0)}showPage(e){let t=this.pages[e],n=yD(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new Hi(t.portrait),r&&(this.portrait.x=this.contentWidth-this.portrait.width),this.portraitLayer.addChild(this.portrait),a=this.contentWidth-this.portrait.width-n.padding,i=r?0:this.portrait.width+n.padding),this.speakerLabel.visible=t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=t.speaker===void 0?0:this.speakerLabel.height+n.spacing,this.body.style.wordWrapWidth=Math.max(16,a),this.revealed=this.speed>0?0:t.text.length,this.body.setText(t.text.slice(0,this.revealed)),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}get pageComplete(){return this.revealed>=this.pages[this.pageIndex].text.length}update(e){if(this.finished||this.pageComplete){this.prompt.visible=this.pageComplete&&!this.choiceList;return}this.revealed=Math.min(this.pages[this.pageIndex].text.length,this.revealed+this.speed*e),this.body.setText(this.pages[this.pageIndex].text.slice(0,Math.floor(this.revealed)))}handleAction(e){return this.delegate?super.handleAction(e):e===`confirm`?this.pageComplete?this.pageIndex<this.pages.length-1?(this.pageIndex++,this.showPage(this.pageIndex),!0):this.choices.length>0?(this.showChoices(),!0):(this.finish(void 0),!0):(this.revealed=this.pages[this.pageIndex].text.length,this.body.setText(this.pages[this.pageIndex].text),!0):!1}showChoices(){let e=yD(),t=this.choices.map(e=>({text:e.text,disabled:e.disabled,value:e.value??e.text})),n=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing,r=t.length*n,i=this.body.y+this.body.height+e.padding,a=i+r-this.contentHeight;a>0&&this.grow(a),this.choiceList=new TD({width:this.contentWidth,height:r,items:t,onSelect:e=>this.finish(e.value)}),this.choiceList.y=i,this.content.addChild(this.choiceList),this.delegate=this.choiceList,this.prompt.visible=!1}grow(e){let t=this.getLocalBounds();this.resize(t.width,t.height+e),this.y=Math.max(0,this.y-e)}finish(e){this.finished||(this.finished=!0,this.onDone?.(e),this.close())}},OD=/[A-Za-z0-9]/;function kD(e,t){let{lineHeight:n,columnHeight:r}=t,i=t.rotate??OD,a=[],o=0,s=0;for(let t of e){if(t===`
|
|
990
|
+
`){o++,s=0;continue}s*n>=r&&(o++,s=0);let e=i.test(t),c=o===0?0:-o*n;a.push({char:t,x:e?c-n/2:c,y:e?s*n+n/2:s*n,rotate:e}),s++}return a}var AD=class extends K{constructor(e){super();let t=yD(),n=e.size??t.font.size,r=Math.ceil(n*t.font.lineHeight),i=kD(e.text,{lineHeight:r,columnHeight:e.columnHeight,rotate:e.rotate});for(let r of i){let i=new Ww({text:r.char,style:{fontFamily:t.font.family,fontSize:n,fill:e.color??t.color.text}});r.rotate&&(i.anchor.set(.5),i.rotation=Math.PI/2),i.x=r.x,i.y=r.y,this.addChild(i)}}},jD={farLeft:.12,left:.28,center:.5,right:.72,farRight:.88},MD=class extends K{constructor(e,t){super(),this.backdropLayer=new K,this.actorLayer=new K,this.backdrop=null,this.outgoingBackdrop=null,this.actors=new Map,this.definitions=new Map,this.focused=null,this.tweens=[],this.dimAmount=.45,this.stageWidth=e,this.stageHeight=t,this.addChild(this.backdropLayer),this.addChild(this.actorLayer)}defineCharacter(e,t){this.definitions.set(e,t)}resize(e,t){this.stageWidth=e,this.stageHeight=t;for(let e of[this.backdrop,this.outgoingBackdrop])e&&this.fitBackdrop(e);for(let e of this.actors.values())this.placeActor(e)}setBackdrop(e,t=.4){this.outgoingBackdrop?.destroy();let n=this.backdrop;this.outgoingBackdrop=n;let r=new Hi(e);this.fitBackdrop(r),this.backdrop=r,this.backdropLayer.addChild(r);let i=()=>{this.outgoingBackdrop===n&&(n?.destroy(),this.outgoingBackdrop=null)};return t<=0?(i(),Promise.resolve()):(r.alpha=0,this.tween(t,e=>{r.alpha=e}).then(i))}fitBackdrop(e){let t=e.texture,n=Math.max(this.stageWidth/t.width,this.stageHeight/t.height);e.scale.set(n),e.x=Math.round((this.stageWidth-t.width*n)/2),e.y=Math.round((this.stageHeight-t.height*n)/2)}show(e,t={}){let n=this.definitions.get(e);if(!n)throw Error(`no character defined as "${e}"`);let r=t.expression??Object.keys(n.expressions)[0],i=this.actors.get(e);if(i)return t.at!==void 0&&(i.slot=this.slotOf(t.at)),this.setExpression(e,r),this.placeActor(i),Promise.resolve();let a=new LE(n.sheet.get(n.expressions[r])),o={id:e,sprite:a,definition:n,slot:this.slotOf(t.at??`center`),expression:r};this.actors.set(e,o),this.actorLayer.addChild(a),this.placeActor(o),this.applyFocus();let s=t.fade??.25;return s<=0?Promise.resolve():(a.alpha=0,this.tween(s,e=>{a.alpha=e}))}hide(e,t=.25){let n=this.actors.get(e);return n?(this.actors.delete(e),this.focused===e&&(this.focused=null),this.applyFocus(),t<=0?(n.sprite.destroy(),Promise.resolve()):this.tween(t,e=>{n.sprite.alpha=1-e}).then(()=>n.sprite.destroy())):Promise.resolve()}hideAll(e=.25){return Promise.all([...this.actors.keys()].map(t=>this.hide(t,e))).then(()=>void 0)}setExpression(e,t){let n=this.actors.get(e);if(!n)return;let r=n.definition.expressions[t];if(r===void 0)throw Error(`character "${e}" has no expression "${t}"`);n.expression=t,n.sprite.texture=n.definition.sheet.get(r)}focus(e){this.focused=e,this.applyFocus()}applyFocus(){let e=Math.round(255*(1-this.dimAmount)),t=e<<16|e<<8|e;for(let e of this.actors.values()){let n=this.focused!==null&&e.id!==this.focused;e.sprite.tint=n?t:16777215}}slotOf(e){return typeof e==`number`?e:jD[e]}placeActor(e){let t=e.definition,n=(t.height??.7)*this.stageHeight,r=n/t.sheet.frameHeight;e.sprite.scale.set(r),e.sprite.x=Math.round(e.slot*this.stageWidth-t.sheet.frameWidth*r/2),e.sprite.y=Math.round((t.baseline??.92)*this.stageHeight-n)}tween(e,t){return new Promise(n=>{this.tweens.push({elapsed:0,duration:e,apply:t,resolve:n})})}update(e){if(this.tweens.length!==0)for(let t of[...this.tweens]){t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.apply(n),n>=1&&(this.tweens.splice(this.tweens.indexOf(t),1),t.resolve())}}get isBusy(){return this.tweens.length>0}},ND=class{constructor(e){this.state={answers:{}},this.cancelled=!1,this.options=e}cancel(){this.cancelled=!0}async run(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)throw Error(`a "goto ${e}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async step(e){let{stage:t}=this.options;if(`backdrop`in e){await t.setBackdrop(this.options.backdrop(e.backdrop),e.fade);return}if(`show`in e){await t.show(e.show,{at:e.at,expression:e.expression,fade:e.fade});return}if(`hide`in e){await t.hide(e.hide,e.fade);return}if(`hideAll`in e){await t.hideAll(e.fade);return}if(`expression`in e){t.setExpression(e.of,e.expression);return}if(`say`in e){await this.speak(e.say,e.as,e.speaker);return}if(`ask`in e){let t=await this.speak(e.ask,e.as,e.speaker,e.choices);return e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`goto`in e)return e.goto;if(`wait`in e){await new Promise(t=>setTimeout(t,e.wait*1e3));return}`call`in e&&await e.call(this.state)}speak(e,t,n,r){let{stage:i,windows:a}=this.options;i.focus(t??null);let o=n??(t?this.options.displayName?.(t)??t:void 0);return new Promise(t=>{a.push(new DD({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:this.options.speed??45,pages:[{text:e,speaker:o}],choices:r,dims:!1,anchor:`bottom`,onDone:e=>t(e)}))})}};function PD(e){let t=FD(e);if(t.length===0)throw Error(`this twee source has no passages - passages start with ":: Name"`);let n={},r,i;for(let e of t){if(e.name===`StoryTitle`){r=e.body.trim()||void 0;continue}if(e.name===`StoryData`){i=LD(e.body);continue}if(Object.prototype.hasOwnProperty.call(n,e.name))throw Error(`this twee source defines "${e.name}" twice`);n[e.name]=RD(e.name,e.body)}let a=Object.keys(n);if(a.length===0)throw Error(`this twee source has no story passages, only StoryTitle/StoryData`);if(i!==void 0&&!Object.prototype.hasOwnProperty.call(n,i))throw Error(`StoryData starts at "${i}", which is not a passage in this file`);for(let[e,t]of Object.entries(n))for(let r of t)if(`ask`in r){for(let t of r.choices)if(t.goto!==void 0&&!Object.prototype.hasOwnProperty.call(n,t.goto))throw Error(`passage "${e}" links to "${t.goto}", which is not a passage in this file`)}return{story:n,start:i??a[0],title:r}}function FD(e){let t=[],n=null,r=[],i=()=>{n!==null&&t.push({name:n,body:r.join(`
|
|
991
991
|
`)})};for(let t of e.split(`
|
|
992
|
-
`))t.startsWith(`::`)?(i(),n=
|
|
993
|
-
`)){let t=LD(i,r,e).replace(/\s+/g,` `).trim();t!==``&&n.push(t)}if(r.length===0)return n.map(e=>({say:e}));let i=n.pop()??``;return[...n.map(e=>({say:e})),{ask:i,choices:r}]}function LD(e,t,n){let r=``,i=e;for(;;){let a=i.indexOf(`[[`);if(a===-1)return r+i;let o=i.indexOf(`]]`,a);if(o===-1)throw Error(`passage "${n}" has a "[[" with no closing "]]" in "${e.trim()}"`);r+=i.slice(0,a),t.push(RD(i.slice(a+2,o),n)),i=i.slice(o+2)}}function RD(e,t){if(e.includes(`[`)||e.includes(`]`))throw Error(`passage "${t}" links with a setter ("${e.trim()}") - story-format macros are not imported, so the link is refused rather than half-read`);let n=e.indexOf(`->`);if(n!==-1)return{text:e.slice(0,n).trim(),goto:e.slice(n+2).trim()};let r=e.indexOf(`<-`);if(r!==-1)return{text:e.slice(r+2).trim(),goto:e.slice(0,r).trim()};let i=e.trim();return{text:i,goto:i}}function zD(e){return e===4?[[0,-1],[1,0],[0,1],[-1,0]]:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]]}var BD={passable:!1,transparent:!1},VD={passable:!0,transparent:!0},HD=class e{constructor(e,t,n,r=0,i=`square`){this.rooms=[],this.width=e,this.shape=i,this.height=t,this.kinds=n,this.terrain=new Uint8Array(e*t).fill(r)}get cellCount(){return this.width*this.height}index(e,t){return t*this.width+e}xOf(e){return e%this.width}yOf(e){return Math.floor(e/this.width)}inside(e,t){return e>=0&&t>=0&&e<this.width&&t<this.height}neighbors(e,t,n=8){return this.shape===`hex`?kE(e,t):zD(n).map(([n,r])=>({x:e+n,y:t+r}))}insideWithBorder(e,t){return e>0&&t>0&&e<this.width-1&&t<this.height-1}get(e,t){return this.inside(e,t)?this.terrain[this.index(e,t)]:0}set(e,t,n){this.inside(e,t)&&(this.terrain[this.index(e,t)]=n)}kindAt(e,t){return this.kinds[this.get(e,t)]??BD}passable(e,t){return this.inside(e,t)&&this.kindAt(e,t).passable}transparent(e,t){return this.inside(e,t)&&this.kindAt(e,t).transparent}fillRect(e,t){for(let n=e.top;n<=e.bottom;n++)for(let r=e.left;r<=e.right;r++)this.set(r,n,t)}passableCells(){let e=[];for(let t=0;t<this.terrain.length;t++)this.kinds[this.terrain[t]]?.passable&&e.push(t);return e}toJSON(){return{width:this.width,height:this.height,shape:this.shape,terrain:[...this.terrain],rooms:this.rooms.map(e=>({...e}))}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function UD(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function WD(e,t,n=0){return!(e.right+n<t.left||t.right+n<e.left||e.bottom+n<t.top||t.bottom+n<e.top)}var GD=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function KD(e){let{width:t,height:n,rooms:r=14,minRoomSize:i=4,maxRoomSize:a=10,extraCorridors:o=3,wall:s=0,floor:c=1,kinds:l=[]}=e,u=new HD(t,n,[...GD,...l],s),d=[];for(let e=0;e<r*6&&d.length<r;e++){let e=uE(i,a),r=uE(i,a),o=lE(1,Math.max(2,t-e-1)),s=lE(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};l.right>=t-1||l.bottom>=n-1||d.some(e=>WD(l,e,2))||(d.push(l),u.fillRect(l,c))}for(let e=1;e<d.length;e++)qD(u,UD(d[e-1]),UD(d[e]),c);for(let e=0;e<o&&d.length>2;e++){let e=d[lE(d.length)],t=d[lE(d.length)];e!==t&&qD(u,UD(e),UD(t),c)}return u.rooms=d,u}function qD(e,t,n,r){fE(.5)?(JD(e,t.x,n.x,t.y,!0,r),JD(e,t.y,n.y,n.x,!1,r)):(JD(e,t.y,n.y,t.x,!1,r),JD(e,t.x,n.x,n.y,!0,r))}function JD(e,t,n,r,i,a){let o=t<=n?1:-1;for(let s=t;s!==n+o;s+=o){let t=i?s:r,n=i?r:s;e.insideWithBorder(t,n)&&e.set(t,n,a)}}function YD(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[lE(n.length)]:null}function XD(e,t){let n=null,r=-1;for(let i of e.rooms){let e=UD(i),a=(e.x-t.x)**2+(e.y-t.y)**2;a>r&&(r=a,n=i)}return n}var ZD=23283064365386963e-26;new class e{constructor(){this._seed=0,this._s0=0,this._s1=0,this._s2=0,this._c=0}getSeed(){return this._seed}setSeed(e){return e=e<1?1/e:e,this._seed=e,this._s0=(e>>>0)*ZD,e=e*69069+1>>>0,this._s1=e*ZD,e=e*69069+1>>>0,this._s2=e*ZD,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*ZD;return this._s0=this._s1,this._s1=this._s2,this._c=e|0,this._s2=e-this._c,this._s2}getUniformInt(e,t){let n=Math.max(e,t),r=Math.min(e,t);return Math.floor(this.getUniform()*(n-r+1))+r}getNormal(e=0,t=1){let n,r,i;do n=2*this.getUniform()-1,r=2*this.getUniform()-1,i=n*n+r*r;while(i>1||i==0);return e+n*Math.sqrt(-2*Math.log(i)/i)*t}getPercentage(){return 1+Math.floor(this.getUniform()*100)}getItem(e){return e.length?e[Math.floor(this.getUniform()*e.length)]:null}shuffle(e){let t=[],n=e.slice();for(;n.length;){let e=n.indexOf(this.getItem(n));t.push(n.splice(e,1)[0])}return t}getWeightedValue(e){let t=0;for(let n in e)t+=e[n];let n=this.getUniform()*t,r,i=0;for(r in e)if(i+=e[r],n<i)return r;return r}getState(){return[this._s0,this._s1,this._s2,this._c]}setState(e){return this._s0=e[0],this._s1=e[1],this._s2=e[2],this._c=e[3],this}clone(){return new e().setState(this.getState())}}().setSeed(Date.now());var QD=class{getContainer(){return null}setOptions(e){this._options=e}},$D=class extends QD{constructor(){super(),this._ctx=document.createElement(`canvas`).getContext(`2d`)}schedule(e){requestAnimationFrame(e)}getContainer(){return this._ctx.canvas}setOptions(e){super.setOptions(e);let t=`${e.fontStyle?`${e.fontStyle} `:``} ${e.fontSize}px ${e.fontFamily}`;this._ctx.font=t,this._updateSize(),this._ctx.font=t,this._ctx.textAlign=`center`,this._ctx.textBaseline=`middle`}clear(){let e=this._ctx.globalCompositeOperation;this._ctx.globalCompositeOperation=`copy`,this._ctx.fillStyle=this._options.bg,this._ctx.fillRect(0,0,this._ctx.canvas.width,this._ctx.canvas.height),this._ctx.globalCompositeOperation=e}eventToPosition(e,t){let n=this._ctx.canvas,r=n.getBoundingClientRect();return e-=r.left,t-=r.top,e*=n.width/r.width,t*=n.height/r.height,e<0||t<0||e>=n.width||t>=n.height?[-1,-1]:this._normalizedEventToPosition(e,t)}};function eO(e){return e.charAt(0).toUpperCase()+e.substring(1)}function tO(e,...t){let n=tO.map;return e.replace(/%(?:([a-z]+)|(?:{([^}]+)}))/gi,function(r,i,a,o){if(e.charAt(o-1)==`%`)return r.substring(1);if(!t.length)return r;let s=t[0],c=(i||a).split(`,`),l=c.shift()||``,u=n[l.toLowerCase()];if(!u)return r;s=t.shift();let d=s[u].apply(s,c),f=l.charAt(0);return f!=f.toLowerCase()&&(d=eO(d)),d})}tO.map={s:`toString`};var nO=class e extends $D{constructor(){super(),this._spacingX=0,this._spacingY=0,this._canvasCache={}}setOptions(e){super.setOptions(e),this._canvasCache={}}draw(t,n){e.cache?this._drawWithCache(t):this._drawNoCache(t,n)}_drawWithCache(e){let[t,n,r,i,a]=e,o=``+r+i+a,s;if(o in this._canvasCache)s=this._canvasCache[o];else{let e=this._options.border;s=document.createElement(`canvas`);let t=s.getContext(`2d`);if(s.width=this._spacingX,s.height=this._spacingY,t.fillStyle=a,t.fillRect(e,e,s.width-e,s.height-e),r){t.fillStyle=i,t.font=this._ctx.font,t.textAlign=`center`,t.textBaseline=`middle`;let e=[].concat(r);for(let n=0;n<e.length;n++)t.fillText(e[n],this._spacingX/2,Math.ceil(this._spacingY/2))}this._canvasCache[o]=s}this._ctx.drawImage(s,t*this._spacingX,n*this._spacingY)}_drawNoCache(e,t){let[n,r,i,a,o]=e;if(t){let e=this._options.border;this._ctx.fillStyle=o,this._ctx.fillRect(n*this._spacingX+e,r*this._spacingY+e,this._spacingX-e,this._spacingY-e)}if(!i)return;this._ctx.fillStyle=a;let s=[].concat(i);for(let e=0;e<s.length;e++)this._ctx.fillText(s[e],(n+.5)*this._spacingX,Math.ceil((r+.5)*this._spacingY))}computeSize(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}computeFontSize(e,t){let n=Math.floor(e/this._options.width),r=Math.floor(t/this._options.height),i=this._ctx.font;this._ctx.font=`100px `+this._options.fontFamily;let a=Math.ceil(this._ctx.measureText(`W`).width);this._ctx.font=i;let o=a/100*r/n;return o>1&&(r=Math.floor(r/o)),Math.floor(r/this._options.spacing)}_normalizedEventToPosition(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}_updateSize(){let e=this._options,t=Math.ceil(this._ctx.measureText(`W`).width);this._spacingX=Math.ceil(e.spacing*t),this._spacingY=Math.ceil(e.spacing*e.fontSize),e.forceSquareRatio&&(this._spacingX=this._spacingY=Math.max(this._spacingX,this._spacingY)),this._ctx.canvas.width=e.width*this._spacingX,this._ctx.canvas.height=e.height*this._spacingY}};nO.cache=!1;var rO={4:[[0,-1],[1,0],[0,1],[-1,0]],8:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],6:[[-1,-1],[1,-1],[2,0],[1,1],[-1,1],[-2,0]]},iO=class{constructor(e,t={}){this._lightPasses=e,this._options=Object.assign({topology:8},t)}_getCircle(e,t,n){let r=[],i,a,o;switch(this._options.topology){case 4:a=1,o=[0,1],i=[rO[8][7],rO[8][1],rO[8][3],rO[8][5]];break;case 6:i=rO[6],a=1,o=[-1,1];break;case 8:i=rO[4],a=2,o=[-1,1];break;default:throw Error(`Incorrect topology for FOV computation`)}let s=e+o[0]*n,c=t+o[1]*n;for(let e=0;e<i.length;e++)for(let t=0;t<n*a;t++)r.push([s,c]),s+=i[e][0],c+=i[e][1];return r}},aO=class extends iO{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l;for(let u=1;u<=n;u++){let n=this._getCircle(e,t,u),d=360/n.length;for(let e=0;e<n.length;e++)if(s=n[e][0],c=n[e][1],a=d*(e-.5),o=a+d,l=!this._lightPasses(s,c),this._visibleCoords(Math.floor(a),Math.ceil(o),l,i)&&r(s,c,u,1),i.length==2&&i[0]==0&&i[1]==360)return}}_visibleCoords(e,t,n,r){if(e<0){let i=this._visibleCoords(0,t,n,r),a=this._visibleCoords(360+e,360,n,r);return i||a}let i=0;for(;i<r.length&&r[i]<e;)i++;if(i==r.length)return n&&r.push(e,t),!0;let a=0;if(i%2){for(;i<r.length&&r[i]<t;)i++,a++;return a!=0&&(n&&(a%2?r.splice(i-a,a,t):r.splice(i-a,a)),!0)}for(;i<r.length&&r[i]<t;)i++,a++;return e==r[i-a]&&a==1?!1:(n&&(a%2?r.splice(i-a,a,e):r.splice(i-a,a,e,t)),!0)}},oO=class extends iO{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l,u;for(let d=1;d<=n;d++){let n=this._getCircle(e,t,d),f=n.length;for(let e=0;e<f;e++)if(a=n[e][0],o=n[e][1],c=[e?2*e-1:2*f-1,2*f],l=[2*e+1,2*f],s=!this._lightPasses(a,o),u=this._checkVisibility(c,l,s,i),u&&r(a,o,d,u),i.length==2&&i[0][0]==0&&i[1][0]==i[1][1])return}}_checkVisibility(e,t,n,r){if(e[0]>t[0])return(this._checkVisibility(e,[e[1],e[1]],n,r)+this._checkVisibility([0,1],t,n,r))/2;let i=0,a=!1;for(;i<r.length;){let t=r[i],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&!(i%2)&&(a=!0);break}i++}let o=r.length,s=!1;for(;o--;){let e=r[o],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&o%2&&(s=!0);break}}let c=!0;if((i==o&&(a||s)||a&&s&&i+1==o&&o%2||i>o&&i%2)&&(c=!1),!c)return 0;let l,u=o-i+1;if(u%2){if(i%2){let e=r[i];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,t)}else{let t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,e)}}else if(i%2){let e=r[i],t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u)}else return n&&r.splice(i,u,e,t),1;let d=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]);return l/d}},sO=[[-1,0,0,1],[0,-1,1,0],[0,-1,-1,0],[-1,0,0,-1],[1,0,0,-1],[0,1,-1,0],[0,1,1,0],[1,0,0,1]],cO={DiscreteShadowcasting:aO,PreciseShadowcasting:oO,RecursiveShadowcasting:class extends iO{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<sO.length;i++)this._renderOctant(e,t,sO[i],n,r)}compute180(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8,o=(r-2+8)%8,s=(r+1+8)%8;this._renderOctant(e,t,sO[o],n,i),this._renderOctant(e,t,sO[a],n,i),this._renderOctant(e,t,sO[r],n,i),this._renderOctant(e,t,sO[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,sO[r],n,i),this._renderOctant(e,t,sO[a],n,i)}_renderOctant(e,t,n,r,i){this._castVisibility(e,t,1,1,0,r+1,n[0],n[1],n[2],n[3],i)}_castVisibility(e,t,n,r,i,a,o,s,c,l,u){if(!(r<i))for(let d=n;d<=a;d++){let n=-d-1,f=-d,p=!1,m=0;for(;n<=0;){n+=1;let h=e+n*o+f*s,g=t+n*c+f*l,_=(n-.5)/(f+.5),v=(n+.5)/(f-.5);if(!(v>r)){if(_<i)break;if(n*n+f*f<a*a&&u(h,g,d,1),!p)!this._lightPasses(h,g)&&d<a&&(p=!0,this._castVisibility(e,t,d+1,r,_,a,o,s,c,l,u),m=v);else{if(!this._lightPasses(h,g)){m=v;continue}p=!1,r=m}}}if(p)break}}}};.5*(Math.sqrt(3)-1),(3-Math.sqrt(3))/6;var lO=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=rO[this._options.topology],this._options.topology==8&&(this._dirs=[this._dirs[0],this._dirs[2],this._dirs[4],this._dirs[6],this._dirs[1],this._dirs[3],this._dirs[5],this._dirs[7]])}_getNeighbors(e,t){let n=[];for(let r=0;r<this._dirs.length;r++){let i=this._dirs[r],a=e+i[0],o=t+i[1];this._passableCallback(a,o)&&n.push([a,o])}return n}},uO={Dijkstra:class extends lO{constructor(e,t,n,r){super(e,t,n,r),this._computed={},this._todo=[],this._add(e,t,null)}compute(e,t,n){let r=e+`,`+t;if(r in this._computed||this._compute(e,t),!(r in this._computed))return;let i=this._computed[r];for(;i;)n(i.x,i.y),i=i.prev}_compute(e,t){for(;this._todo.length;){let n=this._todo.shift();if(n.x==e&&n.y==t)return;let r=this._getNeighbors(n.x,n.y);for(let e=0;e<r.length;e++){let t=r[e],i=t[0],a=t[1];i+`,`+a in this._computed||this._add(i,a,n)}}}_add(e,t,n){let r={x:e,y:t,prev:n};this._computed[e+`,`+t]=r,this._todo.push(r)}},AStar:class extends lO{constructor(e,t,n,r={}){super(e,t,n,r),this._todo=[],this._done={}}compute(e,t,n){for(this._todo=[],this._done={},this._fromX=e,this._fromY=t,this._add(this._toX,this._toY,null);this._todo.length;){let n=this._todo.shift(),r=n.x+`,`+n.y;if(r in this._done)continue;if(this._done[r]=n,n.x==e&&n.y==t)break;let i=this._getNeighbors(n.x,n.y);for(let e=0;e<i.length;e++){let t=i[e],r=t[0],a=t[1];r+`,`+a in this._done||this._add(r,a,n)}}let r=this._done[e+`,`+t];if(r)for(;r;)n(r.x,r.y),r=r.prev}_add(e,t,n){let r=this._distance(e,t),i={x:e,y:t,prev:n,g:n?n.g+1:0,h:r},a=i.g+i.h;for(let e=0;e<this._todo.length;e++){let t=this._todo[e],n=t.g+t.h;if(a<n||a==n&&r<t.h){this._todo.splice(e,0,i);return}}this._todo.push(i)}_distance(e,t){switch(this._options.topology){case 4:return Math.abs(e-this._fromX)+Math.abs(t-this._fromY);case 6:let n=Math.abs(e-this._fromX),r=Math.abs(t-this._fromY);return r+Math.max(0,(n-r)/2);case 8:return Math.max(Math.abs(e-this._fromX),Math.abs(t-this._fromY))}}}};function dO(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function fO(e,t){let n=[],r=e.x,i=e.y,a=Math.abs(t.x-e.x),o=-Math.abs(t.y-e.y),s=e.x<t.x?1:-1,c=e.y<t.y?1:-1,l=a+o;for(;n.push({x:r,y:i}),r!==t.x||i!==t.y;){let e=l*2;e>=o&&(l+=o,r+=s),e<=a&&(l+=a,i+=c)}return n}function pO(e,t,n){let r=fO(t,n);for(let t=1;t<r.length-1;t++)if(!e.transparent(r[t].x,r[t].y))return!1;return!0}function mO(e,t,n,r){return!(dO(t,n)>r.range||(r.requireLineOfSight??!0)&&!pO(e,t,n))}function hO(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return fO(e,t);case`cone`:return gO(e,t,n.width);case`burst`:{let e=[],r=n.radius;for(let n=-r;n<=r;n++)for(let i=-r;i<=r;i++)i*i+n*n>r*r||e.push({x:t.x+i,y:t.y+n});return e}}}function gO(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.max(Math.abs(r),Math.abs(i));if(a===0)return[{...e}];let o=Math.sign(r),s=Math.sign(i),c=r!==0&&i!==0?o:s,l=r!==0&&i!==0?-s:o,u=[];for(let t=1;t<=a;t++){let r=e.x+o*t,i=e.y+s*t,d=Math.round(t/a*n);for(let e=-d;e<=d;e++)u.push({x:r+c*e,y:i+l*e})}return u}function _O(e,t,n,r){let i=new Set,a=[],o=t;for(let t=0;t<n;t++){let t=-1,n=r+1;for(let a=0;a<e.length;a++){if(i.has(a))continue;let s=dO(o,e[a]);s<=r&&s<n&&(n=s,t=a)}if(t===-1)break;i.add(t),a.push(e[t]),o=e[t]}return a}function vO(e,t,n,r){let i=[];for(let a=1;a<=r;a++){let r={x:t.x+n.x*a,y:t.y+n.y*a};if(!e.passable(r.x,r.y))break;i.push(r)}return i}var yO=class{constructor(e){this.visible=new Set,this.explored=new Set,this.light=new Map,this.level=e,this.fov=e.shape===`hex`?null:new cO.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n,r){if(this.visible.clear(),this.light.clear(),r){this.updateFromHeight(e,t,n,r);return}if(this.fov){this.fov.compute(e,t,n,(e,t,n,r)=>{if(!this.level.inside(e,t))return;let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r)});return}let i={x:e,y:t};for(let e of NE(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=ME(i,e);t.slice(1,-1).some(e=>!this.level.inside(e.x,e.y)||!this.level.transparent(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}}lightCell(e,t,n,r){let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r===0?1:Math.max(0,1-n/(r+1)))}updateFromHeight(e,t,n,r){let i=r.height??r.heights.heightAt(e,t),a={x:e,y:t};if(this.level.shape===`hex`){for(let e of NE(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=ME(a,e);this.heightBlocked(t,r.heights,i,r.heights.heightAt(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}return}for(let o=t-n;o<=t+n;o++)for(let t=e-n;t<=e+n;t++){if(!this.level.inside(t,o)||dO(a,{x:t,y:o})>n)continue;let e=fO(a,{x:t,y:o});this.heightBlocked(e,r.heights,i,r.heights.heightAt(t,o))||this.lightCell(t,o,e.length-1,n)}}heightBlocked(e,t,n,r){let i=Math.max(n,r);for(let n=1;n<e.length-1;n++){let r=e[n];if(!this.level.inside(r.x,r.y)||!this.level.transparent(r.x,r.y)||t.heightAt(r.x,r.y)>i)return!0}return!1}isVisible(e,t){return this.visible.has(this.level.index(e,t))}isExplored(e,t){return this.explored.has(this.level.index(e,t))}lightAt(e,t){return this.light.get(this.level.index(e,t))??0}reset(){this.visible.clear(),this.explored.clear(),this.light.clear()}revealAll(){for(let e=0;e<this.level.cellCount;e++)this.explored.add(e)}},bO=class{constructor(e){this.level=e,this.heights=new Int32Array(e.cellCount)}heightAt(e,t){return this.level.inside(e,t)?this.heights[this.level.index(e,t)]:0}set(e,t,n){if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);this.level.inside(e,t)&&(this.heights[this.level.index(e,t)]=n)}},xO=class{constructor(e){this.level=e}passable(e){let t=e.blocked;return(e,n)=>this.level.passable(e,n)?!t?.has(this.level.index(e,n)):!1}stepper(e){let t=this.passable(e),n=e.heights;if(!n)return(e,n,r,i)=>this.level.inside(e,n)&&this.level.inside(r,i)&&t(r,i);let r=e.climb??1;if(!Number.isInteger(r)||r<0)throw Error(`a climb limit must be a non-negative whole number, got ${e.climb}`);return(e,i,a,o)=>this.level.inside(e,i)&&this.level.inside(a,o)&&t(a,o)&&n.heightAt(a,o)-n.heightAt(e,i)<=r}find(e,t,n={}){if(this.level.shape===`hex`||n.heights){let r=this.distanceMap(t,n),i=[],a=e;for(let e=0;e<this.level.cellCount;e++){let e=this.descend(a,r,n);if(!e||(i.push(e),e.x===t.x&&e.y===t.y))break;a=e}return i}let r=new uO.AStar(t.x,t.y,this.passable(n),{topology:n.topology??8}),i=[];return r.compute(e.x,e.y,(e,t)=>i.push({x:e,y:t})),i.slice(1)}step(e,t,n={}){return this.find(e,t,n)[0]??null}distanceMap(e,t={}){let n=new Int32Array(this.level.cellCount).fill(-1),r=this.passable(t),i=this.stepper(t);if(!r(e.x,e.y))return n;let a=[this.level.index(e.x,e.y)];n[a[0]]=0;for(let e=0;e<a.length;e++){let r=a[e],o=this.level.xOf(r),s=this.level.yOf(r),c=n[r]+1;for(let e of this.level.neighbors(o,s,t.topology??8)){if(!i(e.x,e.y,o,s))continue;let t=this.level.index(e.x,e.y);n[t]===-1&&(n[t]=c,a.push(t))}}return n}descend(e,t,n={}){let r=this.stepper(n),i=t[this.level.index(e.x,e.y)];if(i<=0)return null;let a=null,o=i;for(let i of this.level.neighbors(e.x,e.y,n.topology??8)){if(!r(e.x,e.y,i.x,i.y))continue;let n=t[this.level.index(i.x,i.y)];n!==-1&&n<o&&(o=n,a=i)}return a}autoExplore(e,t,n={}){let r=this.passable(n),i=this.stepper(n);if(!r(e.x,e.y))return[];let a=new Map,o=new Set([this.level.index(e.x,e.y)]),s=[e];for(let e=0;e<s.length;e++){let r=s[e];if(e>0&&!t.isExplored(r.x,r.y))return this.reconstruct(a,r);for(let e of this.level.neighbors(r.x,r.y,n.topology??8)){if(!i(r.x,r.y,e.x,e.y))continue;let t=this.level.index(e.x,e.y);o.has(t)||(o.add(t),a.set(t,r),s.push(e))}}return[]}reconstruct(e,t){let n=[t],r=e.get(this.level.index(t.x,t.y));for(;r;)n.push(r),r=e.get(this.level.index(r.x,r.y));return n.reverse()}},SO=class{constructor(){this.entries=[],this.sequence=0,this.now=0}get size(){return this.entries.length}get actors(){return this.entries.map(e=>e.actor)}has(e){return this.entries.some(t=>t.actor===e)}add(e,t=0){this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++}),this.sort()}remove(e){let t=this.entries.findIndex(t=>t.actor===e);t!==-1&&this.entries.splice(t,1)}clear(){this.entries.length=0,this.now=0,this.sequence=0}peek(){let e=this.entries[0];return e?(this.now=Math.max(this.now,e.time),e.actor):null}spend(e){let t=this.entries[0];if(!t)return;let n=t.actor.speed??1;t.time=this.now+e/(n>0?n:1),t.sequence=this.sequence++,this.sort()}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}sort(){this.entries.sort((e,t)=>e.time-t.time||e.sequence-t.sequence)}};function CO(e,t,n,r,i,a={}){let o=a.sightRadius??6,s=a.fleeBelow??0;if((a.disposition??`hostile`)!==`hostile`&&a.provoked!==!0)return{state:`wander`,step:wO(e,n,a)};let c=new yO(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:TO(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:wO(e,n,a)}}function wO(e,t,n){let r=EO(e,t,n);return r.length>0?pE(r):null}function TO(e,t,n,r){let i=EO(e,t,r),a=null,o=DO(t,n);for(let e of i){let t=DO(e,n);t>o&&(o=t,a=e)}return a}function EO(e,t,n){let r=n.blocked,i=[];for(let[a,o]of zD(n.topology??8)){let n={x:t.x+a,y:t.y+o};e.passable(n.x,n.y)&&(r?.has(e.index(n.x,n.y))||i.push(n))}return i}function DO(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var OO=class e{constructor(e){this.revealedKind=new Map,this.discovered=new Set,this.level=e}conceal(e,t,n,r){let i=this.level.index(e,t);this.revealedKind.set(i,r),this.discovered.delete(i),this.level.set(e,t,n)}isSecret(e,t){let n=this.level.index(e,t);return this.revealedKind.has(n)&&!this.discovered.has(n)}isDiscovered(e,t){return this.discovered.has(this.level.index(e,t))}discover(e,t){if(!this.isSecret(e,t))return!1;let n=this.level.index(e,t);return this.discovered.add(n),this.level.set(e,t,this.revealedKind.get(n)),!0}toJSON(){return{revealed:[...this.revealedKind],discovered:[...this.discovered]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.revealed)r.revealedKind.set(e,t);for(let e of n.discovered)r.discovered.add(e);return r}},kO=class e{constructor(e){this.openKind=new Map,this.closedKind=new Map,this.lockedBy=new Map,this.open_=new Map,this.level=e}place(e,t,n){let r=this.level.index(e,t);this.openKind.set(r,n.open),this.closedKind.set(r,n.closed),this.open_.set(r,n.startOpen??!1),n.locked===void 0?this.lockedBy.delete(r):this.lockedBy.set(r,n.locked),this.level.set(e,t,this.open_.get(r)?n.open:n.closed)}isDoor(e,t){return this.open_.has(this.level.index(e,t))}isOpen(e,t){return this.open_.get(this.level.index(e,t))===!0}isLocked(e,t){return this.lockedBy.has(this.level.index(e,t))}requiredKey(e,t){return this.lockedBy.get(this.level.index(e,t))}open(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||this.open_.get(n)||this.lockedBy.has(n)?!1:(this.open_.set(n,!0),this.level.set(e,t,this.openKind.get(n)),!0)}close(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||!this.open_.get(n)?!1:(this.open_.set(n,!1),this.level.set(e,t,this.closedKind.get(n)),!0)}unlock(e,t){let n=this.level.index(e,t);return this.lockedBy.has(n)?(this.lockedBy.delete(n),!0):!1}toJSON(){let e=[];for(let[t,n]of this.openKind)e.push({cell:t,open:n,closed:this.closedKind.get(t),locked:this.lockedBy.get(t),isOpen:this.open_.get(t)===!0});return{doors:e}}static fromJSON(t,n){let r=new e(t);for(let e of n.doors){let n=t.xOf(e.cell),i=t.yOf(e.cell);r.place(n,i,{open:e.open,closed:e.closed,locked:e.locked,startOpen:e.isOpen})}return r}},AO=class e{constructor(e=[]){this.current=0;for(let t=1;t<e.length;t++)if(e[t]>=e[t-1])throw Error(`boss phase thresholds must descend`);this.thresholds=e}get phase(){return this.current}update(e){let t=0;for(;t<this.thresholds.length&&e<=this.thresholds[t];)t++;let n=[];for(;this.current<t;)this.current++,n.push(this.current);return n}reset(){this.current=0}toJSON(){return{phase:this.current}}static fromJSON(t,n){let r=new e(t);return r.current=n.phase,r}},jO=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}tick(){for(let[e,t]of this.remaining)t<=1?this.remaining.delete(e):this.remaining.set(e,t-1)}ready(){let e=[];for(let t of this.cooldowns.keys())this.remaining.has(t)||e.push(t);return e}use(e){let t=this.cooldowns.get(e);return t===void 0||this.remaining.has(e)?!1:(t>0&&this.remaining.set(e,t),!0)}toJSON(){return{remaining:[...this.remaining]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.remaining)r.remaining.set(e,t);return r}},MO=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}volumeAt(e,t){return e<0||t<0||e>=this.width||t>=this.height?0:this.volume[t*this.width+e]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){e<0||t<0||e>=this.width||t>=this.height||(this.volume[t*this.width+e]+=n)}spread(e,t=.25,n=.9){let r=new Float32Array(this.volume.length);for(let n=0;n<this.height;n++)for(let i=0;i<this.width;i++){let a=n*this.width+i,o=this.volume[a];if(o<=0)continue;let s=[];for(let[t,r]of zD(4)){let a=i+t,o=n+r;a<0||o<0||a>=this.width||o>=this.height||e(a,o)&&s.push(o*this.width+a)}if(s.length===0)r[a]+=o;else{let e=o*t/s.length;r[a]+=o-e*s.length;for(let t of s)r[t]+=e}}for(let e=0;e<r.length;e++){let t=r[e]*n;this.volume[e]=t<.001?0:t}}cellsAbove(e){let t=[];for(let n=0;n<this.height;n++)for(let r=0;r<this.width;r++){let i=this.volume[n*this.width+r];i>=e&&t.push({x:r,y:n,volume:i})}return t}toJSON(){return{width:this.width,height:this.height,volume:[...this.volume]}}static fromJSON(t){let n=new e(t.width,t.height);return n.volume.set(t.volume.slice(0,n.volume.length)),n}},NO=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,t){for(let n of this.hooks)n.event===e&&n.handler(t)}modifyDamage(e,t,n){let r={attacker:e,defender:t,amount:n,prevented:!1};return this.emit(`beforeDamage`,r),r.amount=Math.max(0,r.amount),r.amount===0&&(r.prevented=!0),r}},PO=l({AbilityCycle:()=>jO,Blob:()=>MO,BossPhases:()=>AO,CombatHooks:()=>NO,DUNGEON_KINDS:()=>GD,Doors:()=>kO,Elevation:()=>bO,FLOOR:()=>VD,FieldOfView:()=>yO,Level:()=>HD,Pathfinder:()=>xO,Scheduler:()=>SO,Secrets:()=>OO,WALL:()=>BD,canTarget:()=>mO,chainTargets:()=>_O,chebyshevDistance:()=>dO,coneCells:()=>gO,decideMonsterAI:()=>CO,findFreeCell:()=>YD,furthestRoom:()=>XD,generateDungeon:()=>KD,hasLineOfSight:()=>pO,knockbackPath:()=>vO,neighbourOffsets:()=>zD,rectCenter:()=>UD,rectsOverlap:()=>WD,resolveArea:()=>hO,traceLine:()=>fO}),FO=l({direction:()=>UO,has:()=>GO,locale:()=>HO,reset:()=>JO,setActive:()=>VO,setBase:()=>BO,t:()=>WO}),IO=null,LO=null,RO=null,zO=null;function BO(e){IO=e}function VO(e){LO=e,RO=e?new Intl.PluralRules(e.locale):null}function HO(){return(LO??IO)?.locale??`en`}function UO(){return(LO??IO)?.direction??`ltr`}function WO(e,t){let n=LO?.messages[e]??IO?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:KO(n,t?.count);return t?qO(r,t):r}function GO(e){return LO?.messages[e]!==void 0||IO?.messages[e]!==void 0}function KO(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(RO??(zO??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function qO(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r===void 0?e:String(r)})}function JO(){IO=null,LO=null,RO=null}function YO(e,t){let n=e=>t.filter(t=>t.op===e).sort((e,t)=>(e.order??0)-(t.order??0)),r=e;for(let e of n(`add`))r+=e.value;for(let e of n(`multiply`))r*=e.value;for(let e of n(`set`))r=e.value;return r}var XO=class{constructor(e){this.modifiers=[],this.cache=null,this.baseValues={...e.base},this.derived=e.derived??[]}base(e){return this.baseValues[e]??0}setBase(e,t){this.baseValues[e]=t,this.cache=null}addModifier(e){this.modifiers.push(e),this.cache=null}removeModifier(e){let t=this.modifiers.indexOf(e);t!==-1&&this.modifiers.splice(t,1),this.cache=null}removeModifiersFrom(e){this.modifiers=this.modifiers.filter(t=>t.source!==e),this.cache=null}get(e){return this.resolveAll()[e]??0}resolveAll(){if(this.cache)return this.cache;let e={...this.baseValues};for(let t of Object.keys(e))e[t]=YO(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=YO(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}};function ZO(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var QO=class{constructor(e,t={}){this.curve=e,this.level=t.level??1,this.experience=t.experience??this.curve.experienceFor(this.level)}get experienceToNext(){return this.level>=this.curve.maxLevel?null:this.curve.experienceFor(this.level+1)-this.experience}addExperience(e){this.experience+=e;let t=0;for(;this.level<this.curve.maxLevel&&this.experience>=this.curve.experienceFor(this.level+1);)this.level++,t++;return t}};function $O(e,t,n=()=>uE(1,20)){return e+n()>=t}var ek=class{constructor(e,t={}){this.available=0,this.stats=e,this.capFor=t.cap??(()=>1/0),this.costFor=t.cost??(()=>1)}get points(){return this.available}grant(e){this.available+=e}canSpend(e){return this.nextRankCost(e)!==null}spend(e){let t=this.nextRankCost(e);if(t===null)return!1;let n=this.stats.base(e);return this.available-=t,this.stats.setBase(e,n+1),!0}nextRankCost(e){let t=this.stats.base(e);if(t>=this.capFor(e))return null;let n=this.costFor(e,t+1);return this.available>=n?n:null}},tk=class{constructor(e,t=null,n={}){this.worn=new Map,this.names=new Set(e),this.stats=t,this.isSlotLocked=n.locked??(()=>!1)}get(e){return this.worn.get(e)}isLocked(e){let t=this.worn.get(e);return t!==void 0&&this.isSlotLocked(e,t)}equip(e,t){if(this.assertSlot(e),this.isLocked(e))return;let n=this.unequip(e);this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t});return n}unequip(e){let t=this.worn.get(e);if(t&&!this.isSlotLocked(e,t))return this.worn.delete(e),this.stats?.removeModifiersFrom(t),t}get slots(){return[...this.names]}assertSlot(e){if(!this.names.has(e))throw Error(`no such equipment slot: "${e}"`)}},nk=class{constructor(e={}){this.slots=[],this.capacity=e.capacity}get items(){return this.slots}get totalWeight(){return this.slots.reduce((e,t)=>e+this.weightOf(t),0)}weightOf(e){return(e.weight??0)*e.quantity+(e.contents?.totalWeight??0)}find(e){return this.slots.find(t=>t.id===e)}add(e){if(this.capacity!==void 0&&this.totalWeight+this.weightOf(e)>this.capacity)return!1;if(e.stackable){let t=this.slots.find(t=>t.id===e.id&&t.stackable);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t){let n=this.slots.findIndex(t=>t.id===e);if(n===-1)return;let r=this.slots[n];r.quantity-=t??r.quantity,r.quantity<=0&&this.slots.splice(n,1)}};function rk(e,t){for(let n of t.ingredients){let t=e.find(n.id);if(!t||t.quantity<n.quantity)return!1}let n=t.ingredients.map(t=>({...e.find(t.id),quantity:t.quantity}));for(let n of t.ingredients)e.remove(n.id,n.quantity);if(e.add(t.result))return!0;for(let t of n)e.add(t);return!1}function ik(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});let i=t.add({duration:n.duration,tick:e=>n.tick?.(e),onExpire:()=>e.removeModifiersFrom(r)});return{cancel:()=>{t.remove(i),e.removeModifiersFrom(r)}}}function ak(e){e.identified=!0}function ok(e,t){return e.level=(e.level??0)+t,e.level}function sk(e,t){return e.maxDurability!==void 0&&(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function ck(e,t){e.maxDurability!==void 0&&(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t))}var lk=class{constructor(e){this.progress=0,this.max=e.max,this.regenRate=e.regenRate,this.value=e.current??e.max}get current(){return this.value}canAfford(e){return this.value>=e}spend(e){return this.canAfford(e)?(this.value-=e,!0):!1}advance(e=1){if(!(this.value>=this.max)){for(this.progress+=e;this.progress>=this.regenRate&&this.value<this.max;)this.progress-=this.regenRate,this.value++;this.value>=this.max&&(this.progress=0)}}};function uk(e){if(e.entries.length===0||!fE(e.chance??1))return null;let t=mE(e.entries.map(e=>e.weight));if(t===-1)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var dk=class e{constructor(e){this.grantedTiers=0,this.balance=0,this.choices=new Map,this.track=e}get points(){return this.balance}openTiers(e){let t=[];return this.track.tiers.forEach((n,r)=>{e>=n.threshold&&t.push(r)}),t}grant(e){let t=0;for(;this.grantedTiers<this.track.tiers.length&&e>=this.track.tiers[this.grantedTiers].threshold;){let e=this.track.tiers[this.grantedTiers];e.kind===`points`&&(this.balance+=e.points??0,t+=e.points??0),this.grantedTiers++}return t}spend(e){return this.balance<e?!1:(this.balance-=e,!0)}choose(e,t,n){let r=this.track.tiers[e];if(!r)throw Error(`no such advancement tier: ${e}`);if(r.kind===`points`)throw Error(`tier ${e} grants points, it has no choice`);if(n<r.threshold)throw Error(`tier ${e} has not opened yet`);if(this.choices.has(e))throw Error(`tier ${e} is already decided`);if(!(r.options??[]).some(e=>e.id===t))throw Error(`tier ${e} has no option "${t}"`);this.choices.set(e,t)}choice(e){return this.choices.get(e)??null}toJSON(){return{grantedTiers:this.grantedTiers,balance:this.balance,choices:[...this.choices]}}static fromJSON(t,n){let r=new e(t);r.grantedTiers=n.grantedTiers,r.balance=n.balance;for(let[e,t]of n.choices)r.choices.set(e,t);return r}};function fk(e){let t=e.entries.filter(e=>e.weight>0);if(t.length===0)return null;let n=mE(t.map(e=>e.weight));return n===-1?null:t[n]}function pk(e){return e.affix}function mk(e,t){e.affix=t.id,t.curse&&(e.cursed=!0)}function hk(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function gk(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}function _k(e){if(e.labels.length<e.kinds.length)throw Error(`not enough appearances: ${e.kinds.length} kinds but only ${e.labels.length} labels`);let t=[...e.labels];for(let e=t.length-1;e>0;e--){let n=lE(0,e+1);[t[e],t[n]]=[t[e],t[n]]}let n=new Map;return e.kinds.forEach((e,r)=>n.set(e,t[r])),n}var vk=class e{constructor(e){this.assigned=new Map,this.tables=e}appearanceOf(e,t){let n=this.assigned.get(e);if(!n){let t=this.tables[e];if(!t)throw Error(`no such appearance category: "${e}"`);n=_k(t),this.assigned.set(e,n)}let r=n.get(t);if(r===void 0)throw Error(`"${t}" is not in appearance category "${e}"`);return r}toJSON(){return{assigned:[...this.assigned].map(([e,t])=>[e,[...t]])}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.assigned)r.assigned.set(e,new Map(t));return r}};function yk(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=t.find(r);if(!s||s.quantity<i)return!1;let c=o.buy*i;return e.base(a.currency)<c?!1:(t.remove(r,i),n.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)-c),!0):(t.add({...s,quantity:i}),!1))}function bk(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=n.find(r);return!s||s.quantity<i?!1:(n.remove(r,i),t.add({...s,quantity:i}),e.setBase(a.currency,e.base(a.currency)+o.sell*i),!0)}function xk(e){let t=Array.isArray(e)?e:[e];for(let e of t)if(!Number.isFinite(e.amount)||e.amount<0)throw Error(`a resource cost must be a non-negative number, "${e.stat}" costs ${e.amount}`);return t}function Sk(e,t){return xk(t).every(t=>e.base(t.stat)>=t.amount)}function Ck(e,t){let n=xk(t);if(!n.every(t=>e.base(t.stat)>=t.amount))return!1;for(let t of n)e.setBase(t.stat,e.base(t.stat)-t.amount);return!0}var wk=l({Advancement:()=>dk,Appearances:()=>vk,Charges:()=>lk,EquipmentSlots:()=>tk,Inventory:()=>nk,Progression:()=>QO,SkillPoints:()=>ek,StatBlock:()=>XO,affixOf:()=>pk,applyAffix:()=>mk,applyStatusEffect:()=>ik,assignAppearances:()=>_k,buy:()=>yk,canAfford:()=>Sk,craft:()=>rk,damageItem:()=>sk,enchant:()=>ok,identify:()=>ak,powerCurve:()=>ZO,removeAffix:()=>hk,repairItem:()=>ck,rollAffix:()=>fk,rollLoot:()=>uk,scaledModifiers:()=>gk,sell:()=>bk,skillCheck:()=>$O,spend:()=>Ck}),Tk=class{constructor(){this.factories=new Map,this.loaded=new Map,this.currentId=null}define(e,t,n={}){this.factories.set(e,{create:t,persistent:n.persistent??!0})}enter(e,t){let n=this.factories.get(e);if(!n)throw Error(`no such map: "${e}"`);let r=this.loaded.get(e);return(!r||!n.persistent)&&(r=n.create(),this.loaded.set(e,r)),this.currentId=e,this.lastSpawn=t,r}get current(){return this.currentId?this.loaded.get(this.currentId)??null:null}get currentMapId(){return this.currentId}get spawn(){return this.lastSpawn}isLoaded(e){return this.loaded.has(e)}isPersistent(e){return this.factories.get(e)?.persistent??!0}unload(e){if(e===this.currentId)throw Error(`cannot unload the current map: "${e}"`);this.loaded.delete(e)}},Ek=class{constructor(){this.locations=new Map}add(e){this.locations.set(e.id,e)}remove(e){this.locations.delete(e)}get(e){return this.locations.get(e)}at(e,t){for(let n of this.locations.values())if(n.x===e&&n.y===t)return n}get all(){return[...this.locations.values()]}},Dk=class{constructor(){this.turn=0,this.effects=new Map}add(e){let t=Symbol();return this.effects.set(t,{...e}),t}remove(e){this.effects.delete(e)}has(e){return this.effects.has(e)}advance(e=1){this.turn+=e;for(let[t,n]of this.effects)n.tick(this.turn),n.duration!==void 0&&(n.duration-=e,n.duration<=0&&(this.effects.delete(t),n.onExpire?.()))}};function Ok(e){if(e.entries.length===0||!fE(e.rate))return null;let t=mE(e.entries.map(e=>e.weight));return t===-1?null:e.entries[t].value}var kk=l({Overworld:()=>Ek,TurnClock:()=>Dk,World:()=>Tk,rollEncounter:()=>Ok}),Ak=536870911,jk={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function Mk(e,t,n){if(e.frameWidth!==t.tilewidth||e.frameHeight!==t.tileheight)throw Error(`the tileset at firstgid ${n} is cut to ${e.frameWidth}x${e.frameHeight}, but the map is ${t.tilewidth}x${t.tileheight}`)}function Nk(e,t,n){let r=-1;for(let n=0;n<t.length&&t[n]<=e;n++)r=n;if(r===-1)throw Error(`layer "${n}" uses gid ${e}, below every tileset's firstgid (${t.join(`, `)})`);return r}function Pk(e,t){let n=e.orientation??`orthogonal`,r=jk[n];if(!r)throw Error(`loadTiledMap does not read "${n}" maps yet`);if(r===`staggered`&&(e.staggeraxis??`y`)!==`y`)throw Error(`loadTiledMap only reads Y-axis staggered maps right now, this one is staggered on "${e.staggeraxis}"`);if(r===`staggered`&&(e.staggerindex??`odd`)!==`odd`)throw Error(`loadTiledMap only reads odd-index staggered maps right now, this one staggers "${e.staggerindex}"`);if(e.tilesets.length===0)throw Error(`loadTiledMap needs at least one tileset, this map has none`);let i=[...e.tilesets].sort((e,t)=>e.firstgid-t.firstgid),a,o;if(t instanceof YE){if(e.tilesets.length!==1)throw Error(`loadTiledMap was given one sheet but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);Mk(t,e,i[0].firstgid),a=[t],o=[i[0].firstgid]}else{if(t.length!==e.tilesets.length)throw Error(`loadTiledMap was given ${t.length} sheets but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);a=i.map(n=>{let r=t.find(e=>e.firstgid===n.firstgid);if(!r)throw Error(`loadTiledMap was given no sheet for the tileset at firstgid ${n.firstgid}`);return Mk(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new aD({width:e.width,height:e.height,sheet:a,shape:r}),c=[];for(let t of e.layers)if(t.type===`tilelayer`){if(t.encoding&&t.encoding!==`csv`)throw Error(`layer "${t.name}" uses "${t.encoding}" encoding - export tile layers as CSV/plain, not compressed`);let e=(t.data??[]).map(e=>{let n=e&Ak;if(n===0)return-1;let r=Nk(n,o,t.name);return o.length===1?n-o[0]:nD(r,n-o[r])});s.addLayer(t.name,e)}else if(t.type===`objectgroup`)for(let n of t.objects??[])c.push({...n,tileX:Math.floor(n.x/e.tilewidth),tileY:Math.floor(n.y/e.tileheight)});return{map:s,objects:c}}function Fk(e,t,n={}){let r=n.pick??lE,i=0;return t.forEach((t,n)=>{Ik(t,t.name??`#${n+1}`);let a=Lk(e,t);if(i+=a.length,a.length!==0)for(let[n,i]of a){let a=t.outputs[r(t.outputs.length)];for(let[r,o]of Object.entries(a))for(let a=0;a<t.height;a++)for(let s=0;s<t.width;s++){let c=o[a*t.width+s];c!==-1&&e.setTile(r,n+s,i+a,c)}}}),i}function Ik(e,t){if(!Number.isInteger(e.width)||e.width<=0||!Number.isInteger(e.height)||e.height<=0)throw Error(`automap rule "${t}" needs a positive width and height`);if(e.outputs.length===0)throw Error(`automap rule "${t}" has no outputs - a rule that matches and writes nothing is a mistake`);let n=e.width*e.height;for(let[r,i]of Object.entries(e.input))if(i.length!==n)throw Error(`automap rule "${t}" input "${r}" has ${i.length} cells, but the pattern is ${n}`);e.outputs.forEach((e,r)=>{for(let[i,a]of Object.entries(e))if(a.length!==n)throw Error(`automap rule "${t}" output ${r+1} "${i}" has ${a.length} cells, but the pattern is ${n}`)})}function Lk(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)Rk(e,t,i,r)&&n.push([i,r]);return n}function Rk(e,t,n,r){for(let[i,a]of Object.entries(t.input))for(let o=0;o<t.height;o++)for(let s=0;s<t.width;s++){let c=a[o*t.width+s];if(c!==-1&&e.getTile(i,n+s,r+o)!==c)return!1}return!0}var zk=class e{constructor(){this.switches=new Map,this.variables=new Map}switch(e){return this.switches.get(e)??!1}setSwitch(e,t){this.switches.set(e,t)}variable(e){return this.variables.get(e)??0}setVariable(e,t){this.variables.set(e,t)}toJSON(){return{switches:[...this.switches],variables:[...this.variables]}}static fromJSON(t){let n=new e;for(let[e,r]of t.switches)n.setSwitch(e,r);for(let[e,r]of t.variables)n.setVariable(e,r);return n}};function Bk(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function Vk(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>Bk(e,t))&&(n=r);return n}var Hk=class{constructor(e){this.cancelled=!1,this.options=e,this.state={game:e.game,answers:{}}}cancel(){this.cancelled=!0}async run(e){for(let t of e){if(this.cancelled)break;await this.step(t)}return this.state}async step(e){if(`say`in e){await this.speak(e.say,e.speaker);return}if(`ask`in e){let t=await this.speak(e.ask,e.speaker,e.choices);e.store&&(this.state.answers[e.store]=t);return}if(`wait`in e){await new Promise(t=>setTimeout(t,e.wait*1e3));return}if(`setSwitch`in e){this.state.game.setSwitch(e.setSwitch,e.value);return}if(`setVariable`in e){this.state.game.setVariable(e.setVariable,e.value);return}if(`addVariable`in e){let t=this.state.game.variable(e.addVariable);this.state.game.setVariable(e.addVariable,t+e.amount);return}if(`if`in e){let t=Bk(e.if,this.state.game);await this.run(t?e.then:e.else??[]);return}if(`move`in e){await this.options.move?.(e.move.target,e.move.steps);return}`call`in e&&await e.call(this.state)}speak(e,t,n){let{windows:r}=this.options;return new Promise(i=>{r.push(new TD({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:this.options.speed??45,pages:[{text:e,speaker:t}],choices:n,anchor:`bottom`,onDone:e=>i(e)}))})}},Uk=class{constructor(e,t,n,r){this.facing=`down`,this.target=null,this.progress=0,this.sprite=e,this.x=this.fromX=t,this.y=this.fromY=n,this.tileWidth=r.tileWidth,this.tileHeight=r.tileHeight,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.target!==null}turnTo(e,t){this.target||(this.facing=Wk(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=Wk(e,t),this.fromX=this.x,this.fromY=this.y,this.target={x:this.x+e,y:this.y+t},this.progress=0,this.playWalk(),!0)}update(e){this.sprite.update(e),this.target&&(this.progress=Math.min(1,this.progress+this.speed*e),this.sprite.x=Gk(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=Gk(this.fromY,this.target.y,this.progress)*this.tileHeight,this.progress>=1&&(this.x=this.target.x,this.y=this.target.y,this.target=null,this.playIdle()))}place(){this.sprite.x=this.x*this.tileWidth,this.sprite.y=this.y*this.tileHeight}playWalk(){let e=this.options.walkAnimation?.(this.facing);e&&this.sprite.has(e)&&this.sprite.play(e)}playIdle(){let e=this.options.idleAnimation?.(this.facing);e&&this.sprite.has(e)&&this.sprite.play(e)}};function Wk(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function Gk(e,t,n){return e+(t-e)*n}var Kk=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map}define(e){this.definitions.set(e.id,e)}canStart(e){return(this.require(e).requires??[]).every(e=>this.status(e)===`complete`)}start(e){if(!this.canStart(e))throw Error(`quest "${e}" cannot start yet - a prerequisite is incomplete`);this.stageIndex.set(e,0)}status(e){let t=this.require(e),n=this.stageIndex.get(e);return n===void 0?this.canStart(e)?`available`:`unavailable`:n>=t.stages.length?`complete`:`active`}currentStage(e){return this.status(e)===`active`?this.require(e).stages[this.stageIndex.get(e)]:null}progress(e,t){let n=this.currentStage(e);return n?.counter?Math.min(1,t.variable(n.counter.variable)/n.counter.target):null}advance(e,t){let n=this.currentStage(e);return!n||!(n.condition?Bk(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target)?!1:(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0)}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.stageIndex)r.stageIndex.set(e,t);return r}},qk=l({EventRunner:()=>Hk,GameState:()=>zk,GridMover:()=>Uk,QuestLog:()=>Kk,activePage:()=>Vk,automap:()=>Fk,conditionHolds:()=>Bk,loadTiledMap:()=>Pk}),Jk=ZO(20,2,100),Yk=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new QO(e.species.growth??Jk,{level:e.level??1}),this.stats=new XO({base:this.computeBase()})}refreshStats(){let e=this.computeBase();for(let[t,n]of Object.entries(e))this.stats.setBase(t,n)}computeBase(){let e=this.progression.level;return this.deriveStats?this.deriveStats(this.species.baseStats,e):{...this.species.baseStats}}},Xk=class{constructor(){this.multipliers=new Map}key(e,t){return`${e}:${t}`}set(e,t,n){this.multipliers.set(this.key(e,t),n)}get(e,t){return this.multipliers.get(this.key(e,t))??1}multiplierFor(e,t){return t.reduce((t,n)=>t*this.get(e,n),1)}},Zk=class{constructor(e){this.storage=[],this.active=Array(e).fill(null)}get members(){return this.active}get boxed(){return this.storage}add(e){let t=this.active.indexOf(null);t===-1?this.storage.push(e):this.active[t]=e}store(e){let t=this.active[e];t&&(this.active[e]=null,this.storage.push(t))}withdraw(e,t){let n=this.storage[e];if(!n)return;this.storage.splice(e,1);let r=this.active[t];this.active[t]=n,r&&this.storage.push(r)}get activeMembers(){return this.active.filter(e=>e!==null)}};function Qk(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function $k(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var eA=class{constructor(e,t){this.stages=new Map,this.modifiers=new Map,this.stats=e,this.max=t.max,this.multiplierFor=t.multiplier}get(e){return this.stages.get(e)??0}change(e,t){let n=this.get(e),r=Math.max(-this.max,Math.min(this.max,n+t)),i=r-n;return i===0?0:(this.stages.set(e,r),this.applyModifier(e,r),i)}applyModifier(e,t){let n=this.modifiers.get(e);if(n&&this.stats.removeModifier(n),t===0){this.modifiers.delete(e);return}let r={stat:e,op:`multiply`,value:this.multiplierFor(t)};this.stats.addModifier(r),this.modifiers.set(e,r)}resetAll(){for(let e of this.modifiers.values())this.stats.removeModifier(e);this.modifiers.clear(),this.stages.clear()}};function tA(e,t,n,r=(e,n)=>t.multiplierFor(e.type,n)){if(e.length===0)return null;let i=e[0],a=r(i,n);for(let t of e.slice(1)){let e=r(t,n);e>a&&(a=e,i=t)}return i}function nA(e,t,n,r){let i=null,a=rA(e,n,r);return t.forEach((e,t)=>{let o=rA(e.types,n,r);o<a&&(a=o,i=t)}),i}function rA(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var iA=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,t,n){for(let r of this.hooks)r.event===e&&r.handler(t,n)}},aA=class{constructor(){this.conditions=new Map}set(e){this.conditions.set(e.id,{...e})}has(e){return this.conditions.has(e)}get(e){return this.conditions.get(e)}clear(e){this.conditions.delete(e)}get active(){return[...this.conditions.values()]}advance(){for(let[e,t]of this.conditions)t.duration!==void 0&&(--t.duration,t.duration<=0&&this.conditions.delete(e))}},oA=l({BattleHooks:()=>iA,Creature:()=>Yk,Field:()=>aA,Party:()=>Zk,StatStages:()=>eA,TypeMatrix:()=>Xk,battleOrder:()=>Qk,checkEvolution:()=>$k,chooseMove:()=>tA,chooseSwitch:()=>nA});function sA(e){let t=e.charCodeAt(0)-97,n=e.charCodeAt(1)-49;if(t<0||t>7||n<0||n>7||e.length!==2)throw Error(`not a square: "${e}"`);return n*8+t}function cA(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function lA(e){let t=e.trim().split(/\s+/);if(t.length<4)throw Error(`not a FEN string: "${e}"`);let n=Array(64).fill(null),r=t[0].split(`/`);if(r.length!==8)throw Error(`a FEN placement needs 8 ranks: "${e}"`);if(r.forEach((t,r)=>{let i=7-r,a=0;for(let r of t)if(r>=`1`&&r<=`8`)a+=r.charCodeAt(0)-48;else{let o=r===r.toUpperCase()?`white`:`black`,s={p:`pawn`,n:`knight`,b:`bishop`,r:`rook`,q:`queen`,k:`king`}[r.toLowerCase()];if(!s||a>7)throw Error(`bad FEN rank "${t}" in "${e}"`);n[i*8+a]={side:o,kind:s},a++}if(a!==8)throw Error(`bad FEN rank "${t}" in "${e}"`)}),t[1]!==`w`&&t[1]!==`b`)throw Error(`a FEN side is "w" or "b": "${e}"`);let i={whiteKingside:!1,whiteQueenside:!1,blackKingside:!1,blackQueenside:!1};if(t[2]!==`-`)for(let n of t[2])if(n===`K`)i.whiteKingside=!0;else if(n===`Q`)i.whiteQueenside=!0;else if(n===`k`)i.blackKingside=!0;else if(n===`q`)i.blackQueenside=!0;else throw Error(`bad FEN castling "${t[2]}" in "${e}"`);let a=t[3]===`-`?null:sA(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(fA(a)!==n)throw Error(`bad FEN en passant square "${t[3]}" in "${e}"`)}let o={board:n,turn:t[1]===`w`?`white`:`black`,castling:i,enPassant:a};return xA(n,`white`),xA(n,`black`),o}function uA(e){return e===`white`?`black`:`white`}function dA(e){return e&7}function fA(e){return e>>3}function pA(e,t){return e>=0&&e<8&&t>=0&&t<8}function mA(){let e=[`rook`,`knight`,`bishop`,`queen`,`king`,`bishop`,`knight`,`rook`],t=Array(64).fill(null);for(let n=0;n<8;n++)t[n]={side:`white`,kind:e[n]},t[8+n]={side:`white`,kind:`pawn`},t[48+n]={side:`black`,kind:`pawn`},t[56+n]={side:`black`,kind:e[n]};return{board:t,turn:`white`,castling:{whiteKingside:!0,whiteQueenside:!0,blackKingside:!0,blackQueenside:!0},enPassant:null}}function hA(e){return{board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}}var gA=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],_A=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],vA=[[1,1],[-1,1],[-1,-1],[1,-1]],yA=[[1,0],[0,1],[-1,0],[0,-1]];function bA(e,t,n){let r=dA(t),i=fA(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!pA(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of gA){if(!pA(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of _A){if(!pA(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let o=[{steps:vA,kinds:[`bishop`,`queen`]},{steps:yA,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of o)for(let[o,s]of t){let t=r+o,c=i+s;for(;pA(t,c);){let r=e[c*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,c+=s}}return!1}function xA(e,t){let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n}function SA(e,t){return bA(e.board,xA(e.board,t),uA(t))}function CA(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=dA(t),a=fA(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;pA(o,l);){let i=l*8+o,a=e.board[i];if(!a)r.push({from:t,to:i});else{a.side!==n.side&&r.push({from:t,to:i});break}o+=s,l+=c}}};switch(n.kind){case`pawn`:{let o=n.side===`white`?1:-1,s=n.side===`white`?1:6,c=n.side===`white`?7:0;if(pA(i,a+o)&&!e.board[(a+o)*8+i]){let n=(a+o)*8+i;if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),a===s&&!e.board[(a+2*o)*8+i]&&r.push({from:t,to:(a+2*o)*8+i})}for(let s of[-1,1]){if(!pA(i+s,a+o))continue;let l=(a+o)*8+i+s,u=e.board[l];if(u&&u.side!==n.side){if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:a*8+i+s})}break}case`knight`:for(let[o,s]of gA){if(!pA(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];(!l||l.side!==n.side)&&r.push({from:t,to:c})}break;case`bishop`:o(vA);break;case`rook`:o(yA);break;case`queen`:o(vA),o(yA);break;case`king`:{for(let[o,s]of _A){if(!pA(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:c})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!SA(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!bA(e.board,o+5,uA(n.side))&&!bA(e.board,o+6,uA(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!bA(e.board,o+3,uA(n.side))&&!bA(e.board,o+2,uA(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function wA(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${cA(t.from)} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[TA(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[TA(i.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=uA(n.side)}function TA(e,t){let n=dA(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function EA(e){let t=[];for(let n=0;n<64;n++)if(!(!e.board[n]||e.board[n]?.side!==e.turn))for(let r of CA(e,n)){let n=hA(e);wA(n,r),!SA(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function DA(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${cA(t.from)} to move`);let r=CA(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${cA(t.from)}-${cA(t.to)} is not a legal move here`);let i=hA(e);if(wA(i,r),SA(i,e.turn))throw Error(`${cA(t.from)}-${cA(t.to)} leaves the king in check`);wA(e,r)}function OA(e){return EA(e).length>0?`ongoing`:SA(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var kA={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function AA(e,t={}){return jA(e,t).move}function jA(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?1/0:Math.max(1,Math.floor(t.maxNodes)),i=PA(e,EA(e));if(i.length===0)return{move:null,score:NA(e,0),nodes:1};let a=0,o=i[0],s=-1/0,c=-1/0;for(let t of i){if(a>=r)break;let i=hA(e);DA(i,t);let u=-l(i,n-1,-1/0,-c,1);u>s&&(s=u,o=t),c=Math.max(c,u)}return{move:o,score:s,nodes:a};function l(e,t,n,i,o){if(a>=r)return MA(e);if(a++,OA(e)!==`ongoing`)return NA(e,o);if(t===0)return MA(e);let s=-1/0;for(let r of PA(e,EA(e))){let a=hA(e);if(DA(a,r),s=Math.max(s,-l(a,t-1,-i,-n,o+1)),n=Math.max(n,s),n>=i)break}return s}}function MA(e){let t=0;for(let n of e.board)n&&(t+=(n.side===`white`?1:-1)*kA[n.kind]);return e.turn===`white`?t:-t}function NA(e,t){return SA(e,e.turn)?-1e5+t:0}function PA(e,t){return t.slice().sort((t,n)=>FA(e,n)-FA(e,t))}function FA(e,t){let n=e.board[t.to];return(t.promotion?kA[t.promotion]:0)*10+(n?kA[n.kind]:0)}var IA=class{constructor(e,t,n){if(this.width=e,this.height=t,e<1||t<1)throw Error(`a board needs positive dimensions`);if(n&&n.length!==e*t)throw Error(`board cell count does not match dimensions`);this.cells=n?[...n]:Array(e*t).fill(null)}index(e,t){if(!this.inside(e,t))throw Error(`cell (${e},${t}) is outside the board`);return t*this.width+e}inside(e,t){return e>=0&&t>=0&&e<this.width&&t<this.height}get(e,t){return this.cells[this.index(e,t)]}set(e,t,n){this.cells[this.index(e,t)]=n}move(e,t){let n=this.get(e.x,e.y);if(n===null)throw Error(`cannot move an empty cell`);return this.set(e.x,e.y,null),this.set(t.x,t.y,n),n}};function LA(){let e=Array(64).fill(null);for(let t=0;t<3;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`black`,king:!1});for(let t=5;t<8;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`red`,king:!1});return{board:e,turn:`red`,forcedFrom:null}}function RA(e){let t=e.forcedFrom===null?e.board.map((t,n)=>t?.side===e.turn?n:-1).filter(e=>e>=0):[e.forcedFrom],n=t.flatMap(t=>BA(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>BA(e,t,!1)):[]}function zA(e,t){if(!RA(e).some(e=>e.from===t.from&&e.to===t.to&&e.captures.length===t.captures.length))throw Error(`illegal checkers move`);let n=e.board[t.from];if(!n)throw Error(`no checkers piece on the source cell`);e.board[t.from]=null;for(let n of t.captures)e.board[n]=null;let r=!n.king&&(n.side===`red`&&Math.floor(t.to/8)===0||n.side===`black`&&Math.floor(t.to/8)===7);e.board[t.to]={...n,king:n.king||r};let i={board:e.board,turn:e.turn,forcedFrom:t.captures.length>0?t.to:null};t.captures.length===0||BA(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function BA(e,t,n){let r=e.board[t];if(!r)return[];let i=t%8,a=Math.floor(t/8),o=r.king?[-1,1]:r.side===`red`?[-1]:[1],s=[];for(let c of o)for(let o of[-1,1]){let l=i+o,u=a+c,d=i+o*2,f=a+c*2;if(n){if(d<0||f<0||d>=8||f>=8)continue;let n=u*8+l,i=f*8+d;e.board[n]?.side!==r.side&&e.board[n]&&!e.board[i]&&s.push({from:t,to:i,captures:[n]})}else l>=0&&u>=0&&l<8&&u<8&&!e.board[u*8+l]&&s.push({from:t,to:u*8+l,captures:[]})}return s}function VA(e=9){if(e<2||e>25)throw Error(`Go size must be between 2 and 25`);return{size:e,board:Array(e*e).fill(null),turn:`black`,ko:null,passes:0}}function HA(e,t,n){let r=KA(e,t,n);if(e.board[r]||e.ko===r)throw Error(`Go cell is occupied or forbidden by ko`);let i=[...e.board];i[r]=e.turn;let a=e.turn===`black`?`white`:`black`,o=0;for(let t of qA(e,r))i[t]===a&&YA(i,e.size,t)===0&&(o+=XA(i,e.size,t));if(YA(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&YA(i,e.size,r)===1?e.board.findIndex((e,t)=>e!==i[t]):null,e.board=i,e.turn=a,e.passes=0}function UA(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function WA(e){return e.passes>=2?`finished`:`ongoing`}function GA(e){let t={black:0,white:0},n=new Set;for(let r=0;r<e.board.length;r++){let i=e.board[r];if(i)t[i]++;else if(!n.has(r)){let i=JA(e.board,e.size,r),a=new Set;for(let t of i)for(let n of qA(e,t))e.board[n]&&a.add(e.board[n]);for(let e of i)n.add(e);a.size===1&&(t[[...a][0]]+=i.length)}}return t}function KA(e,t,n){if(t<0||n<0||t>=e.size||n>=e.size)throw Error(`Go cell is outside the board`);return n*e.size+t}function qA(e,t){let n=t%e.size,r=Math.floor(t/e.size);return[[n-1,r],[n+1,r],[n,r-1],[n,r+1]].filter(([t,n])=>t>=0&&n>=0&&t<e.size&&n<e.size).map(([t,n])=>n*e.size+t)}function JA(e,t,n){let r=e[n];if(!r)return[];let i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(o.has(n)||e[n]!==r)continue;o.add(n),i.push(n);let s=n%t,c=Math.floor(n/t);for(let[e,n]of[[s-1,c],[s+1,c],[s,c-1],[s,c+1]])e>=0&&n>=0&&e<t&&n<t&&a.push(n*t+e)}return i}function YA(e,t,n){let r=JA(e,t,n),i=new Set;for(let n of r){let r=n%t,a=Math.floor(n/t);for(let[n,o]of[[r-1,a],[r+1,a],[r,a-1],[r,a+1]])n>=0&&o>=0&&n<t&&o<t&&e[o*t+n]===null&&i.add(o*t+n)}return i.size}function XA(e,t,n){let r=JA(e,t,n);for(let t of r)e[t]=null;return r.length}function ZA(){let e=Array(24).fill(0);return e[0]=2,e[11]=5,e[16]=3,e[18]=5,e[23]=-2,e[12]=-5,e[7]=-3,e[5]=-5,{points:e,bar:{white:0,black:0},off:{white:0,black:0},turn:`white`}}function QA(){let e=fj(2,6);return e[0]===e[1]?[...e,...e]:e}function $A(e,t){let n=e.turn===`white`?1:-1,r=[];for(let i of t){if(e.bar[e.turn]>0){let t=e.turn===`white`?i-1:24-i;tj(e,t,n)&&r.push({from:`bar`,to:t,die:i});continue}for(let t=0;t<24;t++)if(e.points[t]*n>0){let a=t+i*n;a<0||a>=24?r.push({from:t,to:`off`,die:i}):tj(e,a,n)&&r.push({from:t,to:a,die:i})}}return r}function ej(e,t){if(!$A(e,[t.die]).some(e=>e.from===t.from&&e.to===t.to))throw Error(`illegal backgammon move`);let n=e.turn===`white`?1:-1;if(t.from===`bar`?e.bar[e.turn]--:e.points[t.from]-=n,t.to===`off`)e.off[e.turn]++;else{if(e.points[t.to]*n<0){let n=e.turn===`white`?`black`:`white`;e.points[t.to]=0,e.bar[n]++}e.points[t.to]+=n}}function tj(e,t,n){return e.points[t]*n>=-1}function nj(e=0){let t=[`clubs`,`diamonds`,`hearts`,`spades`],n=[];for(let e of t)for(let t=1;t<=13;t++)n.push({suit:e,rank:t});return n.concat(Array(e).fill(null).map(()=>({suit:`spades`,rank:1})))}function rj(e){return gE(e)}function ij(e,t,n){if(t<0||n<0||e.length<t*n)throw Error(`not enough cards to deal`);return Array.from({length:t},()=>e.splice(0,n))}function aj(e,t){if(e.length===0)throw Error(`a trick needs at least one play`);let n=e[0].card.suit,r=e=>e.rank===1?14:e.rank;return(t&&e.some(e=>e.card.suit===t)?e.filter(e=>e.card.suit===t):e.filter(e=>e.card.suit===n)).reduce((e,t)=>r(t.card)>r(e.card)?t:e).owner}function oj(e){let t=nj();return e===void 0?rj(t):oE(e,()=>rj(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function sj(e){e.stock.length===0&&(e.stock=e.waste.reverse(),e.waste=[]);let t=e.stock.pop()??null;return t&&e.waste.push(t),t}function cj(e,t,n,r=1){let i=e.tableau[t],a=e.tableau[n],o=i?.up.slice(-r);if(!i||!a||!o?.length||(a.up.length===0?o[0].rank!==13:!dj(o[0],a.up.at(-1))))throw Error(`illegal solitaire tableau move`);i.up.splice(-r,r),a.up.push(...o),i.down.length&&i.up.length===0&&i.up.push(i.down.pop())}function lj(e,t){let n=t===`waste`?e.waste.at(-1):e.tableau[t].up.at(-1);if(!n)throw Error(`no solitaire card to move`);let r=e.foundations.find(e=>e[0]?.suit===n.suit||e.length===0);if(!r||n.rank!==r.length+1)throw Error(`card cannot move to its foundation`);if(t===`waste`)e.waste.pop();else{let n=e.tableau[t];n.up.pop(),n.down.length&&n.up.length===0&&n.up.push(n.down.pop())}r.push(n)}function uj(e){return e.foundations.every(e=>e.length===13)}function dj(e,t){let n=e.suit===`diamonds`||e.suit===`hearts`,r=t.suit===`diamonds`||t.suit===`hearts`;return e.rank===t.rank-1&&n!==r}function fj(e,t){if(!Number.isInteger(e)||e<0||!Number.isInteger(t)||t<1)throw Error(`dice need a non-negative count and positive sides`);return Array.from({length:e},()=>uE(1,t))}function pj(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return fj(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var mj=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=fj(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=uE(1,this.sides))}keep(e){if(e<0||e>=this.count)throw Error(`die index is outside the cup`);this.kept.add(e)}clearKept(){this.kept.clear()}};function hj(e,t){if(e.length!==5||e.some(e=>e<1||e>6))throw Error(`a score sheet needs five d6 values`);let n=new Map;for(let t of e)n.set(t,(n.get(t)??0)+1);let r=e.reduce((e,t)=>e+t,0);if(t===`chance`)return r;if(t===`yahtzee`)return n.size===1?50:0;if(t===`fullHouse`)return[...n.values()].sort().join(`,`)===`2,3`?25:0;if(t===`threeKind`)return[...n.values()].some(e=>e>=3)?r:0;if(t===`fourKind`)return[...n.values()].some(e=>e>=4)?r:0;if(t===`smallStraight`||t===`largeStraight`){let e=[`1234`,`2345`,`3456`],r=[`12345`,`23456`],i=[...n.keys()].sort().join(``);return(t===`smallStraight`?e:r).some(e=>i.includes(e))?t===`smallStraight`?30:40:0}let i=[`ones`,`twos`,`threes`,`fours`,`fives`,`sixes`].indexOf(t)+1;return i>0?(n.get(i)??0)*i:0}function gj(e,t,n=`hex`){if(e<1||t<1)throw Error(`a tactical map needs positive dimensions`);return{width:e,height:t,shape:n,cells:Array.from({length:e*t},()=>({passable:!0,cover:0})),units:[],turn:``,round:1}}function _j(e,t){if(!Ej(e,t.x,t.y)||e.units.some(e=>e.x===t.x&&e.y===t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t}),e.turn||=t.owner}function vj(e,t){let n=wj(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=[];for(let i=0;i<e.height;i++)for(let a=0;a<e.width;a++){let o=Oj(e,n,{x:a,y:i});o>0&&o<=n.actions&&e.cells[i*e.width+a].passable&&!Tj(e,a,i)&&kj(e,n,a,i)&&r.push({unit:t,x:a,y:i,cost:o})}return r}function yj(e,t){let n=vj(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=wj(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function bj(e,t){let n=wj(e,t);if(n.owner!==e.turn||n.actions<=0)throw Error(`only an active unit can enter overwatch`);n.actions=0,n.overwatch=!0}function xj(e,t,n){let r=wj(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||Oj(e,t,r)>3)continue;let a=e.cells[r.y*e.width+r.x].cover??0,o=Math.max(0,n-a);if(r.hp=Math.max(0,r.hp-o),t.overwatch=!1,i.push({attacker:t.id,defender:r.id,damage:o,cover:a,killed:r.hp===0}),r.hp===0){e.units=e.units.filter(e=>e!==r);break}}return i}function Sj(e,t,n,r){let i=wj(e,t),a=wj(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(Oj(e,i,a)>3)throw Error(`tactical target is out of range`);let o=e.cells[a.y*e.width+a.x].cover??0,s=Math.max(0,r-o);a.hp=Math.max(0,a.hp-s);let c=a.hp===0;return c&&(e.units=e.units.filter(e=>e!==a)),{attacker:t,defender:n,damage:s,cover:o,killed:c}}function Cj(e){let t=[...new Set(e.units.map(e=>e.owner))];if(t.length===0)return;let n=t.indexOf(e.turn)+1;n>=t.length&&e.round++,e.turn=t[n%t.length];for(let t of e.units)t.owner===e.turn&&(t.actions=2,t.overwatch=!1)}function wj(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function Tj(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function Ej(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function Dj(e,t,n){return e.shape===`hex`?kE(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function Oj(e,t,n){return e.shape===`hex`?AE(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function kj(e,t,n,r){let i=[{x:t.x,y:t.y,distance:0}],a=new Set([`${t.x},${t.y}`]);for(;i.length;){let t=i.shift();if(t.x===n&&t.y===r)return!0;for(let o of Dj(e,t.x,t.y)){let s=`${o.x},${o.y}`;!Ej(e,o.x,o.y)||a.has(s)||!e.cells[o.y*e.width+o.x].passable||Tj(e,o.x,o.y)&&(o.x!==n||o.y!==r)||(a.add(s),i.push({...o,distance:t.distance+1}))}}return!1}var Aj=l({BoardGrid:()=>IA,DiceCup:()=>mj,addTacticalUnit:()=>_j,applyBackgammonMove:()=>ej,applyCheckersMove:()=>zA,applyMove:()=>DA,backgammonMoves:()=>$A,checkersMoves:()=>RA,chooseMove:()=>AA,cloneChess:()=>hA,createDeck:()=>nj,deal:()=>ij,dealSolitaire:()=>oj,drawSolitaire:()=>sj,endTacticalTurn:()=>Cj,gameResult:()=>OA,goResult:()=>WA,goScore:()=>GA,inCheck:()=>SA,legalMoves:()=>EA,moveSolitaireTableau:()=>cj,moveSolitaireToFoundation:()=>lj,moveTacticalUnit:()=>yj,parseFen:()=>lA,passGo:()=>UA,playGo:()=>HA,rollBackgammonDice:()=>QA,rollDice:()=>fj,rollExpression:()=>pj,scoreDice:()=>hj,search:()=>jA,setTacticalOverwatch:()=>bj,shuffleDeck:()=>rj,solitaireWon:()=>uj,sq:()=>sA,squareName:()=>cA,startingBackgammon:()=>ZA,startingCheckers:()=>LA,startingChess:()=>mA,startingGo:()=>VA,startingTactics:()=>gj,tacticalAttack:()=>Sj,tacticalMoves:()=>vj,trickWinner:()=>aj,triggerTacticalOverwatch:()=>xj});function jj(e){return new Audio(GE(e))}var Mj=class{constructor(e,t={}){this.next=0;let n=Math.max(1,t.poolSize??4),r=t.create??jj;this.volume=t.volume??1,this.pool=Array.from({length:n},()=>r(e))}play(){let e=this.pool[this.next];this.next=(this.next+1)%this.pool.length,e.volume=this.volume,e.currentTime=0,e.play()}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}},Nj=class{constructor(e={}){this.current=null,this.fades=[],this.volume=e.volume??1,this.create=e.create??jj}play(e,t=1){let n=this.create(e);n.loop=!0;let r=this.current;if(this.current=n,t<=0){n.volume=this.volume,n.play(),r?.pause();return}n.volume=0,n.play(),this.fades.push({audio:n,elapsed:0,duration:t,from:0,to:this.volume,stopAtEnd:!1}),r&&this.fades.push({audio:r,elapsed:0,duration:t,from:r.volume,to:0,stopAtEnd:!0})}stop(e=1){let t=this.current;if(t){if(this.current=null,e<=0){t.pause();return}this.fades.push({audio:t,elapsed:0,duration:e,from:t.volume,to:0,stopAtEnd:!0})}}update(e){for(let t of[...this.fades]){t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.audio.volume=t.from+(t.to-t.from)*n,n>=1&&(this.fades.splice(this.fades.indexOf(t),1),t.stopAtEnd&&(t.audio.pause(),t.audio.currentTime=0))}}},Pj=l({Music:()=>Nj,Sound:()=>Mj,createAudio:()=>jj});return e.Achievements=TE,e.ActorAnimator=cD,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return wk}}),e.AnimatedSprite=LE,e.Animation=IE,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return Pj}}),e.BLOB_SHAPES=lD,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return oA}}),Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return Aj}}),e.Camera=XE,e.Collection=bE,e.ColorTransformBatcher=lT,e.DialogueStage=AD,e.EMPTY=$E,e.Game=qT,e.Generator=eE,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return FO}}),e.IconGrid=wD,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return bT}}),e.Label=yD,e.LayeredSprite=oD,e.ListView=CD,e.Logger=XT,e.MessageBox=TD,e.NO_COLOR_ADD=pT,e.NinePatch=bD,e.Player=SE,e.Projectile=sD,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return QT}}),e.Recorder=xE,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return RE}}),Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return PO}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return qk}}),e.SaveSystem=yE,e.Scene=JT,e.SceneStack=eT,e.Signal=tT,e.SpriteSheet=YE,e.StageScript=jD,e.TileMap=aD,e.TintedSprite=hT,e.VerticalLabel=OD,e.Window=xD,e.WindowStack=SD,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return kk}}),e.autotileFrames=mD,e.blobIndex=pD,e.createCamera=QE,e.defaultTheme=hD,e.deserializeReplay=wE,e.hexDistance=AE,e.hexLine=ME,e.hexNeighbors=kE,e.hexRange=NE,e.hexToPixel=PE,e.importTwee=MD,e.layoutVertical=DD,e.packColorAdd=uT,e.packTintAdd=dT,e.pixelToHex=FE,e.registerColorTransform=yT,e.serializeReplay=CE,e.setTheme=vD,e.theme=_D,e.tileFrame=nD,e.tileFrameIndex=iD,e.tileFrameSheet=rD,e})({});
|
|
992
|
+
`))t.startsWith(`::`)?(i(),n=ID(t),r=[]):n!==null&&r.push(t);return i(),t}function ID(e){let t=e.slice(2).trim(),n=t.search(/[[{]/),r=(n===-1?t:t.slice(0,n)).trim();if(!r)throw Error(`a twee passage header needs a name, got "${e}"`);return r}function LD(e){let t;try{t=JSON.parse(e.trim())}catch{throw Error(`StoryData must be JSON - check the braces`)}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`StoryData must be a JSON object`);let n=t.start;if(n!==void 0&&typeof n!=`string`)throw Error(`StoryData "start" must be a passage name`);return n}function RD(e,t){let n=[],r=[];for(let i of t.split(`
|
|
993
|
+
`)){let t=zD(i,r,e).replace(/\s+/g,` `).trim();t!==``&&n.push(t)}if(r.length===0)return n.map(e=>({say:e}));let i=n.pop()??``;return[...n.map(e=>({say:e})),{ask:i,choices:r}]}function zD(e,t,n){let r=``,i=e;for(;;){let a=i.indexOf(`[[`);if(a===-1)return r+i;let o=i.indexOf(`]]`,a);if(o===-1)throw Error(`passage "${n}" has a "[[" with no closing "]]" in "${e.trim()}"`);r+=i.slice(0,a),t.push(BD(i.slice(a+2,o),n)),i=i.slice(o+2)}}function BD(e,t){if(e.includes(`[`)||e.includes(`]`))throw Error(`passage "${t}" links with a setter ("${e.trim()}") - story-format macros are not imported, so the link is refused rather than half-read`);let n=e.indexOf(`->`);if(n!==-1)return{text:e.slice(0,n).trim(),goto:e.slice(n+2).trim()};let r=e.indexOf(`<-`);if(r!==-1)return{text:e.slice(r+2).trim(),goto:e.slice(0,r).trim()};let i=e.trim();return{text:i,goto:i}}function VD(e){return e===4?[[0,-1],[1,0],[0,1],[-1,0]]:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]]}var HD={passable:!1,transparent:!1},UD={passable:!0,transparent:!0},WD=class e{constructor(e,t,n,r=0,i=`square`){this.rooms=[],this.width=e,this.shape=i,this.height=t,this.kinds=n,this.terrain=new Uint8Array(e*t).fill(r)}get cellCount(){return this.width*this.height}index(e,t){return t*this.width+e}xOf(e){return e%this.width}yOf(e){return Math.floor(e/this.width)}inside(e,t){return e>=0&&t>=0&&e<this.width&&t<this.height}neighbors(e,t,n=8){return this.shape===`hex`?fE(e,t):VD(n).map(([n,r])=>({x:e+n,y:t+r}))}insideWithBorder(e,t){return e>0&&t>0&&e<this.width-1&&t<this.height-1}get(e,t){return this.inside(e,t)?this.terrain[this.index(e,t)]:0}set(e,t,n){this.inside(e,t)&&(this.terrain[this.index(e,t)]=n)}kindAt(e,t){return this.kinds[this.get(e,t)]??HD}passable(e,t){return this.inside(e,t)&&this.kindAt(e,t).passable}transparent(e,t){return this.inside(e,t)&&this.kindAt(e,t).transparent}fillRect(e,t){for(let n=e.top;n<=e.bottom;n++)for(let r=e.left;r<=e.right;r++)this.set(r,n,t)}passableCells(){let e=[];for(let t=0;t<this.terrain.length;t++)this.kinds[this.terrain[t]]?.passable&&e.push(t);return e}toJSON(){return{width:this.width,height:this.height,shape:this.shape,terrain:[...this.terrain],rooms:this.rooms.map(e=>({...e}))}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function GD(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function KD(e,t,n=0){return!(e.right+n<t.left||t.right+n<e.left||e.bottom+n<t.top||t.bottom+n<e.top)}var qD=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function JD(e){let{width:t,height:n,rooms:r=14,minRoomSize:i=4,maxRoomSize:a=10,extraCorridors:o=3,wall:s=0,floor:c=1,kinds:l=[]}=e,u=new WD(t,n,[...qD,...l],s),d=[];for(let e=0;e<r*6&&d.length<r;e++){let e=KT(i,a),r=KT(i,a),o=GT(1,Math.max(2,t-e-1)),s=GT(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};l.right>=t-1||l.bottom>=n-1||d.some(e=>KD(l,e,2))||(d.push(l),u.fillRect(l,c))}for(let e=1;e<d.length;e++)YD(u,GD(d[e-1]),GD(d[e]),c);for(let e=0;e<o&&d.length>2;e++){let e=d[GT(d.length)],t=d[GT(d.length)];e!==t&&YD(u,GD(e),GD(t),c)}return u.rooms=d,u}function YD(e,t,n,r){JT(.5)?(XD(e,t.x,n.x,t.y,!0,r),XD(e,t.y,n.y,n.x,!1,r)):(XD(e,t.y,n.y,t.x,!1,r),XD(e,t.x,n.x,n.y,!0,r))}function XD(e,t,n,r,i,a){let o=t<=n?1:-1;for(let s=t;s!==n+o;s+=o){let t=i?s:r,n=i?r:s;e.insideWithBorder(t,n)&&e.set(t,n,a)}}function ZD(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[GT(n.length)]:null}function QD(e,t){let n=null,r=-1;for(let i of e.rooms){let e=GD(i),a=(e.x-t.x)**2+(e.y-t.y)**2;a>r&&(r=a,n=i)}return n}var $D=23283064365386963e-26;new class e{constructor(){this._seed=0,this._s0=0,this._s1=0,this._s2=0,this._c=0}getSeed(){return this._seed}setSeed(e){return e=e<1?1/e:e,this._seed=e,this._s0=(e>>>0)*$D,e=e*69069+1>>>0,this._s1=e*$D,e=e*69069+1>>>0,this._s2=e*$D,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*$D;return this._s0=this._s1,this._s1=this._s2,this._c=e|0,this._s2=e-this._c,this._s2}getUniformInt(e,t){let n=Math.max(e,t),r=Math.min(e,t);return Math.floor(this.getUniform()*(n-r+1))+r}getNormal(e=0,t=1){let n,r,i;do n=2*this.getUniform()-1,r=2*this.getUniform()-1,i=n*n+r*r;while(i>1||i==0);return e+n*Math.sqrt(-2*Math.log(i)/i)*t}getPercentage(){return 1+Math.floor(this.getUniform()*100)}getItem(e){return e.length?e[Math.floor(this.getUniform()*e.length)]:null}shuffle(e){let t=[],n=e.slice();for(;n.length;){let e=n.indexOf(this.getItem(n));t.push(n.splice(e,1)[0])}return t}getWeightedValue(e){let t=0;for(let n in e)t+=e[n];let n=this.getUniform()*t,r,i=0;for(r in e)if(i+=e[r],n<i)return r;return r}getState(){return[this._s0,this._s1,this._s2,this._c]}setState(e){return this._s0=e[0],this._s1=e[1],this._s2=e[2],this._c=e[3],this}clone(){return new e().setState(this.getState())}}().setSeed(Date.now());var eO=class{getContainer(){return null}setOptions(e){this._options=e}},tO=class extends eO{constructor(){super(),this._ctx=document.createElement(`canvas`).getContext(`2d`)}schedule(e){requestAnimationFrame(e)}getContainer(){return this._ctx.canvas}setOptions(e){super.setOptions(e);let t=`${e.fontStyle?`${e.fontStyle} `:``} ${e.fontSize}px ${e.fontFamily}`;this._ctx.font=t,this._updateSize(),this._ctx.font=t,this._ctx.textAlign=`center`,this._ctx.textBaseline=`middle`}clear(){let e=this._ctx.globalCompositeOperation;this._ctx.globalCompositeOperation=`copy`,this._ctx.fillStyle=this._options.bg,this._ctx.fillRect(0,0,this._ctx.canvas.width,this._ctx.canvas.height),this._ctx.globalCompositeOperation=e}eventToPosition(e,t){let n=this._ctx.canvas,r=n.getBoundingClientRect();return e-=r.left,t-=r.top,e*=n.width/r.width,t*=n.height/r.height,e<0||t<0||e>=n.width||t>=n.height?[-1,-1]:this._normalizedEventToPosition(e,t)}};function nO(e){return e.charAt(0).toUpperCase()+e.substring(1)}function rO(e,...t){let n=rO.map;return e.replace(/%(?:([a-z]+)|(?:{([^}]+)}))/gi,function(r,i,a,o){if(e.charAt(o-1)==`%`)return r.substring(1);if(!t.length)return r;let s=t[0],c=(i||a).split(`,`),l=c.shift()||``,u=n[l.toLowerCase()];if(!u)return r;s=t.shift();let d=s[u].apply(s,c),f=l.charAt(0);return f!=f.toLowerCase()&&(d=nO(d)),d})}rO.map={s:`toString`};var iO=class e extends tO{constructor(){super(),this._spacingX=0,this._spacingY=0,this._canvasCache={}}setOptions(e){super.setOptions(e),this._canvasCache={}}draw(t,n){e.cache?this._drawWithCache(t):this._drawNoCache(t,n)}_drawWithCache(e){let[t,n,r,i,a]=e,o=``+r+i+a,s;if(o in this._canvasCache)s=this._canvasCache[o];else{let e=this._options.border;s=document.createElement(`canvas`);let t=s.getContext(`2d`);if(s.width=this._spacingX,s.height=this._spacingY,t.fillStyle=a,t.fillRect(e,e,s.width-e,s.height-e),r){t.fillStyle=i,t.font=this._ctx.font,t.textAlign=`center`,t.textBaseline=`middle`;let e=[].concat(r);for(let n=0;n<e.length;n++)t.fillText(e[n],this._spacingX/2,Math.ceil(this._spacingY/2))}this._canvasCache[o]=s}this._ctx.drawImage(s,t*this._spacingX,n*this._spacingY)}_drawNoCache(e,t){let[n,r,i,a,o]=e;if(t){let e=this._options.border;this._ctx.fillStyle=o,this._ctx.fillRect(n*this._spacingX+e,r*this._spacingY+e,this._spacingX-e,this._spacingY-e)}if(!i)return;this._ctx.fillStyle=a;let s=[].concat(i);for(let e=0;e<s.length;e++)this._ctx.fillText(s[e],(n+.5)*this._spacingX,Math.ceil((r+.5)*this._spacingY))}computeSize(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}computeFontSize(e,t){let n=Math.floor(e/this._options.width),r=Math.floor(t/this._options.height),i=this._ctx.font;this._ctx.font=`100px `+this._options.fontFamily;let a=Math.ceil(this._ctx.measureText(`W`).width);this._ctx.font=i;let o=a/100*r/n;return o>1&&(r=Math.floor(r/o)),Math.floor(r/this._options.spacing)}_normalizedEventToPosition(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}_updateSize(){let e=this._options,t=Math.ceil(this._ctx.measureText(`W`).width);this._spacingX=Math.ceil(e.spacing*t),this._spacingY=Math.ceil(e.spacing*e.fontSize),e.forceSquareRatio&&(this._spacingX=this._spacingY=Math.max(this._spacingX,this._spacingY)),this._ctx.canvas.width=e.width*this._spacingX,this._ctx.canvas.height=e.height*this._spacingY}};iO.cache=!1;var aO={4:[[0,-1],[1,0],[0,1],[-1,0]],8:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],6:[[-1,-1],[1,-1],[2,0],[1,1],[-1,1],[-2,0]]},oO=class{constructor(e,t={}){this._lightPasses=e,this._options=Object.assign({topology:8},t)}_getCircle(e,t,n){let r=[],i,a,o;switch(this._options.topology){case 4:a=1,o=[0,1],i=[aO[8][7],aO[8][1],aO[8][3],aO[8][5]];break;case 6:i=aO[6],a=1,o=[-1,1];break;case 8:i=aO[4],a=2,o=[-1,1];break;default:throw Error(`Incorrect topology for FOV computation`)}let s=e+o[0]*n,c=t+o[1]*n;for(let e=0;e<i.length;e++)for(let t=0;t<n*a;t++)r.push([s,c]),s+=i[e][0],c+=i[e][1];return r}},sO=class extends oO{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l;for(let u=1;u<=n;u++){let n=this._getCircle(e,t,u),d=360/n.length;for(let e=0;e<n.length;e++)if(s=n[e][0],c=n[e][1],a=d*(e-.5),o=a+d,l=!this._lightPasses(s,c),this._visibleCoords(Math.floor(a),Math.ceil(o),l,i)&&r(s,c,u,1),i.length==2&&i[0]==0&&i[1]==360)return}}_visibleCoords(e,t,n,r){if(e<0){let i=this._visibleCoords(0,t,n,r),a=this._visibleCoords(360+e,360,n,r);return i||a}let i=0;for(;i<r.length&&r[i]<e;)i++;if(i==r.length)return n&&r.push(e,t),!0;let a=0;if(i%2){for(;i<r.length&&r[i]<t;)i++,a++;return a!=0&&(n&&(a%2?r.splice(i-a,a,t):r.splice(i-a,a)),!0)}for(;i<r.length&&r[i]<t;)i++,a++;return e==r[i-a]&&a==1?!1:(n&&(a%2?r.splice(i-a,a,e):r.splice(i-a,a,e,t)),!0)}},cO=class extends oO{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l,u;for(let d=1;d<=n;d++){let n=this._getCircle(e,t,d),f=n.length;for(let e=0;e<f;e++)if(a=n[e][0],o=n[e][1],c=[e?2*e-1:2*f-1,2*f],l=[2*e+1,2*f],s=!this._lightPasses(a,o),u=this._checkVisibility(c,l,s,i),u&&r(a,o,d,u),i.length==2&&i[0][0]==0&&i[1][0]==i[1][1])return}}_checkVisibility(e,t,n,r){if(e[0]>t[0])return(this._checkVisibility(e,[e[1],e[1]],n,r)+this._checkVisibility([0,1],t,n,r))/2;let i=0,a=!1;for(;i<r.length;){let t=r[i],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&!(i%2)&&(a=!0);break}i++}let o=r.length,s=!1;for(;o--;){let e=r[o],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&o%2&&(s=!0);break}}let c=!0;if((i==o&&(a||s)||a&&s&&i+1==o&&o%2||i>o&&i%2)&&(c=!1),!c)return 0;let l,u=o-i+1;if(u%2){if(i%2){let e=r[i];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,t)}else{let t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,e)}}else if(i%2){let e=r[i],t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u)}else return n&&r.splice(i,u,e,t),1;let d=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]);return l/d}},lO=[[-1,0,0,1],[0,-1,1,0],[0,-1,-1,0],[-1,0,0,-1],[1,0,0,-1],[0,1,-1,0],[0,1,1,0],[1,0,0,1]],uO={DiscreteShadowcasting:sO,PreciseShadowcasting:cO,RecursiveShadowcasting:class extends oO{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<lO.length;i++)this._renderOctant(e,t,lO[i],n,r)}compute180(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8,o=(r-2+8)%8,s=(r+1+8)%8;this._renderOctant(e,t,lO[o],n,i),this._renderOctant(e,t,lO[a],n,i),this._renderOctant(e,t,lO[r],n,i),this._renderOctant(e,t,lO[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,lO[r],n,i),this._renderOctant(e,t,lO[a],n,i)}_renderOctant(e,t,n,r,i){this._castVisibility(e,t,1,1,0,r+1,n[0],n[1],n[2],n[3],i)}_castVisibility(e,t,n,r,i,a,o,s,c,l,u){if(!(r<i))for(let d=n;d<=a;d++){let n=-d-1,f=-d,p=!1,m=0;for(;n<=0;){n+=1;let h=e+n*o+f*s,g=t+n*c+f*l,_=(n-.5)/(f+.5),v=(n+.5)/(f-.5);if(!(v>r)){if(_<i)break;if(n*n+f*f<a*a&&u(h,g,d,1),!p)!this._lightPasses(h,g)&&d<a&&(p=!0,this._castVisibility(e,t,d+1,r,_,a,o,s,c,l,u),m=v);else{if(!this._lightPasses(h,g)){m=v;continue}p=!1,r=m}}}if(p)break}}}};.5*(Math.sqrt(3)-1),(3-Math.sqrt(3))/6;var dO=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=aO[this._options.topology],this._options.topology==8&&(this._dirs=[this._dirs[0],this._dirs[2],this._dirs[4],this._dirs[6],this._dirs[1],this._dirs[3],this._dirs[5],this._dirs[7]])}_getNeighbors(e,t){let n=[];for(let r=0;r<this._dirs.length;r++){let i=this._dirs[r],a=e+i[0],o=t+i[1];this._passableCallback(a,o)&&n.push([a,o])}return n}},fO={Dijkstra:class extends dO{constructor(e,t,n,r){super(e,t,n,r),this._computed={},this._todo=[],this._add(e,t,null)}compute(e,t,n){let r=e+`,`+t;if(r in this._computed||this._compute(e,t),!(r in this._computed))return;let i=this._computed[r];for(;i;)n(i.x,i.y),i=i.prev}_compute(e,t){for(;this._todo.length;){let n=this._todo.shift();if(n.x==e&&n.y==t)return;let r=this._getNeighbors(n.x,n.y);for(let e=0;e<r.length;e++){let t=r[e],i=t[0],a=t[1];i+`,`+a in this._computed||this._add(i,a,n)}}}_add(e,t,n){let r={x:e,y:t,prev:n};this._computed[e+`,`+t]=r,this._todo.push(r)}},AStar:class extends dO{constructor(e,t,n,r={}){super(e,t,n,r),this._todo=[],this._done={}}compute(e,t,n){for(this._todo=[],this._done={},this._fromX=e,this._fromY=t,this._add(this._toX,this._toY,null);this._todo.length;){let n=this._todo.shift(),r=n.x+`,`+n.y;if(r in this._done)continue;if(this._done[r]=n,n.x==e&&n.y==t)break;let i=this._getNeighbors(n.x,n.y);for(let e=0;e<i.length;e++){let t=i[e],r=t[0],a=t[1];r+`,`+a in this._done||this._add(r,a,n)}}let r=this._done[e+`,`+t];if(r)for(;r;)n(r.x,r.y),r=r.prev}_add(e,t,n){let r=this._distance(e,t),i={x:e,y:t,prev:n,g:n?n.g+1:0,h:r},a=i.g+i.h;for(let e=0;e<this._todo.length;e++){let t=this._todo[e],n=t.g+t.h;if(a<n||a==n&&r<t.h){this._todo.splice(e,0,i);return}}this._todo.push(i)}_distance(e,t){switch(this._options.topology){case 4:return Math.abs(e-this._fromX)+Math.abs(t-this._fromY);case 6:let n=Math.abs(e-this._fromX),r=Math.abs(t-this._fromY);return r+Math.max(0,(n-r)/2);case 8:return Math.max(Math.abs(e-this._fromX),Math.abs(t-this._fromY))}}}};function pO(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function mO(e,t){let n=[],r=e.x,i=e.y,a=Math.abs(t.x-e.x),o=-Math.abs(t.y-e.y),s=e.x<t.x?1:-1,c=e.y<t.y?1:-1,l=a+o;for(;n.push({x:r,y:i}),r!==t.x||i!==t.y;){let e=l*2;e>=o&&(l+=o,r+=s),e<=a&&(l+=a,i+=c)}return n}function hO(e,t,n){let r=mO(t,n);for(let t=1;t<r.length-1;t++)if(!e.transparent(r[t].x,r[t].y))return!1;return!0}function gO(e,t,n,r){return!(pO(t,n)>r.range||(r.requireLineOfSight??!0)&&!hO(e,t,n))}function _O(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return mO(e,t);case`cone`:return vO(e,t,n.width);case`burst`:{let e=[],r=n.radius;for(let n=-r;n<=r;n++)for(let i=-r;i<=r;i++)i*i+n*n>r*r||e.push({x:t.x+i,y:t.y+n});return e}}}function vO(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.max(Math.abs(r),Math.abs(i));if(a===0)return[{...e}];let o=Math.sign(r),s=Math.sign(i),c=r!==0&&i!==0?o:s,l=r!==0&&i!==0?-s:o,u=[];for(let t=1;t<=a;t++){let r=e.x+o*t,i=e.y+s*t,d=Math.round(t/a*n);for(let e=-d;e<=d;e++)u.push({x:r+c*e,y:i+l*e})}return u}function yO(e,t,n,r){let i=new Set,a=[],o=t;for(let t=0;t<n;t++){let t=-1,n=r+1;for(let a=0;a<e.length;a++){if(i.has(a))continue;let s=pO(o,e[a]);s<=r&&s<n&&(n=s,t=a)}if(t===-1)break;i.add(t),a.push(e[t]),o=e[t]}return a}function bO(e,t,n,r){let i=[];for(let a=1;a<=r;a++){let r={x:t.x+n.x*a,y:t.y+n.y*a};if(!e.passable(r.x,r.y))break;i.push(r)}return i}var xO=class{constructor(e){this.visible=new Set,this.explored=new Set,this.light=new Map,this.level=e,this.fov=e.shape===`hex`?null:new uO.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n,r){if(this.visible.clear(),this.light.clear(),r){this.updateFromHeight(e,t,n,r);return}if(this.fov){this.fov.compute(e,t,n,(e,t,n,r)=>{if(!this.level.inside(e,t))return;let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r)});return}let i={x:e,y:t};for(let e of gE(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=hE(i,e);t.slice(1,-1).some(e=>!this.level.inside(e.x,e.y)||!this.level.transparent(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}}lightCell(e,t,n,r){let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r===0?1:Math.max(0,1-n/(r+1)))}updateFromHeight(e,t,n,r){let i=r.height??r.heights.heightAt(e,t),a={x:e,y:t};if(this.level.shape===`hex`){for(let e of gE(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=hE(a,e);this.heightBlocked(t,r.heights,i,r.heights.heightAt(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}return}for(let o=t-n;o<=t+n;o++)for(let t=e-n;t<=e+n;t++){if(!this.level.inside(t,o)||pO(a,{x:t,y:o})>n)continue;let e=mO(a,{x:t,y:o});this.heightBlocked(e,r.heights,i,r.heights.heightAt(t,o))||this.lightCell(t,o,e.length-1,n)}}heightBlocked(e,t,n,r){let i=Math.max(n,r);for(let n=1;n<e.length-1;n++){let r=e[n];if(!this.level.inside(r.x,r.y)||!this.level.transparent(r.x,r.y)||t.heightAt(r.x,r.y)>i)return!0}return!1}isVisible(e,t){return this.visible.has(this.level.index(e,t))}isExplored(e,t){return this.explored.has(this.level.index(e,t))}lightAt(e,t){return this.light.get(this.level.index(e,t))??0}reset(){this.visible.clear(),this.explored.clear(),this.light.clear()}revealAll(){for(let e=0;e<this.level.cellCount;e++)this.explored.add(e)}},SO=class{constructor(e){this.level=e,this.heights=new Int32Array(e.cellCount)}heightAt(e,t){return this.level.inside(e,t)?this.heights[this.level.index(e,t)]:0}set(e,t,n){if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);this.level.inside(e,t)&&(this.heights[this.level.index(e,t)]=n)}},CO=class{constructor(e){this.level=e}passable(e){let t=e.blocked;return(e,n)=>this.level.passable(e,n)?!t?.has(this.level.index(e,n)):!1}stepper(e){let t=this.passable(e),n=e.heights;if(!n)return(e,n,r,i)=>this.level.inside(e,n)&&this.level.inside(r,i)&&t(r,i);let r=e.climb??1;if(!Number.isInteger(r)||r<0)throw Error(`a climb limit must be a non-negative whole number, got ${e.climb}`);return(e,i,a,o)=>this.level.inside(e,i)&&this.level.inside(a,o)&&t(a,o)&&n.heightAt(a,o)-n.heightAt(e,i)<=r}find(e,t,n={}){if(this.level.shape===`hex`||n.heights){let r=this.distanceMap(t,n),i=[],a=e;for(let e=0;e<this.level.cellCount;e++){let e=this.descend(a,r,n);if(!e||(i.push(e),e.x===t.x&&e.y===t.y))break;a=e}return i}let r=new fO.AStar(t.x,t.y,this.passable(n),{topology:n.topology??8}),i=[];return r.compute(e.x,e.y,(e,t)=>i.push({x:e,y:t})),i.slice(1)}step(e,t,n={}){return this.find(e,t,n)[0]??null}distanceMap(e,t={}){let n=new Int32Array(this.level.cellCount).fill(-1),r=this.passable(t),i=this.stepper(t);if(!r(e.x,e.y))return n;let a=[this.level.index(e.x,e.y)];n[a[0]]=0;for(let e=0;e<a.length;e++){let r=a[e],o=this.level.xOf(r),s=this.level.yOf(r),c=n[r]+1;for(let e of this.level.neighbors(o,s,t.topology??8)){if(!i(e.x,e.y,o,s))continue;let t=this.level.index(e.x,e.y);n[t]===-1&&(n[t]=c,a.push(t))}}return n}descend(e,t,n={}){let r=this.stepper(n),i=t[this.level.index(e.x,e.y)];if(i<=0)return null;let a=null,o=i;for(let i of this.level.neighbors(e.x,e.y,n.topology??8)){if(!r(e.x,e.y,i.x,i.y))continue;let n=t[this.level.index(i.x,i.y)];n!==-1&&n<o&&(o=n,a=i)}return a}autoExplore(e,t,n={}){let r=this.passable(n),i=this.stepper(n);if(!r(e.x,e.y))return[];let a=new Map,o=new Set([this.level.index(e.x,e.y)]),s=[e];for(let e=0;e<s.length;e++){let r=s[e];if(e>0&&!t.isExplored(r.x,r.y))return this.reconstruct(a,r);for(let e of this.level.neighbors(r.x,r.y,n.topology??8)){if(!i(r.x,r.y,e.x,e.y))continue;let t=this.level.index(e.x,e.y);o.has(t)||(o.add(t),a.set(t,r),s.push(e))}}return[]}reconstruct(e,t){let n=[t],r=e.get(this.level.index(t.x,t.y));for(;r;)n.push(r),r=e.get(this.level.index(r.x,r.y));return n.reverse()}},wO=class{constructor(){this.entries=[],this.sequence=0,this.now=0}get size(){return this.entries.length}get actors(){return this.entries.map(e=>e.actor)}has(e){return this.entries.some(t=>t.actor===e)}add(e,t=0){this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++}),this.sort()}remove(e){let t=this.entries.findIndex(t=>t.actor===e);t!==-1&&this.entries.splice(t,1)}clear(){this.entries.length=0,this.now=0,this.sequence=0}peek(){let e=this.entries[0];return e?(this.now=Math.max(this.now,e.time),e.actor):null}spend(e){let t=this.entries[0];if(!t)return;let n=t.actor.speed??1;t.time=this.now+e/(n>0?n:1),t.sequence=this.sequence++,this.sort()}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}sort(){this.entries.sort((e,t)=>e.time-t.time||e.sequence-t.sequence)}};function TO(e,t,n,r,i,a={}){let o=a.sightRadius??6,s=a.fleeBelow??0;if((a.disposition??`hostile`)!==`hostile`&&a.provoked!==!0)return{state:`wander`,step:EO(e,n,a)};let c=new xO(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:DO(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:EO(e,n,a)}}function EO(e,t,n){let r=OO(e,t,n);return r.length>0?YT(r):null}function DO(e,t,n,r){let i=OO(e,t,r),a=null,o=kO(t,n);for(let e of i){let t=kO(e,n);t>o&&(o=t,a=e)}return a}function OO(e,t,n){let r=n.blocked,i=[];for(let[a,o]of VD(n.topology??8)){let n={x:t.x+a,y:t.y+o};e.passable(n.x,n.y)&&(r?.has(e.index(n.x,n.y))||i.push(n))}return i}function kO(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var AO=class e{constructor(e){this.revealedKind=new Map,this.discovered=new Set,this.level=e}conceal(e,t,n,r){let i=this.level.index(e,t);this.revealedKind.set(i,r),this.discovered.delete(i),this.level.set(e,t,n)}isSecret(e,t){let n=this.level.index(e,t);return this.revealedKind.has(n)&&!this.discovered.has(n)}isDiscovered(e,t){return this.discovered.has(this.level.index(e,t))}discover(e,t){if(!this.isSecret(e,t))return!1;let n=this.level.index(e,t);return this.discovered.add(n),this.level.set(e,t,this.revealedKind.get(n)),!0}toJSON(){return{revealed:[...this.revealedKind],discovered:[...this.discovered]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.revealed)r.revealedKind.set(e,t);for(let e of n.discovered)r.discovered.add(e);return r}},jO=class e{constructor(e){this.openKind=new Map,this.closedKind=new Map,this.lockedBy=new Map,this.open_=new Map,this.level=e}place(e,t,n){let r=this.level.index(e,t);this.openKind.set(r,n.open),this.closedKind.set(r,n.closed),this.open_.set(r,n.startOpen??!1),n.locked===void 0?this.lockedBy.delete(r):this.lockedBy.set(r,n.locked),this.level.set(e,t,this.open_.get(r)?n.open:n.closed)}isDoor(e,t){return this.open_.has(this.level.index(e,t))}isOpen(e,t){return this.open_.get(this.level.index(e,t))===!0}isLocked(e,t){return this.lockedBy.has(this.level.index(e,t))}requiredKey(e,t){return this.lockedBy.get(this.level.index(e,t))}open(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||this.open_.get(n)||this.lockedBy.has(n)?!1:(this.open_.set(n,!0),this.level.set(e,t,this.openKind.get(n)),!0)}close(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||!this.open_.get(n)?!1:(this.open_.set(n,!1),this.level.set(e,t,this.closedKind.get(n)),!0)}unlock(e,t){let n=this.level.index(e,t);return this.lockedBy.has(n)?(this.lockedBy.delete(n),!0):!1}toJSON(){let e=[];for(let[t,n]of this.openKind)e.push({cell:t,open:n,closed:this.closedKind.get(t),locked:this.lockedBy.get(t),isOpen:this.open_.get(t)===!0});return{doors:e}}static fromJSON(t,n){let r=new e(t);for(let e of n.doors){let n=t.xOf(e.cell),i=t.yOf(e.cell);r.place(n,i,{open:e.open,closed:e.closed,locked:e.locked,startOpen:e.isOpen})}return r}},MO=class e{constructor(e=[]){this.current=0;for(let t=1;t<e.length;t++)if(e[t]>=e[t-1])throw Error(`boss phase thresholds must descend`);this.thresholds=e}get phase(){return this.current}update(e){let t=0;for(;t<this.thresholds.length&&e<=this.thresholds[t];)t++;let n=[];for(;this.current<t;)this.current++,n.push(this.current);return n}reset(){this.current=0}toJSON(){return{phase:this.current}}static fromJSON(t,n){let r=new e(t);return r.current=n.phase,r}},NO=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}tick(){for(let[e,t]of this.remaining)t<=1?this.remaining.delete(e):this.remaining.set(e,t-1)}ready(){let e=[];for(let t of this.cooldowns.keys())this.remaining.has(t)||e.push(t);return e}use(e){let t=this.cooldowns.get(e);return t===void 0||this.remaining.has(e)?!1:(t>0&&this.remaining.set(e,t),!0)}toJSON(){return{remaining:[...this.remaining]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.remaining)r.remaining.set(e,t);return r}},PO=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}volumeAt(e,t){return e<0||t<0||e>=this.width||t>=this.height?0:this.volume[t*this.width+e]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){e<0||t<0||e>=this.width||t>=this.height||(this.volume[t*this.width+e]+=n)}spread(e,t=.25,n=.9){let r=new Float32Array(this.volume.length);for(let n=0;n<this.height;n++)for(let i=0;i<this.width;i++){let a=n*this.width+i,o=this.volume[a];if(o<=0)continue;let s=[];for(let[t,r]of VD(4)){let a=i+t,o=n+r;a<0||o<0||a>=this.width||o>=this.height||e(a,o)&&s.push(o*this.width+a)}if(s.length===0)r[a]+=o;else{let e=o*t/s.length;r[a]+=o-e*s.length;for(let t of s)r[t]+=e}}for(let e=0;e<r.length;e++){let t=r[e]*n;this.volume[e]=t<.001?0:t}}cellsAbove(e){let t=[];for(let n=0;n<this.height;n++)for(let r=0;r<this.width;r++){let i=this.volume[n*this.width+r];i>=e&&t.push({x:r,y:n,volume:i})}return t}toJSON(){return{width:this.width,height:this.height,volume:[...this.volume]}}static fromJSON(t){let n=new e(t.width,t.height);return n.volume.set(t.volume.slice(0,n.volume.length)),n}},FO=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,t){for(let n of this.hooks)n.event===e&&n.handler(t)}modifyDamage(e,t,n){let r={attacker:e,defender:t,amount:n,prevented:!1};return this.emit(`beforeDamage`,r),r.amount=Math.max(0,r.amount),r.amount===0&&(r.prevented=!0),r}},IO=l({AbilityCycle:()=>NO,Blob:()=>PO,BossPhases:()=>MO,CombatHooks:()=>FO,DUNGEON_KINDS:()=>qD,Doors:()=>jO,Elevation:()=>SO,FLOOR:()=>UD,FieldOfView:()=>xO,Level:()=>WD,Pathfinder:()=>CO,Scheduler:()=>wO,Secrets:()=>AO,WALL:()=>HD,canTarget:()=>gO,chainTargets:()=>yO,chebyshevDistance:()=>pO,coneCells:()=>vO,decideMonsterAI:()=>TO,findFreeCell:()=>ZD,furthestRoom:()=>QD,generateDungeon:()=>JD,hasLineOfSight:()=>hO,knockbackPath:()=>bO,neighbourOffsets:()=>VD,rectCenter:()=>GD,rectsOverlap:()=>KD,resolveArea:()=>_O,traceLine:()=>mO}),LO=l({direction:()=>GO,has:()=>qO,locale:()=>WO,reset:()=>XO,setActive:()=>UO,setBase:()=>HO,t:()=>KO}),RO=null,zO=null,BO=null,VO=null;function HO(e){RO=e}function UO(e){zO=e,BO=e?new Intl.PluralRules(e.locale):null}function WO(){return(zO??RO)?.locale??`en`}function GO(){return(zO??RO)?.direction??`ltr`}function KO(e,t){let n=zO?.messages[e]??RO?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:JO(n,t?.count);return t?YO(r,t):r}function qO(e){return zO?.messages[e]!==void 0||RO?.messages[e]!==void 0}function JO(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(BO??(VO??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function YO(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r===void 0?e:String(r)})}function XO(){RO=null,zO=null,BO=null}function ZO(e,t){let n=e=>t.filter(t=>t.op===e).sort((e,t)=>(e.order??0)-(t.order??0)),r=e;for(let e of n(`add`))r+=e.value;for(let e of n(`multiply`))r*=e.value;for(let e of n(`set`))r=e.value;return r}var QO=class{constructor(e){this.modifiers=[],this.cache=null,this.baseValues={...e.base},this.derived=e.derived??[]}base(e){return this.baseValues[e]??0}setBase(e,t){this.baseValues[e]=t,this.cache=null}addModifier(e){this.modifiers.push(e),this.cache=null}removeModifier(e){let t=this.modifiers.indexOf(e);t!==-1&&this.modifiers.splice(t,1),this.cache=null}removeModifiersFrom(e){this.modifiers=this.modifiers.filter(t=>t.source!==e),this.cache=null}get(e){return this.resolveAll()[e]??0}resolveAll(){if(this.cache)return this.cache;let e={...this.baseValues};for(let t of Object.keys(e))e[t]=ZO(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=ZO(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}};function $O(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var ek=class{constructor(e,t={}){this.curve=e,this.level=t.level??1,this.experience=t.experience??this.curve.experienceFor(this.level)}get experienceToNext(){return this.level>=this.curve.maxLevel?null:this.curve.experienceFor(this.level+1)-this.experience}addExperience(e){this.experience+=e;let t=0;for(;this.level<this.curve.maxLevel&&this.experience>=this.curve.experienceFor(this.level+1);)this.level++,t++;return t}};function tk(e,t,n=()=>KT(1,20)){return e+n()>=t}var nk=class{constructor(e,t={}){this.available=0,this.stats=e,this.capFor=t.cap??(()=>1/0),this.costFor=t.cost??(()=>1)}get points(){return this.available}grant(e){this.available+=e}canSpend(e){return this.nextRankCost(e)!==null}spend(e){let t=this.nextRankCost(e);if(t===null)return!1;let n=this.stats.base(e);return this.available-=t,this.stats.setBase(e,n+1),!0}nextRankCost(e){let t=this.stats.base(e);if(t>=this.capFor(e))return null;let n=this.costFor(e,t+1);return this.available>=n?n:null}},rk=class{constructor(e,t=null,n={}){this.worn=new Map,this.names=new Set(e),this.stats=t,this.isSlotLocked=n.locked??(()=>!1)}get(e){return this.worn.get(e)}isLocked(e){let t=this.worn.get(e);return t!==void 0&&this.isSlotLocked(e,t)}equip(e,t){if(this.assertSlot(e),this.isLocked(e))return;let n=this.unequip(e);this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t});return n}unequip(e){let t=this.worn.get(e);if(t&&!this.isSlotLocked(e,t))return this.worn.delete(e),this.stats?.removeModifiersFrom(t),t}get slots(){return[...this.names]}assertSlot(e){if(!this.names.has(e))throw Error(`no such equipment slot: "${e}"`)}},ik=class{constructor(e={}){this.slots=[],this.capacity=e.capacity}get items(){return this.slots}get totalWeight(){return this.slots.reduce((e,t)=>e+this.weightOf(t),0)}weightOf(e){return(e.weight??0)*e.quantity+(e.contents?.totalWeight??0)}find(e){return this.slots.find(t=>t.id===e)}add(e){if(this.capacity!==void 0&&this.totalWeight+this.weightOf(e)>this.capacity)return!1;if(e.stackable){let t=this.slots.find(t=>t.id===e.id&&t.stackable);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t){let n=this.slots.findIndex(t=>t.id===e);if(n===-1)return;let r=this.slots[n];r.quantity-=t??r.quantity,r.quantity<=0&&this.slots.splice(n,1)}};function ak(e,t){let n=new Map;for(let e of t.ingredients)n.set(e.id,(n.get(e.id)??0)+e.quantity);for(let[t,r]of n){let n=e.find(t);if(!n||n.quantity<r)return!1}let r=t.ingredients.map(t=>({...e.find(t.id),quantity:t.quantity}));for(let n of t.ingredients)e.remove(n.id,n.quantity);if(e.add(t.result))return!0;for(let t of r)e.add(t);return!1}function ok(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});let i=t.add({duration:n.duration,tick:e=>n.tick?.(e),onExpire:()=>e.removeModifiersFrom(r)});return{cancel:()=>{t.remove(i),e.removeModifiersFrom(r)}}}function sk(e){e.identified=!0}function ck(e,t){return e.level=(e.level??0)+t,e.level}function lk(e,t){return e.maxDurability!==void 0&&(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function uk(e,t){e.maxDurability!==void 0&&(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t))}var dk=class{constructor(e){this.progress=0,this.max=e.max,this.regenRate=e.regenRate,this.value=e.current??e.max}get current(){return this.value}canAfford(e){return this.value>=e}spend(e){return this.canAfford(e)?(this.value-=e,!0):!1}advance(e=1){if(!(this.value>=this.max)){for(this.progress+=e;this.progress>=this.regenRate&&this.value<this.max;)this.progress-=this.regenRate,this.value++;this.value>=this.max&&(this.progress=0)}}};function fk(e){if(e.entries.length===0||!JT(e.chance??1))return null;let t=XT(e.entries.map(e=>e.weight));if(t===-1)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var pk=class e{constructor(e){this.grantedTiers=0,this.balance=0,this.choices=new Map,this.track=e}get points(){return this.balance}openTiers(e){let t=[];return this.track.tiers.forEach((n,r)=>{e>=n.threshold&&t.push(r)}),t}grant(e){let t=0;for(;this.grantedTiers<this.track.tiers.length&&e>=this.track.tiers[this.grantedTiers].threshold;){let e=this.track.tiers[this.grantedTiers];e.kind===`points`&&(this.balance+=e.points??0,t+=e.points??0),this.grantedTiers++}return t}spend(e){return this.balance<e?!1:(this.balance-=e,!0)}choose(e,t,n){let r=this.track.tiers[e];if(!r)throw Error(`no such advancement tier: ${e}`);if(r.kind===`points`)throw Error(`tier ${e} grants points, it has no choice`);if(n<r.threshold)throw Error(`tier ${e} has not opened yet`);if(this.choices.has(e))throw Error(`tier ${e} is already decided`);if(!(r.options??[]).some(e=>e.id===t))throw Error(`tier ${e} has no option "${t}"`);this.choices.set(e,t)}choice(e){return this.choices.get(e)??null}toJSON(){return{grantedTiers:this.grantedTiers,balance:this.balance,choices:[...this.choices]}}static fromJSON(t,n){let r=new e(t);r.grantedTiers=n.grantedTiers,r.balance=n.balance;for(let[e,t]of n.choices)r.choices.set(e,t);return r}};function mk(e){let t=e.entries.filter(e=>e.weight>0);if(t.length===0)return null;let n=XT(t.map(e=>e.weight));return n===-1?null:t[n]}function hk(e){return e.affix}function gk(e,t){e.affix=t.id,t.curse&&(e.cursed=!0)}function _k(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function vk(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}function yk(e){if(e.labels.length<e.kinds.length)throw Error(`not enough appearances: ${e.kinds.length} kinds but only ${e.labels.length} labels`);let t=[...e.labels];for(let e=t.length-1;e>0;e--){let n=GT(0,e+1);[t[e],t[n]]=[t[n],t[e]]}let n=new Map;return e.kinds.forEach((e,r)=>n.set(e,t[r])),n}var bk=class e{constructor(e){this.assigned=new Map,this.tables=e}appearanceOf(e,t){let n=this.assigned.get(e);if(!n){let t=this.tables[e];if(!t)throw Error(`no such appearance category: "${e}"`);n=yk(t),this.assigned.set(e,n)}let r=n.get(t);if(r===void 0)throw Error(`"${t}" is not in appearance category "${e}"`);return r}toJSON(){return{assigned:[...this.assigned].map(([e,t])=>[e,[...t]])}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.assigned)r.assigned.set(e,new Map(t));return r}};function xk(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=t.find(r);if(!s||s.quantity<i)return!1;let c=o.buy*i;return e.base(a.currency)<c?!1:(t.remove(r,i),n.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)-c),!0):(t.add({...s,quantity:i}),!1))}function Sk(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=n.find(r);return!s||s.quantity<i?!1:(n.remove(r,i),t.add({...s,quantity:i}),e.setBase(a.currency,e.base(a.currency)+o.sell*i),!0)}function Ck(e){let t=Array.isArray(e)?e:[e];for(let e of t)if(!Number.isFinite(e.amount)||e.amount<0)throw Error(`a resource cost must be a non-negative number, "${e.stat}" costs ${e.amount}`);return t}function wk(e){let t=new Map;for(let n of e)t.set(n.stat,(t.get(n.stat)??0)+n.amount);return t}function Tk(e,t){return[...wk(Ck(t))].every(([t,n])=>e.base(t)>=n)}function Ek(e,t){let n=wk(Ck(t));if(![...n].every(([t,n])=>e.base(t)>=n))return!1;for(let[t,r]of n)e.setBase(t,e.base(t)-r);return!0}var Dk=l({Advancement:()=>pk,Appearances:()=>bk,Charges:()=>dk,EquipmentSlots:()=>rk,Inventory:()=>ik,Progression:()=>ek,SkillPoints:()=>nk,StatBlock:()=>QO,affixOf:()=>hk,applyAffix:()=>gk,applyStatusEffect:()=>ok,assignAppearances:()=>yk,buy:()=>xk,canAfford:()=>Tk,craft:()=>ak,damageItem:()=>lk,enchant:()=>ck,identify:()=>sk,powerCurve:()=>$O,removeAffix:()=>_k,repairItem:()=>uk,rollAffix:()=>mk,rollLoot:()=>fk,scaledModifiers:()=>vk,sell:()=>Sk,skillCheck:()=>tk,spend:()=>Ek}),Ok=class{constructor(){this.factories=new Map,this.loaded=new Map,this.currentId=null}define(e,t,n={}){this.factories.set(e,{create:t,persistent:n.persistent??!0})}enter(e,t){let n=this.factories.get(e);if(!n)throw Error(`no such map: "${e}"`);let r=this.loaded.get(e);return(!r||!n.persistent)&&(r=n.create(),this.loaded.set(e,r)),this.currentId=e,this.lastSpawn=t,r}get current(){return this.currentId?this.loaded.get(this.currentId)??null:null}get currentMapId(){return this.currentId}get spawn(){return this.lastSpawn}isLoaded(e){return this.loaded.has(e)}isPersistent(e){return this.factories.get(e)?.persistent??!0}unload(e){if(e===this.currentId)throw Error(`cannot unload the current map: "${e}"`);this.loaded.delete(e)}},kk=class{constructor(){this.locations=new Map}add(e){this.locations.set(e.id,e)}remove(e){this.locations.delete(e)}get(e){return this.locations.get(e)}at(e,t){for(let n of this.locations.values())if(n.x===e&&n.y===t)return n}get all(){return[...this.locations.values()]}},Ak=class{constructor(){this.turn=0,this.effects=new Map}add(e){let t=Symbol();return this.effects.set(t,{...e}),t}remove(e){this.effects.delete(e)}has(e){return this.effects.has(e)}advance(e=1){this.turn+=e;for(let[t,n]of this.effects)n.tick(this.turn),n.duration!==void 0&&(n.duration-=e,n.duration<=0&&(this.effects.delete(t),n.onExpire?.()))}};function jk(e){if(e.entries.length===0||!JT(e.rate))return null;let t=XT(e.entries.map(e=>e.weight));return t===-1?null:e.entries[t].value}var Mk=l({Overworld:()=>kk,TurnClock:()=>Ak,World:()=>Ok,rollEncounter:()=>jk}),Nk=536870911,Pk={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function Fk(e,t,n){if(e.frameWidth!==t.tilewidth||e.frameHeight!==t.tileheight)throw Error(`the tileset at firstgid ${n} is cut to ${e.frameWidth}x${e.frameHeight}, but the map is ${t.tilewidth}x${t.tileheight}`)}function Ik(e,t,n){let r=-1;for(let n=0;n<t.length&&t[n]<=e;n++)r=n;if(r===-1)throw Error(`layer "${n}" uses gid ${e}, below every tileset's firstgid (${t.join(`, `)})`);return r}function Lk(e,t){let n=e.orientation??`orthogonal`,r=Pk[n];if(!r)throw Error(`loadTiledMap does not read "${n}" maps yet`);if(r===`staggered`&&(e.staggeraxis??`y`)!==`y`)throw Error(`loadTiledMap only reads Y-axis staggered maps right now, this one is staggered on "${e.staggeraxis}"`);if(r===`staggered`&&(e.staggerindex??`odd`)!==`odd`)throw Error(`loadTiledMap only reads odd-index staggered maps right now, this one staggers "${e.staggerindex}"`);if(e.tilesets.length===0)throw Error(`loadTiledMap needs at least one tileset, this map has none`);let i=[...e.tilesets].sort((e,t)=>e.firstgid-t.firstgid),a,o;if(t instanceof ZE){if(e.tilesets.length!==1)throw Error(`loadTiledMap was given one sheet but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);Fk(t,e,i[0].firstgid),a=[t],o=[i[0].firstgid]}else{if(t.length!==e.tilesets.length)throw Error(`loadTiledMap was given ${t.length} sheets but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);a=i.map(n=>{let r=t.find(e=>e.firstgid===n.firstgid);if(!r)throw Error(`loadTiledMap was given no sheet for the tileset at firstgid ${n.firstgid}`);return Fk(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new sD({width:e.width,height:e.height,sheet:a,shape:r}),c=[];for(let t of e.layers)if(t.type===`tilelayer`){if(t.encoding&&t.encoding!==`csv`)throw Error(`layer "${t.name}" uses "${t.encoding}" encoding - export tile layers as CSV/plain, not compressed`);let e=(t.data??[]).map(e=>{let n=e&Nk;if(n===0)return-1;let r=Ik(n,o,t.name);return o.length===1?n-o[0]:iD(r,n-o[r])});s.addLayer(t.name,e)}else if(t.type===`objectgroup`)for(let n of t.objects??[])c.push({...n,tileX:Math.floor(n.x/e.tilewidth),tileY:Math.floor(n.y/e.tileheight)});return{map:s,objects:c}}function Rk(e,t,n={}){let r=n.pick??GT,i=0;return t.forEach((t,n)=>{zk(t,t.name??`#${n+1}`);let a=Bk(e,t);if(i+=a.length,a.length!==0)for(let[n,i]of a){let a=t.outputs[r(t.outputs.length)];for(let[r,o]of Object.entries(a))for(let a=0;a<t.height;a++)for(let s=0;s<t.width;s++){let c=o[a*t.width+s];c!==-1&&e.setTile(r,n+s,i+a,c)}}}),i}function zk(e,t){if(!Number.isInteger(e.width)||e.width<=0||!Number.isInteger(e.height)||e.height<=0)throw Error(`automap rule "${t}" needs a positive width and height`);if(e.outputs.length===0)throw Error(`automap rule "${t}" has no outputs - a rule that matches and writes nothing is a mistake`);let n=e.width*e.height;for(let[r,i]of Object.entries(e.input))if(i.length!==n)throw Error(`automap rule "${t}" input "${r}" has ${i.length} cells, but the pattern is ${n}`);e.outputs.forEach((e,r)=>{for(let[i,a]of Object.entries(e))if(a.length!==n)throw Error(`automap rule "${t}" output ${r+1} "${i}" has ${a.length} cells, but the pattern is ${n}`)})}function Bk(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)Vk(e,t,i,r)&&n.push([i,r]);return n}function Vk(e,t,n,r){for(let[i,a]of Object.entries(t.input))for(let o=0;o<t.height;o++)for(let s=0;s<t.width;s++){let c=a[o*t.width+s];if(c!==-1&&e.getTile(i,n+s,r+o)!==c)return!1}return!0}var Hk=class e{constructor(){this.switches=new Map,this.variables=new Map}switch(e){return this.switches.get(e)??!1}setSwitch(e,t){this.switches.set(e,t)}variable(e){return this.variables.get(e)??0}setVariable(e,t){this.variables.set(e,t)}toJSON(){return{switches:[...this.switches],variables:[...this.variables]}}static fromJSON(t){let n=new e;for(let[e,r]of t.switches)n.setSwitch(e,r);for(let[e,r]of t.variables)n.setVariable(e,r);return n}};function Uk(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function Wk(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>Uk(e,t))&&(n=r);return n}var Gk=class{constructor(e){this.cancelled=!1,this.options=e,this.state={game:e.game,answers:{}}}cancel(){this.cancelled=!0}async run(e){for(let t of e){if(this.cancelled)break;await this.step(t)}return this.state}async step(e){if(`say`in e){await this.speak(e.say,e.speaker);return}if(`ask`in e){let t=await this.speak(e.ask,e.speaker,e.choices);e.store&&(this.state.answers[e.store]=t);return}if(`wait`in e){await new Promise(t=>setTimeout(t,e.wait*1e3));return}if(`setSwitch`in e){this.state.game.setSwitch(e.setSwitch,e.value);return}if(`setVariable`in e){this.state.game.setVariable(e.setVariable,e.value);return}if(`addVariable`in e){let t=this.state.game.variable(e.addVariable);this.state.game.setVariable(e.addVariable,t+e.amount);return}if(`if`in e){let t=Uk(e.if,this.state.game);await this.run(t?e.then:e.else??[]);return}if(`move`in e){await this.options.move?.(e.move.target,e.move.steps);return}`call`in e&&await e.call(this.state)}speak(e,t,n){let{windows:r}=this.options;return new Promise(i=>{r.push(new DD({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:this.options.speed??45,pages:[{text:e,speaker:t}],choices:n,anchor:`bottom`,onDone:e=>i(e)}))})}},Kk=class{constructor(e,t,n,r){this.facing=`down`,this.target=null,this.progress=0,this.sprite=e,this.x=this.fromX=t,this.y=this.fromY=n,this.tileWidth=r.tileWidth,this.tileHeight=r.tileHeight,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.target!==null}turnTo(e,t){this.target||(this.facing=qk(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=qk(e,t),this.fromX=this.x,this.fromY=this.y,this.target={x:this.x+e,y:this.y+t},this.progress=0,this.playWalk(),!0)}update(e){this.sprite.update(e),this.target&&(this.progress=Math.min(1,this.progress+this.speed*e),this.sprite.x=Jk(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=Jk(this.fromY,this.target.y,this.progress)*this.tileHeight,this.progress>=1&&(this.x=this.target.x,this.y=this.target.y,this.target=null,this.playIdle()))}place(){this.sprite.x=this.x*this.tileWidth,this.sprite.y=this.y*this.tileHeight}playWalk(){let e=this.options.walkAnimation?.(this.facing);e&&this.sprite.has(e)&&this.sprite.play(e)}playIdle(){let e=this.options.idleAnimation?.(this.facing);e&&this.sprite.has(e)&&this.sprite.play(e)}};function qk(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function Jk(e,t,n){return e+(t-e)*n}var Yk=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map}define(e){this.definitions.set(e.id,e)}canStart(e){return(this.require(e).requires??[]).every(e=>this.status(e)===`complete`)}start(e){if(!this.canStart(e))throw Error(`quest "${e}" cannot start yet - a prerequisite is incomplete`);this.stageIndex.set(e,0)}status(e){let t=this.require(e),n=this.stageIndex.get(e);return n===void 0?this.canStart(e)?`available`:`unavailable`:n>=t.stages.length?`complete`:`active`}currentStage(e){return this.status(e)===`active`?this.require(e).stages[this.stageIndex.get(e)]:null}progress(e,t){let n=this.currentStage(e);return n?.counter?Math.min(1,t.variable(n.counter.variable)/n.counter.target):null}advance(e,t){let n=this.currentStage(e);return!n||!(n.condition?Uk(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target)?!1:(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0)}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.stageIndex)r.stageIndex.set(e,t);return r}},Xk=l({EventRunner:()=>Gk,GameState:()=>Hk,GridMover:()=>Kk,QuestLog:()=>Yk,activePage:()=>Wk,automap:()=>Rk,conditionHolds:()=>Uk,loadTiledMap:()=>Lk}),Zk=$O(20,2,100),Qk=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new ek(e.species.growth??Zk,{level:e.level??1}),this.stats=new QO({base:this.computeBase()})}refreshStats(){let e=this.computeBase();for(let[t,n]of Object.entries(e))this.stats.setBase(t,n)}computeBase(){let e=this.progression.level;return this.deriveStats?this.deriveStats(this.species.baseStats,e):{...this.species.baseStats}}},$k=class{constructor(){this.multipliers=new Map}key(e,t){return`${e}:${t}`}set(e,t,n){this.multipliers.set(this.key(e,t),n)}get(e,t){return this.multipliers.get(this.key(e,t))??1}multiplierFor(e,t){return t.reduce((t,n)=>t*this.get(e,n),1)}},eA=class{constructor(e){this.storage=[],this.active=Array(e).fill(null)}get members(){return this.active}get boxed(){return this.storage}add(e){let t=this.active.indexOf(null);t===-1?this.storage.push(e):this.active[t]=e}store(e){let t=this.active[e];t&&(this.active[e]=null,this.storage.push(t))}withdraw(e,t){if(t<0||t>=this.active.length)return;let n=this.storage[e];if(!n)return;this.storage.splice(e,1);let r=this.active[t];this.active[t]=n,r&&this.storage.push(r)}get activeMembers(){return this.active.filter(e=>e!==null)}};function tA(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function nA(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var rA=class{constructor(e,t){this.stages=new Map,this.modifiers=new Map,this.stats=e,this.max=t.max,this.multiplierFor=t.multiplier}get(e){return this.stages.get(e)??0}change(e,t){let n=this.get(e),r=Math.max(-this.max,Math.min(this.max,n+t)),i=r-n;return i===0?0:(this.stages.set(e,r),this.applyModifier(e,r),i)}applyModifier(e,t){let n=this.modifiers.get(e);if(n&&this.stats.removeModifier(n),t===0){this.modifiers.delete(e);return}let r={stat:e,op:`multiply`,value:this.multiplierFor(t)};this.stats.addModifier(r),this.modifiers.set(e,r)}resetAll(){for(let e of this.modifiers.values())this.stats.removeModifier(e);this.modifiers.clear(),this.stages.clear()}};function iA(e,t,n,r=(e,n)=>t.multiplierFor(e.type,n)){if(e.length===0)return null;let i=e[0],a=r(i,n);for(let t of e.slice(1)){let e=r(t,n);e>a&&(a=e,i=t)}return i}function aA(e,t,n,r){let i=null,a=oA(e,n,r);return t.forEach((e,t)=>{let o=oA(e.types,n,r);o<a&&(a=o,i=t)}),i}function oA(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var sA=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,t,n){for(let r of this.hooks)r.event===e&&r.handler(t,n)}},cA=class{constructor(){this.conditions=new Map}set(e){this.conditions.set(e.id,{...e})}has(e){return this.conditions.has(e)}get(e){return this.conditions.get(e)}clear(e){this.conditions.delete(e)}get active(){return[...this.conditions.values()]}advance(){for(let[e,t]of this.conditions)t.duration!==void 0&&(--t.duration,t.duration<=0&&this.conditions.delete(e))}},lA=l({BattleHooks:()=>sA,Creature:()=>Qk,Field:()=>cA,Party:()=>eA,StatStages:()=>rA,TypeMatrix:()=>$k,battleOrder:()=>tA,checkEvolution:()=>nA,chooseMove:()=>iA,chooseSwitch:()=>aA});function uA(e){let t=e.charCodeAt(0)-97,n=e.charCodeAt(1)-49;if(t<0||t>7||n<0||n>7||e.length!==2)throw Error(`not a square: "${e}"`);return n*8+t}function dA(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function fA(e){let t=e.trim().split(/\s+/);if(t.length<4)throw Error(`not a FEN string: "${e}"`);let n=Array(64).fill(null),r=t[0].split(`/`);if(r.length!==8)throw Error(`a FEN placement needs 8 ranks: "${e}"`);if(r.forEach((t,r)=>{let i=7-r,a=0;for(let r of t)if(r>=`1`&&r<=`8`)a+=r.charCodeAt(0)-48;else{let o=r===r.toUpperCase()?`white`:`black`,s={p:`pawn`,n:`knight`,b:`bishop`,r:`rook`,q:`queen`,k:`king`}[r.toLowerCase()];if(!s||a>7)throw Error(`bad FEN rank "${t}" in "${e}"`);n[i*8+a]={side:o,kind:s},a++}if(a!==8)throw Error(`bad FEN rank "${t}" in "${e}"`)}),t[1]!==`w`&&t[1]!==`b`)throw Error(`a FEN side is "w" or "b": "${e}"`);let i={whiteKingside:!1,whiteQueenside:!1,blackKingside:!1,blackQueenside:!1};if(t[2]!==`-`)for(let n of t[2])if(n===`K`)i.whiteKingside=!0;else if(n===`Q`)i.whiteQueenside=!0;else if(n===`k`)i.blackKingside=!0;else if(n===`q`)i.blackQueenside=!0;else throw Error(`bad FEN castling "${t[2]}" in "${e}"`);let a=t[3]===`-`?null:uA(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(hA(a)!==n)throw Error(`bad FEN en passant square "${t[3]}" in "${e}"`)}let o={board:n,turn:t[1]===`w`?`white`:`black`,castling:i,enPassant:a};return wA(n,`white`),wA(n,`black`),o}function pA(e){return e===`white`?`black`:`white`}function mA(e){return e&7}function hA(e){return e>>3}function gA(e,t){return e>=0&&e<8&&t>=0&&t<8}function _A(){let e=[`rook`,`knight`,`bishop`,`queen`,`king`,`bishop`,`knight`,`rook`],t=Array(64).fill(null);for(let n=0;n<8;n++)t[n]={side:`white`,kind:e[n]},t[8+n]={side:`white`,kind:`pawn`},t[48+n]={side:`black`,kind:`pawn`},t[56+n]={side:`black`,kind:e[n]};return{board:t,turn:`white`,castling:{whiteKingside:!0,whiteQueenside:!0,blackKingside:!0,blackQueenside:!0},enPassant:null}}function vA(e){return{board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}}var yA=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],bA=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],xA=[[1,1],[-1,1],[-1,-1],[1,-1]],SA=[[1,0],[0,1],[-1,0],[0,-1]];function CA(e,t,n){let r=mA(t),i=hA(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!gA(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of yA){if(!gA(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of bA){if(!gA(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let o=[{steps:xA,kinds:[`bishop`,`queen`]},{steps:SA,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of o)for(let[o,s]of t){let t=r+o,c=i+s;for(;gA(t,c);){let r=e[c*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,c+=s}}return!1}function wA(e,t){let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n}function TA(e,t){return CA(e.board,wA(e.board,t),pA(t))}function EA(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=mA(t),a=hA(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;gA(o,l);){let i=l*8+o,a=e.board[i];if(!a)r.push({from:t,to:i});else{a.side!==n.side&&r.push({from:t,to:i});break}o+=s,l+=c}}};switch(n.kind){case`pawn`:{let o=n.side===`white`?1:-1,s=n.side===`white`?1:6,c=n.side===`white`?7:0;if(gA(i,a+o)&&!e.board[(a+o)*8+i]){let n=(a+o)*8+i;if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),a===s&&!e.board[(a+2*o)*8+i]&&r.push({from:t,to:(a+2*o)*8+i})}for(let s of[-1,1]){if(!gA(i+s,a+o))continue;let l=(a+o)*8+i+s,u=e.board[l];if(u&&u.side!==n.side){if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:a*8+i+s})}break}case`knight`:for(let[o,s]of yA){if(!gA(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];(!l||l.side!==n.side)&&r.push({from:t,to:c})}break;case`bishop`:o(xA);break;case`rook`:o(SA);break;case`queen`:o(xA),o(SA);break;case`king`:{for(let[o,s]of bA){if(!gA(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:c})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!TA(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!CA(e.board,o+5,pA(n.side))&&!CA(e.board,o+6,pA(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!CA(e.board,o+3,pA(n.side))&&!CA(e.board,o+2,pA(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function DA(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${dA(t.from)} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[OA(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[OA(i.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=pA(n.side)}function OA(e,t){let n=mA(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function kA(e){let t=[];for(let n=0;n<64;n++)if(!(!e.board[n]||e.board[n]?.side!==e.turn))for(let r of EA(e,n)){let n=vA(e);DA(n,r),!TA(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function AA(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${dA(t.from)} to move`);let r=EA(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${dA(t.from)}-${dA(t.to)} is not a legal move here`);let i=vA(e);if(DA(i,r),TA(i,e.turn))throw Error(`${dA(t.from)}-${dA(t.to)} leaves the king in check`);DA(e,r)}function jA(e){return kA(e).length>0?`ongoing`:TA(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var MA={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function NA(e,t={}){return PA(e,t).move}function PA(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?1/0:Math.max(1,Math.floor(t.maxNodes)),i=LA(e,kA(e));if(i.length===0)return{move:null,score:IA(e,0),nodes:1};let a=0,o=i[0],s=-1/0,c=-1/0;for(let t of i){if(a>=r)break;let i=vA(e);AA(i,t);let u=-l(i,n-1,-1/0,-c,1);u>s&&(s=u,o=t),c=Math.max(c,u)}return{move:o,score:s,nodes:a};function l(e,t,n,i,o){if(a>=r)return FA(e);if(a++,jA(e)!==`ongoing`)return IA(e,o);if(t===0)return FA(e);let s=-1/0;for(let r of LA(e,kA(e))){let a=vA(e);if(AA(a,r),s=Math.max(s,-l(a,t-1,-i,-n,o+1)),n=Math.max(n,s),n>=i)break}return s}}function FA(e){let t=0;for(let n of e.board)n&&(t+=(n.side===`white`?1:-1)*MA[n.kind]);return e.turn===`white`?t:-t}function IA(e,t){return TA(e,e.turn)?-1e5+t:0}function LA(e,t){return t.slice().sort((t,n)=>RA(e,n)-RA(e,t))}function RA(e,t){let n=e.board[t.to];return(t.promotion?MA[t.promotion]:0)*10+(n?MA[n.kind]:0)}var zA=class{constructor(e,t,n){if(this.width=e,this.height=t,e<1||t<1)throw Error(`a board needs positive dimensions`);if(n&&n.length!==e*t)throw Error(`board cell count does not match dimensions`);this.cells=n?[...n]:Array(e*t).fill(null)}index(e,t){if(!this.inside(e,t))throw Error(`cell (${e},${t}) is outside the board`);return t*this.width+e}inside(e,t){return e>=0&&t>=0&&e<this.width&&t<this.height}get(e,t){return this.cells[this.index(e,t)]}set(e,t,n){this.cells[this.index(e,t)]=n}move(e,t){let n=this.get(e.x,e.y);if(n===null)throw Error(`cannot move an empty cell`);return this.set(e.x,e.y,null),this.set(t.x,t.y,n),n}};function BA(){let e=Array(64).fill(null);for(let t=0;t<3;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`black`,king:!1});for(let t=5;t<8;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`red`,king:!1});return{board:e,turn:`red`,forcedFrom:null}}function VA(e){let t=e.forcedFrom===null?e.board.map((t,n)=>t?.side===e.turn?n:-1).filter(e=>e>=0):[e.forcedFrom],n=t.flatMap(t=>UA(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>UA(e,t,!1)):[]}function HA(e,t){if(!VA(e).some(e=>e.from===t.from&&e.to===t.to&&e.captures.length===t.captures.length))throw Error(`illegal checkers move`);let n=e.board[t.from];if(!n)throw Error(`no checkers piece on the source cell`);e.board[t.from]=null;for(let n of t.captures)e.board[n]=null;let r=!n.king&&(n.side===`red`&&Math.floor(t.to/8)===0||n.side===`black`&&Math.floor(t.to/8)===7);e.board[t.to]={...n,king:n.king||r};let i={board:e.board,turn:e.turn,forcedFrom:t.captures.length>0?t.to:null};t.captures.length===0||UA(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function UA(e,t,n){let r=e.board[t];if(!r)return[];let i=t%8,a=Math.floor(t/8),o=r.king?[-1,1]:r.side===`red`?[-1]:[1],s=[];for(let c of o)for(let o of[-1,1]){let l=i+o,u=a+c,d=i+o*2,f=a+c*2;if(n){if(d<0||f<0||d>=8||f>=8)continue;let n=u*8+l,i=f*8+d;e.board[n]?.side!==r.side&&e.board[n]&&!e.board[i]&&s.push({from:t,to:i,captures:[n]})}else l>=0&&u>=0&&l<8&&u<8&&!e.board[u*8+l]&&s.push({from:t,to:u*8+l,captures:[]})}return s}function WA(e=9){if(e<2||e>25)throw Error(`Go size must be between 2 and 25`);return{size:e,board:Array(e*e).fill(null),turn:`black`,ko:null,passes:0}}function GA(e,t,n){let r=YA(e,t,n);if(e.board[r]||e.ko===r)throw Error(`Go cell is occupied or forbidden by ko`);let i=[...e.board];i[r]=e.turn;let a=e.turn===`black`?`white`:`black`,o=0,s=null;for(let t of XA(e,r)){if(i[t]!==a||QA(i,e.size,t)!==0)continue;let n=ZA(i,e.size,t);n.length===1&&(s=n[0]);for(let e of n)i[e]=null;o+=n.length}if(QA(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&QA(i,e.size,r)===1?s:null,e.board=i,e.turn=a,e.passes=0}function KA(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function qA(e){return e.passes>=2?`finished`:`ongoing`}function JA(e){let t={black:0,white:0},n=new Set;for(let r=0;r<e.board.length;r++){let i=e.board[r];if(i)t[i]++;else if(!n.has(r)){let i=ZA(e.board,e.size,r),a=new Set;for(let t of i)for(let n of XA(e,t))e.board[n]&&a.add(e.board[n]);for(let e of i)n.add(e);a.size===1&&(t[[...a][0]]+=i.length)}}return t}function YA(e,t,n){if(t<0||n<0||t>=e.size||n>=e.size)throw Error(`Go cell is outside the board`);return n*e.size+t}function XA(e,t){let n=t%e.size,r=Math.floor(t/e.size);return[[n-1,r],[n+1,r],[n,r-1],[n,r+1]].filter(([t,n])=>t>=0&&n>=0&&t<e.size&&n<e.size).map(([t,n])=>n*e.size+t)}function ZA(e,t,n){let r=e[n];if(!r)return[];let i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(o.has(n)||e[n]!==r)continue;o.add(n),i.push(n);let s=n%t,c=Math.floor(n/t);for(let[e,n]of[[s-1,c],[s+1,c],[s,c-1],[s,c+1]])e>=0&&n>=0&&e<t&&n<t&&a.push(n*t+e)}return i}function QA(e,t,n){let r=ZA(e,t,n),i=new Set;for(let n of r){let r=n%t,a=Math.floor(n/t);for(let[n,o]of[[r-1,a],[r+1,a],[r,a-1],[r,a+1]])n>=0&&o>=0&&n<t&&o<t&&e[o*t+n]===null&&i.add(o*t+n)}return i.size}function $A(){let e=Array(24).fill(0);return e[0]=2,e[11]=5,e[16]=3,e[18]=5,e[23]=-2,e[12]=-5,e[7]=-3,e[5]=-5,{points:e,bar:{white:0,black:0},off:{white:0,black:0},turn:`white`}}function ej(){let e=mj(2,6);return e[0]===e[1]?[...e,...e]:e}function tj(e,t){let n=e.turn===`white`?1:-1,r=[];for(let i of t){if(e.bar[e.turn]>0){let t=e.turn===`white`?i-1:24-i;rj(e,t,n)&&r.push({from:`bar`,to:t,die:i});continue}for(let t=0;t<24;t++)if(e.points[t]*n>0){let a=t+i*n;a<0||a>=24?r.push({from:t,to:`off`,die:i}):rj(e,a,n)&&r.push({from:t,to:a,die:i})}}return r}function nj(e,t){if(!tj(e,[t.die]).some(e=>e.from===t.from&&e.to===t.to))throw Error(`illegal backgammon move`);let n=e.turn===`white`?1:-1;if(t.from===`bar`?e.bar[e.turn]--:e.points[t.from]-=n,t.to===`off`)e.off[e.turn]++;else{if(e.points[t.to]*n<0){let n=e.turn===`white`?`black`:`white`;e.points[t.to]=0,e.bar[n]++}e.points[t.to]+=n}}function rj(e,t,n){return e.points[t]*n>=-1}function ij(e=0){let t=[`clubs`,`diamonds`,`hearts`,`spades`],n=[];for(let e of t)for(let t=1;t<=13;t++)n.push({suit:e,rank:t});return n.concat(Array(e).fill(null).map(()=>({suit:`spades`,rank:1})))}function aj(e){return QT(e)}function oj(e,t,n){if(t<0||n<0||e.length<t*n)throw Error(`not enough cards to deal`);return Array.from({length:t},()=>e.splice(0,n))}function sj(e,t){if(e.length===0)throw Error(`a trick needs at least one play`);let n=e[0].card.suit,r=e=>e.rank===1?14:e.rank;return(t&&e.some(e=>e.card.suit===t)?e.filter(e=>e.card.suit===t):e.filter(e=>e.card.suit===n)).reduce((e,t)=>r(t.card)>r(e.card)?t:e).owner}function cj(e){let t=ij();return e===void 0?aj(t):HT(e,()=>aj(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function lj(e){e.stock.length===0&&(e.stock=e.waste.reverse(),e.waste=[]);let t=e.stock.pop()??null;return t&&e.waste.push(t),t}function uj(e,t,n,r=1){let i=e.tableau[t],a=e.tableau[n],o=i?.up.slice(-r);if(!i||!a||!o?.length||(a.up.length===0?o[0].rank!==13:!pj(o[0],a.up.at(-1))))throw Error(`illegal solitaire tableau move`);i.up.splice(-r,r),a.up.push(...o),i.down.length&&i.up.length===0&&i.up.push(i.down.pop())}function dj(e,t){let n=t===`waste`?e.waste.at(-1):e.tableau[t].up.at(-1);if(!n)throw Error(`no solitaire card to move`);let r=e.foundations.find(e=>e[0]?.suit===n.suit||e.length===0);if(!r||n.rank!==r.length+1)throw Error(`card cannot move to its foundation`);if(t===`waste`)e.waste.pop();else{let n=e.tableau[t];n.up.pop(),n.down.length&&n.up.length===0&&n.up.push(n.down.pop())}r.push(n)}function fj(e){return e.foundations.every(e=>e.length===13)}function pj(e,t){let n=e.suit===`diamonds`||e.suit===`hearts`,r=t.suit===`diamonds`||t.suit===`hearts`;return e.rank===t.rank-1&&n!==r}function mj(e,t){if(!Number.isInteger(e)||e<0||!Number.isInteger(t)||t<1)throw Error(`dice need a non-negative count and positive sides`);return Array.from({length:e},()=>KT(1,t))}function hj(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return mj(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var gj=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=mj(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=KT(1,this.sides))}keep(e){if(e<0||e>=this.count)throw Error(`die index is outside the cup`);this.kept.add(e)}clearKept(){this.kept.clear()}};function _j(e,t){if(e.length!==5||e.some(e=>e<1||e>6))throw Error(`a score sheet needs five d6 values`);let n=new Map;for(let t of e)n.set(t,(n.get(t)??0)+1);let r=e.reduce((e,t)=>e+t,0);if(t===`chance`)return r;if(t===`yahtzee`)return n.size===1?50:0;if(t===`fullHouse`)return[...n.values()].sort().join(`,`)===`2,3`?25:0;if(t===`threeKind`)return[...n.values()].some(e=>e>=3)?r:0;if(t===`fourKind`)return[...n.values()].some(e=>e>=4)?r:0;if(t===`smallStraight`||t===`largeStraight`){let e=[`1234`,`2345`,`3456`],r=[`12345`,`23456`],i=[...n.keys()].sort().join(``);return(t===`smallStraight`?e:r).some(e=>i.includes(e))?t===`smallStraight`?30:40:0}let i=[`ones`,`twos`,`threes`,`fours`,`fives`,`sixes`].indexOf(t)+1;return i>0?(n.get(i)??0)*i:0}function vj(e,t,n=`hex`){if(e<1||t<1)throw Error(`a tactical map needs positive dimensions`);return{width:e,height:t,shape:n,cells:Array.from({length:e*t},()=>({passable:!0,cover:0})),units:[],turn:``,round:1}}function yj(e,t){if(!Oj(e,t.x,t.y)||e.units.some(e=>e.x===t.x&&e.y===t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t}),e.turn||=t.owner}function bj(e,t){let n=Ej(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=[];for(let i=0;i<e.height;i++)for(let a=0;a<e.width;a++){if(a===n.x&&i===n.y||!e.cells[i*e.width+a].passable||Dj(e,a,i))continue;let o=jj(e,n,a,i,n.actions);o!==null&&r.push({unit:t,x:a,y:i,cost:o})}return r}function xj(e,t){let n=bj(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=Ej(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function Sj(e,t){let n=Ej(e,t);if(n.owner!==e.turn||n.actions<=0)throw Error(`only an active unit can enter overwatch`);n.actions=0,n.overwatch=!0}function Cj(e,t,n){let r=Ej(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||Aj(e,t,r)>3)continue;let a=e.cells[r.y*e.width+r.x].cover??0,o=Math.max(0,n-a);if(r.hp=Math.max(0,r.hp-o),t.overwatch=!1,i.push({attacker:t.id,defender:r.id,damage:o,cover:a,killed:r.hp===0}),r.hp===0){e.units=e.units.filter(e=>e!==r);break}}return i}function wj(e,t,n,r){let i=Ej(e,t),a=Ej(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(Aj(e,i,a)>3)throw Error(`tactical target is out of range`);let o=e.cells[a.y*e.width+a.x].cover??0,s=Math.max(0,r-o);a.hp=Math.max(0,a.hp-s);let c=a.hp===0;return c&&(e.units=e.units.filter(e=>e!==a)),{attacker:t,defender:n,damage:s,cover:o,killed:c}}function Tj(e){let t=[...new Set(e.units.map(e=>e.owner))];if(t.length===0)return;let n=t.indexOf(e.turn)+1;n>=t.length&&e.round++,e.turn=t[n%t.length];for(let t of e.units)t.owner===e.turn&&(t.actions=2,t.overwatch=!1)}function Ej(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function Dj(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function Oj(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function kj(e,t,n){return e.shape===`hex`?fE(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function Aj(e,t,n){return e.shape===`hex`?pE(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function jj(e,t,n,r,i){let a=[{x:t.x,y:t.y,distance:0}],o=new Set([`${t.x},${t.y}`]);for(;a.length;){let t=a.shift();if(t.x===n&&t.y===r)return t.distance;if(!(t.distance>=i))for(let i of kj(e,t.x,t.y)){let s=`${i.x},${i.y}`;!Oj(e,i.x,i.y)||o.has(s)||!e.cells[i.y*e.width+i.x].passable||Dj(e,i.x,i.y)&&(i.x!==n||i.y!==r)||(o.add(s),a.push({x:i.x,y:i.y,distance:t.distance+1}))}}return null}var Mj=l({BoardGrid:()=>zA,DiceCup:()=>gj,addTacticalUnit:()=>yj,applyBackgammonMove:()=>nj,applyCheckersMove:()=>HA,applyMove:()=>AA,backgammonMoves:()=>tj,checkersMoves:()=>VA,chooseMove:()=>NA,cloneChess:()=>vA,createDeck:()=>ij,deal:()=>oj,dealSolitaire:()=>cj,drawSolitaire:()=>lj,endTacticalTurn:()=>Tj,gameResult:()=>jA,goResult:()=>qA,goScore:()=>JA,inCheck:()=>TA,legalMoves:()=>kA,moveSolitaireTableau:()=>uj,moveSolitaireToFoundation:()=>dj,moveTacticalUnit:()=>xj,parseFen:()=>fA,passGo:()=>KA,playGo:()=>GA,rollBackgammonDice:()=>ej,rollDice:()=>mj,rollExpression:()=>hj,scoreDice:()=>_j,search:()=>PA,setTacticalOverwatch:()=>Sj,shuffleDeck:()=>aj,solitaireWon:()=>fj,sq:()=>uA,squareName:()=>dA,startingBackgammon:()=>$A,startingCheckers:()=>BA,startingChess:()=>_A,startingGo:()=>WA,startingTactics:()=>vj,tacticalAttack:()=>wj,tacticalMoves:()=>bj,trickWinner:()=>sj,triggerTacticalOverwatch:()=>Cj});function Nj(e){return new Audio(qE(e))}var Pj=class{constructor(e,t={}){this.next=0;let n=Math.max(1,t.poolSize??4),r=t.create??Nj;this.volume=t.volume??1,this.pool=Array.from({length:n},()=>r(e))}play(){let e=this.pool[this.next];this.next=(this.next+1)%this.pool.length,e.volume=this.volume,e.currentTime=0,e.play()}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}},Fj=class{constructor(e={}){this.current=null,this.fades=[],this.volume=e.volume??1,this.create=e.create??Nj}play(e,t=1){let n=this.create(e);n.loop=!0;let r=this.current;if(this.current=n,t<=0){n.volume=this.volume,n.play(),r?.pause();return}n.volume=0,n.play(),this.fades.push({audio:n,elapsed:0,duration:t,from:0,to:this.volume,stopAtEnd:!1}),r&&this.fades.push({audio:r,elapsed:0,duration:t,from:r.volume,to:0,stopAtEnd:!0})}stop(e=1){let t=this.current;if(t){if(this.current=null,e<=0){t.pause();return}this.fades.push({audio:t,elapsed:0,duration:e,from:t.volume,to:0,stopAtEnd:!0})}}update(e){for(let t of[...this.fades]){t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.audio.volume=t.from+(t.to-t.from)*n,n>=1&&(this.fades.splice(this.fades.indexOf(t),1),t.stopAtEnd&&(t.audio.pause(),t.audio.currentTime=0))}}},Ij=l({Music:()=>Fj,Sound:()=>Pj,createAudio:()=>Nj});return e.Achievements=sE,e.ActorAnimator=uD,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return Dk}}),e.AnimatedSprite=zE,e.Animation=RE,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return Ij}}),e.BLOB_SHAPES=dD,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return lA}}),Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return Mj}}),e.Camera=QE,e.Collection=nE,e.ColorTransformBatcher=DE,e.DialogueStage=MD,e.EMPTY=tD,e.Game=kT,e.Generator=IT,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return LO}}),e.IconGrid=ED,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return nT}}),e.Label=xD,e.LayeredSprite=cD,e.ListView=TD,e.Logger=MT,e.MessageBox=DD,e.NO_COLOR_ADD=IE,e.NinePatch=SD,e.Player=iE,e.Projectile=lD,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return PT}}),e.Recorder=rE,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return BE}}),Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return IO}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return Xk}}),e.SaveSystem=tE,e.Scene=AT,e.SceneStack=eT,e.Session=cE,e.Signal=tT,e.SpriteSheet=ZE,e.StageScript=ND,e.TileMap=sD,e.TintedSprite=LE,e.VerticalLabel=AD,e.Window=CD,e.WindowStack=wD,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return Mk}}),e.autotileFrames=gD,e.blobIndex=hD,e.createCamera=eD,e.defaultTheme=_D,e.deserializeReplay=oE,e.hexDistance=pE,e.hexLine=hE,e.hexNeighbors=fE,e.hexRange=gE,e.hexToPixel=_E,e.importTwee=PD,e.layoutVertical=kD,e.packColorAdd=NE,e.packTintAdd=PE,e.pixelToHex=vE,e.registerColorTransform=ME,e.serializeReplay=aE,e.setTheme=bD,e.theme=yD,e.tileFrame=iD,e.tileFrameIndex=oD,e.tileFrameSheet=aD,e})({});
|