@datamoc/mw_games 0.9.1 → 0.11.0
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/CHANGELOG.md +41 -0
- package/README.md +4 -2
- package/dist/assets/loader.d.ts.map +1 -1
- package/dist/assets/loader.js +22 -2
- package/dist/assets/loader.js.map +1 -1
- package/dist/mw_games.global.js +20 -20
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +8 -1
- package/tools/compile-resources.d.mts +29 -0
- package/tools/compile-resources.mjs +61 -7
- package/tools/single-file.d.mts +17 -0
- package/tools/single-file.mjs +224 -0
- package/tools/webp-convert.d.mts +8 -0
- package/tools/webp-convert.mjs +90 -0
package/dist/mw_games.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var mw_games=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},c=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),l=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},u=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},d=(e,r,i)=>(i=e==null?{}:t(a(e)),u(r||!e||!e.__esModule||!o.call(e,`default`)?n(i,`default`,{value:e,enumerable:!0}):i,e)),f=`0.9.1`,p=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}},m=class{constructor(){this.onDestroy=new p,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.teardown())}teardown(){}get isDestroyed(){return this.destroyed}},h=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=[]}},g=class{constructor(){this.items=new Map}register(e,t){if(this.items.has(e))throw Error(`"${e}" is already registered`);this.items.set(e,t)}get(e){let t=this.items.get(e);if(t===void 0)throw Error(`no registration named "${e}"`);return t}has(e){return this.items.has(e)}list(){return[...this.items.keys()]}},_=class{constructor(){this.order=[],this.registry=new g}add(e,t){this.registry.register(e.name,e),this.order.push(e),e.create?.(t)}has(e){return this.registry.has(e)}get(e){return this.registry.get(e)}update(e,t){for(let n of this.order)n.update?.(e,t)}resize(e,t,n){for(let r of this.order)r.resize?.(e,t,n)}onSuspend(e){for(let t of this.order)t.onSuspend?.(e)}onResume(e,t){for(let n of this.order)n.onResume?.(e,t)}destroy(e){for(let t=this.order.length-1;t>=0;t--)this.order[t].destroy?.(e);this.order=[],this.registry=new g}},v={debug:0,info:1,warn:2,error:3},y=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??b}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){v[e]<v[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function b(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 x=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}off(e){this.hooks=this.hooks.filter(t=>t.handler!==e)}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)}get size(){return this.hooks.length}clear(){this.hooks=[]}},S=l({Generator:()=>w,MersenneTwister:()=>ge,RandomStreams:()=>ve,chance:()=>se,element:()=>ce,float:()=>D,int:()=>O,normalRange:()=>oe,pop:()=>ne,push:()=>te,range:()=>ae,reset:()=>ie,shuffle:()=>ue,weighted:()=>le,weightedKey:()=>k,withSeed:()=>re});function C(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 w=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=C(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(ee(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=ee(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 ee(e,t){return(e<<t|e>>>32-t)>>>0}var T=[new w],E=()=>T[T.length-1];function te(e){let t=new w(e);return T.push(t),t}function ne(){if(T.length===1)throw Error(`the base random generator cannot be popped`);T.pop()}function re(e,t){te(e);try{return t()}finally{ne()}}function ie(){T.length=0,T.push(new w)}function D(e,t){return e===void 0?E().float():t===void 0?E().float()*e:e+E().float()*(t-e)}function O(e,t){return t===void 0?E().int(e):e+E().int(t-e)}function ae(e,t){return e+E().int(t-e+1)}function oe(e,t){return e+Math.floor((E().float()+E().float())*(t-e+1)/2)}function se(e){return E().float()<e}function ce(e){return e.length>0?e[E().int(e.length)]:null}function le(e){let t=0;for(let n of e)t+=n;if(t<=0)return null;let n=E().float()*t;for(let t=0;t<e.length;t++)if(n-=e[t],n<0)return t;return e.length-1}function k(e){let t=[...e.keys()],n=le(t.map(t=>e.get(t)??0));return n===null?null:t[n]}function ue(e){for(let t=e.length-1;t>0;t--){let n=E().int(t+1);[e[t],e[n]]=[e[n],e[t]]}return e}var de=624,fe=397,pe=2567483615,me=2147483648,he=2147483647,ge=class{constructor(e=5489){this.state=new Uint32Array(de),this.index=de,this.seedValue=5489,this.produced=0,this.seed(e)}seed(e){this.seedValue=e>>>0,this.state[0]=this.seedValue;for(let e=1;e<de;e++){let t=this.state[e-1]^this.state[e-1]>>>30;this.state[e]=Math.imul(1812433253,t)+e>>>0}this.index=de,this.produced=0}generate(){for(let e=0;e<de;e++){let t=this.state[e]&me|this.state[(e+1)%de]&he,n=this.state[(e+fe)%de]^t>>>1;t&1&&(n^=pe),this.state[e]=n>>>0}this.index=0}nextUint32(){this.index>=de&&this.generate();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,this.produced++,e>>>0}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}discard(e){for(let t=0;t<e;t++)this.nextUint32()}get discardCount(){return this.produced}getState(){return{seed:this.seedValue,state:[...this.state],index:this.index,discard:this.produced}}setState(e){this.seedValue=e.seed>>>0;for(let t=0;t<de;t++)this.state[t]=(e.state[t]??0)>>>0;this.index=e.index,this.produced=e.discard}};function _e(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}var ve=class{constructor(e=0){this.streams=new Map,this.baseSeed=e>>>0}stream(e){let t=this.streams.get(e);if(!t){let n=(this.baseSeed^_e(e))>>>0;t={seed:n,engine:new ge(n)},this.streams.set(e,t)}return t.engine}seedOf(e){return this.streams.get(e)?.seed}reseed(e){this.baseSeed=e>>>0,this.streams.clear()}names(){return[...this.streams.keys()]}getState(){let e={};for(let[t,n]of this.streams)e[t]=n.engine.getState();return e}setState(e){for(let[t,n]of Object.entries(e)){let e=new ge(n.seed);e.setState(n),this.streams.set(t,{seed:n.seed,engine:e})}}},ye=l({DEFAULT_BINDINGS:()=>je,actionsForKey:()=>Pe,attach:()=>ht,attachSwipe:()=>mt,bind:()=>Me,bindAxis:()=>at,bindButton:()=>it,bindTouch:()=>lt,detach:()=>gt,dispatchComposition:()=>Ee,dispatchText:()=>Te,endFrame:()=>Ke,exportBindings:()=>Le,gamepadAxisCode:()=>rt,gamepadButtonCode:()=>nt,importBindings:()=>Re,isDown:()=>Ue,justPressed:()=>We,justReleased:()=>Ge,keysFor:()=>Ie,onAction:()=>Se,onComposition:()=>we,onKey:()=>M,onText:()=>Ce,onWheel:()=>De,pollGamepads:()=>ot,pressTouch:()=>ut,releaseTouch:()=>dt,resetBindings:()=>ze,rumble:()=>st,textFromKey:()=>N,touchCode:()=>ct,unbind:()=>Fe,wheelActionFor:()=>Oe}),be=new Map,A=new Set,j=new Set,xe=new Set,Se=new p(!0),M=new p(!0),Ce=new p(!0),we=new p(!0);function N(e){return e.isComposing||e.ctrlKey||e.metaKey||e.altKey?null:e.key.length===1?e.key:null}function Te(e){e.length>0&&Ce.dispatch(e)}function Ee(e){we.dispatch({phase:e.phase,text:e.text})}var De=new p(!0);function Oe(e){return e.ctrlKey||e.metaKey?`zoom`:e.shiftKey?`scrollHorizontal`:`scroll`}function ke(e){let t=Oe(e);t===`zoom`&&e.preventDefault();let n=t===`scrollHorizontal`&&e.deltaX!==0?e.deltaX:e.deltaY;De.dispatch({action:t,delta:n})}var Ae=!1,je={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 Me(e,t){be.set(e,new Set(t))}function Ne(e,t){let n=be.get(e)??new Set;for(let e of t)n.add(e);be.set(e,n)}function Pe(e){return Be(e)}function Fe(e){be.delete(e)}function Ie(e){return[...be.get(e)??[]]}function Le(){let e={};for(let[t,n]of be)e[t]=[...n];return e}function Re(e){be.clear();for(let[t,n]of Object.entries(e))Me(t,n)}function ze(){Re(je)}ze();function Be(e){let t=[];for(let[n,r]of be)r.has(e)&&t.push(n);return t}function Ve(e){if(!A.has(e)){A.add(e);for(let t of Be(e))j.add(t),Se.dispatch(t)}}function He(e){if(A.has(e)){A.delete(e);for(let t of Be(e))xe.add(t)}}function Ue(e){let t=be.get(e);if(!t)return!1;for(let e of t)if(A.has(e))return!0;return!1}function We(e){return j.has(e)}function Ge(e){return xe.has(e)}function Ke(){j.clear(),xe.clear()}function qe(e){let t=N(e);t!==null&&Te(t)}function Je(e){if(e.repeat){M.dispatch(e),qe(e);return}Ve(e.code),M.dispatch(e),qe(e)}function Ye(e){He(e.code)}function Xe(e){Ee({phase:`start`,text:e.data??``})}function Ze(e){Ee({phase:`update`,text:e.data??``})}function Qe(e){Ee({phase:`end`,text:e.data??``})}function $e(){A.clear(),j.clear(),xe.clear()}var et=.5,tt=new Set;function nt(e,t){return`Gamepad${e}Button${t}`}function rt(e,t,n){return`Gamepad${e}Axis${t}${n>0?`+`:`-`}`}function it(e,t,n){Ne(e,n.map(e=>nt(t,e)))}function at(e,t,n,r){Ne(e,[rt(t,n,r)])}function ot(e=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){tt.clear();for(let t of e)if(t){for(let e=0;e<t.buttons.length;e++)t.buttons[e].pressed&&tt.add(nt(t.index,e));for(let e=0;e<t.axes.length;e++){let n=t.axes[e];n>=et?tt.add(rt(t.index,e,1)):n<=-.5&&tt.add(rt(t.index,e,-1))}}for(let e of tt)Ve(e);for(let e of A)!tt.has(e)&&e.startsWith(`Gamepad`)&&He(e)}function st(e,t,n=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){(n[e]?.vibrationActuator)?.playEffect(`dual-rumble`,{duration:t.duration,weakMagnitude:t.weakMagnitude??1,strongMagnitude:t.strongMagnitude??1})}function ct(e){return`Touch:${e}`}function lt(e,t=e){Ne(e,[ct(t)])}function ut(e){Ve(ct(e))}function dt(e){He(ct(e))}var ft={up:`up`,down:`down`,left:`left`,right:`right`,upLeft:`upLeft`,upRight:`upRight`,downLeft:`downLeft`,downRight:`downRight`},pt=[`right`,`downRight`,`down`,`downLeft`,`left`,`upLeft`,`up`,`upRight`];function mt(e,t={}){let n={...ft,...t.actions},r=t.minDistance??24;for(let e of[...pt,`tap`]){let t=n[e];t&<(t,`swipe:${e}`)}let i=!1,a=-1,o=0,s=0;function c(e){ut(`swipe:${e}`),dt(`swipe:${e}`)}function l(e){i=!0,a=e.pointerId,o=e.clientX,s=e.clientY}function u(e){if(!i||e.pointerId!==a)return;i=!1;let t=e.clientX-o,l=e.clientY-s;if(Math.hypot(t,l)<r){n.tap&&c(`tap`);return}let u=pt[(Math.round(Math.atan2(l,t)/(Math.PI/4))%8+8)%8];n[u]&&c(u)}return e.addEventListener(`pointerdown`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u),()=>{e.removeEventListener(`pointerdown`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)}}function ht(e=window){Ae||(Ae=!0,e.addEventListener(`keydown`,Je),e.addEventListener(`keyup`,Ye),e.addEventListener(`compositionstart`,Xe),e.addEventListener(`compositionupdate`,Ze),e.addEventListener(`compositionend`,Qe),window.addEventListener(`blur`,$e),e.addEventListener(`wheel`,ke,{passive:!1}))}function gt(e=window){Ae&&(Ae=!1,e.removeEventListener(`keydown`,Je),e.removeEventListener(`keyup`,Ye),e.removeEventListener(`compositionstart`,Xe),e.removeEventListener(`compositionupdate`,Ze),e.removeEventListener(`compositionend`,Qe),e.removeEventListener(`wheel`,ke),window.removeEventListener(`blur`,$e),$e())}var _t=class{constructor(e,t={}){if(!e)throw Error(`a player needs a non-empty id`);this.id=e,this.padIndex=t.padIndex}scoped(e){return`${this.id}:${e}`}bind(e,t){Me(this.scoped(e),t)}bindButton(e,t){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad button to`);it(this.scoped(e),this.padIndex,t)}bindAxis(e,t,n){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad axis to`);at(this.scoped(e),this.padIndex,t,n)}bindTouch(e,t=e){lt(this.scoped(e),`${this.id}:${t}`)}pressTouch(e){ut(`${this.id}:${e}`)}releaseTouch(e){dt(`${this.id}:${e}`)}isDown(e){return Ue(this.scoped(e))}justPressed(e){return We(this.scoped(e))}justReleased(e){return Ge(this.scoped(e))}keysFor(e){return Ie(this.scoped(e))}};function vt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=new TextEncoder().encode(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return bt(i)}function yt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=xt(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return new TextDecoder(`utf-8`,{fatal:!0}).decode(i)}function bt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function xt(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var St=10485760;function Ct(e,t={}){let n=t.maxBytes??St,r=typeof e==`string`?new TextEncoder().encode(e).length:e.length;if(r>n)throw Error(`inbound data exceeds the ${n}-byte limit (${r} bytes)`)}function wt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n!==9&&n!==10&&n!==13&&(n<=31||n===127))throw Error(`inbound data contains a control character (0x${n.toString(16).padStart(2,`0`)}) at index ${t}`)}}function Tt(e,t={}){return Ct(e,t),wt(e),e}var Et=new Set([`__proto__`,`constructor`,`prototype`]);function Dt(e,t=`$`){if(Array.isArray(e)){e.forEach((e,n)=>Dt(e,`${t}[${n}]`));return}if(typeof e==`object`&&e)for(let n of Object.keys(e)){if(Et.has(n))throw Error(`${t} contains a forbidden key "${n}"`);Dt(e[n],`${t}.${n}`)}}function Ot(e,t,n=`$`){if(e===void 0){if(t.optional)return;throw Error(`${n} is required`)}switch(t.type){case`string`:if(typeof e!=`string`)throw Error(`${n} must be a string`);return;case`number`:if(typeof e!=`number`||!Number.isFinite(e))throw Error(`${n} must be a finite number`);if(t.min!==void 0&&e<t.min)throw Error(`${n} must be >= ${t.min}`);if(t.max!==void 0&&e>t.max)throw Error(`${n} must be <= ${t.max}`);return;case`boolean`:if(typeof e!=`boolean`)throw Error(`${n} must be a boolean`);return;case`array`:if(!Array.isArray(e))throw Error(`${n} must be an array`);if(t.maxLength!==void 0&&e.length>t.maxLength)throw Error(`${n} exceeds its maximum length of ${t.maxLength}`);e.forEach((e,r)=>Ot(e,t.items,`${n}[${r}]`));return;case`object`:if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${n} must be an object`);for(let t of Object.keys(e))if(Et.has(t))throw Error(`${n} contains a forbidden key "${t}"`);for(let[r,i]of Object.entries(t.fields))Ot(e[r],i,`${n}.${r}`);return}}var kt=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 At(){return typeof localStorage>`u`?new kt:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var jt=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??At()}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;try{let e=JSON.parse(t),n=e.state;for(let t=e.meta.version;t<this.version;t++)n=(this.migrations[t]??(e=>e))(n);return{meta:{...e.meta,version:this.version},state:n}}catch{return null}}importExternal(e,t,n,r){Ct(t);let i=n(t);for(let e=0;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{version:this.version,savedAt:Date.now(),preview:r},state:i};this.storage.write(this.key(e),JSON.stringify(a))}delete(e){this.storage.remove(this.key(e))}exportSlot(e,t){let n=this.storage.read(this.key(e));return n===null?null:t?vt(n,t):n}importSlot(e,t,n){Ct(t);let r=Tt(n?yt(t,n):t),i;try{i=JSON.parse(r)}catch{throw Error(`SaveSystem.importSlot: payload is not valid save data (not parseable JSON)`)}let a=i.state;for(let e=i.meta.version;e<this.version;e++)a=(this.migrations[e]??(e=>e))(a);let o={meta:{...i.meta,version:this.version},state:a};this.storage.write(this.key(e),JSON.stringify(o))}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}},Mt=class{constructor(e,t={}){this._state=structuredClone(e),this.version=t.version??1,this.migrations=t.migrations??{},this.extensions=t.extensions??new Nt}get state(){return structuredClone(this._state)}set(e){this._state=structuredClone(e)}update(e){let t=e(this.state);return this.set(t),this.state}snapshot(){let e=this.extensions.snapshot();return{version:this.version,state:this.state,extensions:e.extensions,extensionVersions:e.versions}}restore(e,t={}){if(!Number.isSafeInteger(e.version)||e.version<1)throw Error(`canonical state snapshot version must be a positive integer`);if(e.version>this.version)throw Error(`canonical state snapshot version ${e.version} is newer than ${this.version}`);let n=this.snapshot();try{let n=structuredClone(e.state);for(let t=e.version;t<this.version;t++){let e=this.migrations[t+1];if(!e)throw Error(`missing canonical state migration to version ${t+1}`);n=e(n)}return this._state=structuredClone(n),this.extensions.restore({extensions:e.extensions,versions:e.extensionVersions},t)}catch(e){throw this._state=structuredClone(n.state),this.extensions.restore({extensions:n.extensions,versions:n.extensionVersions},{missing:`keep`}),e}}transaction(e){let t=this.snapshot();try{return e(this)}catch(e){throw this.restore(t),e}}},Nt=class{constructor(){this.extensions=new Map}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid state extension id: ${e.id}`);if(this.extensions.has(e.id))throw Error(`state extension already registered: ${e.id}`);return this.extensions.set(e.id,{id:e.id,capture:()=>e.capture(),restore:t=>e.restore(t),version:e.version??1,migrations:e.migrations,reset:e.reset,remove:e.remove}),()=>this.extensions.delete(e.id)}snapshot(){let e={};for(let[t,n]of this.extensions)e[t]=structuredClone(n.capture());let t={};for(let[e,n]of this.extensions)t[e]=n.version??1;return{extensions:e,versions:t}}restore(e,t={}){let n=this.snapshot(),r=[];try{for(let[n,i]of this.extensions){if(!(n in e.extensions)){t.missing===`reset`?(i.reset&&i.reset(),r.push({extension:n,from:0,to:i.version??1,status:`reset`})):t.missing===`remove`&&(i.remove&&i.remove(),r.push({extension:n,from:0,to:i.version??1,status:`removed`}));continue}let a=e.versions?.[n]??1,o=i.version??1,s=structuredClone(e.extensions[n]);for(let e=a;e<o;e++){let t=i.migrations?.[e+1];if(!t)throw Error(`missing state migration for ${n} to version ${e+1}`);s=t(s)}i.restore(structuredClone(s)),r.push({extension:n,from:a,to:o,status:a===o?`unchanged`:`migrated`})}}catch(e){for(let[e,t]of this.extensions)e in n.extensions&&t.restore(structuredClone(n.extensions[e]));throw e}for(let e of r)t.onDiagnostic?.(e);return r}transaction(e){let t=this.snapshot();try{return e()}catch(e){throw this.restore(t),e}}},Pt=class{constructor(e,t){if(!e.endpoint)throw Error(`${t} endpoint is required`);if(this.endpoint=e.endpoint,this.timeoutMs=e.timeoutMs??1e4,!(this.timeoutMs>0))throw Error(`${t} timeout must be positive`);if(this.fetchFn=e.fetch??globalThis.fetch,!this.fetchFn)throw Error(`fetch is unavailable; provide ${t}Options.fetch`)}async withTimeout(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this.timeoutMs);try{return await e(t.signal)}finally{clearTimeout(n)}}},Ft=class extends Pt{constructor(e){super(e,`save sync`)}async upload(e,t){if(!e)throw Error(`save sync slot name is required`);if(!t)throw Error(`save sync payload cannot be empty`);return this.withTimeout(async n=>{let r=await this.fetchFn(this.slotUrl(e),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({payload:t}),signal:n});if(!r.ok)throw Error(`save upload failed with HTTP ${r.status}`);return{ok:!0,status:r.status}})}async download(e){if(!e)throw Error(`save sync slot name is required`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.slotUrl(e),{signal:t});if(!n.ok)throw Error(`save download failed with HTTP ${n.status}`);let r=await n.json();if(typeof r.payload!=`string`)throw Error(`save download response missing a string payload`);return r.payload})}async list(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`save slot list failed with HTTP ${t.status}`);let n=await t.json();if(!Array.isArray(n.slots)||!n.slots.every(e=>typeof e==`string`))throw Error(`save slot list response missing a string array of slots`);return n.slots})}slotUrl(e){let t=this.endpoint.includes(`?`)?`&`:`?`;return`${this.endpoint}${t}slot=${encodeURIComponent(e)}`}},It=1,Lt=class{constructor(e){if(this.onWelcome=new p,this.onTick=new p,this.onReject=new p,this.onDesync=new p,this.onClose=new p,this.socket=null,this._id=null,!e.url)throw Error(`lockstep client url is required`);this.url=e.url,this.createSocket=e.create??(e=>new WebSocket(e)),this.validateInput=e.validateInput}get id(){return this._id}get connected(){return this.socket!==null&&this.socket.readyState===It}connect(){if(this.socket)throw Error(`lockstep client is already connected`);let e=this.createSocket(this.url);e.onmessage=e=>this.handleMessage(e.data),e.onclose=()=>{this.socket=null,this._id=null,this.onClose.dispatch()},this.socket=e}submitInput(e,t){if(!this.connected)return;let n=this.validateInput?.(e);if(n===!1||typeof n==`string`){this.onReject.dispatch({reason:n===!1?`input rejected by client validation`:n});return}this.socket?.send(JSON.stringify({type:`input`,payload:e,...t===void 0?{}:{checksum:t}}))}close(){this.socket?.close()}handleMessage(e){let t=JSON.parse(e);if(t.type===`welcome`&&t.id!==void 0)this._id=t.id,this.onWelcome.dispatch({id:t.id,...t.seed===void 0?{}:{seed:t.seed},...t.initialState===void 0?{}:{initialState:t.initialState}});else if(t.type===`tick`&&t.tick!==void 0&&t.inputs!==void 0){let e={tick:t.tick,inputs:t.inputs,...t.checksums===void 0?{}:{checksums:t.checksums}};if(this.onTick.dispatch(e),t.checksums){let e=Object.values(t.checksums);e.some(t=>t!==e[0])&&this.onDesync.dispatch({tick:t.tick,checksums:t.checksums})}}else t.type===`rejected`&&this.onReject.dispatch({reason:t.reason??`input rejected by server`})}},Rt=class{constructor(e,t){this.storage=e,this.key=t}read(e){let t=this.storage.read(this.key);return t?JSON.parse(t):e}write(e){this.storage.write(this.key,JSON.stringify(e))}remove(){this.storage.remove(this.key)}},zt=class{constructor(e){this.store=new Rt(e.storage??At(),`mwg-runs:${e.namespace}`),this.limit=e.limit}readAll(){return this.store.read([])}record(e){let t=this.readAll(),n={id:`${Date.now()}-${t.length}`,endedAt:Date.now(),summary:e};return t.push(n),this.limit!==void 0&&t.length>this.limit&&t.splice(0,t.length-this.limit),this.store.write(t),n}all(){return this.readAll()}ranked(e,t=`desc`){let n=this.readAll(),r=t===`desc`?-1:1;return n.sort((t,n)=>r*(e(t.summary)-e(n.summary)))}clear(){this.store.remove()}},Bt=class{constructor(e){this.store=new Rt(e.storage??At(),`mwg-stats:${e.namespace}`),this.initial=e.initial,this.combine=e.combine}get(){return this.store.read(this.initial)}record(e){let t=this.combine(this.get(),e);return this.store.write(t),t}reset(){this.store.remove()}},Vt=class extends Pt{constructor(e){super(e,`telemetry`),this.consented=!1}get hasConsent(){return this.consented}setConsent(e){this.consented=e}async send(e){if(!e.name)throw Error(`telemetry event needs a name`);return this.consented?this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`telemetry request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}}):null}},Ht=class extends Pt{constructor(e){super(e,`news`)}async fetchItems(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`news request failed with HTTP ${t.status}`);let n=JSON.parse(Tt(await t.text()));if(!Array.isArray(n))throw Error(`news response was not an array`);return n.map((e,t)=>Ut(e,t))})}};function Ut(e,t){if(typeof e!=`object`||!e)throw Error(`news item ${t} was not an object`);let n=e;if(typeof n.id!=`string`||!n.id)throw Error(`news item ${t} is missing a string id`);if(typeof n.title!=`string`)throw Error(`news item ${t} is missing a string title`);if(typeof n.body!=`string`)throw Error(`news item ${t} is missing a string body`);return{id:n.id,title:n.title,body:n.body,publishedAt:typeof n.publishedAt==`number`?n.publishedAt:void 0}}var Wt=class{constructor(e){this.store=new Rt(e.storage??At(),`mwg-news-seen:${e.namespace}`)}readSeen(){return new Set(this.store.read([]))}isSeen(e){return this.readSeen().has(e)}markSeen(e){let t=this.readSeen();t.add(e),this.store.write([...t])}unseen(e){let t=this.readSeen();return e.filter(e=>!t.has(e.id))}},Gt=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??At()}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))}},Kt=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)}},qt=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 Jt(e){return JSON.stringify(e)}function Yt(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 Xt=class e{constructor(){this.entries=[],this.nextSequence=0}append(e,t=[]){let n={sequence:this.nextSequence++,action:e,events:structuredClone([...t])};return this.entries.push(n),structuredClone(n)}get size(){return this.entries.length}get all(){return structuredClone(this.entries)}mark(){return this.nextSequence}since(e){return structuredClone(this.entries.filter(t=>t.sequence>=e))}truncate(e){this.entries=this.entries.filter(t=>t.sequence<e),this.nextSequence=e}toJSON(){return this.all}replace(t){let n=e.fromJSON(t);this.entries=n.entries,this.nextSequence=n.nextSequence}static fromJSON(t){let n=new e,r=0;for(let e of t){if(!Number.isSafeInteger(e.sequence)||e.sequence!==r)throw Error(`action journal sequences must be contiguous from zero`);n.entries.push(structuredClone({sequence:e.sequence,action:e.action,events:[...e.events]})),r++}return n.nextSequence=r,n}};function Zt(e){if(e.criteria)return e.criteria;if(e.counter===void 0||e.target===void 0)throw Error(`achievement "${e.id}" needs either counter/target or criteria`);return[{counter:e.counter,target:e.target}]}var Qt=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 t of this.definitions.values()){let i=Zt(t);i.some(t=>t.counter===e)&&(i.every(t=>t.counter===e?n>=t.target:this.count(t.counter)>=t.target)||i.every(e=>this.count(e.counter)>=e.target)&&(r.push(t.id),this.fresh.push(t.id)))}return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Zt(t).every(e=>this.count(e.counter)>=e.target)}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);let n=Zt(t);if(n.length!==1)throw Error(`achievement "${e}" has several criteria - use subProgress`);return{count:this.count(n[0].counter),target:n[0].target}}subProgress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Zt(t).map(e=>{let t=this.count(e.counter);return{counter:e.counter,count:t,target:e.target,met:t>=e.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}},$t=class e{constructor(e=[]){this.active=new Set,this.spent=new Set,this.rules=[...e]}add(e){this.rules.push(e)}remove(e){this.rules=this.rules.filter(t=>t.id!==e),this.active.delete(e)}check(e){let t=[];for(let n of this.rules){if(n.once&&this.spent.has(n.id))continue;let r=n.when(e);r&&!this.active.has(n.id)&&(n.action(e),t.push(n.id),n.once&&this.spent.add(n.id)),r?this.active.add(n.id):this.active.delete(n.id)}return t}isActive(e){return this.active.has(e)}reset(){this.active.clear(),this.spent.clear()}toJSON(){return{active:[...this.active],spent:[...this.spent]}}static fromJSON(t,n){let r=new e(t);for(let e of n.active)r.active.add(e);for(let e of n.spent)r.spent.add(e);return r}},en=class{constructor(e={}){let t=e.storage??At(),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))}},tn=class extends Pt{constructor(e){super(e,`feedback`)}async submit(e){if(!e.message?.trim())throw Error(`feedback message cannot be empty`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`feedback request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}})}},nn=class{constructor(e){this.schedule=[],this.cursor=0,this.elapsed=0,this.startedWaves=new Set,this.completed=!1,this.onSpawn=e.onSpawn,this.onWaveStart=e.onWaveStart,this.onComplete=e.onComplete,e.waves.forEach((e,t)=>{let n=e.entries.reduce((e,t)=>e+t.count,0),r=e.duration??0,i=0;for(let a of e.entries)for(let o=0;o<a.count;o++,i++){let o=n>1&&r>0?i/(n-1)*r:0;this.schedule.push({time:e.delay+o,kind:a.kind,waveIndex:t})}}),this.schedule.sort((e,t)=>e.time-t.time),this.schedule.length===0&&(this.completed=!0,this.onComplete?.())}update(e){if(!this.completed){for(this.elapsed+=e;this.cursor<this.schedule.length&&this.schedule[this.cursor].time<=this.elapsed;){let e=this.schedule[this.cursor];this.startedWaves.has(e.waveIndex)||(this.startedWaves.add(e.waveIndex),this.onWaveStart?.(e.waveIndex)),this.onSpawn(e.kind),this.cursor++}this.cursor>=this.schedule.length&&(this.completed=!0,this.onComplete?.())}}get isComplete(){return this.completed}};function rn(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function an(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var on=[{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 sn(e,t){let n=rn(e,t);return on.map(e=>an({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function cn(e,t){let n=rn(e.x,e.y),r=rn(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 ln(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 un(e,t){let n=cn(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=rn(e.x,e.y),i=rn(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(an(ln({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 dn(e,t){let n=rn(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(an({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function fn(e,t,n,r,i={}){let a=+((i.offset??`odd`)===`odd`);return(i.orientation??`flat-top`)===`pointy-top`?{x:e*n+((t&1)===a?n/2:0)+n/2,y:t*r*.75+r/2}:{x:e*n*.75+n/2,y:t*r+((e&1)===a?r/2:0)+r/2}}function pn(e,t,n,r,i={}){let a=(i.orientation??`flat-top`)===`pointy-top`,o=a?n:n*.75,s=a?r*.75:r,c=Math.round((e-n/2)/o),l=Math.round((t-r/2)/s),u={x:c,y:l},d=1/0;for(let a=-2;a<=2;a++)for(let o=-2;o<=2;o++){let s={x:c+a,y:l+o},f=fn(s.x,s.y,n,r,i),p=(f.x-e)**2+(f.y-t)**2;p<d&&(d=p,u=s)}return u}var mn=.12,hn=null,gn,_n=new p;function vn(){if(gn===void 0&&(gn=typeof matchMedia==`function`?matchMedia(`(prefers-reduced-motion: reduce)`):null,gn)){let e=()=>{_n.dispatch(bn())};typeof gn.addEventListener==`function`?gn.addEventListener(`change`,e):typeof gn.addListener==`function`&&gn.addListener(e)}return gn}function yn(){return vn()?.matches??!1}function bn(){return hn??yn()}function xn(e){hn=e,_n.dispatch(bn())}function Sn(e){return vn(),_n.add(e),()=>_n.remove(e)}function Cn(e,t=`decorative`){return bn()?t===`meaningful`?Math.min(e,mn):0:e}var wn=[[0,-1],[1,0],[0,1],[-1,0]],Tn=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}index(e,t){return e<0||t<0||e>=this.width||t>=this.height?-1:t*this.width+e}volumeAt(e,t){let n=this.index(e,t);return n<0?0:this.volume[n]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){let r=this.index(e,t);r>=0&&(this.volume[r]+=n)}clear(e,t){let n=this.index(e,t);n>=0&&(this.volume[n]=0)}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 wn){let a=i+t,o=n+r,c=this.index(a,o);c>=0&&e(a,o)&&s.push(c)}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}}let i=[];for(let e=0;e<r.length;e++){let t=r[e]*n,a=t<.001?0:t;a===0&&this.volume[e]>0&&i.push({x:e%this.width,y:Math.floor(e/this.width)}),this.volume[e]=a}return i}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}},En={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2},Dn=class{constructor(){this.tweens=[]}tween(e,t,n=En.linear){let{ease:r=En.linear,intent:i=`decorative`,alternate:a}=typeof n==`function`?{ease:n}:n,o=bn()&&a!==void 0,s=o?a:t,c=Cn(e,o?`meaningful`:i);return c>0?new Promise(e=>{this.tweens.push({elapsed:0,duration:c,ease:r,apply:s,resolve:e,finishOnReduced:!o&&i===`decorative`})}):(s(1),Promise.resolve())}update(e){if(this.tweens.length!==0)for(let t of[...this.tweens]){if(t.finishOnReduced&&bn()){this.tweens.splice(this.tweens.indexOf(t),1),t.apply(1),t.resolve();continue}t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.apply(t.ease(n)),n>=1&&(this.tweens.splice(this.tweens.indexOf(t),1),t.resolve())}}get isBusy(){return this.tweens.length>0}clear(){this.tweens=[]}},On=class{constructor(e={}){this.history=[],this.cursor=-1,this.limit=Math.max(1,e.limit??50)}push(e){this.history.length=this.cursor+1,this.history.push(e),this.history.length>this.limit&&this.history.shift(),this.cursor=this.history.length-1}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.history.length-1}undo(){return this.canUndo?(this.cursor--,this.history[this.cursor]):null}redo(){return this.canRedo?(this.cursor++,this.history[this.cursor]):null}get current(){return this.cursor>=0?this.history[this.cursor]:null}clear(){this.history=[],this.cursor=-1}};function kn(e,t){if(!Number.isFinite(t.maxCost)||t.maxCost<0)return new Map;let n=t.key(e),r=new Map([[n,{cell:e,cost:0}]]),i=[{cell:e,key:n,cost:0}];for(;i.length>0;){let e=jn(i),n=r.get(e.key);if(n&&e.cost===n.cost&&!t.stop?.(e.cell,e.cost))for(let n of t.neighbors(e.cell)){let a=t.cost(e.cell,n);if(!Number.isFinite(a)||a<0)continue;let o=e.cost+a;if(o>t.maxCost||t.canEnter&&!t.canEnter(n,e.cell,o))continue;let s=t.key(n);if(o>=(r.get(s)?.cost??1/0))continue;let c={cell:n,key:s,cost:o};r.set(s,c),An(i,c)}}return r}function An(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=Math.floor((n-1)/2);if(e[t].cost<=e[n].cost)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function jn(e){let t=e[0],n=e.pop();if(!t||!n||e.length===0)return t;e[0]=n;let r=0;for(;;){let t=r*2+1,n=t+1,i=r;if(t<e.length&&e[t].cost<e[i].cost&&(i=t),n<e.length&&e[n].cost<e[i].cost&&(i=n),i===r)break;[e[r],e[i]]=[e[i],e[r]],r=i}return t}var Mn=class{constructor(){this.changed=new p,this.tasks=[],this.progress=new Map,this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1}add(e){if(!e.id)throw Error(`load task needs an id`);if(this.tasks.some(t=>t.id===e.id))throw Error(`duplicate load task "${e.id}"`);if(e.weight!==void 0&&!(e.weight>0))throw Error(`load task weight must be positive`);if(this.status_===`loading`)throw Error(`cannot add a task while loading`);return this.tasks.push(e),this.progress.set(e.id,0),this.emit(),this}get snapshot(){let e=this.tasks.reduce((e,t)=>e+(t.weight??1),0),t=this.tasks.reduce((e,t)=>e+(t.weight??1)*(this.progress.get(t.id)??0),0);return{status:this.status_,completed:t,total:e,current:this.current_,error:this.error_}}async start(){if(this.status_===`loading`)throw Error(`load queue is already running`);this.status_=`loading`,this.cancelled=!1,this.error_=null,this.emit();try{for(let e of this.tasks){if(this.cancelled)break;this.current_=e.id,this.emit();let t=this;await e.run({get cancelled(){return t.cancelled},report:t=>this.report(e.id,t)}),this.cancelled||this.report(e.id,1)}this.current_=null,this.status_=this.cancelled?`cancelled`:`ready`,this.emit()}catch(e){throw this.current_=null,this.error_=e,this.status_=`failed`,this.emit(),e}}cancel(){this.status_===`loading`&&(this.cancelled=!0)}retry(){if(this.status_===`loading`)throw Error(`cannot retry while loading`);this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1;for(let e of this.tasks)this.progress.set(e.id,0);this.emit()}report(e,t){if(!Number.isFinite(t))throw Error(`load progress must be finite`);this.progress.set(e,Math.max(0,Math.min(1,t))),this.emit()}emit(){this.changed.dispatch(this.snapshot)}},Nn=class{constructor(){this.entities=new Map,this.ids=new Map,this.sequence=0}add(e,t){let n=this.ids.get(e);if(n!==void 0){if(t!==void 0&&t!==n)throw Error(`entity already has id ${n}`);return n}let r=t;if(r!==void 0){if(r.length===0)throw Error(`entity id must not be empty`);if(this.entities.has(r))throw Error(`entity id already exists: ${r}`)}else do r=`e${this.sequence++}`;while(this.entities.has(r));return this.entities.set(r,e),this.ids.set(e,r),r}get(e){return this.entities.get(e)}idOf(e){return this.ids.get(e)}has(e){return this.entities.has(e)}remove(e){let t=this.entities.get(e);return t!==void 0&&(this.entities.delete(e),this.ids.delete(t),!0)}get size(){return this.entities.size}},Pn=class{constructor(e){this.queue=[],this.busy=!1,this.remaining=0,this.play=e.play}enqueue(e){this.queue.push(...e),this.busy||this.advance()}update(e){this.busy&&(this.remaining-=e,this.remaining<=0&&this.advance())}get isBusy(){return this.busy}clear(){this.queue=[],this.busy=!1,this.remaining=0}advance(){let e=this.queue.shift();if(e===void 0){this.busy=!1,this.remaining=0;return}this.busy=!0;let t=this.play(e)||0;t>0?this.remaining=t:this.advance()}},Fn=2166136261,In=16777619;function Ln(e,t=!1){if(e==null)return`null`;switch(typeof e){case`boolean`:return e?`true`:`false`;case`number`:return Number.isFinite(e)?String(e):`null`;case`string`:return JSON.stringify(e);case`bigint`:return JSON.stringify(e.toString());case`function`:case`symbol`:return t?`null`:`undefined`}return Array.isArray(e)?`[${e.map(e=>Ln(e,!0)).join(`,`)}]`:`{${Object.entries(e).filter(([,e])=>e!==void 0&&typeof e!=`function`&&typeof e!=`symbol`).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>`${JSON.stringify(e)}:${Ln(t)}`).join(`,`)}}`}function Rn(e){let t=Ln(e),n=Fn;for(let e=0;e<t.length;e++)n^=t.charCodeAt(e),n=Math.imul(n,In)>>>0;return n>>>0}var zn=class{constructor(){this.reference=new Map,this.desyncTick=null}observe(e,t){let n=this.reference.get(e);return n===void 0?(this.reference.set(e,t),!0):n===t||(this.desyncTick===null&&(this.desyncTick=e),!1)}get divergent(){return this.desyncTick!==null}get atTick(){return this.desyncTick}reset(){this.reference.clear(),this.desyncTick=null}};function Bn(e,t={}){let n=Un(e);if(n.length===0)return[];let[r,...i]=n,a=t.listDelimiter??`;`,o=t.mapDelimiter??`=`;return i.map((e,n)=>{let i={};return r.forEach((r,s)=>{let c=e[s]??``;c!==``&&(i[r]=Vn(c,t.columns?.[r]??`string`,r,n,a,o))}),i})}function Vn(e,t,n,r,i,a){return Hn(e,t,{column:n,rowIndex:r,listDelimiter:i,mapDelimiter:a,error:()=>t===`number`?`CSV row ${r+1}, column "${n}": "${e}" is not a number`:t===`boolean`?`CSV row ${r+1}, column "${n}": "${e}" is not "true" or "false"`:t===`map`?`CSV row ${r+1}, column "${n}": "${e.split(i).map(e=>e.trim()).find(e=>e&&!e.includes(a))??e}" has no "${a}" to split a key from its value`:`CSV row ${r+1}, column "${n}": "${e}" is invalid`})}function Hn(e,t,n={}){let r=n.column??`value`,i=n.listDelimiter??`;`,a=n.mapDelimiter??`=`,o=e=>{throw Error(n.error?.(e)??e)};switch(t){case`string`:return e;case`number`:{let t=Number(e);return Number.isFinite(t)||o(`${r} must be a number`),t}case`boolean`:{let t=e.toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1;if(n.acceptYesNo&&t===`yes`)return!0;if(n.acceptYesNo&&t===`no`)return!1;o(`${r} must be true, false${n.acceptYesNo?`, yes, or no`:``}`)}case`list`:return e.split(i).map(e=>e.trim()).filter(e=>e.length>0);case`map`:{let t={};for(let n of e.split(i).map(e=>e.trim()).filter(e=>e.length>0)){let e=n.indexOf(a);e===-1&&o(`${r} map entry must contain ${a}`),t[n.slice(0,e).trim()]=n.slice(e+a.length).trim()}return t}}}function Un(e){let t=[],n=[],r=``,i=!1,a=0;for(;a<e.length;){let o=e[a];if(i){if(o===`"`){if(e[a+1]===`"`){r+=`"`,a+=2;continue}i=!1,a++;continue}r+=o,a++;continue}if(o===`"`){i=!0,a++;continue}if(o===`,`){n.push(r),r=``,a++;continue}if(o===`\r`){a++;continue}if(o===`
|
|
1
|
+
var mw_games=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},c=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),l=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},u=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},d=(e,r,i)=>(i=e==null?{}:t(a(e)),u(r||!e||!e.__esModule||!o.call(e,`default`)?n(i,`default`,{value:e,enumerable:!0}):i,e)),f=`0.11.0`,p=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}},m=class{constructor(){this.onDestroy=new p,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.teardown())}teardown(){}get isDestroyed(){return this.destroyed}},h=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=[]}},g=class{constructor(){this.items=new Map}register(e,t){if(this.items.has(e))throw Error(`"${e}" is already registered`);this.items.set(e,t)}get(e){let t=this.items.get(e);if(t===void 0)throw Error(`no registration named "${e}"`);return t}has(e){return this.items.has(e)}list(){return[...this.items.keys()]}},_=class{constructor(){this.order=[],this.registry=new g}add(e,t){this.registry.register(e.name,e),this.order.push(e),e.create?.(t)}has(e){return this.registry.has(e)}get(e){return this.registry.get(e)}update(e,t){for(let n of this.order)n.update?.(e,t)}resize(e,t,n){for(let r of this.order)r.resize?.(e,t,n)}onSuspend(e){for(let t of this.order)t.onSuspend?.(e)}onResume(e,t){for(let n of this.order)n.onResume?.(e,t)}destroy(e){for(let t=this.order.length-1;t>=0;t--)this.order[t].destroy?.(e);this.order=[],this.registry=new g}},v={debug:0,info:1,warn:2,error:3},y=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??b}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){v[e]<v[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function b(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 x=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}off(e){this.hooks=this.hooks.filter(t=>t.handler!==e)}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)}get size(){return this.hooks.length}clear(){this.hooks=[]}},S=l({Generator:()=>w,MersenneTwister:()=>ge,RandomStreams:()=>ve,chance:()=>se,element:()=>ce,float:()=>D,int:()=>O,normalRange:()=>oe,pop:()=>ne,push:()=>te,range:()=>ae,reset:()=>ie,shuffle:()=>ue,weighted:()=>le,weightedKey:()=>k,withSeed:()=>re});function C(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 w=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=C(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(ee(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=ee(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 ee(e,t){return(e<<t|e>>>32-t)>>>0}var T=[new w],E=()=>T[T.length-1];function te(e){let t=new w(e);return T.push(t),t}function ne(){if(T.length===1)throw Error(`the base random generator cannot be popped`);T.pop()}function re(e,t){te(e);try{return t()}finally{ne()}}function ie(){T.length=0,T.push(new w)}function D(e,t){return e===void 0?E().float():t===void 0?E().float()*e:e+E().float()*(t-e)}function O(e,t){return t===void 0?E().int(e):e+E().int(t-e)}function ae(e,t){return e+E().int(t-e+1)}function oe(e,t){return e+Math.floor((E().float()+E().float())*(t-e+1)/2)}function se(e){return E().float()<e}function ce(e){return e.length>0?e[E().int(e.length)]:null}function le(e){let t=0;for(let n of e)t+=n;if(t<=0)return null;let n=E().float()*t;for(let t=0;t<e.length;t++)if(n-=e[t],n<0)return t;return e.length-1}function k(e){let t=[...e.keys()],n=le(t.map(t=>e.get(t)??0));return n===null?null:t[n]}function ue(e){for(let t=e.length-1;t>0;t--){let n=E().int(t+1);[e[t],e[n]]=[e[n],e[t]]}return e}var de=624,fe=397,pe=2567483615,me=2147483648,he=2147483647,ge=class{constructor(e=5489){this.state=new Uint32Array(de),this.index=de,this.seedValue=5489,this.produced=0,this.seed(e)}seed(e){this.seedValue=e>>>0,this.state[0]=this.seedValue;for(let e=1;e<de;e++){let t=this.state[e-1]^this.state[e-1]>>>30;this.state[e]=Math.imul(1812433253,t)+e>>>0}this.index=de,this.produced=0}generate(){for(let e=0;e<de;e++){let t=this.state[e]&me|this.state[(e+1)%de]&he,n=this.state[(e+fe)%de]^t>>>1;t&1&&(n^=pe),this.state[e]=n>>>0}this.index=0}nextUint32(){this.index>=de&&this.generate();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,this.produced++,e>>>0}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}discard(e){for(let t=0;t<e;t++)this.nextUint32()}get discardCount(){return this.produced}getState(){return{seed:this.seedValue,state:[...this.state],index:this.index,discard:this.produced}}setState(e){this.seedValue=e.seed>>>0;for(let t=0;t<de;t++)this.state[t]=(e.state[t]??0)>>>0;this.index=e.index,this.produced=e.discard}};function _e(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}var ve=class{constructor(e=0){this.streams=new Map,this.baseSeed=e>>>0}stream(e){let t=this.streams.get(e);if(!t){let n=(this.baseSeed^_e(e))>>>0;t={seed:n,engine:new ge(n)},this.streams.set(e,t)}return t.engine}seedOf(e){return this.streams.get(e)?.seed}reseed(e){this.baseSeed=e>>>0,this.streams.clear()}names(){return[...this.streams.keys()]}getState(){let e={};for(let[t,n]of this.streams)e[t]=n.engine.getState();return e}setState(e){for(let[t,n]of Object.entries(e)){let e=new ge(n.seed);e.setState(n),this.streams.set(t,{seed:n.seed,engine:e})}}},ye=l({DEFAULT_BINDINGS:()=>je,actionsForKey:()=>Pe,attach:()=>ht,attachSwipe:()=>mt,bind:()=>Me,bindAxis:()=>at,bindButton:()=>it,bindTouch:()=>lt,detach:()=>gt,dispatchComposition:()=>Ee,dispatchText:()=>Te,endFrame:()=>Ke,exportBindings:()=>Le,gamepadAxisCode:()=>rt,gamepadButtonCode:()=>nt,importBindings:()=>Re,isDown:()=>Ue,justPressed:()=>We,justReleased:()=>Ge,keysFor:()=>Ie,onAction:()=>Se,onComposition:()=>we,onKey:()=>M,onText:()=>Ce,onWheel:()=>De,pollGamepads:()=>ot,pressTouch:()=>ut,releaseTouch:()=>dt,resetBindings:()=>ze,rumble:()=>st,textFromKey:()=>N,touchCode:()=>ct,unbind:()=>Fe,wheelActionFor:()=>Oe}),be=new Map,A=new Set,j=new Set,xe=new Set,Se=new p(!0),M=new p(!0),Ce=new p(!0),we=new p(!0);function N(e){return e.isComposing||e.ctrlKey||e.metaKey||e.altKey?null:e.key.length===1?e.key:null}function Te(e){e.length>0&&Ce.dispatch(e)}function Ee(e){we.dispatch({phase:e.phase,text:e.text})}var De=new p(!0);function Oe(e){return e.ctrlKey||e.metaKey?`zoom`:e.shiftKey?`scrollHorizontal`:`scroll`}function ke(e){let t=Oe(e);t===`zoom`&&e.preventDefault();let n=t===`scrollHorizontal`&&e.deltaX!==0?e.deltaX:e.deltaY;De.dispatch({action:t,delta:n})}var Ae=!1,je={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 Me(e,t){be.set(e,new Set(t))}function Ne(e,t){let n=be.get(e)??new Set;for(let e of t)n.add(e);be.set(e,n)}function Pe(e){return Be(e)}function Fe(e){be.delete(e)}function Ie(e){return[...be.get(e)??[]]}function Le(){let e={};for(let[t,n]of be)e[t]=[...n];return e}function Re(e){be.clear();for(let[t,n]of Object.entries(e))Me(t,n)}function ze(){Re(je)}ze();function Be(e){let t=[];for(let[n,r]of be)r.has(e)&&t.push(n);return t}function Ve(e){if(!A.has(e)){A.add(e);for(let t of Be(e))j.add(t),Se.dispatch(t)}}function He(e){if(A.has(e)){A.delete(e);for(let t of Be(e))xe.add(t)}}function Ue(e){let t=be.get(e);if(!t)return!1;for(let e of t)if(A.has(e))return!0;return!1}function We(e){return j.has(e)}function Ge(e){return xe.has(e)}function Ke(){j.clear(),xe.clear()}function qe(e){let t=N(e);t!==null&&Te(t)}function Je(e){if(e.repeat){M.dispatch(e),qe(e);return}Ve(e.code),M.dispatch(e),qe(e)}function Ye(e){He(e.code)}function Xe(e){Ee({phase:`start`,text:e.data??``})}function Ze(e){Ee({phase:`update`,text:e.data??``})}function Qe(e){Ee({phase:`end`,text:e.data??``})}function $e(){A.clear(),j.clear(),xe.clear()}var et=.5,tt=new Set;function nt(e,t){return`Gamepad${e}Button${t}`}function rt(e,t,n){return`Gamepad${e}Axis${t}${n>0?`+`:`-`}`}function it(e,t,n){Ne(e,n.map(e=>nt(t,e)))}function at(e,t,n,r){Ne(e,[rt(t,n,r)])}function ot(e=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){tt.clear();for(let t of e)if(t){for(let e=0;e<t.buttons.length;e++)t.buttons[e].pressed&&tt.add(nt(t.index,e));for(let e=0;e<t.axes.length;e++){let n=t.axes[e];n>=et?tt.add(rt(t.index,e,1)):n<=-.5&&tt.add(rt(t.index,e,-1))}}for(let e of tt)Ve(e);for(let e of A)!tt.has(e)&&e.startsWith(`Gamepad`)&&He(e)}function st(e,t,n=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){(n[e]?.vibrationActuator)?.playEffect(`dual-rumble`,{duration:t.duration,weakMagnitude:t.weakMagnitude??1,strongMagnitude:t.strongMagnitude??1})}function ct(e){return`Touch:${e}`}function lt(e,t=e){Ne(e,[ct(t)])}function ut(e){Ve(ct(e))}function dt(e){He(ct(e))}var ft={up:`up`,down:`down`,left:`left`,right:`right`,upLeft:`upLeft`,upRight:`upRight`,downLeft:`downLeft`,downRight:`downRight`},pt=[`right`,`downRight`,`down`,`downLeft`,`left`,`upLeft`,`up`,`upRight`];function mt(e,t={}){let n={...ft,...t.actions},r=t.minDistance??24;for(let e of[...pt,`tap`]){let t=n[e];t&<(t,`swipe:${e}`)}let i=!1,a=-1,o=0,s=0;function c(e){ut(`swipe:${e}`),dt(`swipe:${e}`)}function l(e){i=!0,a=e.pointerId,o=e.clientX,s=e.clientY}function u(e){if(!i||e.pointerId!==a)return;i=!1;let t=e.clientX-o,l=e.clientY-s;if(Math.hypot(t,l)<r){n.tap&&c(`tap`);return}let u=pt[(Math.round(Math.atan2(l,t)/(Math.PI/4))%8+8)%8];n[u]&&c(u)}return e.addEventListener(`pointerdown`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u),()=>{e.removeEventListener(`pointerdown`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)}}function ht(e=window){Ae||(Ae=!0,e.addEventListener(`keydown`,Je),e.addEventListener(`keyup`,Ye),e.addEventListener(`compositionstart`,Xe),e.addEventListener(`compositionupdate`,Ze),e.addEventListener(`compositionend`,Qe),window.addEventListener(`blur`,$e),e.addEventListener(`wheel`,ke,{passive:!1}))}function gt(e=window){Ae&&(Ae=!1,e.removeEventListener(`keydown`,Je),e.removeEventListener(`keyup`,Ye),e.removeEventListener(`compositionstart`,Xe),e.removeEventListener(`compositionupdate`,Ze),e.removeEventListener(`compositionend`,Qe),e.removeEventListener(`wheel`,ke),window.removeEventListener(`blur`,$e),$e())}var _t=class{constructor(e,t={}){if(!e)throw Error(`a player needs a non-empty id`);this.id=e,this.padIndex=t.padIndex}scoped(e){return`${this.id}:${e}`}bind(e,t){Me(this.scoped(e),t)}bindButton(e,t){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad button to`);it(this.scoped(e),this.padIndex,t)}bindAxis(e,t,n){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad axis to`);at(this.scoped(e),this.padIndex,t,n)}bindTouch(e,t=e){lt(this.scoped(e),`${this.id}:${t}`)}pressTouch(e){ut(`${this.id}:${e}`)}releaseTouch(e){dt(`${this.id}:${e}`)}isDown(e){return Ue(this.scoped(e))}justPressed(e){return We(this.scoped(e))}justReleased(e){return Ge(this.scoped(e))}keysFor(e){return Ie(this.scoped(e))}};function vt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=new TextEncoder().encode(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return bt(i)}function yt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=xt(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return new TextDecoder(`utf-8`,{fatal:!0}).decode(i)}function bt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function xt(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var St=10485760;function Ct(e,t={}){let n=t.maxBytes??St,r=typeof e==`string`?new TextEncoder().encode(e).length:e.length;if(r>n)throw Error(`inbound data exceeds the ${n}-byte limit (${r} bytes)`)}function wt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n!==9&&n!==10&&n!==13&&(n<=31||n===127))throw Error(`inbound data contains a control character (0x${n.toString(16).padStart(2,`0`)}) at index ${t}`)}}function Tt(e,t={}){return Ct(e,t),wt(e),e}var Et=new Set([`__proto__`,`constructor`,`prototype`]);function Dt(e,t=`$`){if(Array.isArray(e)){e.forEach((e,n)=>Dt(e,`${t}[${n}]`));return}if(typeof e==`object`&&e)for(let n of Object.keys(e)){if(Et.has(n))throw Error(`${t} contains a forbidden key "${n}"`);Dt(e[n],`${t}.${n}`)}}function Ot(e,t,n=`$`){if(e===void 0){if(t.optional)return;throw Error(`${n} is required`)}switch(t.type){case`string`:if(typeof e!=`string`)throw Error(`${n} must be a string`);return;case`number`:if(typeof e!=`number`||!Number.isFinite(e))throw Error(`${n} must be a finite number`);if(t.min!==void 0&&e<t.min)throw Error(`${n} must be >= ${t.min}`);if(t.max!==void 0&&e>t.max)throw Error(`${n} must be <= ${t.max}`);return;case`boolean`:if(typeof e!=`boolean`)throw Error(`${n} must be a boolean`);return;case`array`:if(!Array.isArray(e))throw Error(`${n} must be an array`);if(t.maxLength!==void 0&&e.length>t.maxLength)throw Error(`${n} exceeds its maximum length of ${t.maxLength}`);e.forEach((e,r)=>Ot(e,t.items,`${n}[${r}]`));return;case`object`:if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${n} must be an object`);for(let t of Object.keys(e))if(Et.has(t))throw Error(`${n} contains a forbidden key "${t}"`);for(let[r,i]of Object.entries(t.fields))Ot(e[r],i,`${n}.${r}`);return}}var kt=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 At(){return typeof localStorage>`u`?new kt:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var jt=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??At()}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;try{let e=JSON.parse(t),n=e.state;for(let t=e.meta.version;t<this.version;t++)n=(this.migrations[t]??(e=>e))(n);return{meta:{...e.meta,version:this.version},state:n}}catch{return null}}importExternal(e,t,n,r){Ct(t);let i=n(t);for(let e=0;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{version:this.version,savedAt:Date.now(),preview:r},state:i};this.storage.write(this.key(e),JSON.stringify(a))}delete(e){this.storage.remove(this.key(e))}exportSlot(e,t){let n=this.storage.read(this.key(e));return n===null?null:t?vt(n,t):n}importSlot(e,t,n){Ct(t);let r=Tt(n?yt(t,n):t),i;try{i=JSON.parse(r)}catch{throw Error(`SaveSystem.importSlot: payload is not valid save data (not parseable JSON)`)}let a=i.state;for(let e=i.meta.version;e<this.version;e++)a=(this.migrations[e]??(e=>e))(a);let o={meta:{...i.meta,version:this.version},state:a};this.storage.write(this.key(e),JSON.stringify(o))}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}},Mt=class{constructor(e,t={}){this._state=structuredClone(e),this.version=t.version??1,this.migrations=t.migrations??{},this.extensions=t.extensions??new Nt}get state(){return structuredClone(this._state)}set(e){this._state=structuredClone(e)}update(e){let t=e(this.state);return this.set(t),this.state}snapshot(){let e=this.extensions.snapshot();return{version:this.version,state:this.state,extensions:e.extensions,extensionVersions:e.versions}}restore(e,t={}){if(!Number.isSafeInteger(e.version)||e.version<1)throw Error(`canonical state snapshot version must be a positive integer`);if(e.version>this.version)throw Error(`canonical state snapshot version ${e.version} is newer than ${this.version}`);let n=this.snapshot();try{let n=structuredClone(e.state);for(let t=e.version;t<this.version;t++){let e=this.migrations[t+1];if(!e)throw Error(`missing canonical state migration to version ${t+1}`);n=e(n)}return this._state=structuredClone(n),this.extensions.restore({extensions:e.extensions,versions:e.extensionVersions},t)}catch(e){throw this._state=structuredClone(n.state),this.extensions.restore({extensions:n.extensions,versions:n.extensionVersions},{missing:`keep`}),e}}transaction(e){let t=this.snapshot();try{return e(this)}catch(e){throw this.restore(t),e}}},Nt=class{constructor(){this.extensions=new Map}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid state extension id: ${e.id}`);if(this.extensions.has(e.id))throw Error(`state extension already registered: ${e.id}`);return this.extensions.set(e.id,{id:e.id,capture:()=>e.capture(),restore:t=>e.restore(t),version:e.version??1,migrations:e.migrations,reset:e.reset,remove:e.remove}),()=>this.extensions.delete(e.id)}snapshot(){let e={};for(let[t,n]of this.extensions)e[t]=structuredClone(n.capture());let t={};for(let[e,n]of this.extensions)t[e]=n.version??1;return{extensions:e,versions:t}}restore(e,t={}){let n=this.snapshot(),r=[];try{for(let[n,i]of this.extensions){if(!(n in e.extensions)){t.missing===`reset`?(i.reset&&i.reset(),r.push({extension:n,from:0,to:i.version??1,status:`reset`})):t.missing===`remove`&&(i.remove&&i.remove(),r.push({extension:n,from:0,to:i.version??1,status:`removed`}));continue}let a=e.versions?.[n]??1,o=i.version??1,s=structuredClone(e.extensions[n]);for(let e=a;e<o;e++){let t=i.migrations?.[e+1];if(!t)throw Error(`missing state migration for ${n} to version ${e+1}`);s=t(s)}i.restore(structuredClone(s)),r.push({extension:n,from:a,to:o,status:a===o?`unchanged`:`migrated`})}}catch(e){for(let[e,t]of this.extensions)e in n.extensions&&t.restore(structuredClone(n.extensions[e]));throw e}for(let e of r)t.onDiagnostic?.(e);return r}transaction(e){let t=this.snapshot();try{return e()}catch(e){throw this.restore(t),e}}},Pt=class{constructor(e,t){if(!e.endpoint)throw Error(`${t} endpoint is required`);if(this.endpoint=e.endpoint,this.timeoutMs=e.timeoutMs??1e4,!(this.timeoutMs>0))throw Error(`${t} timeout must be positive`);if(this.fetchFn=e.fetch??globalThis.fetch,!this.fetchFn)throw Error(`fetch is unavailable; provide ${t}Options.fetch`)}async withTimeout(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this.timeoutMs);try{return await e(t.signal)}finally{clearTimeout(n)}}},Ft=class extends Pt{constructor(e){super(e,`save sync`)}async upload(e,t){if(!e)throw Error(`save sync slot name is required`);if(!t)throw Error(`save sync payload cannot be empty`);return this.withTimeout(async n=>{let r=await this.fetchFn(this.slotUrl(e),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({payload:t}),signal:n});if(!r.ok)throw Error(`save upload failed with HTTP ${r.status}`);return{ok:!0,status:r.status}})}async download(e){if(!e)throw Error(`save sync slot name is required`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.slotUrl(e),{signal:t});if(!n.ok)throw Error(`save download failed with HTTP ${n.status}`);let r=await n.json();if(typeof r.payload!=`string`)throw Error(`save download response missing a string payload`);return r.payload})}async list(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`save slot list failed with HTTP ${t.status}`);let n=await t.json();if(!Array.isArray(n.slots)||!n.slots.every(e=>typeof e==`string`))throw Error(`save slot list response missing a string array of slots`);return n.slots})}slotUrl(e){let t=this.endpoint.includes(`?`)?`&`:`?`;return`${this.endpoint}${t}slot=${encodeURIComponent(e)}`}},It=1,Lt=class{constructor(e){if(this.onWelcome=new p,this.onTick=new p,this.onReject=new p,this.onDesync=new p,this.onClose=new p,this.socket=null,this._id=null,!e.url)throw Error(`lockstep client url is required`);this.url=e.url,this.createSocket=e.create??(e=>new WebSocket(e)),this.validateInput=e.validateInput}get id(){return this._id}get connected(){return this.socket!==null&&this.socket.readyState===It}connect(){if(this.socket)throw Error(`lockstep client is already connected`);let e=this.createSocket(this.url);e.onmessage=e=>this.handleMessage(e.data),e.onclose=()=>{this.socket=null,this._id=null,this.onClose.dispatch()},this.socket=e}submitInput(e,t){if(!this.connected)return;let n=this.validateInput?.(e);if(n===!1||typeof n==`string`){this.onReject.dispatch({reason:n===!1?`input rejected by client validation`:n});return}this.socket?.send(JSON.stringify({type:`input`,payload:e,...t===void 0?{}:{checksum:t}}))}close(){this.socket?.close()}handleMessage(e){let t=JSON.parse(e);if(t.type===`welcome`&&t.id!==void 0)this._id=t.id,this.onWelcome.dispatch({id:t.id,...t.seed===void 0?{}:{seed:t.seed},...t.initialState===void 0?{}:{initialState:t.initialState}});else if(t.type===`tick`&&t.tick!==void 0&&t.inputs!==void 0){let e={tick:t.tick,inputs:t.inputs,...t.checksums===void 0?{}:{checksums:t.checksums}};if(this.onTick.dispatch(e),t.checksums){let e=Object.values(t.checksums);e.some(t=>t!==e[0])&&this.onDesync.dispatch({tick:t.tick,checksums:t.checksums})}}else t.type===`rejected`&&this.onReject.dispatch({reason:t.reason??`input rejected by server`})}},Rt=class{constructor(e,t){this.storage=e,this.key=t}read(e){let t=this.storage.read(this.key);return t?JSON.parse(t):e}write(e){this.storage.write(this.key,JSON.stringify(e))}remove(){this.storage.remove(this.key)}},zt=class{constructor(e){this.store=new Rt(e.storage??At(),`mwg-runs:${e.namespace}`),this.limit=e.limit}readAll(){return this.store.read([])}record(e){let t=this.readAll(),n={id:`${Date.now()}-${t.length}`,endedAt:Date.now(),summary:e};return t.push(n),this.limit!==void 0&&t.length>this.limit&&t.splice(0,t.length-this.limit),this.store.write(t),n}all(){return this.readAll()}ranked(e,t=`desc`){let n=this.readAll(),r=t===`desc`?-1:1;return n.sort((t,n)=>r*(e(t.summary)-e(n.summary)))}clear(){this.store.remove()}},Bt=class{constructor(e){this.store=new Rt(e.storage??At(),`mwg-stats:${e.namespace}`),this.initial=e.initial,this.combine=e.combine}get(){return this.store.read(this.initial)}record(e){let t=this.combine(this.get(),e);return this.store.write(t),t}reset(){this.store.remove()}},Vt=class extends Pt{constructor(e){super(e,`telemetry`),this.consented=!1}get hasConsent(){return this.consented}setConsent(e){this.consented=e}async send(e){if(!e.name)throw Error(`telemetry event needs a name`);return this.consented?this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`telemetry request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}}):null}},Ht=class extends Pt{constructor(e){super(e,`news`)}async fetchItems(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`news request failed with HTTP ${t.status}`);let n=JSON.parse(Tt(await t.text()));if(!Array.isArray(n))throw Error(`news response was not an array`);return n.map((e,t)=>Ut(e,t))})}};function Ut(e,t){if(typeof e!=`object`||!e)throw Error(`news item ${t} was not an object`);let n=e;if(typeof n.id!=`string`||!n.id)throw Error(`news item ${t} is missing a string id`);if(typeof n.title!=`string`)throw Error(`news item ${t} is missing a string title`);if(typeof n.body!=`string`)throw Error(`news item ${t} is missing a string body`);return{id:n.id,title:n.title,body:n.body,publishedAt:typeof n.publishedAt==`number`?n.publishedAt:void 0}}var Wt=class{constructor(e){this.store=new Rt(e.storage??At(),`mwg-news-seen:${e.namespace}`)}readSeen(){return new Set(this.store.read([]))}isSeen(e){return this.readSeen().has(e)}markSeen(e){let t=this.readSeen();t.add(e),this.store.write([...t])}unseen(e){let t=this.readSeen();return e.filter(e=>!t.has(e.id))}},Gt=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??At()}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))}},Kt=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)}},qt=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 Jt(e){return JSON.stringify(e)}function Yt(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 Xt=class e{constructor(){this.entries=[],this.nextSequence=0}append(e,t=[]){let n={sequence:this.nextSequence++,action:e,events:structuredClone([...t])};return this.entries.push(n),structuredClone(n)}get size(){return this.entries.length}get all(){return structuredClone(this.entries)}mark(){return this.nextSequence}since(e){return structuredClone(this.entries.filter(t=>t.sequence>=e))}truncate(e){this.entries=this.entries.filter(t=>t.sequence<e),this.nextSequence=e}toJSON(){return this.all}replace(t){let n=e.fromJSON(t);this.entries=n.entries,this.nextSequence=n.nextSequence}static fromJSON(t){let n=new e,r=0;for(let e of t){if(!Number.isSafeInteger(e.sequence)||e.sequence!==r)throw Error(`action journal sequences must be contiguous from zero`);n.entries.push(structuredClone({sequence:e.sequence,action:e.action,events:[...e.events]})),r++}return n.nextSequence=r,n}};function Zt(e){if(e.criteria)return e.criteria;if(e.counter===void 0||e.target===void 0)throw Error(`achievement "${e.id}" needs either counter/target or criteria`);return[{counter:e.counter,target:e.target}]}var Qt=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 t of this.definitions.values()){let i=Zt(t);i.some(t=>t.counter===e)&&(i.every(t=>t.counter===e?n>=t.target:this.count(t.counter)>=t.target)||i.every(e=>this.count(e.counter)>=e.target)&&(r.push(t.id),this.fresh.push(t.id)))}return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Zt(t).every(e=>this.count(e.counter)>=e.target)}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);let n=Zt(t);if(n.length!==1)throw Error(`achievement "${e}" has several criteria - use subProgress`);return{count:this.count(n[0].counter),target:n[0].target}}subProgress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Zt(t).map(e=>{let t=this.count(e.counter);return{counter:e.counter,count:t,target:e.target,met:t>=e.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}},$t=class e{constructor(e=[]){this.active=new Set,this.spent=new Set,this.rules=[...e]}add(e){this.rules.push(e)}remove(e){this.rules=this.rules.filter(t=>t.id!==e),this.active.delete(e)}check(e){let t=[];for(let n of this.rules){if(n.once&&this.spent.has(n.id))continue;let r=n.when(e);r&&!this.active.has(n.id)&&(n.action(e),t.push(n.id),n.once&&this.spent.add(n.id)),r?this.active.add(n.id):this.active.delete(n.id)}return t}isActive(e){return this.active.has(e)}reset(){this.active.clear(),this.spent.clear()}toJSON(){return{active:[...this.active],spent:[...this.spent]}}static fromJSON(t,n){let r=new e(t);for(let e of n.active)r.active.add(e);for(let e of n.spent)r.spent.add(e);return r}},en=class{constructor(e={}){let t=e.storage??At(),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))}},tn=class extends Pt{constructor(e){super(e,`feedback`)}async submit(e){if(!e.message?.trim())throw Error(`feedback message cannot be empty`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`feedback request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}})}},nn=class{constructor(e){this.schedule=[],this.cursor=0,this.elapsed=0,this.startedWaves=new Set,this.completed=!1,this.onSpawn=e.onSpawn,this.onWaveStart=e.onWaveStart,this.onComplete=e.onComplete,e.waves.forEach((e,t)=>{let n=e.entries.reduce((e,t)=>e+t.count,0),r=e.duration??0,i=0;for(let a of e.entries)for(let o=0;o<a.count;o++,i++){let o=n>1&&r>0?i/(n-1)*r:0;this.schedule.push({time:e.delay+o,kind:a.kind,waveIndex:t})}}),this.schedule.sort((e,t)=>e.time-t.time),this.schedule.length===0&&(this.completed=!0,this.onComplete?.())}update(e){if(!this.completed){for(this.elapsed+=e;this.cursor<this.schedule.length&&this.schedule[this.cursor].time<=this.elapsed;){let e=this.schedule[this.cursor];this.startedWaves.has(e.waveIndex)||(this.startedWaves.add(e.waveIndex),this.onWaveStart?.(e.waveIndex)),this.onSpawn(e.kind),this.cursor++}this.cursor>=this.schedule.length&&(this.completed=!0,this.onComplete?.())}}get isComplete(){return this.completed}};function rn(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function an(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var on=[{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 sn(e,t){let n=rn(e,t);return on.map(e=>an({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function cn(e,t){let n=rn(e.x,e.y),r=rn(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 ln(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 un(e,t){let n=cn(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=rn(e.x,e.y),i=rn(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(an(ln({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 dn(e,t){let n=rn(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(an({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function fn(e,t,n,r,i={}){let a=+((i.offset??`odd`)===`odd`);return(i.orientation??`flat-top`)===`pointy-top`?{x:e*n+((t&1)===a?n/2:0)+n/2,y:t*r*.75+r/2}:{x:e*n*.75+n/2,y:t*r+((e&1)===a?r/2:0)+r/2}}function pn(e,t,n,r,i={}){let a=(i.orientation??`flat-top`)===`pointy-top`,o=a?n:n*.75,s=a?r*.75:r,c=Math.round((e-n/2)/o),l=Math.round((t-r/2)/s),u={x:c,y:l},d=1/0;for(let a=-2;a<=2;a++)for(let o=-2;o<=2;o++){let s={x:c+a,y:l+o},f=fn(s.x,s.y,n,r,i),p=(f.x-e)**2+(f.y-t)**2;p<d&&(d=p,u=s)}return u}var mn=.12,hn=null,gn,_n=new p;function vn(){if(gn===void 0&&(gn=typeof matchMedia==`function`?matchMedia(`(prefers-reduced-motion: reduce)`):null,gn)){let e=()=>{_n.dispatch(bn())};typeof gn.addEventListener==`function`?gn.addEventListener(`change`,e):typeof gn.addListener==`function`&&gn.addListener(e)}return gn}function yn(){return vn()?.matches??!1}function bn(){return hn??yn()}function xn(e){hn=e,_n.dispatch(bn())}function Sn(e){return vn(),_n.add(e),()=>_n.remove(e)}function Cn(e,t=`decorative`){return bn()?t===`meaningful`?Math.min(e,mn):0:e}var wn=[[0,-1],[1,0],[0,1],[-1,0]],Tn=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}index(e,t){return e<0||t<0||e>=this.width||t>=this.height?-1:t*this.width+e}volumeAt(e,t){let n=this.index(e,t);return n<0?0:this.volume[n]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){let r=this.index(e,t);r>=0&&(this.volume[r]+=n)}clear(e,t){let n=this.index(e,t);n>=0&&(this.volume[n]=0)}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 wn){let a=i+t,o=n+r,c=this.index(a,o);c>=0&&e(a,o)&&s.push(c)}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}}let i=[];for(let e=0;e<r.length;e++){let t=r[e]*n,a=t<.001?0:t;a===0&&this.volume[e]>0&&i.push({x:e%this.width,y:Math.floor(e/this.width)}),this.volume[e]=a}return i}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}},En={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2},Dn=class{constructor(){this.tweens=[]}tween(e,t,n=En.linear){let{ease:r=En.linear,intent:i=`decorative`,alternate:a}=typeof n==`function`?{ease:n}:n,o=bn()&&a!==void 0,s=o?a:t,c=Cn(e,o?`meaningful`:i);return c>0?new Promise(e=>{this.tweens.push({elapsed:0,duration:c,ease:r,apply:s,resolve:e,finishOnReduced:!o&&i===`decorative`})}):(s(1),Promise.resolve())}update(e){if(this.tweens.length!==0)for(let t of[...this.tweens]){if(t.finishOnReduced&&bn()){this.tweens.splice(this.tweens.indexOf(t),1),t.apply(1),t.resolve();continue}t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.apply(t.ease(n)),n>=1&&(this.tweens.splice(this.tweens.indexOf(t),1),t.resolve())}}get isBusy(){return this.tweens.length>0}clear(){this.tweens=[]}},On=class{constructor(e={}){this.history=[],this.cursor=-1,this.limit=Math.max(1,e.limit??50)}push(e){this.history.length=this.cursor+1,this.history.push(e),this.history.length>this.limit&&this.history.shift(),this.cursor=this.history.length-1}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.history.length-1}undo(){return this.canUndo?(this.cursor--,this.history[this.cursor]):null}redo(){return this.canRedo?(this.cursor++,this.history[this.cursor]):null}get current(){return this.cursor>=0?this.history[this.cursor]:null}clear(){this.history=[],this.cursor=-1}};function kn(e,t){if(!Number.isFinite(t.maxCost)||t.maxCost<0)return new Map;let n=t.key(e),r=new Map([[n,{cell:e,cost:0}]]),i=[{cell:e,key:n,cost:0}];for(;i.length>0;){let e=jn(i),n=r.get(e.key);if(n&&e.cost===n.cost&&!t.stop?.(e.cell,e.cost))for(let n of t.neighbors(e.cell)){let a=t.cost(e.cell,n);if(!Number.isFinite(a)||a<0)continue;let o=e.cost+a;if(o>t.maxCost||t.canEnter&&!t.canEnter(n,e.cell,o))continue;let s=t.key(n);if(o>=(r.get(s)?.cost??1/0))continue;let c={cell:n,key:s,cost:o};r.set(s,c),An(i,c)}}return r}function An(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=Math.floor((n-1)/2);if(e[t].cost<=e[n].cost)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function jn(e){let t=e[0],n=e.pop();if(!t||!n||e.length===0)return t;e[0]=n;let r=0;for(;;){let t=r*2+1,n=t+1,i=r;if(t<e.length&&e[t].cost<e[i].cost&&(i=t),n<e.length&&e[n].cost<e[i].cost&&(i=n),i===r)break;[e[r],e[i]]=[e[i],e[r]],r=i}return t}var Mn=class{constructor(){this.changed=new p,this.tasks=[],this.progress=new Map,this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1}add(e){if(!e.id)throw Error(`load task needs an id`);if(this.tasks.some(t=>t.id===e.id))throw Error(`duplicate load task "${e.id}"`);if(e.weight!==void 0&&!(e.weight>0))throw Error(`load task weight must be positive`);if(this.status_===`loading`)throw Error(`cannot add a task while loading`);return this.tasks.push(e),this.progress.set(e.id,0),this.emit(),this}get snapshot(){let e=this.tasks.reduce((e,t)=>e+(t.weight??1),0),t=this.tasks.reduce((e,t)=>e+(t.weight??1)*(this.progress.get(t.id)??0),0);return{status:this.status_,completed:t,total:e,current:this.current_,error:this.error_}}async start(){if(this.status_===`loading`)throw Error(`load queue is already running`);this.status_=`loading`,this.cancelled=!1,this.error_=null,this.emit();try{for(let e of this.tasks){if(this.cancelled)break;this.current_=e.id,this.emit();let t=this;await e.run({get cancelled(){return t.cancelled},report:t=>this.report(e.id,t)}),this.cancelled||this.report(e.id,1)}this.current_=null,this.status_=this.cancelled?`cancelled`:`ready`,this.emit()}catch(e){throw this.current_=null,this.error_=e,this.status_=`failed`,this.emit(),e}}cancel(){this.status_===`loading`&&(this.cancelled=!0)}retry(){if(this.status_===`loading`)throw Error(`cannot retry while loading`);this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1;for(let e of this.tasks)this.progress.set(e.id,0);this.emit()}report(e,t){if(!Number.isFinite(t))throw Error(`load progress must be finite`);this.progress.set(e,Math.max(0,Math.min(1,t))),this.emit()}emit(){this.changed.dispatch(this.snapshot)}},Nn=class{constructor(){this.entities=new Map,this.ids=new Map,this.sequence=0}add(e,t){let n=this.ids.get(e);if(n!==void 0){if(t!==void 0&&t!==n)throw Error(`entity already has id ${n}`);return n}let r=t;if(r!==void 0){if(r.length===0)throw Error(`entity id must not be empty`);if(this.entities.has(r))throw Error(`entity id already exists: ${r}`)}else do r=`e${this.sequence++}`;while(this.entities.has(r));return this.entities.set(r,e),this.ids.set(e,r),r}get(e){return this.entities.get(e)}idOf(e){return this.ids.get(e)}has(e){return this.entities.has(e)}remove(e){let t=this.entities.get(e);return t!==void 0&&(this.entities.delete(e),this.ids.delete(t),!0)}get size(){return this.entities.size}},Pn=class{constructor(e){this.queue=[],this.busy=!1,this.remaining=0,this.play=e.play}enqueue(e){this.queue.push(...e),this.busy||this.advance()}update(e){this.busy&&(this.remaining-=e,this.remaining<=0&&this.advance())}get isBusy(){return this.busy}clear(){this.queue=[],this.busy=!1,this.remaining=0}advance(){let e=this.queue.shift();if(e===void 0){this.busy=!1,this.remaining=0;return}this.busy=!0;let t=this.play(e)||0;t>0?this.remaining=t:this.advance()}},Fn=2166136261,In=16777619;function Ln(e,t=!1){if(e==null)return`null`;switch(typeof e){case`boolean`:return e?`true`:`false`;case`number`:return Number.isFinite(e)?String(e):`null`;case`string`:return JSON.stringify(e);case`bigint`:return JSON.stringify(e.toString());case`function`:case`symbol`:return t?`null`:`undefined`}return Array.isArray(e)?`[${e.map(e=>Ln(e,!0)).join(`,`)}]`:`{${Object.entries(e).filter(([,e])=>e!==void 0&&typeof e!=`function`&&typeof e!=`symbol`).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>`${JSON.stringify(e)}:${Ln(t)}`).join(`,`)}}`}function Rn(e){let t=Ln(e),n=Fn;for(let e=0;e<t.length;e++)n^=t.charCodeAt(e),n=Math.imul(n,In)>>>0;return n>>>0}var zn=class{constructor(){this.reference=new Map,this.desyncTick=null}observe(e,t){let n=this.reference.get(e);return n===void 0?(this.reference.set(e,t),!0):n===t||(this.desyncTick===null&&(this.desyncTick=e),!1)}get divergent(){return this.desyncTick!==null}get atTick(){return this.desyncTick}reset(){this.reference.clear(),this.desyncTick=null}};function Bn(e,t={}){let n=Un(e);if(n.length===0)return[];let[r,...i]=n,a=t.listDelimiter??`;`,o=t.mapDelimiter??`=`;return i.map((e,n)=>{let i={};return r.forEach((r,s)=>{let c=e[s]??``;c!==``&&(i[r]=Vn(c,t.columns?.[r]??`string`,r,n,a,o))}),i})}function Vn(e,t,n,r,i,a){return Hn(e,t,{column:n,rowIndex:r,listDelimiter:i,mapDelimiter:a,error:()=>t===`number`?`CSV row ${r+1}, column "${n}": "${e}" is not a number`:t===`boolean`?`CSV row ${r+1}, column "${n}": "${e}" is not "true" or "false"`:t===`map`?`CSV row ${r+1}, column "${n}": "${e.split(i).map(e=>e.trim()).find(e=>e&&!e.includes(a))??e}" has no "${a}" to split a key from its value`:`CSV row ${r+1}, column "${n}": "${e}" is invalid`})}function Hn(e,t,n={}){let r=n.column??`value`,i=n.listDelimiter??`;`,a=n.mapDelimiter??`=`,o=e=>{throw Error(n.error?.(e)??e)};switch(t){case`string`:return e;case`number`:{let t=Number(e);return Number.isFinite(t)||o(`${r} must be a number`),t}case`boolean`:{let t=e.toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1;if(n.acceptYesNo&&t===`yes`)return!0;if(n.acceptYesNo&&t===`no`)return!1;o(`${r} must be true, false${n.acceptYesNo?`, yes, or no`:``}`)}case`list`:return e.split(i).map(e=>e.trim()).filter(e=>e.length>0);case`map`:{let t={};for(let n of e.split(i).map(e=>e.trim()).filter(e=>e.length>0)){let e=n.indexOf(a);e===-1&&o(`${r} map entry must contain ${a}`),t[n.slice(0,e).trim()]=n.slice(e+a.length).trim()}return t}}}function Un(e){let t=[],n=[],r=``,i=!1,a=0;for(;a<e.length;){let o=e[a];if(i){if(o===`"`){if(e[a+1]===`"`){r+=`"`,a+=2;continue}i=!1,a++;continue}r+=o,a++;continue}if(o===`"`){i=!0,a++;continue}if(o===`,`){n.push(r),r=``,a++;continue}if(o===`\r`){a++;continue}if(o===`
|
|
2
2
|
`){n.push(r),t.push(n),n=[],r=``,a++;continue}r+=o,a++}return(r.length>0||n.length>0)&&(n.push(r),t.push(n)),t.filter(e=>e.length!==1||e[0]!==``)}function Wn(e,t,n){return e<t?t:e>n?n:e}var P,Gn,Kn,F,I=s((()=>{P=(e=>(e.Application=`application`,e.WebGLPipes=`webgl-pipes`,e.WebGLPipesAdaptor=`webgl-pipes-adaptor`,e.WebGLSystem=`webgl-system`,e.WebGPUPipes=`webgpu-pipes`,e.WebGPUPipesAdaptor=`webgpu-pipes-adaptor`,e.WebGPUSystem=`webgpu-system`,e.CanvasSystem=`canvas-system`,e.CanvasPipesAdaptor=`canvas-pipes-adaptor`,e.CanvasPipes=`canvas-pipes`,e.Asset=`asset`,e.LoadParser=`load-parser`,e.ResolveParser=`resolve-parser`,e.CacheParser=`cache-parser`,e.DetectionParser=`detection-parser`,e.MaskEffect=`mask-effect`,e.BlendMode=`blend-mode`,e.TextureSource=`texture-source`,e.TextureUploaderWebGL=`texture-uploader-webgl`,e.TextureUploaderWebGPU=`texture-uploader-webgpu`,e.Environment=`environment`,e.ShapeBuilder=`shape-builder`,e.Batcher=`batcher`,e))(P||{}),Gn=e=>{if(typeof e==`function`||typeof e==`object`&&e.extension){if(!e.extension)throw Error(`Extension class must have an extension object`);e={...typeof e.extension==`object`?e.extension:{type:e.extension},ref:e}}if(typeof e==`object`)e={...e};else throw Error(`Invalid extension type`);return typeof e.type==`string`&&(e.type=[e.type]),e},Kn=(e,t)=>Gn(e).priority??t,F={_addHandlers:{},_removeHandlers:{},_queue:{},remove(...e){return e.map(Gn).forEach(e=>{e.type.forEach(t=>this._removeHandlers[t]?.(e))}),this},add(...e){return e.map(Gn).forEach(e=>{e.type.forEach(t=>{let n=this._addHandlers,r=this._queue;n[t]?n[t]?.(e):(r[t]=r[t]||[],r[t]?.push(e))})}),this},handle(e,t,n){let r=this._addHandlers,i=this._removeHandlers;if(r[e]||i[e])throw Error(`Extension type ${e} already has a handler`);r[e]=t,i[e]=n;let a=this._queue;return a[e]&&(a[e]?.forEach(e=>t(e)),delete a[e]),this},handleByMap(e,t){return this.handle(e,e=>{e.name&&(t[e.name]=e.ref)},e=>{e.name&&delete t[e.name]})},handleByNamedList(e,t,n=-1){return this.handle(e,e=>{t.findIndex(t=>t.name===e.name)>=0||(t.push({name:e.name,value:e.ref}),t.sort((e,t)=>Kn(t.value,n)-Kn(e.value,n)))},e=>{let n=t.findIndex(t=>t.name===e.name);n!==-1&&t.splice(n,1)})},handleByList(e,t,n=-1){return this.handle(e,e=>{t.includes(e.ref)||(t.push(e.ref),t.sort((e,t)=>Kn(t,n)-Kn(e,n)))},e=>{let n=t.indexOf(e.ref);n!==-1&&t.splice(n,1)})},mixin(e,...t){for(let n of t)Object.defineProperties(e.prototype,Object.getOwnPropertyDescriptors(n))}}})),qn=c(((e,t)=>{var n=Object.prototype.hasOwnProperty,r=`~`;function i(){}Object.create&&(i.prototype=Object.create(null),new i().__proto__||(r=!1));function a(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,n,i,o){if(typeof n!=`function`)throw TypeError(`The listener must be a function`);var s=new a(n,i||e,o),c=r?r+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],s]:e._events[c].push(s):(e._events[c]=s,e._eventsCount++),e}function s(e,t){--e._eventsCount===0?e._events=new i:delete e._events[t]}function c(){this._events=new i,this._eventsCount=0}c.prototype.eventNames=function(){var e=[],t,i;if(this._eventsCount===0)return e;for(i in t=this._events)n.call(t,i)&&e.push(r?i.slice(1):i);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(t)):e},c.prototype.listeners=function(e){var t=r?r+e:e,n=this._events[t];if(!n)return[];if(n.fn)return[n.fn];for(var i=0,a=n.length,o=Array(a);i<a;i++)o[i]=n[i].fn;return o},c.prototype.listenerCount=function(e){var t=r?r+e:e,n=this._events[t];return n?n.fn?1:n.length:0},c.prototype.emit=function(e,t,n,i,a,o){var s=r?r+e:e;if(!this._events[s])return!1;var c=this._events[s],l=arguments.length,u,d;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),l){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,i),!0;case 5:return c.fn.call(c.context,t,n,i,a),!0;case 6:return c.fn.call(c.context,t,n,i,a,o),!0}for(d=1,u=Array(l-1);d<l;d++)u[d-1]=arguments[d];c.fn.apply(c.context,u)}else{var f=c.length,p;for(d=0;d<f;d++)switch(c[d].once&&this.removeListener(e,c[d].fn,void 0,!0),l){case 1:c[d].fn.call(c[d].context);break;case 2:c[d].fn.call(c[d].context,t);break;case 3:c[d].fn.call(c[d].context,t,n);break;case 4:c[d].fn.call(c[d].context,t,n,i);break;default:if(!u)for(p=1,u=Array(l-1);p<l;p++)u[p-1]=arguments[p];c[d].fn.apply(c[d].context,u)}}return!0},c.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},c.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},c.prototype.removeListener=function(e,t,n,i){var a=r?r+e:e;if(!this._events[a])return this;if(!t)return s(this,a),this;var o=this._events[a];if(o.fn)o.fn===t&&(!i||o.once)&&(!n||o.context===n)&&s(this,a);else{for(var c=0,l=[],u=o.length;c<u;c++)(o[c].fn!==t||i&&!o[c].once||n&&o[c].context!==n)&&l.push(o[c]);l.length?this._events[a]=l.length===1?l[0]:l:s(this,a)}return this},c.prototype.removeAllListeners=function(e){var t;return e?(t=r?r+e:e,this._events[t]&&s(this,t)):(this._events=new i,this._eventsCount=0),this},c.prototype.off=c.prototype.removeListener,c.prototype.addListener=c.prototype.on,c.prefixed=r,c.EventEmitter=c,t!==void 0&&(t.exports=c)})),Jn,Yn,Xn=s((()=>{Jn=d(qn(),1),Yn=Jn.default})),Zn,Qn,$n,er,tr,nr,rr,ir,ar,or,sr,cr,lr,ur,dr,fr,pr,mr,hr,gr,_r,vr,yr,br,xr,Sr,Cr,wr,Tr,Er=s((()=>{Zn={grad:.9,turn:360,rad:360/(2*Math.PI)},Qn=function(e){return typeof e==`string`?e.length>0:typeof e==`number`},$n=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=10**t),Math.round(n*e)/n+0},er=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=1),e>n?n:e>t?e:t},tr=function(e){return(e=isFinite(e)?e%360:0)>0?e:e+360},nr=function(e){return{r:er(e.r,0,255),g:er(e.g,0,255),b:er(e.b,0,255),a:er(e.a)}},rr=function(e){return{r:$n(e.r),g:$n(e.g),b:$n(e.b),a:$n(e.a,3)}},ir=/^#([0-9a-f]{3,8})$/i,ar=function(e){var t=e.toString(16);return t.length<2?`0`+t:t},or=function(e){var t=e.r,n=e.g,r=e.b,i=e.a,a=Math.max(t,n,r),o=a-Math.min(t,n,r),s=o?a===t?(n-r)/o:a===n?2+(r-t)/o:4+(t-n)/o:0;return{h:60*(s<0?s+6:s),s:a?o/a*100:0,v:a/255*100,a:i}},sr=function(e){var t=e.h,n=e.s,r=e.v,i=e.a;t=t/360*6,n/=100,r/=100;var a=Math.floor(t),o=r*(1-n),s=r*(1-(t-a)*n),c=r*(1-(1-t+a)*n),l=a%6;return{r:255*[r,s,o,o,c,r][l],g:255*[c,r,r,s,o,o][l],b:255*[o,o,c,r,r,s][l],a:i}},cr=function(e){return{h:tr(e.h),s:er(e.s,0,100),l:er(e.l,0,100),a:er(e.a)}},lr=function(e){return{h:$n(e.h),s:$n(e.s),l:$n(e.l),a:$n(e.a,3)}},ur=function(e){return sr((n=(t=e).s,{h:t.h,s:(n*=((r=t.l)<50?r:100-r)/100)>0?2*n/(r+n)*100:0,v:r+n,a:t.a}));var t,n,r},dr=function(e){return{h:(t=or(e)).h,s:(i=(200-(n=t.s))*(r=t.v)/100)>0&&i<200?n*r/100/(i<=100?i:200-i)*100:0,l:i/2,a:t.a};var t,n,r,i},fr=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,pr=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,mr=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,hr=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,gr={string:[[function(e){var t=ir.exec(e);return t?(e=t[1]).length<=4?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:e.length===4?$n(parseInt(e[3]+e[3],16)/255,2):1}:e.length===6||e.length===8?{r:parseInt(e.substr(0,2),16),g:parseInt(e.substr(2,2),16),b:parseInt(e.substr(4,2),16),a:e.length===8?$n(parseInt(e.substr(6,2),16)/255,2):1}:null:null},`hex`],[function(e){var t=mr.exec(e)||hr.exec(e);return t?t[2]!==t[4]||t[4]!==t[6]?null:nr({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:t[7]===void 0?1:Number(t[7])/(t[8]?100:1)}):null},`rgb`],[function(e){var t=fr.exec(e)||pr.exec(e);if(!t)return null;var n,r;return ur(cr({h:(n=t[1],r=t[2],r===void 0&&(r=`deg`),Number(n)*(Zn[r]||1)),s:Number(t[3]),l:Number(t[4]),a:t[5]===void 0?1:Number(t[5])/(t[6]?100:1)}))},`hsl`]],object:[[function(e){var t=e.r,n=e.g,r=e.b,i=e.a,a=i===void 0?1:i;return Qn(t)&&Qn(n)&&Qn(r)?nr({r:Number(t),g:Number(n),b:Number(r),a:Number(a)}):null},`rgb`],[function(e){var t=e.h,n=e.s,r=e.l,i=e.a,a=i===void 0?1:i;return!Qn(t)||!Qn(n)||!Qn(r)?null:ur(cr({h:Number(t),s:Number(n),l:Number(r),a:Number(a)}))},`hsl`],[function(e){var t=e.h,n=e.s,r=e.v,i=e.a,a=i===void 0?1:i;return!Qn(t)||!Qn(n)||!Qn(r)?null:sr(function(e){return{h:tr(e.h),s:er(e.s,0,100),v:er(e.v,0,100),a:er(e.a)}}({h:Number(t),s:Number(n),v:Number(r),a:Number(a)}))},`hsv`]]},_r=function(e,t){for(var n=0;n<t.length;n++){var r=t[n][0](e);if(r)return[r,t[n][1]]}return[null,void 0]},vr=function(e){return typeof e==`string`?_r(e.trim(),gr.string):typeof e==`object`&&e?_r(e,gr.object):[null,void 0]},yr=function(e,t){var n=dr(e);return{h:n.h,s:er(n.s+100*t,0,100),l:n.l,a:n.a}},br=function(e){return(299*e.r+587*e.g+114*e.b)/1e3/255},xr=function(e,t){var n=dr(e);return{h:n.h,s:n.s,l:er(n.l+100*t,0,100),a:n.a}},Sr=function(){function e(e){this.parsed=vr(e)[0],this.rgba=this.parsed||{r:0,g:0,b:0,a:1}}return e.prototype.isValid=function(){return this.parsed!==null},e.prototype.brightness=function(){return $n(br(this.rgba),2)},e.prototype.isDark=function(){return br(this.rgba)<.5},e.prototype.isLight=function(){return br(this.rgba)>=.5},e.prototype.toHex=function(){return e=rr(this.rgba),t=e.r,n=e.g,r=e.b,a=(i=e.a)<1?ar($n(255*i)):``,`#`+ar(t)+ar(n)+ar(r)+a;var e,t,n,r,i,a},e.prototype.toRgb=function(){return rr(this.rgba)},e.prototype.toRgbString=function(){return e=rr(this.rgba),t=e.r,n=e.g,r=e.b,(i=e.a)<1?`rgba(`+t+`, `+n+`, `+r+`, `+i+`)`:`rgb(`+t+`, `+n+`, `+r+`)`;var e,t,n,r,i},e.prototype.toHsl=function(){return lr(dr(this.rgba))},e.prototype.toHslString=function(){return e=lr(dr(this.rgba)),t=e.h,n=e.s,r=e.l,(i=e.a)<1?`hsla(`+t+`, `+n+`%, `+r+`%, `+i+`)`:`hsl(`+t+`, `+n+`%, `+r+`%)`;var e,t,n,r,i},e.prototype.toHsv=function(){return e=or(this.rgba),{h:$n(e.h),s:$n(e.s),v:$n(e.v),a:$n(e.a,3)};var e},e.prototype.invert=function(){return Cr({r:255-(e=this.rgba).r,g:255-e.g,b:255-e.b,a:e.a});var e},e.prototype.saturate=function(e){return e===void 0&&(e=.1),Cr(yr(this.rgba,e))},e.prototype.desaturate=function(e){return e===void 0&&(e=.1),Cr(yr(this.rgba,-e))},e.prototype.grayscale=function(){return Cr(yr(this.rgba,-1))},e.prototype.lighten=function(e){return e===void 0&&(e=.1),Cr(xr(this.rgba,e))},e.prototype.darken=function(e){return e===void 0&&(e=.1),Cr(xr(this.rgba,-e))},e.prototype.rotate=function(e){return e===void 0&&(e=15),this.hue(this.hue()+e)},e.prototype.alpha=function(e){return typeof e==`number`?Cr({r:(t=this.rgba).r,g:t.g,b:t.b,a:e}):$n(this.rgba.a,3);var t},e.prototype.hue=function(e){var t=dr(this.rgba);return typeof e==`number`?Cr({h:e,s:t.s,l:t.l,a:t.a}):$n(t.h)},e.prototype.isEqual=function(e){return this.toHex()===Cr(e).toHex()},e}(),Cr=function(e){return e instanceof Sr?e:new Sr(e)},wr=[],Tr=function(e){e.forEach(function(e){wr.indexOf(e)<0&&(e(Sr,gr),wr.push(e))})}}));function Dr(e,t){var n={white:`#ffffff`,bisque:`#ffe4c4`,blue:`#0000ff`,cadetblue:`#5f9ea0`,chartreuse:`#7fff00`,chocolate:`#d2691e`,coral:`#ff7f50`,antiquewhite:`#faebd7`,aqua:`#00ffff`,azure:`#f0ffff`,whitesmoke:`#f5f5f5`,papayawhip:`#ffefd5`,plum:`#dda0dd`,blanchedalmond:`#ffebcd`,black:`#000000`,gold:`#ffd700`,goldenrod:`#daa520`,gainsboro:`#dcdcdc`,cornsilk:`#fff8dc`,cornflowerblue:`#6495ed`,burlywood:`#deb887`,aquamarine:`#7fffd4`,beige:`#f5f5dc`,crimson:`#dc143c`,cyan:`#00ffff`,darkblue:`#00008b`,darkcyan:`#008b8b`,darkgoldenrod:`#b8860b`,darkkhaki:`#bdb76b`,darkgray:`#a9a9a9`,darkgreen:`#006400`,darkgrey:`#a9a9a9`,peachpuff:`#ffdab9`,darkmagenta:`#8b008b`,darkred:`#8b0000`,darkorchid:`#9932cc`,darkorange:`#ff8c00`,darkslateblue:`#483d8b`,gray:`#808080`,darkslategray:`#2f4f4f`,darkslategrey:`#2f4f4f`,deeppink:`#ff1493`,deepskyblue:`#00bfff`,wheat:`#f5deb3`,firebrick:`#b22222`,floralwhite:`#fffaf0`,ghostwhite:`#f8f8ff`,darkviolet:`#9400d3`,magenta:`#ff00ff`,green:`#008000`,dodgerblue:`#1e90ff`,grey:`#808080`,honeydew:`#f0fff0`,hotpink:`#ff69b4`,blueviolet:`#8a2be2`,forestgreen:`#228b22`,lawngreen:`#7cfc00`,indianred:`#cd5c5c`,indigo:`#4b0082`,fuchsia:`#ff00ff`,brown:`#a52a2a`,maroon:`#800000`,mediumblue:`#0000cd`,lightcoral:`#f08080`,darkturquoise:`#00ced1`,lightcyan:`#e0ffff`,ivory:`#fffff0`,lightyellow:`#ffffe0`,lightsalmon:`#ffa07a`,lightseagreen:`#20b2aa`,linen:`#faf0e6`,mediumaquamarine:`#66cdaa`,lemonchiffon:`#fffacd`,lime:`#00ff00`,khaki:`#f0e68c`,mediumseagreen:`#3cb371`,limegreen:`#32cd32`,mediumspringgreen:`#00fa9a`,lightskyblue:`#87cefa`,lightblue:`#add8e6`,midnightblue:`#191970`,lightpink:`#ffb6c1`,mistyrose:`#ffe4e1`,moccasin:`#ffe4b5`,mintcream:`#f5fffa`,lightslategray:`#778899`,lightslategrey:`#778899`,navajowhite:`#ffdead`,navy:`#000080`,mediumvioletred:`#c71585`,powderblue:`#b0e0e6`,palegoldenrod:`#eee8aa`,oldlace:`#fdf5e6`,paleturquoise:`#afeeee`,mediumturquoise:`#48d1cc`,mediumorchid:`#ba55d3`,rebeccapurple:`#663399`,lightsteelblue:`#b0c4de`,mediumslateblue:`#7b68ee`,thistle:`#d8bfd8`,tan:`#d2b48c`,orchid:`#da70d6`,mediumpurple:`#9370db`,purple:`#800080`,pink:`#ffc0cb`,skyblue:`#87ceeb`,springgreen:`#00ff7f`,palegreen:`#98fb98`,red:`#ff0000`,yellow:`#ffff00`,slateblue:`#6a5acd`,lavenderblush:`#fff0f5`,peru:`#cd853f`,palevioletred:`#db7093`,violet:`#ee82ee`,teal:`#008080`,slategray:`#708090`,slategrey:`#708090`,aliceblue:`#f0f8ff`,darkseagreen:`#8fbc8f`,darkolivegreen:`#556b2f`,greenyellow:`#adff2f`,seagreen:`#2e8b57`,seashell:`#fff5ee`,tomato:`#ff6347`,silver:`#c0c0c0`,sienna:`#a0522d`,lavender:`#e6e6fa`,lightgreen:`#90ee90`,orange:`#ffa500`,orangered:`#ff4500`,steelblue:`#4682b4`,royalblue:`#4169e1`,turquoise:`#40e0d0`,yellowgreen:`#9acd32`,salmon:`#fa8072`,saddlebrown:`#8b4513`,sandybrown:`#f4a460`,rosybrown:`#bc8f8f`,darksalmon:`#e9967a`,lightgoldenrodyellow:`#fafad2`,snow:`#fffafa`,lightgrey:`#d3d3d3`,lightgray:`#d3d3d3`,dimgray:`#696969`,dimgrey:`#696969`,olivedrab:`#6b8e23`,olive:`#808000`},r={};for(var i in n)r[n[i]]=i;var a={};e.prototype.toName=function(t){if(!(this.rgba.a||this.rgba.r||this.rgba.g||this.rgba.b))return`transparent`;var i,o,s=r[this.toHex()];if(s)return s;if(t?.closest){var c=this.toRgb(),l=1/0,u=`black`;if(!a.length)for(var d in n)a[d]=new e(n[d]).toRgb();for(var f in n){var p=(i=c,o=a[f],(i.r-o.r)**2+(i.g-o.g)**2+(i.b-o.b)**2);p<l&&(l=p,u=f)}return u}},t.string.push([function(t){var r=t.toLowerCase(),i=r===`transparent`?`#0000`:n[r];return i?new e(i).toRgb():null},`name`])}var Or=s((()=>{})),kr,L,Ar=s((()=>{Er(),Or(),Tr([Dr]),kr=class e{constructor(e=16777215){this._value=null,this._components=new Float32Array(4),this._components.fill(1),this._int=16777215,this.value=e}get red(){return this._components[0]}get green(){return this._components[1]}get blue(){return this._components[2]}get alpha(){return this._components[3]}setValue(e){return this.value=e,this}set value(t){if(t instanceof e)this._value=this._cloneSource(t._value),this._int=t._int,this._components.set(t._components);else if(t===null)throw Error(`Cannot set Color#value to null`);else(this._value===null||!this._isSourceEqual(this._value,t))&&(this._value=this._cloneSource(t),this._normalize(this._value))}get value(){return this._value}_cloneSource(e){return typeof e==`string`||typeof e==`number`||e instanceof Number||e===null?e:Array.isArray(e)||ArrayBuffer.isView(e)?e.slice(0):typeof e==`object`&&e?{...e}:e}_isSourceEqual(e,t){let n=typeof e;if(n!==typeof t)return!1;if(n===`number`||n===`string`||e instanceof Number)return e===t;if(Array.isArray(e)&&Array.isArray(t)||ArrayBuffer.isView(e)&&ArrayBuffer.isView(t))return e.length===t.length&&e.every((e,n)=>e===t[n]);if(e!==null&&t!==null){let n=Object.keys(e),r=Object.keys(t);return n.length===r.length&&n.every(n=>e[n]===t[n])}return e===t}toRgba(){let[e,t,n,r]=this._components;return{r:e,g:t,b:n,a:r}}toRgb(){let[e,t,n]=this._components;return{r:e,g:t,b:n}}toRgbaString(){let[e,t,n]=this.toUint8RgbArray();return`rgba(${e},${t},${n},${this.alpha})`}toUint8RgbArray(e){let[t,n,r]=this._components;return this._arrayRgb||=[],e||=this._arrayRgb,e[0]=Math.round(t*255),e[1]=Math.round(n*255),e[2]=Math.round(r*255),e}toArray(e){this._arrayRgba||=[],e||=this._arrayRgba;let[t,n,r,i]=this._components;return e[0]=t,e[1]=n,e[2]=r,e[3]=i,e}toRgbArray(e){this._arrayRgb||=[],e||=this._arrayRgb;let[t,n,r]=this._components;return e[0]=t,e[1]=n,e[2]=r,e}toNumber(){return this._int}toBgrNumber(){let[e,t,n]=this.toUint8RgbArray();return(n<<16)+(t<<8)+e}toLittleEndianNumber(){let e=this._int;return(e>>16)+(e&65280)+((e&255)<<16)}multiply(t){let[n,r,i,a]=e._temp.setValue(t)._components;return this._components[0]*=n,this._components[1]*=r,this._components[2]*=i,this._components[3]*=a,this._refreshInt(),this._value=null,this}premultiply(e,t=!0){return t&&(this._components[0]*=e,this._components[1]*=e,this._components[2]*=e),this._components[3]=e,this._refreshInt(),this._value=null,this}toPremultiplied(e,t=!0){if(e===1)return(255<<24)+this._int;if(e===0)return t?0:this._int;let n=this._int>>16&255,r=this._int>>8&255,i=this._int&255;return t&&(n=n*e+.5|0,r=r*e+.5|0,i=i*e+.5|0),(e*255<<24)+(n<<16)+(r<<8)+i}toHex(){let e=this._int.toString(16);return`#${`000000`.substring(0,6-e.length)+e}`}toHexa(){let e=Math.round(this._components[3]*255).toString(16);return this.toHex()+`00`.substring(0,2-e.length)+e}setAlpha(e){return this._components[3]=this._clamp(e),this._value=null,this}_normalize(t){let n,r,i,a;if((typeof t==`number`||t instanceof Number)&&t>=0&&t<=16777215){let e=t;n=(e>>16&255)/255,r=(e>>8&255)/255,i=(e&255)/255,a=1}else if((Array.isArray(t)||t instanceof Float32Array)&&t.length>=3&&t.length<=4)t=this._clamp(t),[n,r,i,a=1]=t;else if((t instanceof Uint8Array||t instanceof Uint8ClampedArray)&&t.length>=3&&t.length<=4)t=this._clamp(t,0,255),[n,r,i,a=255]=t,n/=255,r/=255,i/=255,a/=255;else if(typeof t==`string`||typeof t==`object`){if(typeof t==`string`){let n=e.HEX_PATTERN.exec(t);n&&(t=`#${n[2]}`)}let o=Cr(t);o.isValid()&&({r:n,g:r,b:i,a}=o.rgba,n/=255,r/=255,i/=255)}if(n!==void 0)this._components[0]=n,this._components[1]=r,this._components[2]=i,this._components[3]=a,this._refreshInt();else throw Error(`Unable to convert color ${t}`)}_refreshInt(){this._clamp(this._components);let[e,t,n]=this._components;this._int=(e*255<<16)+(t*255<<8)+(n*255|0)}_clamp(e,t=0,n=1){return typeof e==`number`?Math.min(Math.max(e,t),n):(e.forEach((r,i)=>{e[i]=Math.min(Math.max(r,t),n)}),e)}static isColorLike(t){return typeof t==`number`||typeof t==`string`||t instanceof Number||t instanceof e||Array.isArray(t)||t instanceof Uint8Array||t instanceof Uint8ClampedArray||t instanceof Float32Array||t.r!==void 0&&t.g!==void 0&&t.b!==void 0||t.r!==void 0&&t.g!==void 0&&t.b!==void 0&&t.a!==void 0||t.h!==void 0&&t.s!==void 0&&t.l!==void 0||t.h!==void 0&&t.s!==void 0&&t.l!==void 0&&t.a!==void 0||t.h!==void 0&&t.s!==void 0&&t.v!==void 0||t.h!==void 0&&t.s!==void 0&&t.v!==void 0&&t.a!==void 0}},kr.shared=new kr,kr._temp=new kr,kr.HEX_PATTERN=/^(#|0x)?(([a-f0-9]{3}){1,2}([a-f0-9]{2})?)$/i,L=kr})),jr,Mr=s((()=>{jr={cullArea:null,cullable:!1,cullableChildren:!0}})),Nr,Pr,Fr,Ir=s((()=>{Nr=Math.PI*2,Pr=180/Math.PI,Fr=Math.PI/180})),Lr,Rr,zr=s((()=>{Lr=class e{constructor(e=0,t=0){this.x=0,this.y=0,this.x=e,this.y=t}clone(){return new e(this.x,this.y)}copyFrom(e){return this.set(e.x,e.y),this}copyTo(e){return e.set(this.x,this.y),e}equals(e){return e.x===this.x&&e.y===this.y}set(e=0,t=e){return this.x=e,this.y=t,this}toString(){return`[pixi.js/math:Point x=${this.x} y=${this.y}]`}static get shared(){return Rr.x=0,Rr.y=0,Rr}},Rr=new Lr})),R,Br,Vr,z=s((()=>{Ir(),zr(),R=class e{constructor(e=1,t=0,n=0,r=1,i=0,a=0){this.array=null,this.a=e,this.b=t,this.c=n,this.d=r,this.tx=i,this.ty=a}fromArray(e){this.a=e[0],this.b=e[1],this.c=e[3],this.d=e[4],this.tx=e[2],this.ty=e[5]}set(e,t,n,r,i,a){return this.a=e,this.b=t,this.c=n,this.d=r,this.tx=i,this.ty=a,this}toArray(e,t){this.array||=new Float32Array(9);let n=t||this.array;return e?(n[0]=this.a,n[1]=this.b,n[2]=0,n[3]=this.c,n[4]=this.d,n[5]=0,n[6]=this.tx,n[7]=this.ty,n[8]=1):(n[0]=this.a,n[1]=this.c,n[2]=this.tx,n[3]=this.b,n[4]=this.d,n[5]=this.ty,n[6]=0,n[7]=0,n[8]=1),n}apply(e,t){t||=new Lr;let n=e.x,r=e.y;return t.x=this.a*n+this.c*r+this.tx,t.y=this.b*n+this.d*r+this.ty,t}applyInverse(e,t){t||=new Lr;let n=this.a,r=this.b,i=this.c,a=this.d,o=this.tx,s=this.ty,c=1/(n*a+i*-r),l=e.x,u=e.y;return t.x=a*c*l+-i*c*u+(s*i-o*a)*c,t.y=n*c*u+-r*c*l+(-s*n+o*r)*c,t}translate(e,t){return this.tx+=e,this.ty+=t,this}scale(e,t){return this.a*=e,this.d*=t,this.c*=e,this.b*=t,this.tx*=e,this.ty*=t,this}rotate(e){let t=Math.cos(e),n=Math.sin(e),r=this.a,i=this.c,a=this.tx;return this.a=r*t-this.b*n,this.b=r*n+this.b*t,this.c=i*t-this.d*n,this.d=i*n+this.d*t,this.tx=a*t-this.ty*n,this.ty=a*n+this.ty*t,this}append(e){let t=this.a,n=this.b,r=this.c,i=this.d;return this.a=e.a*t+e.b*r,this.b=e.a*n+e.b*i,this.c=e.c*t+e.d*r,this.d=e.c*n+e.d*i,this.tx=e.tx*t+e.ty*r+this.tx,this.ty=e.tx*n+e.ty*i+this.ty,this}appendFrom(e,t){let n=e.a,r=e.b,i=e.c,a=e.d,o=e.tx,s=e.ty,c=t.a,l=t.b,u=t.c,d=t.d;return this.a=n*c+r*u,this.b=n*l+r*d,this.c=i*c+a*u,this.d=i*l+a*d,this.tx=o*c+s*u+t.tx,this.ty=o*l+s*d+t.ty,this}setTransform(e,t,n,r,i,a,o,s,c){return this.a=Math.cos(o+c)*i,this.b=Math.sin(o+c)*i,this.c=-Math.sin(o-s)*a,this.d=Math.cos(o-s)*a,this.tx=e-(n*this.a+r*this.c),this.ty=t-(n*this.b+r*this.d),this}prepend(e){let t=this.tx;if(e.a!==1||e.b!==0||e.c!==0||e.d!==1){let t=this.a,n=this.c;this.a=t*e.a+this.b*e.c,this.b=t*e.b+this.b*e.d,this.c=n*e.a+this.d*e.c,this.d=n*e.b+this.d*e.d}return this.tx=t*e.a+this.ty*e.c+e.tx,this.ty=t*e.b+this.ty*e.d+e.ty,this}decompose(e){let t=this.a,n=this.b,r=this.c,i=this.d,a=e.pivot,o=-Math.atan2(-r,i),s=Math.atan2(n,t),c=Math.abs(o+s);return c<1e-5||Math.abs(Nr-c)<1e-5?(e.rotation=s,e.skew.x=e.skew.y=0):(e.rotation=0,e.skew.x=o,e.skew.y=s),e.scale.x=Math.sqrt(t*t+n*n),e.scale.y=Math.sqrt(r*r+i*i),e.position.x=this.tx+(a.x*t+a.y*r),e.position.y=this.ty+(a.x*n+a.y*i),e}invert(){let e=this.a,t=this.b,n=this.c,r=this.d,i=this.tx,a=e*r-t*n;return this.a=r/a,this.b=-t/a,this.c=-n/a,this.d=e/a,this.tx=(n*this.ty-r*i)/a,this.ty=-(e*this.ty-t*i)/a,this}isIdentity(){return this.a===1&&this.b===0&&this.c===0&&this.d===1&&this.tx===0&&this.ty===0}identity(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this}clone(){let t=new e;return t.a=this.a,t.b=this.b,t.c=this.c,t.d=this.d,t.tx=this.tx,t.ty=this.ty,t}copyTo(e){return e.a=this.a,e.b=this.b,e.c=this.c,e.d=this.d,e.tx=this.tx,e.ty=this.ty,e}copyFrom(e){return this.a=e.a,this.b=e.b,this.c=e.c,this.d=e.d,this.tx=e.tx,this.ty=e.ty,this}equals(e){return e.a===this.a&&e.b===this.b&&e.c===this.c&&e.d===this.d&&e.tx===this.tx&&e.ty===this.ty}toString(){return`[pixi.js:Matrix a=${this.a} b=${this.b} c=${this.c} d=${this.d} tx=${this.tx} ty=${this.ty}]`}static get IDENTITY(){return Vr.identity()}static get shared(){return Br.identity()}},Br=new R,Vr=new R})),Hr,Ur=s((()=>{Hr=class e{constructor(e,t,n){this._x=t||0,this._y=n||0,this._observer=e}clone(t){return new e(t??this._observer,this._x,this._y)}set(e=0,t=e){return(this._x!==e||this._y!==t)&&(this._x=e,this._y=t,this._observer._onUpdate(this)),this}copyFrom(e){return(this._x!==e.x||this._y!==e.y)&&(this._x=e.x,this._y=e.y,this._observer._onUpdate(this)),this}copyTo(e){return e.set(this._x,this._y),e}equals(e){return e.x===this._x&&e.y===this._y}toString(){return`[pixi.js/math:ObservablePoint x=${this._x} y=${this._y} scope=${this._observer}]`}get x(){return this._x}set x(e){this._x!==e&&(this._x=e,this._observer._onUpdate(this))}get y(){return this._y}set y(e){this._y!==e&&(this._y=e,this._observer._onUpdate(this))}}}));function Wr(e=`default`){return Gr[e]===void 0&&(Gr[e]=-1),++Gr[e]}var Gr,Kr=s((()=>{Gr={default:-1}})),qr,B,Jr,Yr,V,Xr=s((()=>{qr=new Set,B=`8.0.0`,Jr=`8.3.4`,Yr={quiet:!1,noColor:!1},V=((e,t,n=3)=>{if(Yr.quiet||qr.has(t))return;let r=Error().stack,i=`${t}
|
|
3
3
|
Deprecated since v${e}`,a=typeof console.groupCollapsed==`function`&&!Yr.noColor;r===void 0?console.warn(`PixiJS Deprecation Warning: `,i):(r=r.split(`
|
|
4
4
|
`).splice(n).join(`
|
|
@@ -1328,20 +1328,20 @@ fn mainFragment(
|
|
|
1328
1328
|
`,end:`
|
|
1329
1329
|
let addedAlpha = finalColor.a + vColorAdd.a;
|
|
1330
1330
|
finalColor = vec4<f32>(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
1331
|
-
`}},Tk=class extends Su{constructor(e){super({glProgram:mp({name:`color-transform-batch`,bits:[_p,Ck,Cp(e),Mp]}),gpuProgram:pp({name:`color-transform-batch`,bits:[gp,wk,xp(e),jp]}),resources:{batchSamplers:Xm(e)}}),this.maxTextures=e}},Ek=7,Dk=class extends ed{constructor(){let e=new qu({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Q.VERTEX|Q.COPY_DST,shrinkToFit:!1}),t=new qu({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Q.INDEX|Q.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})}},Ok=0,kk=e=>e.colorAdd??Ok;function Ak(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 jk=class e extends Wm{static{this.extension={type:[P.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new Dk,this.name=e.extension.name,this.vertexSize=Ek,this.shader=new Tk(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=kk(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=kk(e),y=i<<16|e.roundPixels&65535;Ak(t,n,r,a,o,s,c,l,u,m,g,f.x0,f.y0,_,y,v),r+=Ek,Ak(t,n,r,a,o,s,c,l,u,p,g,f.x1,f.y1,_,y,v),r+=Ek,Ak(t,n,r,a,o,s,c,l,u,p,h,f.x2,f.y2,_,y,v),r+=Ek,Ak(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 Tk(e))}destroy(){this.shader.destroy(),super.destroy()}},Mk=`mwg-tinted-sprite`;function Nk(e){e.renderPipeId=Mk}var Pk=class{static{this.extension={type:[P.WebGLPipes,P.WebGPUPipes,P.CanvasPipes],name:Mk}}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 Fk;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}},Fk=class{constructor(){this.batcherName=jk.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()}},Ik=!1;function Lk(){Ik||(Ik=!0,F.add(jk),F.add(Pk))}function Rk(e,t,n,r=0){return(Bk(r)<<24|Bk(n)<<16|Bk(t)<<8|Bk(e))>>>0}function zk(e,t){return Rk((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function Bk(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var Vk=Ok;Lk();var Hk=class extends $s{constructor(e){super(e),this._colorAdd=0,Nk(this)}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=Rk(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=zk(e,t)}silhouette(e){this.tint=0,this.colorAdd=zk(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}};function Uk(e){return[e>>16&255,e>>8&255,e&255]}function Wk(e){let[t,n,r]=Uk(e);return Math.floor((t+n+r)/3)}function Gk(e,t,n){return Math.trunc(n*e+(1-n)*t)}function Kk(e,t,n){let[r,i,a]=Uk(e),[o,s,c]=Uk(t);return Gk(r,o,n)<<16|Gk(i,s,n)<<8|Gk(a,c,n)}function qk(e,t){let n=e.length>0?Wk(e[0]):255;return{from:e,to:e.map(e=>{let r=Wk(e);return n!==0&&r<=n?Kk(t.mid,t.min,r/n):Kk(t.mid,t.max,(255-r)/(255-n))})}}function Jk(e,t,n=`exact`){let r=t.from.map(Uk),i=new Uint8ClampedArray(e.length);for(let a=0;a<e.length;a+=4){let o=e[a+3],s=e[a],c=e[a+1],l=e[a+2];if(i[a]=s,i[a+1]=c,i[a+2]=l,i[a+3]=o,o===0||r.length===0)continue;if(n===`exact`){let e=r.findIndex(([e,t,n])=>e===s&&t===c&&n===l);if(e<0)continue;let[n,o,u]=Uk(t.to[e]??t.from[e]);i[a]=n,i[a+1]=o,i[a+2]=u;continue}let u=0,d=1/0;for(let e=0;e<r.length;e+=1){let[t,n,i]=r[e],a=s-t,o=c-n,f=l-i,p=a*a+o*o+f*f;p<d&&(d=p,u=e)}let[f,p,m]=Uk(t.to[u]??t.from[u]);i[a]=f,i[a+1]=p,i[a+2]=m}return i}function Yk(e,t,n){let r=e.width,i=e.height;if(r<=0||i<=0||!e.source)return e;let a=!t.createCanvas,o=t.createCanvas?.(r,i)??(typeof document>`u`?null:document.createElement(`canvas`));if(!o)return e;o.width=r,o.height=i;let s=o.getContext(`2d`);if(!s)return e;let c=a?{drawImage:s.drawImage.bind(s),getImageData:s.getImageData.bind(s),putImageData:(e,t,n)=>s.putImageData(new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),t,n)}:s;return s.drawImage(e.source.resource,0,0),n(c,r,i),K.from(o)}function Xk(e,t,n={},r=`exact`){return Yk(e,n,(e,n,i)=>{let a=Jk(e.getImageData(0,0,n,i).data,t,r);e.putImageData({data:a,width:n,height:i},0,0)})}function Zk(e){e=e.replace(/^"|"$/g,``);let t=[],n=0,r=0;for(let i=0;i<e.length;i+=1)e[i]===`(`?r+=1:e[i]===`)`?r=Math.max(0,r-1):e[i]===`~`&&r===0&&(t.push(e.slice(n,i)),n=i+1);t.push(e.slice(n));let i=(t.shift()??``).trim(),a=[];for(let e of t){let t=/^([A-Za-z][A-Za-z0-9_-]*)(?:\((.*)\))?$/.exec(e.trim());t&&a.push({name:t[1].toUpperCase(),args:t[2]===void 0?[]:t[2].split(`,`).map(e=>e.trim())})}return{path:i,modifiers:a}}function Qk(e,t){return e.modifiers.find(e=>e.name===t.toUpperCase())}function $k(e){return e!==void 0&&/^(linear|smooth)$/i.test(e)?`linear`:`nearest`}function eA(e,t,n){return[1,0,0,0,e/255,0,1,0,0,t/255,0,0,1,0,n/255,0,0,0,1,0]}function tA(e){return[(e.red??100)/100,0,0,0,0,0,(e.green??100)/100,0,0,0,0,0,(e.blue??100)/100,0,0,0,0,0,1,0]}function nA(e,t){let n=1-t,r=(e>>16&255)/255,i=(e>>8&255)/255,a=(e&255)/255;return[n,0,0,0,r*t,0,n,0,0,i*t,0,0,n,0,a*t,0,0,0,1,0]}function rA(e){let t=[`R`,`G`,`B`,`A`].map((t,n)=>e[n]??t),n=e=>{switch(e){case`R`:return[1,0,0,0,0];case`G`:return[0,1,0,0,0];case`B`:return[0,0,1,0,0];case`A`:return[0,0,0,1,0];case`0`:return[0,0,0,0,0];case`1`:return[0,0,0,0,1]}};return t.flatMap(e=>n(e))}function iA(e,t){let n=new zD;n.matrix=t,e.filters=[n]}function aA(e){if(e===void 0)return;let t=e.trim(),n=t.endsWith(`%`),r=Number(n?t.slice(0,-1):t);if(Number.isFinite(r))return n||r>1?r/100:r}function oA(e){if(e===void 0)return;let t=Number.parseInt(e.replace(/^#/,``),16);return Number.isFinite(t)?t:void 0}function sA(e,t,n=1){let r=Qk(t,`FL`);r&&(r.args.length===0||r.args.some(e=>/horiz|horizontal|x/i.test(e)))&&(e.scale.x*=-1),r?.args.some(e=>/vert|vertical|y/i.test(e))&&(e.scale.y*=-1);let i=Qk(t,`SCALE`);if(i){let t=Number(i.args[0]),r=Number(i.args[1]??i.args[0]);Number.isFinite(t)&&t>0&&(e.width=t*n),Number.isFinite(r)&&r>0&&(e.height=r*n)}if(Qk(t,`GS`)){let t=new zD;t.greyscale(1,!1),e.filters=[...e.filters??[],t]}let a=Qk(t,`CS`);if(a){let t=a.args.slice(0,3).map(Number);if(t.length===3&&t.every(e=>Number.isFinite(e))){let n=new zD;n.matrix=eA(t[0],t[1],t[2]),e.filters=[...e.filters??[],n]}}let o=Qk(t,`R`),s=Qk(t,`G`),c=Qk(t,`B`);if(o||s||c){let t=o?Number(o.args[0]):void 0,n=s?Number(s.args[0]):void 0,r=c?Number(c.args[0]):void 0,i=new zD;i.matrix=tA({red:Number.isFinite(t)?t:void 0,green:Number.isFinite(n)?n:void 0,blue:Number.isFinite(r)?r:void 0}),e.filters=[...e.filters??[],i]}let l=Qk(t,`CHAN`);if(l&&l.args.length>0){let t=l.args.map(e=>e.trim().toUpperCase()),n=new zD;n.matrix=rA(t),e.filters=[...e.filters??[],n]}let u=Qk(t,`O`);if(u){let t=aA(u.args[0]);t!==void 0&&(e.alpha*=Math.min(1,Math.max(0,t)))}}function cA(e,t,n={},r=1){e.texture=pA(e.texture,t,n),sA(e,t,r)}function lA(e,t){let n=Qk(t,`CROP`);if(!n||n.args.length<4||!e.source)return e;let r=n.args.slice(0,4).map(Number);if(r.some(e=>!Number.isFinite(e))||r[2]<=0||r[3]<=0)return e;let i=Math.max(0,r[0]),a=Math.max(0,r[1]),o=Math.min(r[2],Math.max(0,e.width-i)),s=Math.min(r[3],Math.max(0,e.height-a));return o>0&&s>0?new K({source:e.source,frame:new W(i,a,o,s)}):e}function uA(e,t){let n=e.trim();return oA(n)??t?.(n)}function dA(e,t){let n=[],r=[];for(let i of e){let[e,a]=i.split(`>`);if(e===void 0||a===void 0)continue;let o=uA(e,t),s=uA(a,t);o!==void 0&&s!==void 0&&(n.push(o),r.push(s))}return{from:n,to:r}}function fA(e,t){let n=e.join(`,`),r=n.indexOf(`>`);if(r<0)return{from:[],to:[]};let i=e=>e.split(`,`).map(e=>uA(e,t)).filter(e=>e!==void 0);return{from:i(n.slice(0,r)),to:i(n.slice(r+1))}}function pA(e,t,n={}){let r=e,i=Qk(t,`RC`);if(i&&i.args.length>0){let e=dA(i.args,n.resolveColor);e.from.length>0&&(r=Xk(r,e,n,`exact`))}let a=Qk(t,`PAL`);if(a){let e=fA(a.args,n.resolveColor);e.from.length>0&&e.from.length===e.to.length&&(r=Xk(r,e,n,`exact`))}let o=Qk(t,`BLIT`);if(o&&o.args.length>0&&n.resolveTexture){let e=n.resolveTexture(o.args[0]);if(e){let t=Number(o.args[1]??0)||0,i=Number(o.args[2]??0)||0;r=Yk(r,n,n=>{n.drawImage(e.source.resource,t,i)})}}let s=Qk(t,`MASK`);if(s&&s.args.length>0&&n.resolveTexture){let e=n.resolveTexture(s.args[0]);if(e){let t=Number(s.args[1]??0)||0,i=Number(s.args[2]??0)||0;r=Yk(r,n,(r,a,o)=>{let s=r.getImageData(0,0,a,o),c=mA(e.width,e.height,n);if(!c)return;let l=c.getContext(`2d`);if(!l)return;l.drawImage(e.source.resource,0,0);let u=l.getImageData(0,0,e.width,e.height),d=hA(s.data,a,o,u.data,e.width,e.height,t,i);r.putImageData({data:d,width:a,height:o},0,0)})}}let c=Qk(t,`BLEND`);if(c){let e=uA(c.args[0]??``,n.resolveColor),t=aA(c.args[1]);e!==void 0&&t!==void 0&&(r=Yk(r,n,(n,r,i)=>{let a=gA(n.getImageData(0,0,r,i).data,e,t);n.putImageData({data:a,width:r,height:i},0,0)}))}let l=Qk(t,`ROTATE`);if(l){let e=Number(l.args[0]);if(Number.isFinite(e)&&e%360!=0){let t=r.width,i=r.height;if(t>0&&i>0&&r.source){let a=mA(t,i,n),o=a?.getContext(`2d`);if(a&&o){o.drawImage(r.source.resource,0,0);let a=_A(o.getImageData(0,0,t,i).data,t,i,e,$k(l.args[1])),s=mA(a.width,a.height,n),c=s?.getContext(`2d`);s&&c&&(c.putImageData({data:a.data,width:a.width,height:a.height},0,0),r=K.from(s))}}}}return r}function mA(e,t,n){let r=n.createCanvas?.(e,t)??(typeof document>`u`?null:document.createElement(`canvas`));return r?(r.width=e,r.height=t,r):null}function hA(e,t,n,r,i,a,o,s){let c=new Uint8ClampedArray(e.length);for(let l=0;l<n;l+=1)for(let n=0;n<t;n+=1){let u=(l*t+n)*4,d=n-o,f=l-s,p=d>=0&&d<i&&f>=0&&f<a?r[(f*i+d)*4+3]:0;c[u]=e[u],c[u+1]=e[u+1],c[u+2]=e[u+2],c[u+3]=Math.round(e[u+3]*p/255)}return c}function gA(e,t,n){let r=Math.min(1,Math.max(0,n)),i=t>>16&255,a=t>>8&255,o=t&255,s=new Uint8ClampedArray(e.length);for(let t=0;t<e.length;t+=4){let n=e[t+3];if(s[t+3]=n,n===0){s[t]=e[t],s[t+1]=e[t+1],s[t+2]=e[t+2];continue}s[t]=e[t]*(1-r)+i*r,s[t+1]=e[t+1]*(1-r)+a*r,s[t+2]=e[t+2]*(1-r)+o*r}return s}function _A(e,t,n,r,i=`nearest`){let a=r*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=t/2,l=n/2,u=0,d=0;for(let[e,t]of[[-c,-l],[c,-l],[c,l],[-c,l]])u=Math.max(u,Math.abs(e*o-t*s)),d=Math.max(d,Math.abs(e*s+t*o));let f=Math.max(1,Math.round(u*2)),p=Math.max(1,Math.round(d*2)),m=new Uint8ClampedArray(f*p*4),h=t/2-.5,g=n/2-.5,_=f/2-.5,v=p/2-.5,y=i===`linear`&&r%90!=0;for(let r=0;r<p;r+=1)for(let i=0;i<f;i+=1){let a=i-_,c=r-v,l=a*o+c*s+h,u=-a*s+c*o+g,d=(r*f+i)*4;if(!y){let r=Math.round(l),i=Math.round(u);if(r<0||r>=t||i<0||i>=n)continue;let a=(i*t+r)*4;m[d]=e[a],m[d+1]=e[a+1],m[d+2]=e[a+2],m[d+3]=e[a+3];continue}vA(e,t,n,l,u,m,d)}return{data:m,width:f,height:p}}function vA(e,t,n,r,i,a,o){if(r<-.5||i<-.5||r>t-.5||i>n-.5)return;let s=Math.floor(r),c=Math.floor(i),l=r-s,u=i-c,d=0,f=0,p=0,m=0;for(let r=0;r<=1;r+=1)for(let i=0;i<=1;i+=1){let a=(i===0?1-l:l)*(r===0?1-u:u);if(a===0)continue;let o=Wn(s+i,0,t-1),h=(Wn(c+r,0,n-1)*t+o)*4,g=e[h+3];d+=g*a,f+=e[h]*g*a,p+=e[h+1]*g*a,m+=e[h+2]*g*a}d<=0||(a[o]=f/d,a[o+1]=p/d,a[o+2]=m/d,a[o+3]=d)}var yA=class{constructor(e,{fps:t=10,loop:n=!0,startTime:r=0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);if(!(t>0))throw Error(`an animation needs a positive fps, got ${t}`);this.frameDuration=1/t,this.frames=e.map(e=>bA(e)?e:{texture:e}),this.times=this.frames.map(e=>e.duration??this.frameDuration),this.loop=n,this.startTime=r;let i=0,a=0;for(let e of this.frames)e.duration===void 0?i++:a+=e.duration;this.duration=i*this.frameDuration+a}frameAt(e){return this.frames[this.frameIndexAt(e)]}frameIndexAt(e){let t=e-this.startTime;if(t<=0)return 0;let n=this.duration;if(n<=0)return this.frames.length-1;let r=this.loop?t%n:Math.min(t,n);for(let e=0;e<this.times.length;e++){if(r<this.times[e])return e;r-=this.times[e]}return this.frames.length-1}};function bA(e){return e.texture!==void 0}var xA=class extends Hk{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.elapsed=0,this.finished=!1,this.offset={x:0,y:0},this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new yA(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}get frameOffset(){return this.offset}get elapsedTime(){return this.elapsed}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.elapsed=0,this.finished=!1,this.show(n.frameAt(0)),this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;!t||this.paused||this.finished||(this.elapsed+=e,this.show(t.frameAt(this.elapsed)),!t.loop&&this.elapsed>=t.startTime+t.duration&&(this.finished=!0,this.onFinish?.(this.currentName)))}show(e){this.texture=e.texture,this.offset.x=e.offsetX??0,this.offset.y=e.offsetY??0}},SA=``;function CA(e){SA=e.endsWith(`/`)||e===``?e:e+`/`}var wA;function TA(e){wA=e}function EA(){return wA||(typeof window>`u`?void 0:window.__MWG_ASSETS__)}function DA(){return EA()!==void 0}function OA(){return Object.keys(EA()??{})}function kA(e){let t=EA();return!t||e in t}function AA(e){let t=EA();if(!t)return SA+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 jA(e,t={}){let{onProgress:n,resolution:r,optional:i,onMissing:a}=typeof t==`function`?{onProgress:t,resolution:void 0,optional:void 0,onMissing:void 0}:t,o=new Set(i??[]),s=e.filter(e=>!FD.cache.has(e)),c=s.filter(e=>!o.has(e)),l=s.filter(e=>o.has(e)),u=e=>{let t=AA(e),n={alias:e,src:t};if(r!==void 0&&(n.data={resolution:r}),t.startsWith(`data:`)){let t=/\.([a-z0-9]+)$/i.exec(e)?.[1];t&&(n.format=t)}FD.add(n)};if(l.length===0&&c.length===0){n?.(1);return}for(let e of c)u(e);let d=c.length>0?FD.load(c,n):Promise.resolve(),f=l.map(async e=>{u(e);try{await FD.load(e)}catch(t){a?.(e,t)}});await Promise.all([d,...f]),l.length>0&&c.length===0&&n?.(1)}function MA(e,t){if(!FD.cache.has(e)){if(t!==void 0)return t;throw Error(`texture "${e}" has not been loaded - pass it to load() first`)}return FD.get(e)}function NA(e,t){if(!FD.cache.has(e)){if(t!==void 0)return t;throw Error(`asset "${e}" has not been loaded - pass it to load() first`)}return FD.get(e)}function PA(e){return FD.cache.has(e)}async function FA(e){let t=e.filter(e=>FD.cache.has(e));t.length!==0&&await FD.unload(t)}var IA=new Map;async function LA(e,t,n={}){let r=n.fetch??globalThis.fetch;if(!r)throw Error(`fetch is unavailable; provide LoadBinaryOptions.fetch`);let i=e.filter(e=>!IA.has(e));if(i.length===0){t?.(1);return}let a=0;await Promise.all(i.map(async e=>{let n=await r(AA(e));if(!n.ok)throw Error(`failed to load binary asset "${e}": ${n.status}`);IA.set(e,await n.arrayBuffer()),a++,t?.(a/i.length)}))}function RA(e){let t=IA.get(e);if(!t)throw Error(`binary asset "${e}" has not been loaded - pass it to loadBinary() first`);return t}function zA(e){return IA.has(e)}function BA(e){for(let t of e)IA.delete(t)}var VA=class{constructor(e={}){if(this.entries=new Map,this.clock=0,this.budgetBytes=e.budgetBytes??1/0,!(this.budgetBytes>=0))throw Error(`asset stream budget must not be negative`);this.loadAssets=e.load??jA,this.releaseAssets=e.release??FA}async preload(e,t){if(!e.id)throw Error(`asset bundle needs an id`);if(e.estimatedBytes!==void 0&&e.estimatedBytes<0)throw Error(`asset bundle size must not be negative`);let n=this.entries.get(e.id);if(n?.ready){n.lastUsed=++this.clock,t?.(1);return}let r=e.paths.filter(e=>!this.isRetained(e));r.length>0?await this.loadAssets([...r],t):t?.(1),this.entries.set(e.id,{...e,lastUsed:++this.clock,ready:!0}),await this.enforceBudget(e.id)}async preloadLikely(e,t){let n=[...e].sort((e,t)=>(t.priority??0)-(e.priority??0));for(let[e,r]of n.entries())await this.preload(r,t&&(r=>t((e+r)/n.length)));t?.(1)}use(e){let t=this.entries.get(e);return t?.ready?(t.lastUsed=++this.clock,!0):!1}isReady(e){return this.entries.get(e)?.ready??!1}async unload(e){let t=this.entries.get(e);if(!t)return;this.entries.delete(e);let n=t.paths.filter(e=>!this.isRetained(e));n.length>0&&await this.releaseAssets(n)}get estimatedBytes(){return[...this.entries.values()].reduce((e,t)=>e+(t.estimatedBytes??0),0)}async enforceBudget(e){for(;this.estimatedBytes>this.budgetBytes;){let t=[...this.entries.values()].filter(t=>t.id!==e).sort((e,t)=>e.lastUsed-t.lastUsed)[0];if(!t)return;await this.unload(t.id)}}isRetained(e){return[...this.entries.values()].some(t=>t.ready&&t.paths.includes(e))}};async function HA(e,t,n=fetch){let r=await n(e);if(!r.ok)throw Error(`fetchWithByteProgress: ${e} responded ${r.status}`);let i=r.headers.get(`content-length`),a=i!==null&&i!==``?Number(i):null;if(!r.body){let e=await r.blob();return t?.({loaded:e.size,total:a??e.size}),e}let o=r.body.getReader(),s=[],c=0;for(;;){let{done:e,value:n}=await o.read();if(e)break;s.push(n),c+=n.byteLength,t?.({loaded:c,total:a})}return new Blob(s)}var UA=l({AssetStream:()=>VA,fetchWithByteProgress:()=>HA,get:()=>NA,getBinary:()=>RA,has:()=>kA,isBinaryLoaded:()=>zA,isCompiled:()=>DA,isLoaded:()=>PA,load:()=>jA,loadBinary:()=>LA,paths:()=>OA,release:()=>FA,releaseBinary:()=>BA,resolve:()=>AA,setAssetMap:()=>TA,setBase:()=>CA,texture:()=>MA});function WA(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}var GA=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=t>0?Math.floor(e.width/t):0,this.rows=n>0?Math.floor(e.height/n):0}static grid(t,n=0,r=n){return new e(MA(t),n,r)}static fromTexture(t,n=0,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 K({source:this.texture.source,frame:new W(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}rect(e,t,n,r,i){if(r<=0||i<=0)throw Error(`a sprite sheet rect needs a positive width and height`);return this.frames.set(e,new K({source:this.texture.source,frame:new W(t,n,r,i)})),this}region(e){let t=this.get(e);return{texture:t,frame:WA(t.frame)}}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))}},KA=class{constructor(e={}){if(this.world=new J,this.x=0,this.y=0,this.viewWidth=0,this.viewHeight=0,this.screenX=0,this.screenY=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.step=0,this._angle=0,this.targetAngle=null,this.angleIntensity=0,e.grid!==void 0&&e.grid!==`square`&&e.grid!==`hex`)throw Error(`camera grid must be "square" or "hex", not "${e.grid}"`);this.stepsPerTurn=e.grid===`hex`?6:4,this.deadzone=e.deadzone??0,this.pixelPerfectTileSize=e.pixelPerfectTileSize,this._zoom=1,this.zoom=e.zoom??1}get rotationSteps(){return this.step}get rotation(){return this._angle}get uprightRotation(){return-this.rotation}setRotationStep(e){if(!Number.isInteger(e))throw Error(`camera rotation step must be an integer`);this.step=(e%this.stepsPerTurn+this.stepsPerTurn)%this.stepsPerTurn,this._angle=this.step/this.stepsPerTurn*Math.PI*2,this.targetAngle=null,this.apply()}rotate(e=1){this.setRotationStep(this.step+e)}rotateTo(e){this._angle=e,this.targetAngle=null,this.angleIntensity=0,this.apply()}animateRotationTo(e,t=4){this.targetAngle=e,this.angleIntensity=t}get spin(){let e=this.rotation;return{cos:Math.cos(e),sin:Math.sin(e)}}get zoom(){return this._zoom}set zoom(e){let t=Math.max(.01,e);this._zoom=this.pixelPerfectTileSize?JA(t,this.pixelPerfectTileSize):t}setViewport(e,t,n=0,r=0){this.viewWidth=e,this.viewHeight=t,this.screenX=n,this.screenY=r}get view(){let e=this.viewWidth/this._zoom,t=this.viewHeight/this._zoom,{x:n,y:r}=this.clampedCentre(this.x,this.y);if(this._angle===0)return{x:n-e/2,y:r-t/2,width:e,height:t};let i=[this.toWorld(this.screenX,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY+this.viewHeight),this.toWorld(this.screenX,this.screenY+this.viewHeight)],a=i.map(e=>e.x),o=i.map(e=>e.y),s=Math.min(...a),c=Math.min(...o);return{x:s,y:c,width:Math.max(...a)-s,height:Math.max(...o)-c}}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){bn()||(this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t)}shakeScreen(e,t=.4){this.shake(e/this._zoom,t)}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.viewWidth/this._zoom*this.deadzone/2,n=this.viewHeight/this._zoom*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=bn()?1:1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.targetAngle!==null&&this.angleIntensity>0){let t=qA(this._angle,this.targetAngle),n=bn()?1:1-Math.exp(-this.angleIntensity*e);this._angle+=t*n}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=D(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=D(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=e-n,s=t-r;return{x:(o*i-s*a)*this._zoom+this.screenX+this.viewWidth/2,y:(o*a+s*i)*this._zoom+this.screenY+this.viewHeight/2}}toWorld(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=(e-this.screenX-this.viewWidth/2)/this._zoom,s=(t-this.screenY-this.viewHeight/2)/this._zoom;return{x:n+o*i+s*a,y:r-o*a+s*i}}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:Wn(e,i+n,o-n),y:s-a<r*2?(a+s)/2:Wn(t,a+r,s-r)}}apply(){let{x:e,y:t}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY);if(this.world.scale.set(this._zoom),this._angle===0){this.world.rotation=0,this.world.pivot.set(0,0),this.world.x=Math.round(this.screenX+this.viewWidth/2-e*this._zoom),this.world.y=Math.round(this.screenY+this.viewHeight/2-t*this._zoom);return}this.world.rotation=this.rotation,this.world.pivot.set(e,t),this.world.x=Math.round(this.screenX+this.viewWidth/2),this.world.y=Math.round(this.screenY+this.viewHeight/2)}};function qA(e,t){let n=Math.PI*2,r=(t-e)%n;return r>Math.PI&&(r-=n),r<-Math.PI&&(r+=n),r}function JA(e,t){return Math.max(1,Math.round(e*t))/t}function YA(e={}){let t=new KA(e),n=xk.current;return t.setViewport(n.width,n.height),t}var XA=class{constructor(e){this.container=new J,this.clip=new ww,this.camera=new KA(e),this.container.addChild(this.camera.world),this.container.addChild(this.clip),this.container.mask=this.clip,this.resize(e.x,e.y,e.width,e.height)}resize(e,t,n,r){this.camera.setViewport(n,r,e,t),this.clip.clear().rect(e,t,n,r).fill(16777215)}update(e){this.camera.update(e)}};function ZA(e,t){if(e>=t){let n=Math.floor(e/2);return[{x:0,y:0,width:n,height:t},{x:n,y:0,width:e-n,height:t}]}let n=Math.floor(t/2);return[{x:0,y:0,width:e,height:n},{x:0,y:n,width:e,height:t-n}]}var QA={protanopia:[.567,.433,0,0,0,.558,.442,0,0,0,0,.242,.758,0,0,0,0,0,1,0],deuteranopia:[.625,.375,0,0,0,.7,.3,0,0,0,0,.3,.7,0,0,0,0,0,1,0],tritanopia:[.95,.05,0,0,0,0,.433,.567,0,0,0,.475,.525,0,0,0,0,0,1,0]};function $A(e){let t=new zD;return t.matrix=QA[e],t}function ej(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function tj(e,t,n,r=`square`){return r===`hex`?fn(e,t,n,n):{x:(e+.5)*n,y:(t+.5)*n}}var nj=class extends J{constructor(e){super(),this.drawn=new Set,this.marker=new ww,this.widthInCells=e.widthInCells,this.cellSize=e.cellSize??2,this.shape=e.shape??`square`,this.renderTexture=Ph.create({width:this.shape===`hex`?Math.ceil((e.widthInCells-1)*this.cellSize*.75+this.cellSize):e.widthInCells*this.cellSize,height:this.shape===`hex`?e.heightInCells*this.cellSize+this.cellSize/2:e.heightInCells*this.cellSize}),this.sprite=new $s(this.renderTexture),this.addChild(this.sprite),this.addChild(this.marker)}get exploredCount(){return this.drawn.size}sync(e,t){let n=ej(e,this.drawn);if(n.length===0)return;let r=new ww;for(let e of n){this.drawn.add(e);let n=e%this.widthInCells,i=Math.floor(e/this.widthInCells),a=tj(n,i,this.cellSize,this.shape);if(this.shape===`hex`){let e=this.cellSize/2,o=[];for(let t=0;t<6;t++){let n=Math.PI/3*t;o.push(a.x+Math.cos(n)*e,a.y+Math.sin(n)*e)}r.poly(o).fill({color:t(n,i)})}else r.rect(a.x-this.cellSize/2,a.y-this.cellSize/2,this.cellSize,this.cellSize).fill({color:t(n,i)})}xk.current.app.renderer.render({container:r,target:this.renderTexture,clear:!1}),r.destroy()}setMarker(e,t,n,r=16777215){this.setMarkers([{x:e,y:t,facing:n,color:r}])}setMarkers(e){this.marker.clear();for(let t of e){let e=t.color??16777215,n=tj(t.x,t.y,this.cellSize,this.shape);if(this.marker.circle(n.x,n.y,Math.max(1,this.cellSize)).fill({color:e}),t.facing!==void 0){let r=this.cellSize*2;this.marker.moveTo(n.x,n.y).lineTo(n.x+Math.cos(t.facing)*r,n.y+Math.sin(t.facing)*r).stroke({color:e,width:1})}}}reset(){this.drawn.clear(),xk.current.app.renderer.render({container:new J,target:this.renderTexture,clear:!0})}destroy(e){this.renderTexture.destroy(!0),super.destroy(e)}},rj=-1,ij=7237230,aj=10132122;function oj(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 sj(e){return e>>>20}function cj(e){return e&(1<<20)-1}var lj=class extends J{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 J,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new J;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 fn(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 pn(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=sj(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(cj(e))}buildSprite(e,t,n,r){let i=new Hk(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 ww;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(ij),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(aj)}}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}},uj=class extends J{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new Hk(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))}},dj=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,this.animation=r.animation;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)}get frame(){return this.animation?.frameAt(this.elapsed)}get frameOffset(){let e=this.frame;return{x:e?.offsetX??0,y:e?.offsetY??0}}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)}},fj=class{constructor(e,t,n={}){this.elapsed=0,this.sinceFlicker=0,this.expired=!1,this.current=[],this.from={...e},this.to={...t},this.segments=Math.max(0,Math.floor(n.segments??6)),this.jitter=n.jitter??12,this.flickerInterval=n.flickerInterval,this.random=n.random??Math.random,this.duration=n.duration,this.reroll()}get points(){return this.current}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.flickerInterval===void 0&&this.reroll()}update(e){return!this.expired&&(this.elapsed+=e,this.flickerInterval!==void 0&&(this.sinceFlicker+=e,this.sinceFlicker>=this.flickerInterval&&(this.sinceFlicker=0,this.reroll())),this.duration!==void 0&&this.elapsed>=this.duration&&(this.expired=!0,!0))}reroll(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t),r=n>0?-t/n:0,i=n>0?e/n:0,a=[{...this.from}],o=this.segments+1;for(let n=1;n<o;n+=1){let s=n/o,c=Math.sin(Math.PI*s),l=(this.random()*2-1)*this.jitter*c;a.push({x:this.from.x+e*s+r*l,y:this.from.y+t*s+i*l})}a.push({...this.to}),this.current=a}},pj=class{constructor(e,t={}){this.elapsed=0,this.expired=!1,this.child=e,this.offsetX=t.offsetX??0,this.offsetY=t.offsetY??0,this.duration=t.duration}get done(){return this.expired}follow(e,t){return this.child.x=e+this.offsetX,this.child.y=t+this.offsetY,this}update(e){return this.expired||this.duration===void 0?!1:(this.elapsed+=e,this.elapsed>=this.duration&&(this.expired=!0,!0))}},mj=`halo`,hj=class extends xA{constructor(e){super(),this.offsetX=e.offsetX??0,this.offsetY=e.offsetY??0,this.blendMode=e.blendMode??`add`,this.add(mj,e.frames,e.animation),this.play(mj)}follow(e,t){return this.position.set(e+this.offsetX,t+this.offsetY),this}};function gj(e){return typeof e==`number`?e:D(e[0],e[1])}function _j(e){if(typeof e==`number`)return e;let t=D(),n=n=>{let r=e[0]>>n&255,i=e[1]>>n&255;return Math.round(r+(i-r)*t)<<n};return n(16)|n(8)|n(0)}function vj(e){return typeof e==`function`?e:t=>e[0]+(e[1]-e[0])*t}var yj=class extends J{constructor(e={}){super(),this.pool=[],this.sprites=[],this.emitting=!1,this.poolCursor=0,this.debt=0;let t=Math.max(1,Math.floor(e.max??200));this.rate=e.rate??0,this.life=e.life??[.4,.9],this.speed=e.speed??[20,60],this.angleRange=e.angle??[0,Math.PI*2],this.gravityX=e.gravity?.x??0,this.gravityY=e.gravity?.y??0,this.scaleOf=vj(e.scale??[1,1]),this.alphaOf=vj(e.alpha??[1,0]),this.flicker=Math.min(1,Math.max(0,e.flicker??0)),this.spin=e.spin??0,this.tintRange=e.tint??16777215,this.frames=e.frames,this.spawnArea=e.spawn??null;for(let n=0;n<t;n++){this.pool.push({x:0,y:0,vx:0,vy:0,age:0,life:0,rotation:0,spin:0,scale:1,alpha:1,tint:16777215,frame:0,active:!1});let t=this.frames?.[0]??e.texture;if(t){let n=new $s(t);n.anchor.set(.5),n.visible=!1,typeof e.tint==`number`&&(n.tint=e.tint),this.sprites.push(n),this.addChild(n)}}}start(){this.emitting=!0}stop(){this.emitting=!1,this.debt=0}get isEmitting(){return this.emitting}get activeCount(){let e=0;for(let t of this.pool)t.active&&e++;return e}get particles(){return this.pool}burst(e){let t=0;for(let n=0;n<e&&this.spawn();n++)t++;return t}spawn(){let e=null;for(let t=0;t<this.pool.length;t++){let t=this.pool[this.poolCursor];if(this.poolCursor=(this.poolCursor+1)%this.pool.length,!t.active){e=t;break}}if(!e)return!1;let t=gj(this.angleRange),n=gj(this.speed),r=+!bn(),i=this.spawnOffset();return e.x=this.x+i.x,e.y=this.y+i.y,e.vx=Math.cos(t)*n*r,e.vy=Math.sin(t)*n*r,e.age=0,e.life=Math.max(1e-6,gj(this.life)),e.rotation=0,e.spin=gj(this.spin)*r,e.scale=this.scaleOf(0),e.alpha=this.alphaOf(0),e.tint=_j(this.tintRange),e.frame=0,e.active=!0,!0}spawnOffset(){let e=this.spawnArea;if(!e)return{x:0,y:0};let t=e.height??e.width;if(e.shape===`rect`)return{x:(D()-.5)*e.width,y:(D()-.5)*t};let n=Math.sqrt(D()),r=D()*Math.PI*2;return{x:Math.cos(r)*n*(e.width/2),y:Math.sin(r)*n*(t/2)}}update(e){if(this.emitting&&this.rate>0){for(this.debt+=this.rate*e;this.debt>=1;)if(--this.debt,!this.spawn()){this.debt=0;break}}let t=bn();for(let n of this.pool){if(!n.active)continue;if(n.age+=e,n.age>=n.life){n.active=!1;continue}t?(n.vx=0,n.vy=0,n.spin=0):(n.vx+=this.gravityX*e,n.vy+=this.gravityY*e),n.x+=n.vx*e,n.y+=n.vy*e,n.rotation+=n.spin*e;let r=n.age/n.life;n.scale=this.scaleOf(r),n.alpha=this.alphaOf(r),this.flicker>0&&!t&&(n.scale*=1-this.flicker*D()),this.frames&&(n.frame=Math.min(this.frames.length-1,Math.floor(r*this.frames.length)))}this.draw()}draw(){if(this.sprites.length===0)return;let e=typeof this.tintRange!=`number`;for(let t=0;t<this.pool.length;t++){let n=this.pool[t],r=this.sprites[t];r.visible=n.active,n.active&&(r.x=n.x-this.x,r.y=n.y-this.y,r.rotation=n.rotation,r.alpha=n.alpha,r.scale.set(n.scale),e&&(r.tint=n.tint),this.frames&&(r.texture=this.frames[n.frame]??r.texture))}}clear(){for(let e of this.pool)e.active=!1;this.debt=0,this.draw()}},bj=class extends J{constructor(e={}){super(),this.overlay=new ww,this.phase=`idle`,this.elapsed=0,this.duration=0,this.fromAlpha=0,this.toAlpha=0,this.queue=[],this.defaultColor=e.color??0,this.viewWidth=e.width??0,this.viewHeight=e.height??0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor,this.addChild(this.overlay),this.redraw()}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.redraw()}redraw(){this.overlay.clear(),this.viewWidth>0&&this.viewHeight>0&&this.overlay.rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get isBusy(){return this.phase!==`idle`}get washAlpha(){return this.overlay.alpha}fadeOut(e,t){this.begin(`fadeOut`,e,this.overlay.alpha,1,t)}fadeIn(e,t){this.begin(`fadeIn`,e,this.overlay.alpha,0,t)}flash(e,t,n=1){this.begin(`flash`,e,0,n,t)}sequence(e){if(this.queue=e.slice(1),e.length===0){this.phase=`idle`;return}this.beginStep(e[0])}setTint(e,t){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.tint=e,this.overlay.alpha=Math.max(0,Math.min(1,t))}clear(){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor}beginStep(e){switch(e.kind){case`fadeOut`:return this.begin(`fadeOut`,e.duration,this.overlay.alpha,1,e.color);case`fadeIn`:return this.begin(`fadeIn`,e.duration,this.overlay.alpha,0,e.color);case`flash`:return this.begin(`flash`,e.duration,0,e.peak??1,e.color);case`hold`:return this.begin(`hold`,e.duration,this.overlay.alpha,this.overlay.alpha,e.color??this.overlay.tint)}}advance(){let e=this.queue.shift();return e?this.beginStep(e):(this.phase=`idle`,!0)}begin(e,t,n,r,i){return bn()&&(t=0),this.overlay.tint=i??this.defaultColor,this.fromAlpha=n,this.toAlpha=r,this.elapsed=0,this.duration=t,t>0?(this.phase=e,this.overlay.alpha=e===`flash`?0:n,!1):(this.overlay.alpha=e===`flash`?0:r,this.advance())}update(e){if(this.phase===`idle`)return!1;if(bn())return this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance();this.elapsed+=e;let t=Math.min(1,this.elapsed/this.duration);if(this.phase===`flash`){let e=t<.5?En.easeOutQuad(t*2):1-En.easeInQuad((t-.5)*2);this.overlay.alpha=this.toAlpha*e}else{let e=En.easeInOutQuad(t);this.overlay.alpha=this.fromAlpha+(this.toAlpha-this.fromAlpha)*e}return t>=1&&(this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance())}},xj=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`)}},Sj=class{constructor(e,t){this.active=new Set,this.elapsed=0,this.flashColor=0,this.flashStrength=0,this.flashDuration=0,this.flashRemaining=0,this.target=e,this.styles=t.styles}set(e,t){t?this.active.add(e):this.active.delete(e)}has(e){return this.active.has(e)}flash(e,t,n){this.flashColor=e,this.flashStrength=t,this.flashDuration=Math.max(n,1e-6),this.flashRemaining=this.flashDuration}update(e){this.elapsed+=e,this.flashRemaining>0&&(this.flashRemaining=Math.max(0,this.flashRemaining-e));let t=0,n=0,r=0;for(let e of this.active){let i=this.styles[e];if(!i)continue;let a=i.strength??.5,o=i.pulseRate?a*(.5+.5*Math.sin(this.elapsed*i.pulseRate*Math.PI*2)):a;t+=(i.color>>16&255)/255*o,n+=(i.color>>8&255)/255*o,r+=(i.color&255)/255*o}if(this.flashRemaining>0){let e=this.flashRemaining/this.flashDuration,i=this.flashStrength*e;t+=(this.flashColor>>16&255)/255*i,n+=(this.flashColor>>8&255)/255*i,r+=(this.flashColor&255)/255*i}this.target.colorAdd=Rk(Math.min(1,t),Math.min(1,n),Math.min(1,r))}},Cj=Ej(),wj=new Map(Cj.map((e,t)=>[Tj(e),t]));function Tj(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 Ej(){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=Tj(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 Dj(e){return wj.get(Tj(e))}function Oj(e,t,n,r){if(r.length!==Cj.length)throw Error(`autotileFrames needs exactly ${Cj.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[Dj({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 kj=24,Aj=48,jj=[0,16,48,80];function Mj(e,t){if(!Number.isInteger(t))throw Error(`${e} must be an integer, got ${t}`)}function Nj(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw Error(`RPG Maker autotile slot must be 0, 1, 2, or 3, got ${e}`)}function Pj(e){if(e.length===0)throw Error(`RPG Maker autotile shape table cannot be empty`);for(let t=0;t<e.length;t++){if(e[t].length!==4)throw Error(`RPG Maker autotile shape ${t} needs exactly 4 quadrants`);for(let n of e[t])if(n.length!==2||!n.every(Number.isInteger)||n.some(e=>e<0))throw Error(`RPG Maker autotile shape ${t} has an invalid quadrant offset`)}}function Fj(e,t){let n=jj[t]+Math.floor(e/48),r=n%8,i=Math.floor(n/8);return t===0?[Math.floor(r/4)*8,i*6+Math.floor(r/2)%2*3]:t===1?[r*2,(i-2)*3]:t===2?[r*2,(i-6)*2]:[r*2,Math.floor((i-10)*2.5+(i%2==1?.5:0))]}function Ij(e,t,n,r){if(Mj(`RPG Maker autotile tileId`,e),e<0)throw Error(`RPG Maker autotile tileId must be non-negative, got ${e}`);if(Nj(t),Mj(`RPG Maker autotile shape`,n),Pj(r),n<0||n>=r.length)throw Error(`RPG Maker autotile shape ${n} is outside the table, which holds ${r.length}`);let[i,a]=Fj(e,t);return{tileId:e,slot:t,shape:n,destinationX:e%16*Aj,destinationY:Math.floor(e/16)*Aj,quadrants:r[n].map(([e,t],n)=>({sourceX:(i*2+e)*kj,sourceY:(a*2+t)*kj,destinationX:n%2*kj,destinationY:Math.floor(n/2)*kj}))}}var Lj=class{constructor(e){this.cache=new Map,this.table=e,Pj(e)}get(e,t,n){let r=`${e}:${t}:${n}`,i=this.cache.get(r);if(i)return i;let a=Ij(e,t,n,this.table);return this.cache.set(r,a),a}clear(){this.cache.clear()}};function Rj(e,t,n,r){let i=n*4/r,a=e,o=t;for(let e=0;e<i;e+=1)[a,o]=[-o,a];return{dx:a||0,dy:o||0}}function zj(e,t,n,r){let i=n*6/r,a=e,o=t;for(let e=0;e<i;e+=1){let e=-a-o;[a,o]=[-o,-e]}return{dx:a||0,dy:o||0}}function Bj(e,t){let n=t??new Set;return!(e.hasAll&&!e.hasAll.every(e=>n.has(e))||e.hasAny&&!e.hasAny.some(e=>n.has(e))||e.hasNone&&e.hasNone.some(e=>n.has(e)))}function Vj(e,t,n,r,i=Rj,a=0){let o=e.rotations??0;return e.conditions.every(e=>{let s=o>0?i(e.dx,e.dy,a,o):e;return Bj(e,r(t+s.dx,n+s.dy))})}function Hj(e,t,n,r,i={}){let a=i.rotate??Rj,o=i.random??new w,s=[];for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1){let e=-1,c=[];for(let o of n){let n=o.rotations??0,s=n>0?n:1;for(let n=0;n<s;n+=1){if(!Vj(o,t,i,r,a,n))continue;let s=o.conditions.length;s>e?(e=s,c=[{rule:o,rotationIndex:n}]):s===e&&c.push({rule:o,rotationIndex:n})}}if(c.length===0)continue;let l=c.length===1?c[0]:c[Uj(c.map(e=>e.rule.probability??1),o)],u=l.rule.rotations??0;for(let e of l.rule.images){let n=u>0?a(e.dx??0,e.dy??0,l.rotationIndex,u):{dx:e.dx??0,dy:e.dy??0};s.push({x:t,y:i,ruleId:l.rule.id,image:e.image,dx:n.dx,dy:n.dy,layer:e.layer??0})}}return s}function Uj(e,t){let n=e.reduce((e,t)=>e+Math.max(0,t),0);if(n<=0)return 0;let r=t.float()*n;for(let t=0;t<e.length;t+=1)if(r-=Math.max(0,e[t]),r<0)return t;return e.length-1}var Wj=class extends J{};function Gj(e,t){let n={};for(let r of t){let t=new Wj;t.label=r,e.addChild(t),n[r]=t}return n}var Kj=class extends ww{},qj=class extends TO{},Jj=class extends $s{},Yj=class extends sO{},Xj=Cx,Zj=class extends Wj{constructor(e){super(),this.placements=e.placements,this.project=e.project,this.resolveImage=e.resolveImage??(e=>MA(e,K.EMPTY)),this.rebuild()}setPlacements(e){this.placements=e,this.rebuild()}rebuild(){for(let e of this.removeChildren())e.destroy();for(let e of[...this.placements].sort((e,t)=>e.layer-t.layer)){let t=this.project(e.x,e.y,e.dx,e.dy),n=new Jj(this.resolveImage(e.image));n.x=t.x,n.y=t.y,this.addChild(n)}}},Qj=[{workload:`sprites`,preferred:`PixiJS WebGL/WebGPU batcher`,fallback:`PixiJS WebGL`,reason:`high-volume textured 2D batches`},{workload:`ui`,preferred:`PixiJS display tree`,fallback:`PixiJS display tree`,reason:`themeable 2D layout and text`},{workload:`custom-shaders`,preferred:`backend-specific GLSL/WGSL only when profiled`,fallback:`PixiJS filters`,reason:`avoid maintaining paired shader sources without a measured gain`},{workload:`particles`,preferred:`PixiJS for 2D, Babylon.js for 3D`,fallback:`instanced sprites/meshes`,reason:`match simulation and depth to the scene`},{workload:`instanced-terrain`,preferred:`Babylon.js thin instances`,fallback:`PixiJS TileMap for 2D`,reason:`depth-tested repeated 3D geometry`},{workload:`voxels`,preferred:`Babylon.js thin instances`,fallback:`batched meshes`,reason:`color-grouped 3D voxels`},{workload:`animated-models`,preferred:`Babylon.js glTF animation groups`,fallback:`billboard sprites`,reason:`standard 3D interchange and animation support`},{workload:`large-3d-worlds`,preferred:`Babylon.js with streaming/culling`,fallback:`partitioned scenes`,reason:`scene graph, depth, and instancing`}];function $j(e={}){let t=e.createCanvas?.()??(typeof document>`u`?null:document.createElement(`canvas`)),n=!!t?.getContext(`webgl2`);return{webgl1:n||!!(t?.getContext(`webgl`)??t?.getContext(`experimental-webgl`)),webgl2:n,webgpu:e.webgpu??!!globalThis.navigator?.gpu,wgsl:e.wgsl??!1}}async function eM(){let e=globalThis.navigator?.gpu;if(!e)return{webgpu:!1,wgsl:!1};try{let t=await(await e.requestAdapter())?.requestDevice();return t?{webgpu:!0,wgsl:(await t.createShaderModule({code:`@compute @workgroup_size(1) fn main() {}`}).getCompilationInfo()).messages.length===0}:{webgpu:!1,wgsl:!1}}catch{return{webgpu:!1,wgsl:!1}}}var tM=536870911,nM={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function rM(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 iM(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 aM(e,t){let n=e.orientation??`orthogonal`,r=nM[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 GA){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`);rM(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 rM(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new lj({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&tM;if(n===0)return-1;let r=iM(n,o,t.name);return o.length===1?n-o[0]:oj(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}}var oM={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},sM={panelBorder:6,padding:10,spacing:4,direction:`ltr`,font:{family:oM.font.family,size:14,lineHeight:1.5},color:{text:16777215,textDim:13421772,textHighlight:16776960,panelFill:0,panelBorder:16777215,selection:16776960,overlay:0},overlayAlpha:.85},cM=oM;function $(){return cM}var lM=new p;function uM(e){cM={...oM,...e,font:{...oM.font,...e.font},color:{...oM.color,...e.color}},lM.dispatch(cM)}function dM(e){return typeof e==`string`?{text:e}:e}function fM(e,t){return e.align??(t.direction===`rtl`?`right`:`left`)}function pM(e,t=40){let n=Math.max(0,e);return{total:n,speed:Math.max(0,t),revealed:t===0?n:0}}function mM(e,t){return e.revealed=Math.min(e.total,Math.max(0,e.revealed+e.speed*t)),gM(e)}function hM(e){e.revealed=e.total}function gM(e){return e.revealed>=e.total}var _M=class extends TO{constructor(e={}){let t=dM(e),n=$();super({text:t.text??``,resolution:t.resolution,roundPixels:t.roundPixels,style:new iE({fontFamily:n.font.family,stroke:t.stroke,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:fM(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})}),this.themeListener=e=>this.restyle(e),this.revealSource=null,this.reveal=null,this.opts=t,lM.add(this.themeListener)}setColor(e){this.style.fill=e}setText(e){this.revealSource=null,this.reveal=null,this.text!==e&&(this.text=e)}showProgressive(e,t){this.revealSource=e,this.reveal=pM(e.length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=mM(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(hM(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||this.revealSource===null)return;let e=this.revealSource.slice(0,Math.floor(this.reveal.revealed));this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=fM(this.opts,e))}destroy(e){lM.remove(this.themeListener),super.destroy(e)}},vM=``,yM=``,bM=``;function xM(e){let t=``;for(let n=0;n<e.length;n++)if(e[n]===`\\`&&n+1<e.length&&(e[n+1]===`*`||e[n+1]===`_`||e[n+1]===`\\`)){let r=e[n+1];t+=r===`*`?vM:r===`_`?yM:bM,n++}else t+=e[n];return t}function SM(e){return e.replaceAll(vM,`*`).replaceAll(yM,`_`).replaceAll(bM,`\\`)}function CM(e){return e!==void 0&&/[\p{L}\p{N}_]/u.test(e)}function wM(e,t,n){let r=[],i=0;for(;i<e.length;){if(e[i]!==t){i++;continue}let a=0;for(;e[i+a]===t;)a++;if(!(t===`_`&&CM(e[i-1])&&CM(e[i+a]))){if(n)for(let e=0;e<Math.floor(a/2);e++)r.push(i+e*2);else a%2==1&&r.push(i+a-1)}i+=a}return r}function TM(e,t,n,r,i,a){let o=wM(e,t,n),s=n?2:1;for(let e=0;e+1<o.length;e+=2){let t=o[e],n=o[e+1];i.push({from:t+s,to:n,style:r}),a.push({from:t,to:t+s},{from:n,to:n+s})}}function EM(e){let t=[];for(let n of e){if(!n.text)continue;let e=t[t.length-1];e&&e.bold===n.bold&&e.italic===n.italic?e.text+=n.text:t.push({...n})}return t}function DM(e){let t=xM(e),n=[],r=[];TM(t,`*`,!0,`bold`,n,r),TM(t,`_`,!0,`bold`,n,r),TM(t,`*`,!1,`italic`,n,r),TM(t,`_`,!1,`italic`,n,r);let i=new Set([0,t.length]);for(let e of n)i.add(e.from),i.add(e.to);for(let e of r)i.add(e.from),i.add(e.to);let a=[...i].sort((e,t)=>e-t),o=[];for(let e=0;e+1<a.length;e++){let i=a[e],s=a[e+1];i>=s||r.some(e=>e.from<=i&&s<=e.to)||o.push({text:t.slice(i,s),bold:n.some(e=>e.style===`bold`&&e.from<=i&&s<=e.to),italic:n.some(e=>e.style===`italic`&&e.from<=i&&s<=e.to)})}return EM(o).map(e=>({...e,text:SM(e.text)}))}function OM(e){return DM(e).map(e=>e.text).join(``)}function kM(e,t){let n=[],r=Math.max(0,Math.floor(t));for(let t of e){if(r<=0)break;let e=Math.min(t.text.length,r);n.push({...t,text:t.text.slice(0,e)}),r-=e}return n}var AM=class extends ck{constructor(e={}){let t=dM(e),n=$(),r=t.tagStyles===void 0?[]:Object.keys(t.tagStyles);super({text:jM(t.text??``,r),resolution:t.resolution,style:new GO({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:fM(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0,tagStyles:t.tagStyles})}),this.themeListener=e=>this.restyle(e),this.revealSpans=null,this.reveal=null,this.opts=t,this.tags=r,lM.add(this.themeListener)}setText(e){this.revealSpans=null,this.reveal=null;let t=jM(e,this.tags);this.text!==t&&(this.text=t)}showProgressive(e,t){this.revealSpans=DM(e),this.reveal=pM(OM(e).length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=mM(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(hM(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||!this.revealSpans)return;let e=MM(kM(this.revealSpans,this.reveal.revealed),this.tags);this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=fM(this.opts,e))}destroy(e){lM.remove(this.themeListener),super.destroy(e)}};function jM(e,t){return MM(DM(e),t)}function MM(e,t){return e.map(e=>{let n=NM(e.text,t);return e.italic&&(n=`<i>${n}</i>`),e.bold&&(n=`<b>${n}</b>`),n}).join(``)}function NM(e,t){let n=e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`);for(let e of t)n=n.replaceAll(`<${e}>`,`<${e}>`).replaceAll(`</${e}>`,`</${e}>`);return n}var PM=new Set([`b`,`i`,`span`,`br`,`img`]);function FM(e,t={}){let n=t.variables??{},r=t.tags,i=[],a=[],o={bold:!1,italic:!1},s=``,c=()=>{if(!s)return;let e={text:s,bold:o.bold,italic:o.italic};o.color!==void 0&&(e.color=o.color),o.size!==void 0&&(e.size=o.size),o.tag!==void 0&&(e.tag=o.tag),i.push(e),s=``};for(let t=0;t<e.length;t++){let l=e[t];if(l===`&`){let n=qM(e,t);if(n){s+=n.text,t=n.end;continue}}if(l===`$`){let r=JM(e,t),i=r?n[r.name]:void 0;if(r&&i!==void 0){s+=i,t=r.end;continue}}if(l===`<`){let n=GM(e,t);if(n&&(PM.has(n.name)||r?.has(n.name))){if(n.name===`img`){let r=KM(e,n);if(r){c(),i.push({text:``,bold:!1,italic:!1,image:r.src}),t=r.end;continue}}else if(n.name===`br`){s+=`
|
|
1332
|
-
`,t=n.end;continue}else if(n.closing){let e=a[a.length-1];if(e?.tag===n.name){c(),o=e.style,a.pop(),t=n.end;continue}}else{c(),a.push({tag:n.name,style:o}),o=
|
|
1333
|
-
`).forEach((e,n)=>{n>0&&r.push({text:``,bold:t.bold,italic:t.italic,hardBreak:!0});for(let n of e.match(/\S+|\s+/g)??[])r.push({text:n,bold:t.bold,italic:t.italic,color:t.color,size:t.size,tag:t.tag})})}let i=[],a=[],o=0,s=()=>{for(;a.length>0&&a[a.length-1].text.trim()===``&&!a[a.length-1].image;)o-=t(a[a.length-1]),a.pop();i.push({spans:BM(a),width:Math.max(0,o)}),a=[],o=0};for(let e of r){if(e.hardBreak){s();continue}let r=t(e),i=e.image===void 0&&e.text.trim()===``;o>0&&!i&&o+r>n&&s(),a.push(e),o+=r}return(a.length>0||i.length===0)&&s(),i}function BM(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.image===void 0&&e.image===void 0&&e.bold===n.bold&&e.italic===n.italic&&e.color===n.color&&e.size===n.size&&e.tag===n.tag?e.text+=n.text:t.push({...n})}return t}function VM(e,t){let n=t.direction??`ltr`,r=t.align??(n===`rtl`?`right`:`left`),i=[];for(let a=0;a<e.length;a++){let o=e[a],s=a*t.lineHeight,c=o.spans.map(e=>t.measure(e)),l=c.reduce((e,t)=>e+t,0),u=r===`left`?0:r===`right`?t.maxWidth-l:(t.maxWidth-l)/2,d=n===`rtl`?u+l:u;for(let e=0;e<o.spans.length;e++){let t=c[e],r=n===`rtl`?d-t:d;d=n===`rtl`?d-t:d+t,i.push({span:o.spans[e],x:r,y:s,width:t})}}return i}function HM(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function UM(e,t,n){if(t===`b`)return{...e,bold:!0};if(t===`i`)return{...e,italic:!0};if(t!==`span`)return{...e,tag:t};let r=WM(n,`color`),i=Number(WM(n,`size`)??``),a={...e};return r&&(a.color=r),Number.isFinite(i)&&i>0&&(a.size=i),a}function WM(e,t){let n=RegExp(`(?:^|\\s)${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s"'>]+))`).exec(e);return n?n[1]??n[2]??n[3]:void 0}function GM(e,t){let n=/^<(\/?)([a-zA-Z]+)([^>]*)>/.exec(e.slice(t));if(!n)return null;let r=n[3].trimEnd();return{name:n[2].toLowerCase(),closing:n[1]===`/`,selfClosing:r.endsWith(`/`)&&n[1]===``,body:r.replace(/\/$/,``).trim(),end:t+n[0].length-1}}function KM(e,t){if(t.selfClosing){let e=WM(t.body,`src`);return e?{src:e,end:t.end}:null}let n=e.indexOf(`</img>`,t.end+1);if(n<0)return null;let r=e.slice(t.end+1,n).trim();return r?{src:r,end:n+6-1}:null}function qM(e,t){let n={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`},r=/^&(lt|gt|amp|quot|apos);/.exec(e.slice(t));if(r)return{text:n[r[1]],end:t+r[0].length-1};let i=/^&#(\d+);/.exec(e.slice(t));return i?{text:String.fromCodePoint(Number(i[1])),end:t+i[0].length-1}:null}function JM(e,t){let n=/^\$([A-Za-z_][A-Za-z0-9_]*)/.exec(e.slice(t));return n?{name:n[1],end:t+n[0].length-1}:null}var YM=class extends J{constructor(e={}){super(),this.themeListener=e=>this.rebuild(e),this.opts=e,this.rebuild($()),lM.add(this.themeListener)}setText(e){this.opts.text=e,this.rebuild($())}rebuild(e){for(let e of this.removeChildren())e.destroy();let t=this.opts.lineHeight??e.font.size*e.font.lineHeight,n=this.opts.maxWidth??1/0,r=this.opts.maxWidth??0,i=this.opts.direction??e.direction,a=this.opts.resolveImage??(e=>MA(e,K.EMPTY)),o=ZM(),s=n=>this.measurePiece(n,e,t,a,o),c=this.opts.tagStyles,l=VM(zM(FM(this.opts.text??``,{variables:this.opts.variables,tags:c===void 0?void 0:new Set(Object.keys(c))}),s,n),{measure:s,maxWidth:r,lineHeight:t,direction:i,align:this.opts.align??(this.opts.maxWidth===void 0?`left`:void 0)});for(let n of l){let r=n.span.image===void 0?this.textFor(n.span,e,t):this.spriteFor(n.span.image,t,a);r.x=n.x,r.y=n.y,this.addChild(r)}}measurePiece(e,t,n,r,i){if(e.image!==void 0)return eN(r(e.image),n).width;let a=this.resolvedFont(e,t);return i?(i.font=`${a.italic?`italic `:``}${a.bold?`bold `:``}${a.size}px ${a.family}`,i.measureText(e.text).width):e.text.length*a.size}tagStyle(e){return e===void 0||this.opts.tagStyles===void 0?void 0:this.opts.tagStyles[e]}resolvedFont(e,t){let n=this.tagStyle(e.tag);return{family:typeof n?.fontFamily==`string`?n.fontFamily:t.font.family,size:typeof n?.fontSize==`number`?n.fontSize:e.size??t.font.size,bold:n?.fontWeight===void 0?e.bold:QM(n.fontWeight),italic:n?.fontStyle===void 0?e.italic:$M(n.fontStyle)}}textFor(e,t,n){let r=this.resolvedFont(e,t),i=this.tagStyle(e.tag);return new qj({text:e.text,resolution:this.opts.resolution,style:{fontFamily:r.family,fontSize:r.size,fontWeight:r.bold?`bold`:`normal`,fontStyle:r.italic?`italic`:`normal`,fill:e.color??t.color.text,lineHeight:n,...i}})}spriteFor(e,t,n){let r=n(e),i=eN(r,t),a=new Jj(r);return a.width=i.width,a.height=i.height,a}destroy(e){lM.remove(this.themeListener),super.destroy(e)}},XM=null;function ZM(){return typeof document>`u`?null:(XM??=document.createElement(`canvas`).getContext(`2d`),XM)}function QM(e){if(e===`bold`||e===`bolder`)return!0;if(e===`normal`||e===`lighter`)return!1;let t=Number(e);return Number.isFinite(t)&&t>=600}function $M(e){return e===`italic`||e===`oblique`}function eN(e,t){return{width:(e.width>0?e.width:t)*(t/(e.height>0?e.height:t)),height:t}}var tN=class extends RO{constructor(e={}){let t=dM(e),n=$();super({text:t.text??``,style:nN(t,n)}),this.themeListener=e=>this.restyle(e),this.opts=t,lM.add(this.themeListener)}setText(e){this.text!==e&&(this.text=e)}restyle(e){this.style=nN(this.opts,e)}destroy(e){lM.remove(this.themeListener),super.destroy(e)}};function nN(e,t){return{fontFamily:t.font.family,fontSize:e.size??t.font.size,fontWeight:e.bold?`bold`:`normal`,fill:e.color??t.color.text,align:fM(e,t),wordWrap:e.wrapWidth!==void 0,wordWrapWidth:e.wrapWidth??0,breakWords:!0}}var rN=class extends J{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 _k({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)}},iN=`position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;`,aN=class{constructor(){this.polite=null,this.assertive=null}region(e){if(typeof document>`u`||!document.body)return null;let t=e?this.assertive:this.polite;if(t)return t;let n=document.createElement(`div`);return n.setAttribute(`aria-live`,e?`assertive`:`polite`),n.setAttribute(`aria-atomic`,`true`),n.setAttribute(`role`,`status`),n.setAttribute(`style`,iN),document.body.appendChild(n),e?this.assertive=n:this.polite=n,n}announce(e,t={}){let n=this.region(t.assertive??!1);n&&(n.textContent=``,n.appendChild(document.createTextNode(e)))}clear(){this.polite&&(this.polite.textContent=``),this.assertive&&(this.assertive.textContent=``)}destroy(){this.polite?.remove(),this.assertive?.remove(),this.polite=null,this.assertive=null}},oN=new aN,sN=class extends J{constructor(e){super(),this.content=new J,this.onClose=new p,this.titleLabel=null,this.innerWidth=0,this.innerHeight=0,this.currentWidth=0,this.currentHeight=0,this.blocker=null,this.themeListener=()=>this.restyle(),this.isClosed=!1,this.delegate=null,this.onBlockerDown=e=>{e.stopPropagation();let t=e.getLocalPosition(this);this.handleOutsideClick(t.x,t.y)};let t=$();this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,e.blocker===!0&&(this.blocker=new J,this.blocker.eventMode=`static`,this.blocker.on(`pointerdown`,this.onBlockerDown),this.addChild(this.blocker)),this.background=t.panel?new rN(t.panel,{border:t.panelBorder}):new ww,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new _M({text:e.title,color:t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel),oN.announce(e.title)),this.addChild(this.content),this.resize(e.width,e.height),lM.add(this.themeListener)}restyle(){this.titleLabel?.setColor($().color.textHighlight),this.resize(this.currentWidth,this.currentHeight)}resize(e,t){this.currentWidth=e,this.currentHeight=t;let n=$(),r=(this.background instanceof rN?this.background.border.left:2)+n.padding;this.background instanceof rN?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.isClosed?!1:this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}get closed(){return this.isClosed}update(e){}close(){this.isClosed||(this.isClosed=!0,this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0}))}place(e,t){if(this.isClosed)return;let n=this.getLocalBounds(),r=$().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),this.fitBlocker(e,t)}fitBlocker(e,t){this.blocker&&(this.blocker.hitArea=new W(-this.x,-this.y,e,t))}handleOutsideClick(e,t){return this.isClosed||e>=0&&t>=0&&e<this.currentWidth&&t<this.currentHeight||!this.closable?!1:(this.close(),!0)}destroy(e){this.isClosed=!0,lM.remove(this.themeListener),super.destroy(e)}},cN=class extends J{constructor(){super(),this.windows=[],this.overlay=new ww,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.themeListener=()=>this.drawOverlay(),this.overlay.visible=!1,this.addChild(this.overlay),Se.add(this.listener),lM.add(this.themeListener)}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){if(e.closed)throw Error(`cannot open a window that was already closed`);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=$();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){Se.remove(this.listener),lM.remove(this.themeListener),super.destroy(e)}},lN=class{constructor(e){this.list=[],this.current=0,this.hooks=e}get items(){return this.list}get selectedIndex(){return this.current}get selected(){return this.list[this.current]??null}get length(){return this.list.length}reset(e){this.list=e,this.current=e.findIndex(e=>!e.disabled),this.current===-1&&(this.current=0)}swap(e,t){[this.list[e],this.list[t]]=[this.list[t],this.list[e]]}land(e){this.current=e,this.hooks.onChange();let t=this.list[e];t&&this.hooks.onHighlight(t,e)}select(e){e<0||e>=this.list.length||this.list[e].disabled||this.land(e)}confirm(e){let t=this.selected;return!t||t.disabled?!1:(e?.(t,this.current),!0)}step(e,t){if(this.list.length===0)return!1;let n=this.current;for(let r=0;r<t;r++){let t=e(n,this.list.length);if(n=t,!(t<0||t>=this.list.length)&&!this.list[t].disabled)return this.land(t),!0}return!1}},uN=class extends J{constructor(e){super(),this.selection=new lN({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.rows=[],this.rowsLayer=new J,this.highlight=new ww,this.mask_=new ww,this.scroll=0,this.themeListener=()=>this.restyle();let t=$();this.viewWidth=e.width,this.viewHeight=e.height,this.explicitRowHeight=e.rowHeight!==void 0,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.eventMode=`static`,this.on(`wheel`,e=>this.move(e.deltaY>0?1:-1)),this.setItems(e.items??[]),lM.add(this.themeListener)}restyle(){let e=$();this.explicitRowHeight||(this.rowHeight=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing);let t=e.direction===`rtl`,n=this.selection.items;this.rows.forEach((r,i)=>{r.y=i*this.rowHeight;let a=n[i],o=r.children.find(e=>e instanceof _M);if(o){o.setColor(a.disabled?e.color.textDim:e.color.text);let n=e.spacing+(a.icon?this.rowHeight:0);o.x=t?this.viewWidth-n-o.width:n,o.y=Math.round((this.rowHeight-o.height)/2)}a.icon&&(a.icon.x=t?this.viewWidth-e.spacing-this.rowHeight:e.spacing)}),this.refresh()}destroy(e){lM.remove(this.themeListener),super.destroy(e)}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.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=$(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new J;i.y=r*this.rowHeight,i.eventMode=`static`,i.cursor=e.disabled?`default`:`pointer`,i.on(`pointerdown`,()=>this.tapRow(r)),e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.rowHeight:t.spacing,i.addChild(e.icon));let a=new _M({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.selection.reset(e),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){return this.selection.step((t,n)=>(t+e+n)%n,this.selection.length)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}tapRow(e){let t=this.selection.items;e<0||e>=t.length||t[e].disabled||(this.select(e),this.confirm())}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,t=this.selection.selectedIndex,n=this.selection.length;t<this.scroll?this.scroll=t:t>=this.scroll+e&&(this.scroll=t-e+1),this.scroll=Math.max(0,Math.min(this.scroll,Math.max(0,n-e))),this.rowsLayer.y=-this.scroll*this.rowHeight;let r=$();if(n===0){this.highlight.clear();return}this.highlight.clear().rect(0,(t-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:r.color.selection})}},dN=class extends J{columnX(e){return($().direction===`rtl`?this.columns-1-e:e)*this.cellSize}constructor(e){super(),this.selection=new lN({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.cells=[],this.cellsLayer=new J,this.highlight=new ww,this.pickupHighlight=new ww,this.mask_=new ww,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.themeListener=()=>{let e=$();this.selection.items.forEach((t,n)=>{let r=this.cells[n];r&&(r.x=this.columnX(n%this.columns),!((t.quantity??1)<=1)&&r.children.find(e=>e instanceof _M)?.setColor(e.color.textHighlight))}),this.refresh()},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.eventMode=`static`,this.on(`wheel`,e=>this.move(0,e.deltaY>0?1:-1)),this.setItems(e.items??[]),lM.add(this.themeListener)}destroy(e){lM.remove(this.themeListener),super.destroy(e)}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.selection.length/this.columns))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=$();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new J;if(a.x=this.columnX(i),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 _M({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.selection.reset(e),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.selection.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.selection.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){let t=this.selection.items;if(e<0||e>=t.length)return;if(this.pickedUp===null){if(t[e].disabled)return;this.pickedUp=e,this.refresh();return}let n=this.pickedUp;this.pickedUp=null,n!==e&&(this.swapCells(n,e),this.onReorder?.(n,e)),this.refresh()}swapCells(e,t){let n=this.selection.items;this.selection.swap(e,t);let r=this.cells[e],i=this.cells[t],a=r.removeChildren(),o=i.removeChildren();for(let e of o)r.addChild(e);for(let e of a)i.addChild(e);r.cursor=n[e].disabled?`default`:`pointer`,i.cursor=n[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){let n=this.rows,r=this.columns;return this.selection.step(i=>{let a=(Math.floor(i/r)+t+n)%n,o=(i%r+e+r)%r;return a*r+o},n*r)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move($().direction===`rtl`?1:-1,0);case`right`:return this.move($().direction===`rtl`?-1:1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:this.columnX(e%this.columns),y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=Math.floor(t/this.columns);n<this.scrollRow?this.scrollRow=n:n>=this.scrollRow+e&&(this.scrollRow=n-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 r=$();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:r.color.textHighlight,width:2})}if(this.highlight.clear(),this.selection.length>0){let{x:e,y:n}=this.cellRect(t);this.highlight.rect(e,n,this.cellSize,this.cellSize).fill({color:r.color.selection})}}},fN=class{constructor(e){if(this.onChange=new p,this.currentTabIndex=0,this.currentQuery=``,this.rows_=[],this.currentSelectedIndex=0,this.detail=!1,e.tabs.length===0)throw Error(`TabbedList needs at least one tab`);this.tabList=[...e.tabs],this.rowsFor=e.rowsFor,this.pageSize=Math.max(0,Math.floor(e.pageSize??0)),this.labelOf=e.label??(e=>String(e)),this.filterOf=e.filter??((e,t)=>t===``||this.labelOf(e).toLowerCase().includes(t.toLowerCase())),this.disabledOf=e.disabled??(()=>!1),this.recompute()}get tabs(){return this.tabList}get tab(){return this.tabList[this.currentTabIndex]}get query(){return this.currentQuery}get rows(){return this.rows_}get pageCount(){return this.pageSize<=0?1:Math.max(1,Math.ceil(this.rows_.length/this.pageSize))}get page(){return this.pageSize<=0?0:Math.floor(this.currentSelectedIndex/this.pageSize)}get pageRows(){if(this.pageSize<=0)return this.rows_;let e=this.page*this.pageSize;return this.rows_.slice(e,e+this.pageSize)}get selectedIndex(){return this.currentSelectedIndex}get selected(){return this.rows_[this.currentSelectedIndex]??null}get detailOpen(){return this.detail}selectTab(e){let t=this.tabList.findIndex(t=>t.id===e);t===-1||this.tabList[t].disabled||t!==this.currentTabIndex&&(this.currentTabIndex=t,this.recompute(),this.emit())}nextTab(e=1){if(e===0)return;let t=e>0?1:-1,n=this.currentTabIndex;for(let r=0;r<Math.abs(e);r++)do n=(n+t+this.tabList.length)%this.tabList.length;while(this.tabList[n].disabled&&n!==this.currentTabIndex);n!==this.currentTabIndex&&(this.currentTabIndex=n,this.recompute(),this.emit())}setQuery(e){e!==this.currentQuery&&(this.currentQuery=e,this.recompute(),this.emit())}move(e){if(e===0||this.rows_.length===0)return;let t=e>0?1:-1,n=this.currentSelectedIndex;for(let r=0;r<Math.abs(e);r++){let e=n;do e+=t;while(e>=0&&e<this.rows_.length&&this.disabledOf(this.rows_[e]));if(e<0||e>=this.rows_.length)break;n=e}n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}setPage(e){let t=Math.max(0,Math.min(this.pageCount-1,Math.floor(e)));if(this.pageSize<=0)return;let n=this.firstSelectableOnPage(t);n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}nextPage(e){this.setPage(this.page+e)}openDetail(){return this.selected===null||this.disabledOf(this.selected)?!1:(this.detail||(this.detail=!0,this.emit()),!0)}closeDetail(){this.detail&&(this.detail=!1,this.emit())}firstSelectableOnPage(e){let t=e*this.pageSize,n=Math.min(this.rows_.length,t+this.pageSize);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e]))return e;return Math.min(t,Math.max(0,this.rows_.length-1))}firstSelectable(e){for(let t=e;t<this.rows_.length;t++)if(!this.disabledOf(this.rows_[t]))return t;return 0}recompute(){let e=this.rowsFor(this.tab.id).filter(e=>this.filterOf(e,this.currentQuery));this.rows_=e,this.currentSelectedIndex=e.length===0?0:this.firstSelectable(0),this.detail=!1}emit(){this.onChange.dispatch()}};function pN(e,t,n={}){let r={},i=t.replace(/\r/g,``).split(`
|
|
1334
|
-
`),a=null,o=``,s=[],c=!1,l=()=>{if(a){if(r[a]!==void 0)throw Error(`Duplicate FTL message: ${a}`);if(s.length){if(!c)throw Error(`FTL select expression is not closed: ${a}`);let t=o.trim().match(/^\{\s*\$([\w-]+)\s*->\s*$/)?.[1];if(!t)throw Error(`Invalid FTL selector: ${o}`);r[a]=
|
|
1331
|
+
`}},Tk=class extends Su{constructor(e){super({glProgram:mp({name:`color-transform-batch`,bits:[_p,Ck,Cp(e),Mp]}),gpuProgram:pp({name:`color-transform-batch`,bits:[gp,wk,xp(e),jp]}),resources:{batchSamplers:Xm(e)}}),this.maxTextures=e}},Ek=7,Dk=class extends ed{constructor(){let e=new qu({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Q.VERTEX|Q.COPY_DST,shrinkToFit:!1}),t=new qu({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Q.INDEX|Q.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})}},Ok=0,kk=e=>e.colorAdd??Ok;function Ak(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 jk=class e extends Wm{static{this.extension={type:[P.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new Dk,this.name=e.extension.name,this.vertexSize=Ek,this.shader=new Tk(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=kk(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=kk(e),y=i<<16|e.roundPixels&65535;Ak(t,n,r,a,o,s,c,l,u,m,g,f.x0,f.y0,_,y,v),r+=Ek,Ak(t,n,r,a,o,s,c,l,u,p,g,f.x1,f.y1,_,y,v),r+=Ek,Ak(t,n,r,a,o,s,c,l,u,p,h,f.x2,f.y2,_,y,v),r+=Ek,Ak(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 Tk(e))}destroy(){this.shader.destroy(),super.destroy()}},Mk=`mwg-tinted-sprite`;function Nk(e){e.renderPipeId=Mk}var Pk=class{static{this.extension={type:[P.WebGLPipes,P.WebGPUPipes,P.CanvasPipes],name:Mk}}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 Fk;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}},Fk=class{constructor(){this.batcherName=jk.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()}},Ik=!1;function Lk(){Ik||(Ik=!0,F.add(jk),F.add(Pk))}function Rk(e,t,n,r=0){return(Bk(r)<<24|Bk(n)<<16|Bk(t)<<8|Bk(e))>>>0}function zk(e,t){return Rk((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function Bk(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var Vk=Ok;Lk();var Hk=class extends $s{constructor(e){super(e),this._colorAdd=0,Nk(this)}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=Rk(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=zk(e,t)}silhouette(e){this.tint=0,this.colorAdd=zk(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}};function Uk(e){return[e>>16&255,e>>8&255,e&255]}function Wk(e){let[t,n,r]=Uk(e);return Math.floor((t+n+r)/3)}function Gk(e,t,n){return Math.trunc(n*e+(1-n)*t)}function Kk(e,t,n){let[r,i,a]=Uk(e),[o,s,c]=Uk(t);return Gk(r,o,n)<<16|Gk(i,s,n)<<8|Gk(a,c,n)}function qk(e,t){let n=e.length>0?Wk(e[0]):255;return{from:e,to:e.map(e=>{let r=Wk(e);return n!==0&&r<=n?Kk(t.mid,t.min,r/n):Kk(t.mid,t.max,(255-r)/(255-n))})}}function Jk(e,t,n=`exact`){let r=t.from.map(Uk),i=new Uint8ClampedArray(e.length);for(let a=0;a<e.length;a+=4){let o=e[a+3],s=e[a],c=e[a+1],l=e[a+2];if(i[a]=s,i[a+1]=c,i[a+2]=l,i[a+3]=o,o===0||r.length===0)continue;if(n===`exact`){let e=r.findIndex(([e,t,n])=>e===s&&t===c&&n===l);if(e<0)continue;let[n,o,u]=Uk(t.to[e]??t.from[e]);i[a]=n,i[a+1]=o,i[a+2]=u;continue}let u=0,d=1/0;for(let e=0;e<r.length;e+=1){let[t,n,i]=r[e],a=s-t,o=c-n,f=l-i,p=a*a+o*o+f*f;p<d&&(d=p,u=e)}let[f,p,m]=Uk(t.to[u]??t.from[u]);i[a]=f,i[a+1]=p,i[a+2]=m}return i}function Yk(e,t,n){let r=e.width,i=e.height;if(r<=0||i<=0||!e.source)return e;let a=!t.createCanvas,o=t.createCanvas?.(r,i)??(typeof document>`u`?null:document.createElement(`canvas`));if(!o)return e;o.width=r,o.height=i;let s=o.getContext(`2d`);if(!s)return e;let c=a?{drawImage:s.drawImage.bind(s),getImageData:s.getImageData.bind(s),putImageData:(e,t,n)=>s.putImageData(new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),t,n)}:s;return s.drawImage(e.source.resource,0,0),n(c,r,i),K.from(o)}function Xk(e,t,n={},r=`exact`){return Yk(e,n,(e,n,i)=>{let a=Jk(e.getImageData(0,0,n,i).data,t,r);e.putImageData({data:a,width:n,height:i},0,0)})}function Zk(e){e=e.replace(/^"|"$/g,``);let t=[],n=0,r=0;for(let i=0;i<e.length;i+=1)e[i]===`(`?r+=1:e[i]===`)`?r=Math.max(0,r-1):e[i]===`~`&&r===0&&(t.push(e.slice(n,i)),n=i+1);t.push(e.slice(n));let i=(t.shift()??``).trim(),a=[];for(let e of t){let t=/^([A-Za-z][A-Za-z0-9_-]*)(?:\((.*)\))?$/.exec(e.trim());t&&a.push({name:t[1].toUpperCase(),args:t[2]===void 0?[]:t[2].split(`,`).map(e=>e.trim())})}return{path:i,modifiers:a}}function Qk(e,t){return e.modifiers.find(e=>e.name===t.toUpperCase())}function $k(e){return e!==void 0&&/^(linear|smooth)$/i.test(e)?`linear`:`nearest`}function eA(e,t,n){return[1,0,0,0,e/255,0,1,0,0,t/255,0,0,1,0,n/255,0,0,0,1,0]}function tA(e){return[(e.red??100)/100,0,0,0,0,0,(e.green??100)/100,0,0,0,0,0,(e.blue??100)/100,0,0,0,0,0,1,0]}function nA(e,t){let n=1-t,r=(e>>16&255)/255,i=(e>>8&255)/255,a=(e&255)/255;return[n,0,0,0,r*t,0,n,0,0,i*t,0,0,n,0,a*t,0,0,0,1,0]}function rA(e){let t=[`R`,`G`,`B`,`A`].map((t,n)=>e[n]??t),n=e=>{switch(e){case`R`:return[1,0,0,0,0];case`G`:return[0,1,0,0,0];case`B`:return[0,0,1,0,0];case`A`:return[0,0,0,1,0];case`0`:return[0,0,0,0,0];case`1`:return[0,0,0,0,1]}};return t.flatMap(e=>n(e))}function iA(e,t){let n=new zD;n.matrix=t,e.filters=[n]}function aA(e){if(e===void 0)return;let t=e.trim(),n=t.endsWith(`%`),r=Number(n?t.slice(0,-1):t);if(Number.isFinite(r))return n||r>1?r/100:r}function oA(e){if(e===void 0)return;let t=Number.parseInt(e.replace(/^#/,``),16);return Number.isFinite(t)?t:void 0}function sA(e,t,n=1){let r=Qk(t,`FL`);r&&(r.args.length===0||r.args.some(e=>/horiz|horizontal|x/i.test(e)))&&(e.scale.x*=-1),r?.args.some(e=>/vert|vertical|y/i.test(e))&&(e.scale.y*=-1);let i=Qk(t,`SCALE`);if(i){let t=Number(i.args[0]),r=Number(i.args[1]??i.args[0]);Number.isFinite(t)&&t>0&&(e.width=t*n),Number.isFinite(r)&&r>0&&(e.height=r*n)}if(Qk(t,`GS`)){let t=new zD;t.greyscale(1,!1),e.filters=[...e.filters??[],t]}let a=Qk(t,`CS`);if(a){let t=a.args.slice(0,3).map(Number);if(t.length===3&&t.every(e=>Number.isFinite(e))){let n=new zD;n.matrix=eA(t[0],t[1],t[2]),e.filters=[...e.filters??[],n]}}let o=Qk(t,`R`),s=Qk(t,`G`),c=Qk(t,`B`);if(o||s||c){let t=o?Number(o.args[0]):void 0,n=s?Number(s.args[0]):void 0,r=c?Number(c.args[0]):void 0,i=new zD;i.matrix=tA({red:Number.isFinite(t)?t:void 0,green:Number.isFinite(n)?n:void 0,blue:Number.isFinite(r)?r:void 0}),e.filters=[...e.filters??[],i]}let l=Qk(t,`CHAN`);if(l&&l.args.length>0){let t=l.args.map(e=>e.trim().toUpperCase()),n=new zD;n.matrix=rA(t),e.filters=[...e.filters??[],n]}let u=Qk(t,`O`);if(u){let t=aA(u.args[0]);t!==void 0&&(e.alpha*=Math.min(1,Math.max(0,t)))}}function cA(e,t,n={},r=1){e.texture=pA(e.texture,t,n),sA(e,t,r)}function lA(e,t){let n=Qk(t,`CROP`);if(!n||n.args.length<4||!e.source)return e;let r=n.args.slice(0,4).map(Number);if(r.some(e=>!Number.isFinite(e))||r[2]<=0||r[3]<=0)return e;let i=Math.max(0,r[0]),a=Math.max(0,r[1]),o=Math.min(r[2],Math.max(0,e.width-i)),s=Math.min(r[3],Math.max(0,e.height-a));return o>0&&s>0?new K({source:e.source,frame:new W(i,a,o,s)}):e}function uA(e,t){let n=e.trim();return oA(n)??t?.(n)}function dA(e,t){let n=[],r=[];for(let i of e){let[e,a]=i.split(`>`);if(e===void 0||a===void 0)continue;let o=uA(e,t),s=uA(a,t);o!==void 0&&s!==void 0&&(n.push(o),r.push(s))}return{from:n,to:r}}function fA(e,t){let n=e.join(`,`),r=n.indexOf(`>`);if(r<0)return{from:[],to:[]};let i=e=>e.split(`,`).map(e=>uA(e,t)).filter(e=>e!==void 0);return{from:i(n.slice(0,r)),to:i(n.slice(r+1))}}function pA(e,t,n={}){let r=e,i=Qk(t,`RC`);if(i&&i.args.length>0){let e=dA(i.args,n.resolveColor);e.from.length>0&&(r=Xk(r,e,n,`exact`))}let a=Qk(t,`PAL`);if(a){let e=fA(a.args,n.resolveColor);e.from.length>0&&e.from.length===e.to.length&&(r=Xk(r,e,n,`exact`))}let o=Qk(t,`BLIT`);if(o&&o.args.length>0&&n.resolveTexture){let e=n.resolveTexture(o.args[0]);if(e){let t=Number(o.args[1]??0)||0,i=Number(o.args[2]??0)||0;r=Yk(r,n,n=>{n.drawImage(e.source.resource,t,i)})}}let s=Qk(t,`MASK`);if(s&&s.args.length>0&&n.resolveTexture){let e=n.resolveTexture(s.args[0]);if(e){let t=Number(s.args[1]??0)||0,i=Number(s.args[2]??0)||0;r=Yk(r,n,(r,a,o)=>{let s=r.getImageData(0,0,a,o),c=mA(e.width,e.height,n);if(!c)return;let l=c.getContext(`2d`);if(!l)return;l.drawImage(e.source.resource,0,0);let u=l.getImageData(0,0,e.width,e.height),d=hA(s.data,a,o,u.data,e.width,e.height,t,i);r.putImageData({data:d,width:a,height:o},0,0)})}}let c=Qk(t,`BLEND`);if(c){let e=uA(c.args[0]??``,n.resolveColor),t=aA(c.args[1]);e!==void 0&&t!==void 0&&(r=Yk(r,n,(n,r,i)=>{let a=gA(n.getImageData(0,0,r,i).data,e,t);n.putImageData({data:a,width:r,height:i},0,0)}))}let l=Qk(t,`ROTATE`);if(l){let e=Number(l.args[0]);if(Number.isFinite(e)&&e%360!=0){let t=r.width,i=r.height;if(t>0&&i>0&&r.source){let a=mA(t,i,n),o=a?.getContext(`2d`);if(a&&o){o.drawImage(r.source.resource,0,0);let a=_A(o.getImageData(0,0,t,i).data,t,i,e,$k(l.args[1])),s=mA(a.width,a.height,n),c=s?.getContext(`2d`);s&&c&&(c.putImageData({data:a.data,width:a.width,height:a.height},0,0),r=K.from(s))}}}}return r}function mA(e,t,n){let r=n.createCanvas?.(e,t)??(typeof document>`u`?null:document.createElement(`canvas`));return r?(r.width=e,r.height=t,r):null}function hA(e,t,n,r,i,a,o,s){let c=new Uint8ClampedArray(e.length);for(let l=0;l<n;l+=1)for(let n=0;n<t;n+=1){let u=(l*t+n)*4,d=n-o,f=l-s,p=d>=0&&d<i&&f>=0&&f<a?r[(f*i+d)*4+3]:0;c[u]=e[u],c[u+1]=e[u+1],c[u+2]=e[u+2],c[u+3]=Math.round(e[u+3]*p/255)}return c}function gA(e,t,n){let r=Math.min(1,Math.max(0,n)),i=t>>16&255,a=t>>8&255,o=t&255,s=new Uint8ClampedArray(e.length);for(let t=0;t<e.length;t+=4){let n=e[t+3];if(s[t+3]=n,n===0){s[t]=e[t],s[t+1]=e[t+1],s[t+2]=e[t+2];continue}s[t]=e[t]*(1-r)+i*r,s[t+1]=e[t+1]*(1-r)+a*r,s[t+2]=e[t+2]*(1-r)+o*r}return s}function _A(e,t,n,r,i=`nearest`){let a=r*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=t/2,l=n/2,u=0,d=0;for(let[e,t]of[[-c,-l],[c,-l],[c,l],[-c,l]])u=Math.max(u,Math.abs(e*o-t*s)),d=Math.max(d,Math.abs(e*s+t*o));let f=Math.max(1,Math.round(u*2)),p=Math.max(1,Math.round(d*2)),m=new Uint8ClampedArray(f*p*4),h=t/2-.5,g=n/2-.5,_=f/2-.5,v=p/2-.5,y=i===`linear`&&r%90!=0;for(let r=0;r<p;r+=1)for(let i=0;i<f;i+=1){let a=i-_,c=r-v,l=a*o+c*s+h,u=-a*s+c*o+g,d=(r*f+i)*4;if(!y){let r=Math.round(l),i=Math.round(u);if(r<0||r>=t||i<0||i>=n)continue;let a=(i*t+r)*4;m[d]=e[a],m[d+1]=e[a+1],m[d+2]=e[a+2],m[d+3]=e[a+3];continue}vA(e,t,n,l,u,m,d)}return{data:m,width:f,height:p}}function vA(e,t,n,r,i,a,o){if(r<-.5||i<-.5||r>t-.5||i>n-.5)return;let s=Math.floor(r),c=Math.floor(i),l=r-s,u=i-c,d=0,f=0,p=0,m=0;for(let r=0;r<=1;r+=1)for(let i=0;i<=1;i+=1){let a=(i===0?1-l:l)*(r===0?1-u:u);if(a===0)continue;let o=Wn(s+i,0,t-1),h=(Wn(c+r,0,n-1)*t+o)*4,g=e[h+3];d+=g*a,f+=e[h]*g*a,p+=e[h+1]*g*a,m+=e[h+2]*g*a}d<=0||(a[o]=f/d,a[o+1]=p/d,a[o+2]=m/d,a[o+3]=d)}var yA=class{constructor(e,{fps:t=10,loop:n=!0,startTime:r=0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);if(!(t>0))throw Error(`an animation needs a positive fps, got ${t}`);this.frameDuration=1/t,this.frames=e.map(e=>bA(e)?e:{texture:e}),this.times=this.frames.map(e=>e.duration??this.frameDuration),this.loop=n,this.startTime=r;let i=0,a=0;for(let e of this.frames)e.duration===void 0?i++:a+=e.duration;this.duration=i*this.frameDuration+a}frameAt(e){return this.frames[this.frameIndexAt(e)]}frameIndexAt(e){let t=e-this.startTime;if(t<=0)return 0;let n=this.duration;if(n<=0)return this.frames.length-1;let r=this.loop?t%n:Math.min(t,n);for(let e=0;e<this.times.length;e++){if(r<this.times[e])return e;r-=this.times[e]}return this.frames.length-1}};function bA(e){return e.texture!==void 0}var xA=class extends Hk{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.elapsed=0,this.finished=!1,this.offset={x:0,y:0},this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new yA(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}get frameOffset(){return this.offset}get elapsedTime(){return this.elapsed}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.elapsed=0,this.finished=!1,this.show(n.frameAt(0)),this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;!t||this.paused||this.finished||(this.elapsed+=e,this.show(t.frameAt(this.elapsed)),!t.loop&&this.elapsed>=t.startTime+t.duration&&(this.finished=!0,this.onFinish?.(this.currentName)))}show(e){this.texture=e.texture,this.offset.x=e.offsetX??0,this.offset.y=e.offsetY??0}},SA=``;function CA(e){SA=e.endsWith(`/`)||e===``?e:e+`/`}var wA;function TA(e){wA=e}function EA(){return wA||(typeof window>`u`?void 0:window.__MWG_ASSETS__)}function DA(){return EA()!==void 0}function OA(){return Object.keys(EA()??{})}function kA(e){let t=EA();return!t||e in t}function AA(e){let t=EA();if(!t)return SA+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}var jA={"image/png":`png`,"image/jpeg":`jpg`,"image/webp":`webp`,"image/gif":`gif`,"image/svg+xml":`svg`};async function MA(e,t={}){let{onProgress:n,resolution:r,optional:i,onMissing:a}=typeof t==`function`?{onProgress:t,resolution:void 0,optional:void 0,onMissing:void 0}:t,o=new Set(i??[]),s=e.filter(e=>!FD.cache.has(e)),c=s.filter(e=>!o.has(e)),l=s.filter(e=>o.has(e)),u=e=>{let t=AA(e),n={alias:e,src:t};if(r!==void 0&&(n.data={resolution:r}),t.startsWith(`data:`)){let r=/^data:([^;,]+)/.exec(t)?.[1],i=(r&&jA[r])??/\.([a-z0-9]+)$/i.exec(e)?.[1];i&&(n.format=i)}FD.add(n)};if(l.length===0&&c.length===0){n?.(1);return}for(let e of c)u(e);let d=c.length>0?FD.load(c,n):Promise.resolve(),f=l.map(async e=>{u(e);try{await FD.load(e)}catch(t){a?.(e,t)}});await Promise.all([d,...f]),l.length>0&&c.length===0&&n?.(1)}function NA(e,t){if(!FD.cache.has(e)){if(t!==void 0)return t;throw Error(`texture "${e}" has not been loaded - pass it to load() first`)}return FD.get(e)}function PA(e,t){if(!FD.cache.has(e)){if(t!==void 0)return t;throw Error(`asset "${e}" has not been loaded - pass it to load() first`)}return FD.get(e)}function FA(e){return FD.cache.has(e)}async function IA(e){let t=e.filter(e=>FD.cache.has(e));t.length!==0&&await FD.unload(t)}var LA=new Map;async function RA(e,t,n={}){let r=n.fetch??globalThis.fetch;if(!r)throw Error(`fetch is unavailable; provide LoadBinaryOptions.fetch`);let i=e.filter(e=>!LA.has(e));if(i.length===0){t?.(1);return}let a=0;await Promise.all(i.map(async e=>{let n=await r(AA(e));if(!n.ok)throw Error(`failed to load binary asset "${e}": ${n.status}`);LA.set(e,await n.arrayBuffer()),a++,t?.(a/i.length)}))}function zA(e){let t=LA.get(e);if(!t)throw Error(`binary asset "${e}" has not been loaded - pass it to loadBinary() first`);return t}function BA(e){return LA.has(e)}function VA(e){for(let t of e)LA.delete(t)}var HA=class{constructor(e={}){if(this.entries=new Map,this.clock=0,this.budgetBytes=e.budgetBytes??1/0,!(this.budgetBytes>=0))throw Error(`asset stream budget must not be negative`);this.loadAssets=e.load??MA,this.releaseAssets=e.release??IA}async preload(e,t){if(!e.id)throw Error(`asset bundle needs an id`);if(e.estimatedBytes!==void 0&&e.estimatedBytes<0)throw Error(`asset bundle size must not be negative`);let n=this.entries.get(e.id);if(n?.ready){n.lastUsed=++this.clock,t?.(1);return}let r=e.paths.filter(e=>!this.isRetained(e));r.length>0?await this.loadAssets([...r],t):t?.(1),this.entries.set(e.id,{...e,lastUsed:++this.clock,ready:!0}),await this.enforceBudget(e.id)}async preloadLikely(e,t){let n=[...e].sort((e,t)=>(t.priority??0)-(e.priority??0));for(let[e,r]of n.entries())await this.preload(r,t&&(r=>t((e+r)/n.length)));t?.(1)}use(e){let t=this.entries.get(e);return t?.ready?(t.lastUsed=++this.clock,!0):!1}isReady(e){return this.entries.get(e)?.ready??!1}async unload(e){let t=this.entries.get(e);if(!t)return;this.entries.delete(e);let n=t.paths.filter(e=>!this.isRetained(e));n.length>0&&await this.releaseAssets(n)}get estimatedBytes(){return[...this.entries.values()].reduce((e,t)=>e+(t.estimatedBytes??0),0)}async enforceBudget(e){for(;this.estimatedBytes>this.budgetBytes;){let t=[...this.entries.values()].filter(t=>t.id!==e).sort((e,t)=>e.lastUsed-t.lastUsed)[0];if(!t)return;await this.unload(t.id)}}isRetained(e){return[...this.entries.values()].some(t=>t.ready&&t.paths.includes(e))}};async function UA(e,t,n=fetch){let r=await n(e);if(!r.ok)throw Error(`fetchWithByteProgress: ${e} responded ${r.status}`);let i=r.headers.get(`content-length`),a=i!==null&&i!==``?Number(i):null;if(!r.body){let e=await r.blob();return t?.({loaded:e.size,total:a??e.size}),e}let o=r.body.getReader(),s=[],c=0;for(;;){let{done:e,value:n}=await o.read();if(e)break;s.push(n),c+=n.byteLength,t?.({loaded:c,total:a})}return new Blob(s)}var WA=l({AssetStream:()=>HA,fetchWithByteProgress:()=>UA,get:()=>PA,getBinary:()=>zA,has:()=>kA,isBinaryLoaded:()=>BA,isCompiled:()=>DA,isLoaded:()=>FA,load:()=>MA,loadBinary:()=>RA,paths:()=>OA,release:()=>IA,releaseBinary:()=>VA,resolve:()=>AA,setAssetMap:()=>TA,setBase:()=>CA,texture:()=>NA});function GA(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}var KA=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=t>0?Math.floor(e.width/t):0,this.rows=n>0?Math.floor(e.height/n):0}static grid(t,n=0,r=n){return new e(NA(t),n,r)}static fromTexture(t,n=0,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 K({source:this.texture.source,frame:new W(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}rect(e,t,n,r,i){if(r<=0||i<=0)throw Error(`a sprite sheet rect needs a positive width and height`);return this.frames.set(e,new K({source:this.texture.source,frame:new W(t,n,r,i)})),this}region(e){let t=this.get(e);return{texture:t,frame:GA(t.frame)}}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))}},qA=class{constructor(e={}){if(this.world=new J,this.x=0,this.y=0,this.viewWidth=0,this.viewHeight=0,this.screenX=0,this.screenY=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.step=0,this._angle=0,this.targetAngle=null,this.angleIntensity=0,e.grid!==void 0&&e.grid!==`square`&&e.grid!==`hex`)throw Error(`camera grid must be "square" or "hex", not "${e.grid}"`);this.stepsPerTurn=e.grid===`hex`?6:4,this.deadzone=e.deadzone??0,this.pixelPerfectTileSize=e.pixelPerfectTileSize,this._zoom=1,this.zoom=e.zoom??1}get rotationSteps(){return this.step}get rotation(){return this._angle}get uprightRotation(){return-this.rotation}setRotationStep(e){if(!Number.isInteger(e))throw Error(`camera rotation step must be an integer`);this.step=(e%this.stepsPerTurn+this.stepsPerTurn)%this.stepsPerTurn,this._angle=this.step/this.stepsPerTurn*Math.PI*2,this.targetAngle=null,this.apply()}rotate(e=1){this.setRotationStep(this.step+e)}rotateTo(e){this._angle=e,this.targetAngle=null,this.angleIntensity=0,this.apply()}animateRotationTo(e,t=4){this.targetAngle=e,this.angleIntensity=t}get spin(){let e=this.rotation;return{cos:Math.cos(e),sin:Math.sin(e)}}get zoom(){return this._zoom}set zoom(e){let t=Math.max(.01,e);this._zoom=this.pixelPerfectTileSize?YA(t,this.pixelPerfectTileSize):t}setViewport(e,t,n=0,r=0){this.viewWidth=e,this.viewHeight=t,this.screenX=n,this.screenY=r}get view(){let e=this.viewWidth/this._zoom,t=this.viewHeight/this._zoom,{x:n,y:r}=this.clampedCentre(this.x,this.y);if(this._angle===0)return{x:n-e/2,y:r-t/2,width:e,height:t};let i=[this.toWorld(this.screenX,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY+this.viewHeight),this.toWorld(this.screenX,this.screenY+this.viewHeight)],a=i.map(e=>e.x),o=i.map(e=>e.y),s=Math.min(...a),c=Math.min(...o);return{x:s,y:c,width:Math.max(...a)-s,height:Math.max(...o)-c}}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){bn()||(this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t)}shakeScreen(e,t=.4){this.shake(e/this._zoom,t)}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.viewWidth/this._zoom*this.deadzone/2,n=this.viewHeight/this._zoom*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=bn()?1:1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.targetAngle!==null&&this.angleIntensity>0){let t=JA(this._angle,this.targetAngle),n=bn()?1:1-Math.exp(-this.angleIntensity*e);this._angle+=t*n}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=D(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=D(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=e-n,s=t-r;return{x:(o*i-s*a)*this._zoom+this.screenX+this.viewWidth/2,y:(o*a+s*i)*this._zoom+this.screenY+this.viewHeight/2}}toWorld(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=(e-this.screenX-this.viewWidth/2)/this._zoom,s=(t-this.screenY-this.viewHeight/2)/this._zoom;return{x:n+o*i+s*a,y:r-o*a+s*i}}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:Wn(e,i+n,o-n),y:s-a<r*2?(a+s)/2:Wn(t,a+r,s-r)}}apply(){let{x:e,y:t}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY);if(this.world.scale.set(this._zoom),this._angle===0){this.world.rotation=0,this.world.pivot.set(0,0),this.world.x=Math.round(this.screenX+this.viewWidth/2-e*this._zoom),this.world.y=Math.round(this.screenY+this.viewHeight/2-t*this._zoom);return}this.world.rotation=this.rotation,this.world.pivot.set(e,t),this.world.x=Math.round(this.screenX+this.viewWidth/2),this.world.y=Math.round(this.screenY+this.viewHeight/2)}};function JA(e,t){let n=Math.PI*2,r=(t-e)%n;return r>Math.PI&&(r-=n),r<-Math.PI&&(r+=n),r}function YA(e,t){return Math.max(1,Math.round(e*t))/t}function XA(e={}){let t=new qA(e),n=xk.current;return t.setViewport(n.width,n.height),t}var ZA=class{constructor(e){this.container=new J,this.clip=new ww,this.camera=new qA(e),this.container.addChild(this.camera.world),this.container.addChild(this.clip),this.container.mask=this.clip,this.resize(e.x,e.y,e.width,e.height)}resize(e,t,n,r){this.camera.setViewport(n,r,e,t),this.clip.clear().rect(e,t,n,r).fill(16777215)}update(e){this.camera.update(e)}};function QA(e,t){if(e>=t){let n=Math.floor(e/2);return[{x:0,y:0,width:n,height:t},{x:n,y:0,width:e-n,height:t}]}let n=Math.floor(t/2);return[{x:0,y:0,width:e,height:n},{x:0,y:n,width:e,height:t-n}]}var $A={protanopia:[.567,.433,0,0,0,.558,.442,0,0,0,0,.242,.758,0,0,0,0,0,1,0],deuteranopia:[.625,.375,0,0,0,.7,.3,0,0,0,0,.3,.7,0,0,0,0,0,1,0],tritanopia:[.95,.05,0,0,0,0,.433,.567,0,0,0,.475,.525,0,0,0,0,0,1,0]};function ej(e){let t=new zD;return t.matrix=$A[e],t}function tj(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function nj(e,t,n,r=`square`){return r===`hex`?fn(e,t,n,n):{x:(e+.5)*n,y:(t+.5)*n}}var rj=class extends J{constructor(e){super(),this.drawn=new Set,this.marker=new ww,this.widthInCells=e.widthInCells,this.cellSize=e.cellSize??2,this.shape=e.shape??`square`,this.renderTexture=Ph.create({width:this.shape===`hex`?Math.ceil((e.widthInCells-1)*this.cellSize*.75+this.cellSize):e.widthInCells*this.cellSize,height:this.shape===`hex`?e.heightInCells*this.cellSize+this.cellSize/2:e.heightInCells*this.cellSize}),this.sprite=new $s(this.renderTexture),this.addChild(this.sprite),this.addChild(this.marker)}get exploredCount(){return this.drawn.size}sync(e,t){let n=tj(e,this.drawn);if(n.length===0)return;let r=new ww;for(let e of n){this.drawn.add(e);let n=e%this.widthInCells,i=Math.floor(e/this.widthInCells),a=nj(n,i,this.cellSize,this.shape);if(this.shape===`hex`){let e=this.cellSize/2,o=[];for(let t=0;t<6;t++){let n=Math.PI/3*t;o.push(a.x+Math.cos(n)*e,a.y+Math.sin(n)*e)}r.poly(o).fill({color:t(n,i)})}else r.rect(a.x-this.cellSize/2,a.y-this.cellSize/2,this.cellSize,this.cellSize).fill({color:t(n,i)})}xk.current.app.renderer.render({container:r,target:this.renderTexture,clear:!1}),r.destroy()}setMarker(e,t,n,r=16777215){this.setMarkers([{x:e,y:t,facing:n,color:r}])}setMarkers(e){this.marker.clear();for(let t of e){let e=t.color??16777215,n=nj(t.x,t.y,this.cellSize,this.shape);if(this.marker.circle(n.x,n.y,Math.max(1,this.cellSize)).fill({color:e}),t.facing!==void 0){let r=this.cellSize*2;this.marker.moveTo(n.x,n.y).lineTo(n.x+Math.cos(t.facing)*r,n.y+Math.sin(t.facing)*r).stroke({color:e,width:1})}}}reset(){this.drawn.clear(),xk.current.app.renderer.render({container:new J,target:this.renderTexture,clear:!0})}destroy(e){this.renderTexture.destroy(!0),super.destroy(e)}},ij=-1,aj=7237230,oj=10132122;function sj(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 cj(e){return e>>>20}function lj(e){return e&(1<<20)-1}var uj=class extends J{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 J,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new J;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 fn(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 pn(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=cj(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(lj(e))}buildSprite(e,t,n,r){let i=new Hk(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 ww;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(aj),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(oj)}}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}},dj=class extends J{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new Hk(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))}},fj=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,this.animation=r.animation;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)}get frame(){return this.animation?.frameAt(this.elapsed)}get frameOffset(){let e=this.frame;return{x:e?.offsetX??0,y:e?.offsetY??0}}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)}},pj=class{constructor(e,t,n={}){this.elapsed=0,this.sinceFlicker=0,this.expired=!1,this.current=[],this.from={...e},this.to={...t},this.segments=Math.max(0,Math.floor(n.segments??6)),this.jitter=n.jitter??12,this.flickerInterval=n.flickerInterval,this.random=n.random??Math.random,this.duration=n.duration,this.reroll()}get points(){return this.current}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.flickerInterval===void 0&&this.reroll()}update(e){return!this.expired&&(this.elapsed+=e,this.flickerInterval!==void 0&&(this.sinceFlicker+=e,this.sinceFlicker>=this.flickerInterval&&(this.sinceFlicker=0,this.reroll())),this.duration!==void 0&&this.elapsed>=this.duration&&(this.expired=!0,!0))}reroll(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t),r=n>0?-t/n:0,i=n>0?e/n:0,a=[{...this.from}],o=this.segments+1;for(let n=1;n<o;n+=1){let s=n/o,c=Math.sin(Math.PI*s),l=(this.random()*2-1)*this.jitter*c;a.push({x:this.from.x+e*s+r*l,y:this.from.y+t*s+i*l})}a.push({...this.to}),this.current=a}},mj=class{constructor(e,t={}){this.elapsed=0,this.expired=!1,this.child=e,this.offsetX=t.offsetX??0,this.offsetY=t.offsetY??0,this.duration=t.duration}get done(){return this.expired}follow(e,t){return this.child.x=e+this.offsetX,this.child.y=t+this.offsetY,this}update(e){return this.expired||this.duration===void 0?!1:(this.elapsed+=e,this.elapsed>=this.duration&&(this.expired=!0,!0))}},hj=`halo`,gj=class extends xA{constructor(e){super(),this.offsetX=e.offsetX??0,this.offsetY=e.offsetY??0,this.blendMode=e.blendMode??`add`,this.add(hj,e.frames,e.animation),this.play(hj)}follow(e,t){return this.position.set(e+this.offsetX,t+this.offsetY),this}};function _j(e){return typeof e==`number`?e:D(e[0],e[1])}function vj(e){if(typeof e==`number`)return e;let t=D(),n=n=>{let r=e[0]>>n&255,i=e[1]>>n&255;return Math.round(r+(i-r)*t)<<n};return n(16)|n(8)|n(0)}function yj(e){return typeof e==`function`?e:t=>e[0]+(e[1]-e[0])*t}var bj=class extends J{constructor(e={}){super(),this.pool=[],this.sprites=[],this.emitting=!1,this.poolCursor=0,this.debt=0;let t=Math.max(1,Math.floor(e.max??200));this.rate=e.rate??0,this.life=e.life??[.4,.9],this.speed=e.speed??[20,60],this.angleRange=e.angle??[0,Math.PI*2],this.gravityX=e.gravity?.x??0,this.gravityY=e.gravity?.y??0,this.scaleOf=yj(e.scale??[1,1]),this.alphaOf=yj(e.alpha??[1,0]),this.flicker=Math.min(1,Math.max(0,e.flicker??0)),this.spin=e.spin??0,this.tintRange=e.tint??16777215,this.frames=e.frames,this.spawnArea=e.spawn??null;for(let n=0;n<t;n++){this.pool.push({x:0,y:0,vx:0,vy:0,age:0,life:0,rotation:0,spin:0,scale:1,alpha:1,tint:16777215,frame:0,active:!1});let t=this.frames?.[0]??e.texture;if(t){let n=new $s(t);n.anchor.set(.5),n.visible=!1,typeof e.tint==`number`&&(n.tint=e.tint),this.sprites.push(n),this.addChild(n)}}}start(){this.emitting=!0}stop(){this.emitting=!1,this.debt=0}get isEmitting(){return this.emitting}get activeCount(){let e=0;for(let t of this.pool)t.active&&e++;return e}get particles(){return this.pool}burst(e){let t=0;for(let n=0;n<e&&this.spawn();n++)t++;return t}spawn(){let e=null;for(let t=0;t<this.pool.length;t++){let t=this.pool[this.poolCursor];if(this.poolCursor=(this.poolCursor+1)%this.pool.length,!t.active){e=t;break}}if(!e)return!1;let t=_j(this.angleRange),n=_j(this.speed),r=+!bn(),i=this.spawnOffset();return e.x=this.x+i.x,e.y=this.y+i.y,e.vx=Math.cos(t)*n*r,e.vy=Math.sin(t)*n*r,e.age=0,e.life=Math.max(1e-6,_j(this.life)),e.rotation=0,e.spin=_j(this.spin)*r,e.scale=this.scaleOf(0),e.alpha=this.alphaOf(0),e.tint=vj(this.tintRange),e.frame=0,e.active=!0,!0}spawnOffset(){let e=this.spawnArea;if(!e)return{x:0,y:0};let t=e.height??e.width;if(e.shape===`rect`)return{x:(D()-.5)*e.width,y:(D()-.5)*t};let n=Math.sqrt(D()),r=D()*Math.PI*2;return{x:Math.cos(r)*n*(e.width/2),y:Math.sin(r)*n*(t/2)}}update(e){if(this.emitting&&this.rate>0){for(this.debt+=this.rate*e;this.debt>=1;)if(--this.debt,!this.spawn()){this.debt=0;break}}let t=bn();for(let n of this.pool){if(!n.active)continue;if(n.age+=e,n.age>=n.life){n.active=!1;continue}t?(n.vx=0,n.vy=0,n.spin=0):(n.vx+=this.gravityX*e,n.vy+=this.gravityY*e),n.x+=n.vx*e,n.y+=n.vy*e,n.rotation+=n.spin*e;let r=n.age/n.life;n.scale=this.scaleOf(r),n.alpha=this.alphaOf(r),this.flicker>0&&!t&&(n.scale*=1-this.flicker*D()),this.frames&&(n.frame=Math.min(this.frames.length-1,Math.floor(r*this.frames.length)))}this.draw()}draw(){if(this.sprites.length===0)return;let e=typeof this.tintRange!=`number`;for(let t=0;t<this.pool.length;t++){let n=this.pool[t],r=this.sprites[t];r.visible=n.active,n.active&&(r.x=n.x-this.x,r.y=n.y-this.y,r.rotation=n.rotation,r.alpha=n.alpha,r.scale.set(n.scale),e&&(r.tint=n.tint),this.frames&&(r.texture=this.frames[n.frame]??r.texture))}}clear(){for(let e of this.pool)e.active=!1;this.debt=0,this.draw()}},xj=class extends J{constructor(e={}){super(),this.overlay=new ww,this.phase=`idle`,this.elapsed=0,this.duration=0,this.fromAlpha=0,this.toAlpha=0,this.queue=[],this.defaultColor=e.color??0,this.viewWidth=e.width??0,this.viewHeight=e.height??0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor,this.addChild(this.overlay),this.redraw()}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.redraw()}redraw(){this.overlay.clear(),this.viewWidth>0&&this.viewHeight>0&&this.overlay.rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get isBusy(){return this.phase!==`idle`}get washAlpha(){return this.overlay.alpha}fadeOut(e,t){this.begin(`fadeOut`,e,this.overlay.alpha,1,t)}fadeIn(e,t){this.begin(`fadeIn`,e,this.overlay.alpha,0,t)}flash(e,t,n=1){this.begin(`flash`,e,0,n,t)}sequence(e){if(this.queue=e.slice(1),e.length===0){this.phase=`idle`;return}this.beginStep(e[0])}setTint(e,t){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.tint=e,this.overlay.alpha=Math.max(0,Math.min(1,t))}clear(){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor}beginStep(e){switch(e.kind){case`fadeOut`:return this.begin(`fadeOut`,e.duration,this.overlay.alpha,1,e.color);case`fadeIn`:return this.begin(`fadeIn`,e.duration,this.overlay.alpha,0,e.color);case`flash`:return this.begin(`flash`,e.duration,0,e.peak??1,e.color);case`hold`:return this.begin(`hold`,e.duration,this.overlay.alpha,this.overlay.alpha,e.color??this.overlay.tint)}}advance(){let e=this.queue.shift();return e?this.beginStep(e):(this.phase=`idle`,!0)}begin(e,t,n,r,i){return bn()&&(t=0),this.overlay.tint=i??this.defaultColor,this.fromAlpha=n,this.toAlpha=r,this.elapsed=0,this.duration=t,t>0?(this.phase=e,this.overlay.alpha=e===`flash`?0:n,!1):(this.overlay.alpha=e===`flash`?0:r,this.advance())}update(e){if(this.phase===`idle`)return!1;if(bn())return this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance();this.elapsed+=e;let t=Math.min(1,this.elapsed/this.duration);if(this.phase===`flash`){let e=t<.5?En.easeOutQuad(t*2):1-En.easeInQuad((t-.5)*2);this.overlay.alpha=this.toAlpha*e}else{let e=En.easeInOutQuad(t);this.overlay.alpha=this.fromAlpha+(this.toAlpha-this.fromAlpha)*e}return t>=1&&(this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance())}},Sj=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`)}},Cj=class{constructor(e,t){this.active=new Set,this.elapsed=0,this.flashColor=0,this.flashStrength=0,this.flashDuration=0,this.flashRemaining=0,this.target=e,this.styles=t.styles}set(e,t){t?this.active.add(e):this.active.delete(e)}has(e){return this.active.has(e)}flash(e,t,n){this.flashColor=e,this.flashStrength=t,this.flashDuration=Math.max(n,1e-6),this.flashRemaining=this.flashDuration}update(e){this.elapsed+=e,this.flashRemaining>0&&(this.flashRemaining=Math.max(0,this.flashRemaining-e));let t=0,n=0,r=0;for(let e of this.active){let i=this.styles[e];if(!i)continue;let a=i.strength??.5,o=i.pulseRate?a*(.5+.5*Math.sin(this.elapsed*i.pulseRate*Math.PI*2)):a;t+=(i.color>>16&255)/255*o,n+=(i.color>>8&255)/255*o,r+=(i.color&255)/255*o}if(this.flashRemaining>0){let e=this.flashRemaining/this.flashDuration,i=this.flashStrength*e;t+=(this.flashColor>>16&255)/255*i,n+=(this.flashColor>>8&255)/255*i,r+=(this.flashColor&255)/255*i}this.target.colorAdd=Rk(Math.min(1,t),Math.min(1,n),Math.min(1,r))}},wj=Dj(),Tj=new Map(wj.map((e,t)=>[Ej(e),t]));function Ej(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 Dj(){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=Ej(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 Oj(e){return Tj.get(Ej(e))}function kj(e,t,n,r){if(r.length!==wj.length)throw Error(`autotileFrames needs exactly ${wj.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[Oj({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 Aj=24,jj=48,Mj=[0,16,48,80];function Nj(e,t){if(!Number.isInteger(t))throw Error(`${e} must be an integer, got ${t}`)}function Pj(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw Error(`RPG Maker autotile slot must be 0, 1, 2, or 3, got ${e}`)}function Fj(e){if(e.length===0)throw Error(`RPG Maker autotile shape table cannot be empty`);for(let t=0;t<e.length;t++){if(e[t].length!==4)throw Error(`RPG Maker autotile shape ${t} needs exactly 4 quadrants`);for(let n of e[t])if(n.length!==2||!n.every(Number.isInteger)||n.some(e=>e<0))throw Error(`RPG Maker autotile shape ${t} has an invalid quadrant offset`)}}function Ij(e,t){let n=Mj[t]+Math.floor(e/48),r=n%8,i=Math.floor(n/8);return t===0?[Math.floor(r/4)*8,i*6+Math.floor(r/2)%2*3]:t===1?[r*2,(i-2)*3]:t===2?[r*2,(i-6)*2]:[r*2,Math.floor((i-10)*2.5+(i%2==1?.5:0))]}function Lj(e,t,n,r){if(Nj(`RPG Maker autotile tileId`,e),e<0)throw Error(`RPG Maker autotile tileId must be non-negative, got ${e}`);if(Pj(t),Nj(`RPG Maker autotile shape`,n),Fj(r),n<0||n>=r.length)throw Error(`RPG Maker autotile shape ${n} is outside the table, which holds ${r.length}`);let[i,a]=Ij(e,t);return{tileId:e,slot:t,shape:n,destinationX:e%16*jj,destinationY:Math.floor(e/16)*jj,quadrants:r[n].map(([e,t],n)=>({sourceX:(i*2+e)*Aj,sourceY:(a*2+t)*Aj,destinationX:n%2*Aj,destinationY:Math.floor(n/2)*Aj}))}}var Rj=class{constructor(e){this.cache=new Map,this.table=e,Fj(e)}get(e,t,n){let r=`${e}:${t}:${n}`,i=this.cache.get(r);if(i)return i;let a=Lj(e,t,n,this.table);return this.cache.set(r,a),a}clear(){this.cache.clear()}};function zj(e,t,n,r){let i=n*4/r,a=e,o=t;for(let e=0;e<i;e+=1)[a,o]=[-o,a];return{dx:a||0,dy:o||0}}function Bj(e,t,n,r){let i=n*6/r,a=e,o=t;for(let e=0;e<i;e+=1){let e=-a-o;[a,o]=[-o,-e]}return{dx:a||0,dy:o||0}}function Vj(e,t){let n=t??new Set;return!(e.hasAll&&!e.hasAll.every(e=>n.has(e))||e.hasAny&&!e.hasAny.some(e=>n.has(e))||e.hasNone&&e.hasNone.some(e=>n.has(e)))}function Hj(e,t,n,r,i=zj,a=0){let o=e.rotations??0;return e.conditions.every(e=>{let s=o>0?i(e.dx,e.dy,a,o):e;return Vj(e,r(t+s.dx,n+s.dy))})}function Uj(e,t,n,r,i={}){let a=i.rotate??zj,o=i.random??new w,s=[];for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1){let e=-1,c=[];for(let o of n){let n=o.rotations??0,s=n>0?n:1;for(let n=0;n<s;n+=1){if(!Hj(o,t,i,r,a,n))continue;let s=o.conditions.length;s>e?(e=s,c=[{rule:o,rotationIndex:n}]):s===e&&c.push({rule:o,rotationIndex:n})}}if(c.length===0)continue;let l=c.length===1?c[0]:c[Wj(c.map(e=>e.rule.probability??1),o)],u=l.rule.rotations??0;for(let e of l.rule.images){let n=u>0?a(e.dx??0,e.dy??0,l.rotationIndex,u):{dx:e.dx??0,dy:e.dy??0};s.push({x:t,y:i,ruleId:l.rule.id,image:e.image,dx:n.dx,dy:n.dy,layer:e.layer??0})}}return s}function Wj(e,t){let n=e.reduce((e,t)=>e+Math.max(0,t),0);if(n<=0)return 0;let r=t.float()*n;for(let t=0;t<e.length;t+=1)if(r-=Math.max(0,e[t]),r<0)return t;return e.length-1}var Gj=class extends J{};function Kj(e,t){let n={};for(let r of t){let t=new Gj;t.label=r,e.addChild(t),n[r]=t}return n}var qj=class extends ww{},Jj=class extends TO{},Yj=class extends $s{},Xj=class extends sO{},Zj=Cx,Qj=class extends Gj{constructor(e){super(),this.placements=e.placements,this.project=e.project,this.resolveImage=e.resolveImage??(e=>NA(e,K.EMPTY)),this.rebuild()}setPlacements(e){this.placements=e,this.rebuild()}rebuild(){for(let e of this.removeChildren())e.destroy();for(let e of[...this.placements].sort((e,t)=>e.layer-t.layer)){let t=this.project(e.x,e.y,e.dx,e.dy),n=new Yj(this.resolveImage(e.image));n.x=t.x,n.y=t.y,this.addChild(n)}}},$j=[{workload:`sprites`,preferred:`PixiJS WebGL/WebGPU batcher`,fallback:`PixiJS WebGL`,reason:`high-volume textured 2D batches`},{workload:`ui`,preferred:`PixiJS display tree`,fallback:`PixiJS display tree`,reason:`themeable 2D layout and text`},{workload:`custom-shaders`,preferred:`backend-specific GLSL/WGSL only when profiled`,fallback:`PixiJS filters`,reason:`avoid maintaining paired shader sources without a measured gain`},{workload:`particles`,preferred:`PixiJS for 2D, Babylon.js for 3D`,fallback:`instanced sprites/meshes`,reason:`match simulation and depth to the scene`},{workload:`instanced-terrain`,preferred:`Babylon.js thin instances`,fallback:`PixiJS TileMap for 2D`,reason:`depth-tested repeated 3D geometry`},{workload:`voxels`,preferred:`Babylon.js thin instances`,fallback:`batched meshes`,reason:`color-grouped 3D voxels`},{workload:`animated-models`,preferred:`Babylon.js glTF animation groups`,fallback:`billboard sprites`,reason:`standard 3D interchange and animation support`},{workload:`large-3d-worlds`,preferred:`Babylon.js with streaming/culling`,fallback:`partitioned scenes`,reason:`scene graph, depth, and instancing`}];function eM(e={}){let t=e.createCanvas?.()??(typeof document>`u`?null:document.createElement(`canvas`)),n=!!t?.getContext(`webgl2`);return{webgl1:n||!!(t?.getContext(`webgl`)??t?.getContext(`experimental-webgl`)),webgl2:n,webgpu:e.webgpu??!!globalThis.navigator?.gpu,wgsl:e.wgsl??!1}}async function tM(){let e=globalThis.navigator?.gpu;if(!e)return{webgpu:!1,wgsl:!1};try{let t=await(await e.requestAdapter())?.requestDevice();return t?{webgpu:!0,wgsl:(await t.createShaderModule({code:`@compute @workgroup_size(1) fn main() {}`}).getCompilationInfo()).messages.length===0}:{webgpu:!1,wgsl:!1}}catch{return{webgpu:!1,wgsl:!1}}}var nM=536870911,rM={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function iM(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 aM(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 oM(e,t){let n=e.orientation??`orthogonal`,r=rM[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 KA){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`);iM(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 iM(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new uj({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&nM;if(n===0)return-1;let r=aM(n,o,t.name);return o.length===1?n-o[0]:sj(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}}var sM={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},cM={panelBorder:6,padding:10,spacing:4,direction:`ltr`,font:{family:sM.font.family,size:14,lineHeight:1.5},color:{text:16777215,textDim:13421772,textHighlight:16776960,panelFill:0,panelBorder:16777215,selection:16776960,overlay:0},overlayAlpha:.85},lM=sM;function $(){return lM}var uM=new p;function dM(e){lM={...sM,...e,font:{...sM.font,...e.font},color:{...sM.color,...e.color}},uM.dispatch(lM)}function fM(e){return typeof e==`string`?{text:e}:e}function pM(e,t){return e.align??(t.direction===`rtl`?`right`:`left`)}function mM(e,t=40){let n=Math.max(0,e);return{total:n,speed:Math.max(0,t),revealed:t===0?n:0}}function hM(e,t){return e.revealed=Math.min(e.total,Math.max(0,e.revealed+e.speed*t)),_M(e)}function gM(e){e.revealed=e.total}function _M(e){return e.revealed>=e.total}var vM=class extends TO{constructor(e={}){let t=fM(e),n=$();super({text:t.text??``,resolution:t.resolution,roundPixels:t.roundPixels,style:new iE({fontFamily:n.font.family,stroke:t.stroke,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:pM(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})}),this.themeListener=e=>this.restyle(e),this.revealSource=null,this.reveal=null,this.opts=t,uM.add(this.themeListener)}setColor(e){this.style.fill=e}setText(e){this.revealSource=null,this.reveal=null,this.text!==e&&(this.text=e)}showProgressive(e,t){this.revealSource=e,this.reveal=mM(e.length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=hM(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(gM(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||this.revealSource===null)return;let e=this.revealSource.slice(0,Math.floor(this.reveal.revealed));this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=pM(this.opts,e))}destroy(e){uM.remove(this.themeListener),super.destroy(e)}},yM=``,bM=``,xM=``;function SM(e){let t=``;for(let n=0;n<e.length;n++)if(e[n]===`\\`&&n+1<e.length&&(e[n+1]===`*`||e[n+1]===`_`||e[n+1]===`\\`)){let r=e[n+1];t+=r===`*`?yM:r===`_`?bM:xM,n++}else t+=e[n];return t}function CM(e){return e.replaceAll(yM,`*`).replaceAll(bM,`_`).replaceAll(xM,`\\`)}function wM(e){return e!==void 0&&/[\p{L}\p{N}_]/u.test(e)}function TM(e,t,n){let r=[],i=0;for(;i<e.length;){if(e[i]!==t){i++;continue}let a=0;for(;e[i+a]===t;)a++;if(!(t===`_`&&wM(e[i-1])&&wM(e[i+a]))){if(n)for(let e=0;e<Math.floor(a/2);e++)r.push(i+e*2);else a%2==1&&r.push(i+a-1)}i+=a}return r}function EM(e,t,n,r,i,a){let o=TM(e,t,n),s=n?2:1;for(let e=0;e+1<o.length;e+=2){let t=o[e],n=o[e+1];i.push({from:t+s,to:n,style:r}),a.push({from:t,to:t+s},{from:n,to:n+s})}}function DM(e){let t=[];for(let n of e){if(!n.text)continue;let e=t[t.length-1];e&&e.bold===n.bold&&e.italic===n.italic?e.text+=n.text:t.push({...n})}return t}function OM(e){let t=SM(e),n=[],r=[];EM(t,`*`,!0,`bold`,n,r),EM(t,`_`,!0,`bold`,n,r),EM(t,`*`,!1,`italic`,n,r),EM(t,`_`,!1,`italic`,n,r);let i=new Set([0,t.length]);for(let e of n)i.add(e.from),i.add(e.to);for(let e of r)i.add(e.from),i.add(e.to);let a=[...i].sort((e,t)=>e-t),o=[];for(let e=0;e+1<a.length;e++){let i=a[e],s=a[e+1];i>=s||r.some(e=>e.from<=i&&s<=e.to)||o.push({text:t.slice(i,s),bold:n.some(e=>e.style===`bold`&&e.from<=i&&s<=e.to),italic:n.some(e=>e.style===`italic`&&e.from<=i&&s<=e.to)})}return DM(o).map(e=>({...e,text:CM(e.text)}))}function kM(e){return OM(e).map(e=>e.text).join(``)}function AM(e,t){let n=[],r=Math.max(0,Math.floor(t));for(let t of e){if(r<=0)break;let e=Math.min(t.text.length,r);n.push({...t,text:t.text.slice(0,e)}),r-=e}return n}var jM=class extends ck{constructor(e={}){let t=fM(e),n=$(),r=t.tagStyles===void 0?[]:Object.keys(t.tagStyles);super({text:MM(t.text??``,r),resolution:t.resolution,style:new GO({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:pM(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0,tagStyles:t.tagStyles})}),this.themeListener=e=>this.restyle(e),this.revealSpans=null,this.reveal=null,this.opts=t,this.tags=r,uM.add(this.themeListener)}setText(e){this.revealSpans=null,this.reveal=null;let t=MM(e,this.tags);this.text!==t&&(this.text=t)}showProgressive(e,t){this.revealSpans=OM(e),this.reveal=mM(kM(e).length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=hM(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(gM(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||!this.revealSpans)return;let e=NM(AM(this.revealSpans,this.reveal.revealed),this.tags);this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=pM(this.opts,e))}destroy(e){uM.remove(this.themeListener),super.destroy(e)}};function MM(e,t){return NM(OM(e),t)}function NM(e,t){return e.map(e=>{let n=PM(e.text,t);return e.italic&&(n=`<i>${n}</i>`),e.bold&&(n=`<b>${n}</b>`),n}).join(``)}function PM(e,t){let n=e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`);for(let e of t)n=n.replaceAll(`<${e}>`,`<${e}>`).replaceAll(`</${e}>`,`</${e}>`);return n}var FM=new Set([`b`,`i`,`span`,`br`,`img`]);function IM(e,t={}){let n=t.variables??{},r=t.tags,i=[],a=[],o={bold:!1,italic:!1},s=``,c=()=>{if(!s)return;let e={text:s,bold:o.bold,italic:o.italic};o.color!==void 0&&(e.color=o.color),o.size!==void 0&&(e.size=o.size),o.tag!==void 0&&(e.tag=o.tag),i.push(e),s=``};for(let t=0;t<e.length;t++){let l=e[t];if(l===`&`){let n=JM(e,t);if(n){s+=n.text,t=n.end;continue}}if(l===`$`){let r=YM(e,t),i=r?n[r.name]:void 0;if(r&&i!==void 0){s+=i,t=r.end;continue}}if(l===`<`){let n=KM(e,t);if(n&&(FM.has(n.name)||r?.has(n.name))){if(n.name===`img`){let r=qM(e,n);if(r){c(),i.push({text:``,bold:!1,italic:!1,image:r.src}),t=r.end;continue}}else if(n.name===`br`){s+=`
|
|
1332
|
+
`,t=n.end;continue}else if(n.closing){let e=a[a.length-1];if(e?.tag===n.name){c(),o=e.style,a.pop(),t=n.end;continue}}else{c(),a.push({tag:n.name,style:o}),o=WM(o,n.name,n.body),t=n.end;continue}}}s+=l}return c(),i}function LM(e,t={}){return IM(e,t).map(e=>e.image??e.text).join(``)}function RM(e){return e.map(e=>{if(e.image!==void 0)return``;let t=UM(e.text);e.italic&&(t=`<i>${t}</i>`),e.bold&&(t=`<b>${t}</b>`);let n=[e.color===void 0?void 0:`color:${e.color}`,e.size===void 0?void 0:`font-size:${e.size}px`].filter(e=>e!==void 0);return n.length>0&&(t=`<span style="${n.join(`;`)}">${t}</span>`),e.tag!==void 0&&(t=`<${e.tag}>${t}</${e.tag}>`),t}).join(``)}function zM(e,t={}){let n=t.describeImage??(()=>`[image]`);return e.map(e=>e.image===void 0?e.text:n(e.image)).join(``)}function BM(e,t,n){let r=[];for(let t of e){if(t.image!==void 0){r.push({...t});continue}t.text.split(`
|
|
1333
|
+
`).forEach((e,n)=>{n>0&&r.push({text:``,bold:t.bold,italic:t.italic,hardBreak:!0});for(let n of e.match(/\S+|\s+/g)??[])r.push({text:n,bold:t.bold,italic:t.italic,color:t.color,size:t.size,tag:t.tag})})}let i=[],a=[],o=0,s=()=>{for(;a.length>0&&a[a.length-1].text.trim()===``&&!a[a.length-1].image;)o-=t(a[a.length-1]),a.pop();i.push({spans:VM(a),width:Math.max(0,o)}),a=[],o=0};for(let e of r){if(e.hardBreak){s();continue}let r=t(e),i=e.image===void 0&&e.text.trim()===``;o>0&&!i&&o+r>n&&s(),a.push(e),o+=r}return(a.length>0||i.length===0)&&s(),i}function VM(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.image===void 0&&e.image===void 0&&e.bold===n.bold&&e.italic===n.italic&&e.color===n.color&&e.size===n.size&&e.tag===n.tag?e.text+=n.text:t.push({...n})}return t}function HM(e,t){let n=t.direction??`ltr`,r=t.align??(n===`rtl`?`right`:`left`),i=[];for(let a=0;a<e.length;a++){let o=e[a],s=a*t.lineHeight,c=o.spans.map(e=>t.measure(e)),l=c.reduce((e,t)=>e+t,0),u=r===`left`?0:r===`right`?t.maxWidth-l:(t.maxWidth-l)/2,d=n===`rtl`?u+l:u;for(let e=0;e<o.spans.length;e++){let t=c[e],r=n===`rtl`?d-t:d;d=n===`rtl`?d-t:d+t,i.push({span:o.spans[e],x:r,y:s,width:t})}}return i}function UM(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function WM(e,t,n){if(t===`b`)return{...e,bold:!0};if(t===`i`)return{...e,italic:!0};if(t!==`span`)return{...e,tag:t};let r=GM(n,`color`),i=Number(GM(n,`size`)??``),a={...e};return r&&(a.color=r),Number.isFinite(i)&&i>0&&(a.size=i),a}function GM(e,t){let n=RegExp(`(?:^|\\s)${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s"'>]+))`).exec(e);return n?n[1]??n[2]??n[3]:void 0}function KM(e,t){let n=/^<(\/?)([a-zA-Z]+)([^>]*)>/.exec(e.slice(t));if(!n)return null;let r=n[3].trimEnd();return{name:n[2].toLowerCase(),closing:n[1]===`/`,selfClosing:r.endsWith(`/`)&&n[1]===``,body:r.replace(/\/$/,``).trim(),end:t+n[0].length-1}}function qM(e,t){if(t.selfClosing){let e=GM(t.body,`src`);return e?{src:e,end:t.end}:null}let n=e.indexOf(`</img>`,t.end+1);if(n<0)return null;let r=e.slice(t.end+1,n).trim();return r?{src:r,end:n+6-1}:null}function JM(e,t){let n={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`},r=/^&(lt|gt|amp|quot|apos);/.exec(e.slice(t));if(r)return{text:n[r[1]],end:t+r[0].length-1};let i=/^&#(\d+);/.exec(e.slice(t));return i?{text:String.fromCodePoint(Number(i[1])),end:t+i[0].length-1}:null}function YM(e,t){let n=/^\$([A-Za-z_][A-Za-z0-9_]*)/.exec(e.slice(t));return n?{name:n[1],end:t+n[0].length-1}:null}var XM=class extends J{constructor(e={}){super(),this.themeListener=e=>this.rebuild(e),this.opts=e,this.rebuild($()),uM.add(this.themeListener)}setText(e){this.opts.text=e,this.rebuild($())}rebuild(e){for(let e of this.removeChildren())e.destroy();let t=this.opts.lineHeight??e.font.size*e.font.lineHeight,n=this.opts.maxWidth??1/0,r=this.opts.maxWidth??0,i=this.opts.direction??e.direction,a=this.opts.resolveImage??(e=>NA(e,K.EMPTY)),o=QM(),s=n=>this.measurePiece(n,e,t,a,o),c=this.opts.tagStyles,l=HM(BM(IM(this.opts.text??``,{variables:this.opts.variables,tags:c===void 0?void 0:new Set(Object.keys(c))}),s,n),{measure:s,maxWidth:r,lineHeight:t,direction:i,align:this.opts.align??(this.opts.maxWidth===void 0?`left`:void 0)});for(let n of l){let r=n.span.image===void 0?this.textFor(n.span,e,t):this.spriteFor(n.span.image,t,a);r.x=n.x,r.y=n.y,this.addChild(r)}}measurePiece(e,t,n,r,i){if(e.image!==void 0)return tN(r(e.image),n).width;let a=this.resolvedFont(e,t);return i?(i.font=`${a.italic?`italic `:``}${a.bold?`bold `:``}${a.size}px ${a.family}`,i.measureText(e.text).width):e.text.length*a.size}tagStyle(e){return e===void 0||this.opts.tagStyles===void 0?void 0:this.opts.tagStyles[e]}resolvedFont(e,t){let n=this.tagStyle(e.tag);return{family:typeof n?.fontFamily==`string`?n.fontFamily:t.font.family,size:typeof n?.fontSize==`number`?n.fontSize:e.size??t.font.size,bold:n?.fontWeight===void 0?e.bold:$M(n.fontWeight),italic:n?.fontStyle===void 0?e.italic:eN(n.fontStyle)}}textFor(e,t,n){let r=this.resolvedFont(e,t),i=this.tagStyle(e.tag);return new Jj({text:e.text,resolution:this.opts.resolution,style:{fontFamily:r.family,fontSize:r.size,fontWeight:r.bold?`bold`:`normal`,fontStyle:r.italic?`italic`:`normal`,fill:e.color??t.color.text,lineHeight:n,...i}})}spriteFor(e,t,n){let r=n(e),i=tN(r,t),a=new Yj(r);return a.width=i.width,a.height=i.height,a}destroy(e){uM.remove(this.themeListener),super.destroy(e)}},ZM=null;function QM(){return typeof document>`u`?null:(ZM??=document.createElement(`canvas`).getContext(`2d`),ZM)}function $M(e){if(e===`bold`||e===`bolder`)return!0;if(e===`normal`||e===`lighter`)return!1;let t=Number(e);return Number.isFinite(t)&&t>=600}function eN(e){return e===`italic`||e===`oblique`}function tN(e,t){return{width:(e.width>0?e.width:t)*(t/(e.height>0?e.height:t)),height:t}}var nN=class extends RO{constructor(e={}){let t=fM(e),n=$();super({text:t.text??``,style:rN(t,n)}),this.themeListener=e=>this.restyle(e),this.opts=t,uM.add(this.themeListener)}setText(e){this.text!==e&&(this.text=e)}restyle(e){this.style=rN(this.opts,e)}destroy(e){uM.remove(this.themeListener),super.destroy(e)}};function rN(e,t){return{fontFamily:t.font.family,fontSize:e.size??t.font.size,fontWeight:e.bold?`bold`:`normal`,fill:e.color??t.color.text,align:pM(e,t),wordWrap:e.wrapWidth!==void 0,wordWrapWidth:e.wrapWidth??0,breakWords:!0}}var iN=class extends J{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 _k({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)}},aN=`position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;`,oN=class{constructor(){this.polite=null,this.assertive=null}region(e){if(typeof document>`u`||!document.body)return null;let t=e?this.assertive:this.polite;if(t)return t;let n=document.createElement(`div`);return n.setAttribute(`aria-live`,e?`assertive`:`polite`),n.setAttribute(`aria-atomic`,`true`),n.setAttribute(`role`,`status`),n.setAttribute(`style`,aN),document.body.appendChild(n),e?this.assertive=n:this.polite=n,n}announce(e,t={}){let n=this.region(t.assertive??!1);n&&(n.textContent=``,n.appendChild(document.createTextNode(e)))}clear(){this.polite&&(this.polite.textContent=``),this.assertive&&(this.assertive.textContent=``)}destroy(){this.polite?.remove(),this.assertive?.remove(),this.polite=null,this.assertive=null}},sN=new oN,cN=class extends J{constructor(e){super(),this.content=new J,this.onClose=new p,this.titleLabel=null,this.innerWidth=0,this.innerHeight=0,this.currentWidth=0,this.currentHeight=0,this.blocker=null,this.themeListener=()=>this.restyle(),this.isClosed=!1,this.delegate=null,this.onBlockerDown=e=>{e.stopPropagation();let t=e.getLocalPosition(this);this.handleOutsideClick(t.x,t.y)};let t=$();this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,e.blocker===!0&&(this.blocker=new J,this.blocker.eventMode=`static`,this.blocker.on(`pointerdown`,this.onBlockerDown),this.addChild(this.blocker)),this.background=t.panel?new iN(t.panel,{border:t.panelBorder}):new ww,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new vM({text:e.title,color:t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel),sN.announce(e.title)),this.addChild(this.content),this.resize(e.width,e.height),uM.add(this.themeListener)}restyle(){this.titleLabel?.setColor($().color.textHighlight),this.resize(this.currentWidth,this.currentHeight)}resize(e,t){this.currentWidth=e,this.currentHeight=t;let n=$(),r=(this.background instanceof iN?this.background.border.left:2)+n.padding;this.background instanceof iN?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.isClosed?!1:this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}get closed(){return this.isClosed}update(e){}close(){this.isClosed||(this.isClosed=!0,this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0}))}place(e,t){if(this.isClosed)return;let n=this.getLocalBounds(),r=$().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),this.fitBlocker(e,t)}fitBlocker(e,t){this.blocker&&(this.blocker.hitArea=new W(-this.x,-this.y,e,t))}handleOutsideClick(e,t){return this.isClosed||e>=0&&t>=0&&e<this.currentWidth&&t<this.currentHeight||!this.closable?!1:(this.close(),!0)}destroy(e){this.isClosed=!0,uM.remove(this.themeListener),super.destroy(e)}},lN=class extends J{constructor(){super(),this.windows=[],this.overlay=new ww,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.themeListener=()=>this.drawOverlay(),this.overlay.visible=!1,this.addChild(this.overlay),Se.add(this.listener),uM.add(this.themeListener)}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){if(e.closed)throw Error(`cannot open a window that was already closed`);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=$();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){Se.remove(this.listener),uM.remove(this.themeListener),super.destroy(e)}},uN=class{constructor(e){this.list=[],this.current=0,this.hooks=e}get items(){return this.list}get selectedIndex(){return this.current}get selected(){return this.list[this.current]??null}get length(){return this.list.length}reset(e){this.list=e,this.current=e.findIndex(e=>!e.disabled),this.current===-1&&(this.current=0)}swap(e,t){[this.list[e],this.list[t]]=[this.list[t],this.list[e]]}land(e){this.current=e,this.hooks.onChange();let t=this.list[e];t&&this.hooks.onHighlight(t,e)}select(e){e<0||e>=this.list.length||this.list[e].disabled||this.land(e)}confirm(e){let t=this.selected;return!t||t.disabled?!1:(e?.(t,this.current),!0)}step(e,t){if(this.list.length===0)return!1;let n=this.current;for(let r=0;r<t;r++){let t=e(n,this.list.length);if(n=t,!(t<0||t>=this.list.length)&&!this.list[t].disabled)return this.land(t),!0}return!1}},dN=class extends J{constructor(e){super(),this.selection=new uN({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.rows=[],this.rowsLayer=new J,this.highlight=new ww,this.mask_=new ww,this.scroll=0,this.themeListener=()=>this.restyle();let t=$();this.viewWidth=e.width,this.viewHeight=e.height,this.explicitRowHeight=e.rowHeight!==void 0,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.eventMode=`static`,this.on(`wheel`,e=>this.move(e.deltaY>0?1:-1)),this.setItems(e.items??[]),uM.add(this.themeListener)}restyle(){let e=$();this.explicitRowHeight||(this.rowHeight=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing);let t=e.direction===`rtl`,n=this.selection.items;this.rows.forEach((r,i)=>{r.y=i*this.rowHeight;let a=n[i],o=r.children.find(e=>e instanceof vM);if(o){o.setColor(a.disabled?e.color.textDim:e.color.text);let n=e.spacing+(a.icon?this.rowHeight:0);o.x=t?this.viewWidth-n-o.width:n,o.y=Math.round((this.rowHeight-o.height)/2)}a.icon&&(a.icon.x=t?this.viewWidth-e.spacing-this.rowHeight:e.spacing)}),this.refresh()}destroy(e){uM.remove(this.themeListener),super.destroy(e)}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.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=$(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new J;i.y=r*this.rowHeight,i.eventMode=`static`,i.cursor=e.disabled?`default`:`pointer`,i.on(`pointerdown`,()=>this.tapRow(r)),e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.rowHeight:t.spacing,i.addChild(e.icon));let a=new vM({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.selection.reset(e),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){return this.selection.step((t,n)=>(t+e+n)%n,this.selection.length)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}tapRow(e){let t=this.selection.items;e<0||e>=t.length||t[e].disabled||(this.select(e),this.confirm())}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,t=this.selection.selectedIndex,n=this.selection.length;t<this.scroll?this.scroll=t:t>=this.scroll+e&&(this.scroll=t-e+1),this.scroll=Math.max(0,Math.min(this.scroll,Math.max(0,n-e))),this.rowsLayer.y=-this.scroll*this.rowHeight;let r=$();if(n===0){this.highlight.clear();return}this.highlight.clear().rect(0,(t-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:r.color.selection})}},fN=class extends J{columnX(e){return($().direction===`rtl`?this.columns-1-e:e)*this.cellSize}constructor(e){super(),this.selection=new uN({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.cells=[],this.cellsLayer=new J,this.highlight=new ww,this.pickupHighlight=new ww,this.mask_=new ww,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.themeListener=()=>{let e=$();this.selection.items.forEach((t,n)=>{let r=this.cells[n];r&&(r.x=this.columnX(n%this.columns),!((t.quantity??1)<=1)&&r.children.find(e=>e instanceof vM)?.setColor(e.color.textHighlight))}),this.refresh()},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.eventMode=`static`,this.on(`wheel`,e=>this.move(0,e.deltaY>0?1:-1)),this.setItems(e.items??[]),uM.add(this.themeListener)}destroy(e){uM.remove(this.themeListener),super.destroy(e)}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.selection.length/this.columns))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=$();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new J;if(a.x=this.columnX(i),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 vM({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.selection.reset(e),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.selection.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.selection.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){let t=this.selection.items;if(e<0||e>=t.length)return;if(this.pickedUp===null){if(t[e].disabled)return;this.pickedUp=e,this.refresh();return}let n=this.pickedUp;this.pickedUp=null,n!==e&&(this.swapCells(n,e),this.onReorder?.(n,e)),this.refresh()}swapCells(e,t){let n=this.selection.items;this.selection.swap(e,t);let r=this.cells[e],i=this.cells[t],a=r.removeChildren(),o=i.removeChildren();for(let e of o)r.addChild(e);for(let e of a)i.addChild(e);r.cursor=n[e].disabled?`default`:`pointer`,i.cursor=n[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){let n=this.rows,r=this.columns;return this.selection.step(i=>{let a=(Math.floor(i/r)+t+n)%n,o=(i%r+e+r)%r;return a*r+o},n*r)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move($().direction===`rtl`?1:-1,0);case`right`:return this.move($().direction===`rtl`?-1:1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:this.columnX(e%this.columns),y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=Math.floor(t/this.columns);n<this.scrollRow?this.scrollRow=n:n>=this.scrollRow+e&&(this.scrollRow=n-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 r=$();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:r.color.textHighlight,width:2})}if(this.highlight.clear(),this.selection.length>0){let{x:e,y:n}=this.cellRect(t);this.highlight.rect(e,n,this.cellSize,this.cellSize).fill({color:r.color.selection})}}},pN=class{constructor(e){if(this.onChange=new p,this.currentTabIndex=0,this.currentQuery=``,this.rows_=[],this.currentSelectedIndex=0,this.detail=!1,e.tabs.length===0)throw Error(`TabbedList needs at least one tab`);this.tabList=[...e.tabs],this.rowsFor=e.rowsFor,this.pageSize=Math.max(0,Math.floor(e.pageSize??0)),this.labelOf=e.label??(e=>String(e)),this.filterOf=e.filter??((e,t)=>t===``||this.labelOf(e).toLowerCase().includes(t.toLowerCase())),this.disabledOf=e.disabled??(()=>!1),this.recompute()}get tabs(){return this.tabList}get tab(){return this.tabList[this.currentTabIndex]}get query(){return this.currentQuery}get rows(){return this.rows_}get pageCount(){return this.pageSize<=0?1:Math.max(1,Math.ceil(this.rows_.length/this.pageSize))}get page(){return this.pageSize<=0?0:Math.floor(this.currentSelectedIndex/this.pageSize)}get pageRows(){if(this.pageSize<=0)return this.rows_;let e=this.page*this.pageSize;return this.rows_.slice(e,e+this.pageSize)}get selectedIndex(){return this.currentSelectedIndex}get selected(){return this.rows_[this.currentSelectedIndex]??null}get detailOpen(){return this.detail}selectTab(e){let t=this.tabList.findIndex(t=>t.id===e);t===-1||this.tabList[t].disabled||t!==this.currentTabIndex&&(this.currentTabIndex=t,this.recompute(),this.emit())}nextTab(e=1){if(e===0)return;let t=e>0?1:-1,n=this.currentTabIndex;for(let r=0;r<Math.abs(e);r++)do n=(n+t+this.tabList.length)%this.tabList.length;while(this.tabList[n].disabled&&n!==this.currentTabIndex);n!==this.currentTabIndex&&(this.currentTabIndex=n,this.recompute(),this.emit())}setQuery(e){e!==this.currentQuery&&(this.currentQuery=e,this.recompute(),this.emit())}move(e){if(e===0||this.rows_.length===0)return;let t=e>0?1:-1,n=this.currentSelectedIndex;for(let r=0;r<Math.abs(e);r++){let e=n;do e+=t;while(e>=0&&e<this.rows_.length&&this.disabledOf(this.rows_[e]));if(e<0||e>=this.rows_.length)break;n=e}n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}setPage(e){let t=Math.max(0,Math.min(this.pageCount-1,Math.floor(e)));if(this.pageSize<=0)return;let n=this.firstSelectableOnPage(t);n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}nextPage(e){this.setPage(this.page+e)}openDetail(){return this.selected===null||this.disabledOf(this.selected)?!1:(this.detail||(this.detail=!0,this.emit()),!0)}closeDetail(){this.detail&&(this.detail=!1,this.emit())}firstSelectableOnPage(e){let t=e*this.pageSize,n=Math.min(this.rows_.length,t+this.pageSize);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e]))return e;return Math.min(t,Math.max(0,this.rows_.length-1))}firstSelectable(e){for(let t=e;t<this.rows_.length;t++)if(!this.disabledOf(this.rows_[t]))return t;return 0}recompute(){let e=this.rowsFor(this.tab.id).filter(e=>this.filterOf(e,this.currentQuery));this.rows_=e,this.currentSelectedIndex=e.length===0?0:this.firstSelectable(0),this.detail=!1}emit(){this.onChange.dispatch()}};function mN(e,t,n={}){let r={},i=t.replace(/\r/g,``).split(`
|
|
1334
|
+
`),a=null,o=``,s=[],c=!1,l=()=>{if(a){if(r[a]!==void 0)throw Error(`Duplicate FTL message: ${a}`);if(s.length){if(!c)throw Error(`FTL select expression is not closed: ${a}`);let t=o.trim().match(/^\{\s*\$([\w-]+)\s*->\s*$/)?.[1];if(!t)throw Error(`Invalid FTL selector: ${o}`);r[a]=gN(e,t,s)}else r[a]=hN(o);a=null,o=``,s=[],c=!1}};for(let e of i){if(!e.trim()||e.trimStart().startsWith(`#`))continue;let t=e.match(/^([\w-]+)\s*=\s*(.*)$/);if(t){l(),a=t[1],o=t[2];continue}if(!a)throw Error(`FTL continuation has no message: ${e}`);if(e.trim()===`}`){if(!s.length||c)throw Error(`Unexpected FTL select terminator: ${e}`);c=!0;continue}if(c)throw Error(`FTL content follows a closed select expression: ${e}`);let n=e.match(/^\s*(\*)?\[([^\]]+)\]\s*(.*)$/);if(n){s.push({key:n[2],value:n[3],default:!!n[1]});continue}if(/^\s+/.test(e)){s.length?s[s.length-1].value+=` ${e.trim()}`:o+=` ${e.trim()}`;continue}throw Error(`Invalid FTL line: ${e}`)}return l(),{locale:e,direction:n.direction??(/^(ar|he|fa|ur)(?:-|$)/i.test(e)?`rtl`:`ltr`),messages:r}}function hN(e){return e.replace(/\{\s*\$([\w-]+)\s*(?:!([sra]))?\s*(?::\s*([^{}]*?))?\s*\}/g,(e,t,n,r)=>`{${t}${n?`!${n}`:``}${r===void 0?``:`:${r.trim()}`}}`).trim()}function gN(e,t,n){let r=n.filter(e=>e.default);if(r.length!==1)throw Error(`FTL select expressions need exactly one default variant`);let i=r[0],a=new Intl.PluralRules(e);return{format(e={}){let r=e[t],o=n.find(e=>e.key===String(r)),s=typeof r==`number`?a.select(r):``;return hN((o??n.find(e=>e.key===s)??i).value)}}}function _N(e,t,n={}){let r=n.domain??`messages`,i=r===`messages`?``:`${r}:`,a={},o=t.replace(/\r\n?/g,`
|
|
1335
1335
|
`).split(`
|
|
1336
|
-
`),s=null,c=``,l=()=>{if(s){if(s.id===void 0){if(s.str!==void 0||s.plurals.size>0||s.context!==void 0)throw Error(`PO entry has a translation but no msgid`);s=null,c=``;return}u(s),s=null,c=``}},u=t=>{let n=t.id;if(n===``||/(^|,)\s*fuzzy\s*(,|$)/.test(c))return;if(t.plural!==void 0&&t.plurals.size===0)throw Error(`PO message "${n}" has a plural but no msgstr[N] forms`);let r=i+(t.context?`${t.context}\u0004${n}`:n);if(a[r]!==void 0)throw Error(`Duplicate PO message: ${r}`);if(t.plurals.size>0){if([...t.plurals.values()].every(e=>e===``))return;let i=new Intl.PluralRules(e).resolvedOptions().pluralCategories,o={};for(let[r,a]of[...t.plurals].sort((e,t)=>e[0]-t[0])){let t=i[r];if(t===void 0)throw Error(`PO message "${n}" has plural form ${r}, but ${e} declares only ${i.length}`);o[t]=a}a[r]=o;return}t.str!==void 0&&t.str!==``&&(a[r]=t.str)};for(let e=0;e<o.length;e++){let t=o[e],n=t.trim();if(n===``){l();continue}if(n.startsWith(`#,`)){c+=`${c===``?``:`,`}${n.slice(2).trim()}`;continue}if(n.startsWith(`#`))continue;let r=t.match(/^(msgctxt|msgid_plural|msgid|msgstr(?:\[(\d+)\])?)\s+(.*)$/);if(!r)throw Error(`Invalid PO line ${e+1}: ${t}`);let i=r[1],a=r[2]===void 0?void 0:Number(r[2]),u=
|
|
1337
|
-
`;case`t`:return` `;case`r`:return`\r`;case`"`:return`"`;case`\\`:return`\\`;case`a`:return`\x07`;case`b`:return`\b`;case`f`:return`\f`;case`v`:return`\v`;default:return t}})}var bN=/\{sound:([^{}\r\n]+)\}/g;function xN(e){let t=[],n=``,r=0,i;for(bN.lastIndex=0;(i=bN.exec(e))!==null;){n+=e.slice(r,i.index);let a=i[1].trim();a===``?n+=i[0]:t.push({path:a,index:n.length}),r=i.index+i[0].length}return n+=e.slice(r),{text:n,cues:t}}function SN(e){return xN(e).text}function CN(){return{format(e,t){let n=e.params;if(t===`audio`){let t=`${e.type}.audio`;return RP(t)?EP(t,n):``}let r=`${e.type}.${t}`;return RP(r)?DP(r,n):DP(e.type,n)}}}function wN(e,t){return new Intl.NumberFormat(wP(),t).format(e)}function TN(e,t){return new Intl.DateTimeFormat(wP(),t).format(e)}function EN(e,t){return new Intl.ListFormat(wP(),t).format(e)}var DN=/\{(?!sound:)(\w+(?:\.\w+)*)(=)?(?:!([sra]))?(?::([^{}]*))?\}/g;function ON(e){let t=[];DN.lastIndex=0;let n=0,r;for(;(r=DN.exec(e))!==null;){r.index>n&&t.push(e.slice(n,r.index));let i=r[1],a=r[3],o=r[4];t.push({raw:r[0],token:i,debug:r[2]===`=`,conv:a,spec:o}),n=r.index+r[0].length}return n<e.length&&t.push(e.slice(n)),t}function kN(e){return`${e.debug?`=`:``}${e.conv?`!${e.conv}`:``}${e.spec===void 0?``:`:${e.spec}`}`}function AN(e,t){let n=new Map,r=new Map;for(let t of ON(e))typeof t!=`string`&&n.set(t.token,kN(t));for(let e of ON(t))typeof e!=`string`&&r.set(e.token,kN(e));return{missing:[...n.keys()].filter(e=>!r.has(e)),extra:[...r.keys()].filter(e=>!n.has(e)),changed:[...n].flatMap(([e,t])=>{let n=r.get(e);return n!==void 0&&n!==t?[{token:e,base:t,target:n}]:[]})}}var jN=/^(?:(.)?([<>=^]))?([+\- ])?(z)?(#)?(0)?(\d+)?([,_])?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/,MN={b:2,o:8,x:16,X:16},NN={b:`0b`,o:`0o`,x:`0x`,X:`0X`},PN=new Set([`f`,`F`,`e`,`E`,`g`,`G`,`%`,`n`]);function FN(e){return Number.isNaN(e)?`nan`:e===1/0?`inf`:e===-1/0?`-inf`:Object.is(e,-0)?`-0.0`:String(e)}function IN(e,t,n=3,r=`\\d`){return e.replace(RegExp(`\\B(?=(${r}{${n}})+(?!${r}))`,`g`),t)}function LN(e,t){let n=/^(\d+)/.exec(e);return n?IN(n[1],t)+e.slice(n[1].length):e}function RN(e,t,n,r){if(e.length>=t)return e;let i=n.repeat(t-e.length);return r===`<`?e+i:r===`^`?i.slice(0,Math.floor(i.length/2))+e+i.slice(Math.floor(i.length/2)):i+e}function zN(e){return e.replace(/([eE][+-])(\d)$/,`$10$2`)}function BN(e,t,n,r,i){let a=t===0?1:t;if(e===0)return r?`0.${`0`.repeat(a-1)}`:`0`;let o=Math.floor(Math.log10(e)),s;return o>=-4&&o<(i??a)?(s=e.toFixed(a-1-o),r||(s=s.replace(/(\.\d*?)0+$/,`$1`).replace(/\.$/,``))):(s=zN(e.toExponential(a-1)),r||(s=s.replace(/(\.\d*?)0+(e|$)/,`$1$2`).replace(/\.e/i,`e`))),n?s.toUpperCase():s}function VN(e){let t=`,`,n=`.`;for(let r of new Intl.NumberFormat(e).formatToParts(1000.5))r.type===`group`&&(t=r.value),r.type===`decimal`&&(n=r.value);return{group:t,decimal:n}}function HN(e,t,n,r,i,a){return RN(a===void 0?e:e.slice(0,a),i,t??(r?`0`:` `),n??`<`)}function UN(e,t,n=`en`){if(t===``)return typeof e==`number`?FN(e):e;let r=jN.exec(t);if(!r)return;let[i,a,o,s,c,l,u,d,f,p]=r.slice(1),m=f===void 0?void 0:Number(f),h=u===void 0?0:Number(u);if(typeof e==`string`)return o||s||c||d||a===`=`||p!==void 0&&p!==`s`?void 0:HN(e,i,a,l,h,m);if(p===`s`)return;if(p===`c`){if(o||c||l||d||m!==void 0)return;let t=Math.trunc(e);return t<0||t>1114111?void 0:RN(String.fromCodePoint(t),h,i??` `,a??`>`)}if(!Number.isFinite(e)){if(p!==void 0&&!PN.has(p))return;let t=Number.isNaN(e)?`nan`:`inf`;return(p===`F`||p===`E`||p===`G`)&&(t=t.toUpperCase()),p===`%`&&(t+=`%`),RN((e<0?`-`:o===`+`?`+`:o===` `?` `:``)+t,h,i??` `,a??`>`)}let g=e<0||Object.is(e,-0);s&&e===0&&(g=!1);let _=Math.abs(e),v=d===`,`?`,`:d===`_`?`_`:``,y;if(p===void 0){if(m!==void 0){if(Number.isInteger(_))return;y=BN(_,m,!1,!!c,m-1)}else y=FN(_);v&&(y=LN(y,v))}else if(p===`d`){if(m!==void 0||!Number.isInteger(_))return;y=String(Math.trunc(_)),v&&(y=IN(y,v))}else if(p in MN){if(m!==void 0||!Number.isInteger(_)||d===`,`)return;y=Math.trunc(_).toString(MN[p]),p===`X`&&(y=y.toUpperCase()),v&&(y=IN(y,v,4,`[0-9a-fA-F]`)),c&&(y=NN[p]+y)}else if(p===`n`){if(d||m!==void 0&&Number.isInteger(_))return;if(Number.isInteger(_))y=new Intl.NumberFormat(n).format(Math.trunc(_));else{let{group:e,decimal:t}=VN(n),r=BN(_,m??6,!1,!!c),i=r.split(`e`)[0],a=r.slice(i.length);y=LN(i,e).replace(`.`,t)+a}}else if(p===`f`||p===`F`)y=_.toFixed(m??6),v&&(y=LN(y,v));else if(p===`e`||p===`E`)y=zN(_.toExponential(m??6)),p===`E`&&(y=y.toUpperCase()),v&&(y=LN(y,v));else if(p===`g`||p===`G`)y=BN(_,m??6,p===`G`,!!c),v&&(y=LN(y,v));else{let e=_*100;y=(Number.isFinite(e)?e.toFixed(m??6):`inf`)+`%`,v&&Number.isFinite(e)&&(y=LN(y,v))}let b=g?`-`:o===`+`?`+`:o===` `?` `:``,x=i??(l&&!a?`0`:` `),S=a??(l&&!a?`=`:`>`);return S===`=`?b+RN(y,h-b.length,x,`>`):RN(b+y,h,x,S)}function WN(e,t){let n=new Set(Object.keys(e.messages)),r=new Set(Object.keys(t.messages));return{missing:[...n].filter(e=>!r.has(e)),extra:[...r].filter(e=>!n.has(e))}}function GN(e){let t=[];for(let[n,r]of Object.entries(e.messages)){if(typeof r==`string`){r===``&&t.push({key:n,kind:`empty-message`,detail:`message resolves to an empty string`});continue}KN(r)&&r.other===void 0&&t.push({key:n,kind:`plural-missing-other`,detail:`plural forms have no "other" branch`})}return t}function KN(e){return typeof e==`object`&&!!e&&!(`format`in e)}function qN(e){let t=[];for(let[n,r]of Object.entries(e.messages))n.endsWith(`.audio`)&&(typeof r==`string`?r===``&&t.push({key:n,kind:`empty-audio-path`,detail:`an empty audio entry already means "no sound"; remove the key instead`}):t.push({key:n,kind:`audio-not-a-path`,detail:`an audio entry must be a plain path string, not plural forms or a select message`}));return t}function JN(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`format`in e)try{return e.format()}catch{return``}let t=e;return t.other??Object.values(t)[0]??``}function YN(e,t){if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let n=Array.from({length:t.length+1},(e,t)=>t),r=Array(t.length+1);for(let i=1;i<=e.length;i++){r[0]=i;for(let a=1;a<=t.length;a++){let o=e[i-1]===t[a-1]?0:1;r[a]=Math.min(n[a]+1,r[a-1]+1,n[a-1]+o)}[n,r]=[r,n]}return n[t.length]}function XN(e,t=.8){let n=Object.entries(e.messages).map(([e,t])=>[e,JN(t)]).filter(([,e])=>e.length>0),r=[];for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let[a,o]=n[e],[s,c]=n[i],l=Math.max(o.length,c.length),u=YN(o,c),d=l===0?1:1-u/l;d>=t&&r.push({a,b:s,distance:u,similarity:d})}return r.sort((e,t)=>t.similarity-e.similarity)}function ZN(e,t){let n=new Set(t),r=Object.keys(e.messages),i=r.filter(e=>!n.has(e));return{totalKeys:r.length,usedKeys:r.length-i.length,unusedKeys:i}}function QN(e,t){let n=Object.keys(e.messages);if(n.length===0)return 1;let{missing:r}=WN(e,t);return(n.length-r.length)/n.length}function $N(e){let t={},n=0;for(let r of Object.values(e.messages))if(!(typeof r==`string`||typeof r==`object`&&r&&`format`in r)){n++;for(let e of Object.keys(r))t[e]=(t[e]??0)+1}return{pluralKeys:n,formsPresent:t}}function eP(e,t,n){if(!(t in e.messages))throw Error(`mergeCatalogKeys: "${t}" is not a key in this catalog`);if(!(n in e.messages))throw Error(`mergeCatalogKeys: "${n}" is not a key in this catalog`);if(t===n)throw Error(`mergeCatalogKeys: survivingKey and mergedKey must be different keys`);let r={...e.messages};return delete r[n],{...e,messages:r}}function tP(e,t){return{base:e,target:t}}var nP=`.audio`;function rP(e){return e.endsWith(nP)}function iP(e){return[...new Set([...Object.keys(e.base.messages),...Object.keys(e.target.messages)])].filter(e=>!rP(e)).sort()}function aP(e){if(e===void 0)return;let t=JN(e);return t===``?void 0:t}var oP=[`log`,`compact`,`accessibility`,`debug`];function sP(e){let t=e.lastIndexOf(`.`);if(!(t<=0||!oP.includes(e.slice(t+1))))return`${e.slice(0,t)}${nP}`}function cP(e,t){let n=e.base.messages[t],r=e.target.messages[t],i=n!==void 0&&r!==void 0?`ok`:n===void 0?`extra`:`missing`,a=[`${t}${nP}`],o=sP(t);o&&a.push(o);let s,c,l=!1;for(let t of a){let n=aP(e.target.messages[t]);if(n!==void 0){s=n,c=t;break}let r=aP(e.base.messages[t]);if(r!==void 0){s=r,c=t,l=!0;break}}return{key:t,baseText:n===void 0?``:JN(n),targetText:r===void 0?``:JN(r),status:i,sound:s,soundKey:c,soundInherited:l}}function lP(e,t){let n=`${t}${nP}`;return n in e.target.messages||n in e.base.messages?n:sP(t)??n}function uP(e,t={}){let n=t.query?.toLowerCase()??``;return iP(e).map(t=>cP(e,t)).filter(e=>!t.missingOnly||e.status===`missing`).filter(e=>n===``||e.key.toLowerCase().includes(n)||e.baseText.toLowerCase().includes(n)||e.targetText.toLowerCase().includes(n))}function dP(e,t,n){let r=e.target.messages[t]??e.base.messages[t],i=n;if(r!==void 0&&typeof r==`object`&&!(`format`in r))try{let e=JSON.parse(n);typeof e==`object`&&e&&!Array.isArray(e)&&(i=e)}catch{}return{...e,target:{...e.target,messages:{...e.target.messages,[t]:i}}}}function fP(e,t){let n=e.base.messages[t];if(n===void 0)throw Error(`copyFromBase: "${t}" is not a key in the base catalog`);return{...e,target:{...e.target,messages:{...e.target.messages,[t]:n}}}}function pP(e,t){if(!(t in e.target.messages))throw Error(`deleteTargetKey: "${t}" is not a key in the target catalog`);let n={...e.target.messages};return delete n[t],{...e,target:{...e.target,messages:n}}}function mP(e,t,n){let r={...e.target.messages},i=lP(e,t);return n===``?delete r[i]:r[i]=n,{...e,target:{...e.target,messages:r}}}function hP(e){let t=e=>({...e,messages:Object.fromEntries(Object.entries(e.messages).filter(([e])=>!rP(e)))});return QN(t(e.base),t(e.target))}function gP(e){return{base:e.target,target:e.base}}var _P=l({AUDIO_SUFFIX:()=>nP,catalogCompleteness:()=>QN,catalogUsage:()=>ZN,copyFromBase:()=>fP,createCatalogFormatter:()=>CN,createEditSession:()=>tP,cueKeyFor:()=>lP,deleteTargetKey:()=>pP,diffCatalogKeys:()=>WN,diffPlaceholders:()=>AN,direction:()=>TP,findSimilarMessages:()=>XN,formatDate:()=>TN,formatList:()=>EN,formatNumber:()=>wN,formatSpec:()=>UN,has:()=>RP,isAudioKey:()=>rP,levenshteinDistance:()=>YN,locale:()=>wP,mergeCatalogKeys:()=>eP,messageText:()=>JN,nonBreakingUnit:()=>PP,parseFTL:()=>pN,parsePo:()=>gN,parseSoundMarkers:()=>xN,pluralFormCoverage:()=>$N,reset:()=>KP,sessionCompleteness:()=>hP,sessionKeys:()=>iP,sessionRow:()=>cP,sessionRows:()=>uP,setActive:()=>CP,setBase:()=>SP,setTargetSound:()=>mP,setTargetText:()=>dP,stripSoundMarkers:()=>SN,swapSession:()=>gP,t:()=>DP,tRaw:()=>EP,tokenizeMessage:()=>ON,typographic:()=>NP,validateCatalog:()=>GN,validateMessageAudio:()=>qN}),vP=null,yP=null,bP=null,xP=null;function SP(e){vP=e}function CP(e){yP=e,bP=e?new Intl.PluralRules(e.locale):null}function wP(){return(yP??vP)?.locale??`en`}function TP(){return(yP??vP)?.direction??`ltr`}function EP(e,t){let n=yP?.messages[e]??vP?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:BP(n)?n.format(t):zP(n,t?.count);return t?VP(r,t):r}function DP(e,t){if(!RP(e))return e;let n=EP(e,t),r=(yP??vP)?.typography===!1?n:NP(n,wP());return TP()===`rtl`?`${r}`:r}var OP=` `,kP=`\xA0`,AP=[`Chapitre`,`Tome`,`Livre`,`Partie`,`Section`,`Article`,`Acte`,`Scène`,`Niveau`,`Manche`,`Round`,`Étape`,`Volume`,`Figure`,`Page`,`Numéro`],jP=[`Nr`,`Dr`,`Bd`,`Kap`,`Art`,`Abb`,`Str`,`Tel`],MP=[`kg`,`g`,`mg`,`t`,`km`,`m`,`cm`,`mm`,`l`,`ml`,`h`,`min`,`s`,`%`,`°C`,`€`];function NP(e,t=wP()){let n=t.split(`-`)[0].toLowerCase(),r=e;return(n===`fr`||n===`it`||n===`nl`)&&(r=r.replace(/([\p{L}])'(?=[\p{L}])/gu,`$1’`)),n===`fr`&&(r=FP(r)),n===`de`&&(r=IP(r)),r}function PP(e,t,n=wP()){let r=n.split(`-`)[0].toLowerCase();return`${e}${r===`fr`?OP:r===`de`?kP:` `}${t}`}function FP(e){let t=e.replace(/\s?([;!?])/g,`${OP}$1`).replace(/«\s?/g,`«${OP}`).replace(/\s?»/g,`${OP}»`);t=t.replace(/(?<!\{soun)(\p{L})\s?:/gu,`$1${OP}:`);let n=RegExp(`\\b(${AP.join(`|`)})\\s+(?=\\d)`,`g`);return t.replace(n,`$1${kP}`)}function IP(e){let t=RegExp(`(\\d)\\s+(?=(?:${MP.map(LP).join(`|`)})(?![\\p{L}\\p{N}]))`,`gu`),n=RegExp(`\\b(${jP.join(`|`)})\\.\\s+`,`g`);return e.replace(t,`$1${kP}`).replace(n,`$1.${kP}`)}function LP(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function RP(e){return yP?.messages[e]!==void 0||vP?.messages[e]!==void 0}function zP(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(bP??(xP??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function BP(e){return`format`in e}function VP(e,t){return ON(e).map(e=>typeof e==`string`?e:UP(e,t)).join(``)}function HP(e,t){let n=e[t];if(typeof n==`string`||typeof n==`number`)return n;let r=e;for(let e of t.split(`.`)){if(typeof r!=`object`)return;r=r[e]}return typeof r==`string`||typeof r==`number`?r:void 0}function UP(e,t){let n=HP(t,e.token);if(n===void 0)return e.raw;try{let t=e.conv===void 0?n:WP(n,e.conv),r=e.spec===void 0?String(t):UN(t,e.spec,wP());return r===void 0?e.raw:e.debug?`${e.token}=${r}`:r}catch{return e.raw}}function WP(e,t){if(t===`s`)return String(e);if(typeof e==`number`){let n=UN(e,``,`en`)??String(e);return t===`a`?GP(n):n}let n=`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}'`;return t===`a`?GP(n):n}function GP(e){let t=``;for(let n of e){let e=n.codePointAt(0)??0;t+=e>127?e>65535?`\\U${e.toString(16).padStart(8,`0`)}`:`\\u${e.toString(16).padStart(4,`0`)}`:n}return t}function KP(){vP=null,yP=null,bP=null}var qP=class extends sN{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.reveal=pM(0),this.pageText=``,this.pageCues=[],this.nextCue=0,this.portrait=null,this.portraitLayer=new J,this.choiceList=null,this.finished=!1,this.autoAdvanceElapsed=0,this.messageThemeListener=()=>this.restyleMessage(),this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.mode=e.mode??`adv`,this.autoAdvance=e.autoAdvance,this.choices=e.choices??[],this.onDone=e.onDone??null,this.onSound=e.onSound??null,this.announce=e.announce??!0;let t=$();this.content.addChild(this.portraitLayer),this.speakerLabel=new _M({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new _M({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new _M({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0),lM.add(this.messageThemeListener)}restyleMessage(){let e=$();this.speakerLabel.setColor(e.color.textHighlight),this.prompt.setColor(e.color.textDim)}destroy(e){lM.remove(this.messageThemeListener),super.destroy(e)}showPage(e){let t=this.pages[e],n=$(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new $s(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=this.mode===`adv`&&t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=this.mode===`adv`&&t.speaker!==void 0?this.speakerLabel.height+n.spacing:0,this.body.style.wordWrapWidth=Math.max(16,a);let o=xN(t.text);this.pageText=o.text,this.pageCues=o.cues,this.nextCue=0,this.announce&&oN.announce(t.speaker===void 0?this.pageText:`${t.speaker}: ${this.pageText}`),this.reveal=pM(this.pageText.length,this.speed),this.autoAdvanceElapsed=0,this.playRevealedSounds(),this.renderBody(),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}renderBody(){if(this.mode===`adv`){this.body.setText(this.pageText.slice(0,Math.floor(this.reveal.revealed)));return}let e=this.pages.slice(0,this.pageIndex).map(e=>this.formatLine(e,xN(e.text).text)),t=this.pages[this.pageIndex];e.push(this.formatLine(t,this.pageText.slice(0,Math.floor(this.reveal.revealed)))),this.body.setText(e.join(`
|
|
1336
|
+
`),s=null,c=``,l=()=>{if(s){if(s.id===void 0){if(s.str!==void 0||s.plurals.size>0||s.context!==void 0)throw Error(`PO entry has a translation but no msgid`);s=null,c=``;return}u(s),s=null,c=``}},u=t=>{let n=t.id;if(n===``||/(^|,)\s*fuzzy\s*(,|$)/.test(c))return;if(t.plural!==void 0&&t.plurals.size===0)throw Error(`PO message "${n}" has a plural but no msgstr[N] forms`);let r=i+(t.context?`${t.context}\u0004${n}`:n);if(a[r]!==void 0)throw Error(`Duplicate PO message: ${r}`);if(t.plurals.size>0){if([...t.plurals.values()].every(e=>e===``))return;let i=new Intl.PluralRules(e).resolvedOptions().pluralCategories,o={};for(let[r,a]of[...t.plurals].sort((e,t)=>e[0]-t[0])){let t=i[r];if(t===void 0)throw Error(`PO message "${n}" has plural form ${r}, but ${e} declares only ${i.length}`);o[t]=a}a[r]=o;return}t.str!==void 0&&t.str!==``&&(a[r]=t.str)};for(let e=0;e<o.length;e++){let t=o[e],n=t.trim();if(n===``){l();continue}if(n.startsWith(`#,`)){c+=`${c===``?``:`,`}${n.slice(2).trim()}`;continue}if(n.startsWith(`#`))continue;let r=t.match(/^(msgctxt|msgid_plural|msgid|msgstr(?:\[(\d+)\])?)\s+(.*)$/);if(!r)throw Error(`Invalid PO line ${e+1}: ${t}`);let i=r[1],a=r[2]===void 0?void 0:Number(r[2]),u=vN(o,e,r[3]);if(e=u.next-1,s?(i===`msgctxt`||i===`msgid`)&&s.id!==void 0&&(l(),s={plurals:new Map}):s={plurals:new Map},i===`msgctxt`)s.context=u.text;else if(i===`msgid`)s.id=u.text;else if(i===`msgid_plural`)s.plural=u.text;else if(i===`msgstr`)s.str=u.text;else if(a!==void 0)s.plurals.set(a,u.text);else throw Error(`Invalid PO keyword on line ${e+1}: ${i}`)}return l(),{locale:e,direction:n.direction??(/^(ar|he|fa|ur)(?:-|$)/i.test(e)?`rtl`:`ltr`),messages:a}}function vN(e,t,n){if(!n.trim().startsWith(`"`))throw Error(`PO string must start with a quote on line ${t+1}: ${n}`);let r=yN(n.trim(),t),i=t+1;for(;i<e.length&&e[i].trim().startsWith(`"`);)r+=yN(e[i].trim(),i),i++;return{text:r,next:i}}function yN(e,t){let n=e.match(/^"((?:[^"\\]|\\.)*)"/);if(!n)throw Error(`Invalid PO string on line ${t+1}: ${e}`);return bN(n[1])}function bN(e){return e.replace(/\\(.)/g,(e,t)=>{switch(t){case`n`:return`
|
|
1337
|
+
`;case`t`:return` `;case`r`:return`\r`;case`"`:return`"`;case`\\`:return`\\`;case`a`:return`\x07`;case`b`:return`\b`;case`f`:return`\f`;case`v`:return`\v`;default:return t}})}var xN=/\{sound:([^{}\r\n]+)\}/g;function SN(e){let t=[],n=``,r=0,i;for(xN.lastIndex=0;(i=xN.exec(e))!==null;){n+=e.slice(r,i.index);let a=i[1].trim();a===``?n+=i[0]:t.push({path:a,index:n.length}),r=i.index+i[0].length}return n+=e.slice(r),{text:n,cues:t}}function CN(e){return SN(e).text}function wN(){return{format(e,t){let n=e.params;if(t===`audio`){let t=`${e.type}.audio`;return zP(t)?DP(t,n):``}let r=`${e.type}.${t}`;return zP(r)?OP(r,n):OP(e.type,n)}}}function TN(e,t){return new Intl.NumberFormat(TP(),t).format(e)}function EN(e,t){return new Intl.DateTimeFormat(TP(),t).format(e)}function DN(e,t){return new Intl.ListFormat(TP(),t).format(e)}var ON=/\{(?!sound:)(\w+(?:\.\w+)*)(=)?(?:!([sra]))?(?::([^{}]*))?\}/g;function kN(e){let t=[];ON.lastIndex=0;let n=0,r;for(;(r=ON.exec(e))!==null;){r.index>n&&t.push(e.slice(n,r.index));let i=r[1],a=r[3],o=r[4];t.push({raw:r[0],token:i,debug:r[2]===`=`,conv:a,spec:o}),n=r.index+r[0].length}return n<e.length&&t.push(e.slice(n)),t}function AN(e){return`${e.debug?`=`:``}${e.conv?`!${e.conv}`:``}${e.spec===void 0?``:`:${e.spec}`}`}function jN(e,t){let n=new Map,r=new Map;for(let t of kN(e))typeof t!=`string`&&n.set(t.token,AN(t));for(let e of kN(t))typeof e!=`string`&&r.set(e.token,AN(e));return{missing:[...n.keys()].filter(e=>!r.has(e)),extra:[...r.keys()].filter(e=>!n.has(e)),changed:[...n].flatMap(([e,t])=>{let n=r.get(e);return n!==void 0&&n!==t?[{token:e,base:t,target:n}]:[]})}}var MN=/^(?:(.)?([<>=^]))?([+\- ])?(z)?(#)?(0)?(\d+)?([,_])?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/,NN={b:2,o:8,x:16,X:16},PN={b:`0b`,o:`0o`,x:`0x`,X:`0X`},FN=new Set([`f`,`F`,`e`,`E`,`g`,`G`,`%`,`n`]);function IN(e){return Number.isNaN(e)?`nan`:e===1/0?`inf`:e===-1/0?`-inf`:Object.is(e,-0)?`-0.0`:String(e)}function LN(e,t,n=3,r=`\\d`){return e.replace(RegExp(`\\B(?=(${r}{${n}})+(?!${r}))`,`g`),t)}function RN(e,t){let n=/^(\d+)/.exec(e);return n?LN(n[1],t)+e.slice(n[1].length):e}function zN(e,t,n,r){if(e.length>=t)return e;let i=n.repeat(t-e.length);return r===`<`?e+i:r===`^`?i.slice(0,Math.floor(i.length/2))+e+i.slice(Math.floor(i.length/2)):i+e}function BN(e){return e.replace(/([eE][+-])(\d)$/,`$10$2`)}function VN(e,t,n,r,i){let a=t===0?1:t;if(e===0)return r?`0.${`0`.repeat(a-1)}`:`0`;let o=Math.floor(Math.log10(e)),s;return o>=-4&&o<(i??a)?(s=e.toFixed(a-1-o),r||(s=s.replace(/(\.\d*?)0+$/,`$1`).replace(/\.$/,``))):(s=BN(e.toExponential(a-1)),r||(s=s.replace(/(\.\d*?)0+(e|$)/,`$1$2`).replace(/\.e/i,`e`))),n?s.toUpperCase():s}function HN(e){let t=`,`,n=`.`;for(let r of new Intl.NumberFormat(e).formatToParts(1000.5))r.type===`group`&&(t=r.value),r.type===`decimal`&&(n=r.value);return{group:t,decimal:n}}function UN(e,t,n,r,i,a){return zN(a===void 0?e:e.slice(0,a),i,t??(r?`0`:` `),n??`<`)}function WN(e,t,n=`en`){if(t===``)return typeof e==`number`?IN(e):e;let r=MN.exec(t);if(!r)return;let[i,a,o,s,c,l,u,d,f,p]=r.slice(1),m=f===void 0?void 0:Number(f),h=u===void 0?0:Number(u);if(typeof e==`string`)return o||s||c||d||a===`=`||p!==void 0&&p!==`s`?void 0:UN(e,i,a,l,h,m);if(p===`s`)return;if(p===`c`){if(o||c||l||d||m!==void 0)return;let t=Math.trunc(e);return t<0||t>1114111?void 0:zN(String.fromCodePoint(t),h,i??` `,a??`>`)}if(!Number.isFinite(e)){if(p!==void 0&&!FN.has(p))return;let t=Number.isNaN(e)?`nan`:`inf`;return(p===`F`||p===`E`||p===`G`)&&(t=t.toUpperCase()),p===`%`&&(t+=`%`),zN((e<0?`-`:o===`+`?`+`:o===` `?` `:``)+t,h,i??` `,a??`>`)}let g=e<0||Object.is(e,-0);s&&e===0&&(g=!1);let _=Math.abs(e),v=d===`,`?`,`:d===`_`?`_`:``,y;if(p===void 0){if(m!==void 0){if(Number.isInteger(_))return;y=VN(_,m,!1,!!c,m-1)}else y=IN(_);v&&(y=RN(y,v))}else if(p===`d`){if(m!==void 0||!Number.isInteger(_))return;y=String(Math.trunc(_)),v&&(y=LN(y,v))}else if(p in NN){if(m!==void 0||!Number.isInteger(_)||d===`,`)return;y=Math.trunc(_).toString(NN[p]),p===`X`&&(y=y.toUpperCase()),v&&(y=LN(y,v,4,`[0-9a-fA-F]`)),c&&(y=PN[p]+y)}else if(p===`n`){if(d||m!==void 0&&Number.isInteger(_))return;if(Number.isInteger(_))y=new Intl.NumberFormat(n).format(Math.trunc(_));else{let{group:e,decimal:t}=HN(n),r=VN(_,m??6,!1,!!c),i=r.split(`e`)[0],a=r.slice(i.length);y=RN(i,e).replace(`.`,t)+a}}else if(p===`f`||p===`F`)y=_.toFixed(m??6),v&&(y=RN(y,v));else if(p===`e`||p===`E`)y=BN(_.toExponential(m??6)),p===`E`&&(y=y.toUpperCase()),v&&(y=RN(y,v));else if(p===`g`||p===`G`)y=VN(_,m??6,p===`G`,!!c),v&&(y=RN(y,v));else{let e=_*100;y=(Number.isFinite(e)?e.toFixed(m??6):`inf`)+`%`,v&&Number.isFinite(e)&&(y=RN(y,v))}let b=g?`-`:o===`+`?`+`:o===` `?` `:``,x=i??(l&&!a?`0`:` `),S=a??(l&&!a?`=`:`>`);return S===`=`?b+zN(y,h-b.length,x,`>`):zN(b+y,h,x,S)}function GN(e,t){let n=new Set(Object.keys(e.messages)),r=new Set(Object.keys(t.messages));return{missing:[...n].filter(e=>!r.has(e)),extra:[...r].filter(e=>!n.has(e))}}function KN(e){let t=[];for(let[n,r]of Object.entries(e.messages)){if(typeof r==`string`){r===``&&t.push({key:n,kind:`empty-message`,detail:`message resolves to an empty string`});continue}qN(r)&&r.other===void 0&&t.push({key:n,kind:`plural-missing-other`,detail:`plural forms have no "other" branch`})}return t}function qN(e){return typeof e==`object`&&!!e&&!(`format`in e)}function JN(e){let t=[];for(let[n,r]of Object.entries(e.messages))n.endsWith(`.audio`)&&(typeof r==`string`?r===``&&t.push({key:n,kind:`empty-audio-path`,detail:`an empty audio entry already means "no sound"; remove the key instead`}):t.push({key:n,kind:`audio-not-a-path`,detail:`an audio entry must be a plain path string, not plural forms or a select message`}));return t}function YN(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`format`in e)try{return e.format()}catch{return``}let t=e;return t.other??Object.values(t)[0]??``}function XN(e,t){if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let n=Array.from({length:t.length+1},(e,t)=>t),r=Array(t.length+1);for(let i=1;i<=e.length;i++){r[0]=i;for(let a=1;a<=t.length;a++){let o=e[i-1]===t[a-1]?0:1;r[a]=Math.min(n[a]+1,r[a-1]+1,n[a-1]+o)}[n,r]=[r,n]}return n[t.length]}function ZN(e,t=.8){let n=Object.entries(e.messages).map(([e,t])=>[e,YN(t)]).filter(([,e])=>e.length>0),r=[];for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let[a,o]=n[e],[s,c]=n[i],l=Math.max(o.length,c.length),u=XN(o,c),d=l===0?1:1-u/l;d>=t&&r.push({a,b:s,distance:u,similarity:d})}return r.sort((e,t)=>t.similarity-e.similarity)}function QN(e,t){let n=new Set(t),r=Object.keys(e.messages),i=r.filter(e=>!n.has(e));return{totalKeys:r.length,usedKeys:r.length-i.length,unusedKeys:i}}function $N(e,t){let n=Object.keys(e.messages);if(n.length===0)return 1;let{missing:r}=GN(e,t);return(n.length-r.length)/n.length}function eP(e){let t={},n=0;for(let r of Object.values(e.messages))if(!(typeof r==`string`||typeof r==`object`&&r&&`format`in r)){n++;for(let e of Object.keys(r))t[e]=(t[e]??0)+1}return{pluralKeys:n,formsPresent:t}}function tP(e,t,n){if(!(t in e.messages))throw Error(`mergeCatalogKeys: "${t}" is not a key in this catalog`);if(!(n in e.messages))throw Error(`mergeCatalogKeys: "${n}" is not a key in this catalog`);if(t===n)throw Error(`mergeCatalogKeys: survivingKey and mergedKey must be different keys`);let r={...e.messages};return delete r[n],{...e,messages:r}}function nP(e,t){return{base:e,target:t}}var rP=`.audio`;function iP(e){return e.endsWith(rP)}function aP(e){return[...new Set([...Object.keys(e.base.messages),...Object.keys(e.target.messages)])].filter(e=>!iP(e)).sort()}function oP(e){if(e===void 0)return;let t=YN(e);return t===``?void 0:t}var sP=[`log`,`compact`,`accessibility`,`debug`];function cP(e){let t=e.lastIndexOf(`.`);if(!(t<=0||!sP.includes(e.slice(t+1))))return`${e.slice(0,t)}${rP}`}function lP(e,t){let n=e.base.messages[t],r=e.target.messages[t],i=n!==void 0&&r!==void 0?`ok`:n===void 0?`extra`:`missing`,a=[`${t}${rP}`],o=cP(t);o&&a.push(o);let s,c,l=!1;for(let t of a){let n=oP(e.target.messages[t]);if(n!==void 0){s=n,c=t;break}let r=oP(e.base.messages[t]);if(r!==void 0){s=r,c=t,l=!0;break}}return{key:t,baseText:n===void 0?``:YN(n),targetText:r===void 0?``:YN(r),status:i,sound:s,soundKey:c,soundInherited:l}}function uP(e,t){let n=`${t}${rP}`;return n in e.target.messages||n in e.base.messages?n:cP(t)??n}function dP(e,t={}){let n=t.query?.toLowerCase()??``;return aP(e).map(t=>lP(e,t)).filter(e=>!t.missingOnly||e.status===`missing`).filter(e=>n===``||e.key.toLowerCase().includes(n)||e.baseText.toLowerCase().includes(n)||e.targetText.toLowerCase().includes(n))}function fP(e,t,n){let r=e.target.messages[t]??e.base.messages[t],i=n;if(r!==void 0&&typeof r==`object`&&!(`format`in r))try{let e=JSON.parse(n);typeof e==`object`&&e&&!Array.isArray(e)&&(i=e)}catch{}return{...e,target:{...e.target,messages:{...e.target.messages,[t]:i}}}}function pP(e,t){let n=e.base.messages[t];if(n===void 0)throw Error(`copyFromBase: "${t}" is not a key in the base catalog`);return{...e,target:{...e.target,messages:{...e.target.messages,[t]:n}}}}function mP(e,t){if(!(t in e.target.messages))throw Error(`deleteTargetKey: "${t}" is not a key in the target catalog`);let n={...e.target.messages};return delete n[t],{...e,target:{...e.target,messages:n}}}function hP(e,t,n){let r={...e.target.messages},i=uP(e,t);return n===``?delete r[i]:r[i]=n,{...e,target:{...e.target,messages:r}}}function gP(e){let t=e=>({...e,messages:Object.fromEntries(Object.entries(e.messages).filter(([e])=>!iP(e)))});return $N(t(e.base),t(e.target))}function _P(e){return{base:e.target,target:e.base}}var vP=l({AUDIO_SUFFIX:()=>rP,catalogCompleteness:()=>$N,catalogUsage:()=>QN,copyFromBase:()=>pP,createCatalogFormatter:()=>wN,createEditSession:()=>nP,cueKeyFor:()=>uP,deleteTargetKey:()=>mP,diffCatalogKeys:()=>GN,diffPlaceholders:()=>jN,direction:()=>EP,findSimilarMessages:()=>ZN,formatDate:()=>EN,formatList:()=>DN,formatNumber:()=>TN,formatSpec:()=>WN,has:()=>zP,isAudioKey:()=>iP,levenshteinDistance:()=>XN,locale:()=>TP,mergeCatalogKeys:()=>tP,messageText:()=>YN,nonBreakingUnit:()=>FP,parseFTL:()=>mN,parsePo:()=>_N,parseSoundMarkers:()=>SN,pluralFormCoverage:()=>eP,reset:()=>qP,sessionCompleteness:()=>gP,sessionKeys:()=>aP,sessionRow:()=>lP,sessionRows:()=>dP,setActive:()=>wP,setBase:()=>CP,setTargetSound:()=>hP,setTargetText:()=>fP,stripSoundMarkers:()=>CN,swapSession:()=>_P,t:()=>OP,tRaw:()=>DP,tokenizeMessage:()=>kN,typographic:()=>PP,validateCatalog:()=>KN,validateMessageAudio:()=>JN}),yP=null,bP=null,xP=null,SP=null;function CP(e){yP=e}function wP(e){bP=e,xP=e?new Intl.PluralRules(e.locale):null}function TP(){return(bP??yP)?.locale??`en`}function EP(){return(bP??yP)?.direction??`ltr`}function DP(e,t){let n=bP?.messages[e]??yP?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:VP(n)?n.format(t):BP(n,t?.count);return t?HP(r,t):r}function OP(e,t){if(!zP(e))return e;let n=DP(e,t),r=(bP??yP)?.typography===!1?n:PP(n,TP());return EP()===`rtl`?`${r}`:r}var kP=` `,AP=`\xA0`,jP=[`Chapitre`,`Tome`,`Livre`,`Partie`,`Section`,`Article`,`Acte`,`Scène`,`Niveau`,`Manche`,`Round`,`Étape`,`Volume`,`Figure`,`Page`,`Numéro`],MP=[`Nr`,`Dr`,`Bd`,`Kap`,`Art`,`Abb`,`Str`,`Tel`],NP=[`kg`,`g`,`mg`,`t`,`km`,`m`,`cm`,`mm`,`l`,`ml`,`h`,`min`,`s`,`%`,`°C`,`€`];function PP(e,t=TP()){let n=t.split(`-`)[0].toLowerCase(),r=e;return(n===`fr`||n===`it`||n===`nl`)&&(r=r.replace(/([\p{L}])'(?=[\p{L}])/gu,`$1’`)),n===`fr`&&(r=IP(r)),n===`de`&&(r=LP(r)),r}function FP(e,t,n=TP()){let r=n.split(`-`)[0].toLowerCase();return`${e}${r===`fr`?kP:r===`de`?AP:` `}${t}`}function IP(e){let t=e.replace(/\s?([;!?])/g,`${kP}$1`).replace(/«\s?/g,`«${kP}`).replace(/\s?»/g,`${kP}»`);t=t.replace(/(?<!\{soun)(\p{L})\s?:/gu,`$1${kP}:`);let n=RegExp(`\\b(${jP.join(`|`)})\\s+(?=\\d)`,`g`);return t.replace(n,`$1${AP}`)}function LP(e){let t=RegExp(`(\\d)\\s+(?=(?:${NP.map(RP).join(`|`)})(?![\\p{L}\\p{N}]))`,`gu`),n=RegExp(`\\b(${MP.join(`|`)})\\.\\s+`,`g`);return e.replace(t,`$1${AP}`).replace(n,`$1.${AP}`)}function RP(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function zP(e){return bP?.messages[e]!==void 0||yP?.messages[e]!==void 0}function BP(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(xP??(SP??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function VP(e){return`format`in e}function HP(e,t){return kN(e).map(e=>typeof e==`string`?e:WP(e,t)).join(``)}function UP(e,t){let n=e[t];if(typeof n==`string`||typeof n==`number`)return n;let r=e;for(let e of t.split(`.`)){if(typeof r!=`object`)return;r=r[e]}return typeof r==`string`||typeof r==`number`?r:void 0}function WP(e,t){let n=UP(t,e.token);if(n===void 0)return e.raw;try{let t=e.conv===void 0?n:GP(n,e.conv),r=e.spec===void 0?String(t):WN(t,e.spec,TP());return r===void 0?e.raw:e.debug?`${e.token}=${r}`:r}catch{return e.raw}}function GP(e,t){if(t===`s`)return String(e);if(typeof e==`number`){let n=WN(e,``,`en`)??String(e);return t===`a`?KP(n):n}let n=`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}'`;return t===`a`?KP(n):n}function KP(e){let t=``;for(let n of e){let e=n.codePointAt(0)??0;t+=e>127?e>65535?`\\U${e.toString(16).padStart(8,`0`)}`:`\\u${e.toString(16).padStart(4,`0`)}`:n}return t}function qP(){yP=null,bP=null,xP=null}var JP=class extends cN{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.reveal=mM(0),this.pageText=``,this.pageCues=[],this.nextCue=0,this.portrait=null,this.portraitLayer=new J,this.choiceList=null,this.finished=!1,this.autoAdvanceElapsed=0,this.messageThemeListener=()=>this.restyleMessage(),this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.mode=e.mode??`adv`,this.autoAdvance=e.autoAdvance,this.choices=e.choices??[],this.onDone=e.onDone??null,this.onSound=e.onSound??null,this.announce=e.announce??!0;let t=$();this.content.addChild(this.portraitLayer),this.speakerLabel=new vM({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new vM({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new vM({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0),uM.add(this.messageThemeListener)}restyleMessage(){let e=$();this.speakerLabel.setColor(e.color.textHighlight),this.prompt.setColor(e.color.textDim)}destroy(e){uM.remove(this.messageThemeListener),super.destroy(e)}showPage(e){let t=this.pages[e],n=$(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new $s(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=this.mode===`adv`&&t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=this.mode===`adv`&&t.speaker!==void 0?this.speakerLabel.height+n.spacing:0,this.body.style.wordWrapWidth=Math.max(16,a);let o=SN(t.text);this.pageText=o.text,this.pageCues=o.cues,this.nextCue=0,this.announce&&sN.announce(t.speaker===void 0?this.pageText:`${t.speaker}: ${this.pageText}`),this.reveal=mM(this.pageText.length,this.speed),this.autoAdvanceElapsed=0,this.playRevealedSounds(),this.renderBody(),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}renderBody(){if(this.mode===`adv`){this.body.setText(this.pageText.slice(0,Math.floor(this.reveal.revealed)));return}let e=this.pages.slice(0,this.pageIndex).map(e=>this.formatLine(e,SN(e.text).text)),t=this.pages[this.pageIndex];e.push(this.formatLine(t,this.pageText.slice(0,Math.floor(this.reveal.revealed)))),this.body.setText(e.join(`
|
|
1338
1338
|
|
|
1339
|
-
`))}formatLine(e,t){return e.speaker===void 0?t:`${e.speaker}: ${t}`}playRevealedSounds(){let e=Math.floor(this.reveal.revealed);for(;this.nextCue<this.pageCues.length&&this.pageCues[this.nextCue].index<=e;)this.onSound?.(this.pageCues[this.nextCue].path),this.nextCue++}get pageComplete(){return
|
|
1340
|
-
`){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 XP=class extends J{constructor(e){super(),this.themeListener=e=>this.build(e),this.opts=e,this.build($()),lM.add(this.themeListener)}build(e){this.removeChildren().forEach(e=>e.destroy());let t=this.opts.size??e.font.size,n=Math.ceil(t*e.font.lineHeight),r=YP(this.opts.text,{lineHeight:n,columnHeight:this.opts.columnHeight,rotate:this.opts.rotate});for(let n of r){let r=new TO({text:n.char,style:{fontFamily:e.font.family,fontSize:t,fill:this.opts.color??e.color.text}});n.rotate&&(r.anchor.set(.5),r.rotation=Math.PI/2),r.x=n.x,r.y=n.y,this.addChild(r)}}destroy(e){lM.remove(this.themeListener),super.destroy(e)}};function ZP(e,t=0,n=1){return n>t?Math.max(0,Math.min(1,(e-t)/(n-t))):0}function QP(e,t=0,n=1,r=0){let i=t+Math.max(0,Math.min(1,e))*(n-t);if(!(r>0))return i;let a=(String(r).split(`.`)[1]??``).length,o=t+Math.round((i-t)/r)*r;return Number(Math.max(t,Math.min(n,o)).toFixed(a))}var $P=class extends J{constructor(e){super(),this.onChange=new p,this.track=new ww,this.fill=new ww,this.knob=new ww,this.dragging=!1,this.themeListener=()=>this.draw(),this.handleDown=e=>{this.disabled_||(this.dragging=!0,this.setFraction(this.fractionAt(this.toLocal(e.global).x)))},this.handleMove=e=>{this.dragging&&!this.disabled_&&this.setFraction(this.fractionAt(this.toLocal(e.global).x))},this.handleUp=()=>{this.dragging=!1},this.width_=e.width,this.height_=e.height??6,this.knobSize=e.knobSize??Math.max(12,this.height_*2),this.min=e.min??0,this.max=e.max??1,this.step=e.step??0,this.value_=this.snap(e.value??this.min),this.disabled_=e.disabled??!1,this.addChild(this.track),this.addChild(this.fill),this.addChild(this.knob),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointerdown`,this.handleDown),this.on(`pointermove`,this.handleMove),this.on(`pointerup`,this.handleUp),this.on(`pointerupoutside`,this.handleUp),lM.add(this.themeListener)}get value(){return this.value_}get fraction(){return ZP(this.value_,this.min,this.max)}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){let t=this.snap(e);if(t===this.value_){this.draw();return}this.value_=t,this.draw(),this.onChange.dispatch(t)}setFraction(e){this.setValue(QP(e,this.min,this.max,this.step))}resize(e,t){this.width_=e,this.height_=t,this.draw()}get trackLength(){return Math.max(0,this.width_-this.knobSize)}snap(e){return QP(ZP(e,this.min,this.max),this.min,this.max,this.step)}fractionAt(e){return this.trackLength>0?Math.max(0,Math.min(1,(e-this.knobSize/2)/this.trackLength)):0}draw(){let e=$(),t=this.disabled_?e.color.textDim:e.color.textHighlight,n=e.color.panelFill,r=(this.knobSize-this.height_)/2;this.track.clear().roundRect(0,r,this.width_,this.height_,this.height_/2).fill({color:n});let i=this.knobSize/2+this.fraction*this.trackLength;this.fill.clear(),i>this.knobSize/2&&this.fill.roundRect(this.knobSize/2,r,i-this.knobSize/2,this.height_,this.height_/2).fill({color:t}),this.knob.clear().circle(i,this.knobSize/2,this.knobSize/2).fill({color:t})}destroy(e){lM.remove(this.themeListener),super.destroy(e)}},eF=class extends J{constructor(e={}){super(),this.onChange=new p,this.box=new ww,this.themeListener=()=>this.draw(),this.handleTap=()=>{this.disabled_||this.toggle()},this.size_=e.size??20,this.checked_=e.checked??!1,this.disabled_=e.disabled??!1,this.addChild(this.box),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),lM.add(this.themeListener)}get checked(){return this.checked_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setChecked(e){if(e===this.checked_){this.draw();return}this.checked_=e,this.draw(),this.onChange.dispatch(e)}toggle(){this.setChecked(!this.checked_)}resize(e){this.size_=e,this.draw()}draw(){let e=$(),t=this.disabled_?e.color.textDim:e.color.textHighlight;if(this.box.clear().roundRect(0,0,this.size_,this.size_,4).fill({color:e.color.panelFill}).stroke({color:this.disabled_?e.color.textDim:e.color.panelBorder,width:2}),this.checked_){let e=this.size_*.25;this.box.moveTo(e,this.size_*.55).lineTo(this.size_*.45,this.size_-e).lineTo(this.size_-e,e).stroke({color:t,width:Math.max(2,this.size_*.12),cap:`round`,join:`round`})}}destroy(e){lM.remove(this.themeListener),super.destroy(e)}};function tF(e,t,n,r,i=1,a=!1){if(!(r>n))return n;let o=i>0?i:1,s=(String(o).split(`.`)[1]??``).length,c=Math.round((e-n)/o)+Math.round(t),l=Math.round((r-n)/o)+1,u=c;return u=a?(u%l+l)%l:Math.max(0,Math.min(l-1,u)),Number((n+u*o).toFixed(s))}var nF=class extends J{constructor(e={}){super(),this.onChange=new p,this.face=new ww,this.themeListener=()=>this.draw(),this.handleTap=e=>{this.disabled_||(this.toLocal(e.global).y<this.height_/2?this.increment():this.decrement())},this.width_=e.width??24,this.height_=e.height??32,this.min=e.min??0,this.max=e.max??9,this.step=e.step??1,this.wrap=e.wrap??!1,this.disabled_=e.disabled??!1,this.value_=tF(e.value??this.min,0,this.min,this.max,this.step,!1),this.addChild(this.face),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),lM.add(this.themeListener)}get value(){return this.value_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){this.commit(tF(e,0,this.min,this.max,this.step,this.wrap))}increment(){this.commit(tF(this.value_,1,this.min,this.max,this.step,this.wrap))}decrement(){this.commit(tF(this.value_,-1,this.min,this.max,this.step,this.wrap))}resize(e,t){this.width_=e,this.height_=t,this.draw()}commit(e){if(e===this.value_){this.draw();return}this.value_=e,this.draw(),this.onChange.dispatch(e)}draw(){let e=$(),t=this.disabled_?e.color.textDim:e.color.textHighlight;this.face.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:e.color.panelFill}).stroke({color:e.color.panelBorder,width:1});let n=this.width_/2,r=Math.min(this.width_/4,this.height_/5);this.face.moveTo(n-r,r*1.6).lineTo(n,r*.6).lineTo(n+r,r*1.6).closePath().fill({color:t}),this.face.moveTo(n-r,this.height_-r*1.6).lineTo(n,this.height_-r*.6).lineTo(n+r,this.height_-r*1.6).closePath().fill({color:t})}destroy(e){lM.remove(this.themeListener),super.destroy(e)}},rF=class{constructor(e){this.onChange=new p,this.open_=!1,this.options_=[...e.options],this.disabled_=e.disabled??!1;let t=e.selectedIndex??this.firstEnabled();this.current=this.options_[t]?.disabled?this.firstEnabled():t,this.highlight_=this.current}get options(){return this.options_}get selectedIndex(){return this.current}get selected(){return this.options_[this.current]??null}get isOpen(){return this.open_}get disabled(){return this.disabled_}get highlight(){return this.highlight_}setDisabled(e){this.disabled_=e,e&&(this.open_=!1)}setOptions(e){this.options_=[...e],this.current=this.firstEnabled(),this.highlight_=this.current,this.open_=!1}open(){this.disabled_||this.open_||(this.open_=!0,this.highlight_=this.current)}close(){this.open_=!1}toggleOpen(){this.open_?this.close():this.open()}move(e){if(!this.open_||this.options_.length===0)return;let t=this.options_.length,n=this.highlight_;for(let r=0;r<t;r++)if(n=((n+e)%t+t)%t,!this.options_[n].disabled){this.highlight_=n;return}}setHighlight(e){e<0||e>=this.options_.length||this.options_[e].disabled||(this.highlight_=e)}confirm(){if(!this.open_)return!1;let e=this.options_[this.highlight_];return!e||e.disabled?!1:(this.open_=!1,this.highlight_!==this.current&&(this.current=this.highlight_,this.onChange.dispatch({option:e,index:this.current})),!0)}cancel(){this.open_=!1,this.highlight_=this.current}firstEnabled(){let e=this.options_.findIndex(e=>!e.disabled);return e===-1?0:e}},iF=class{constructor(e={}){this.text=e.value??``,this.maxLength=e.maxLength,this.mask=e.mask??!1,this.maskCharacter=e.maskCharacter??`•`,this.caretIndex=this.text.length,this.anchor=this.caretIndex}get value(){return this.text}get maskedValue(){return this.mask?this.maskCharacter.repeat(this.text.length):this.text}get length(){return this.text.length}get caret(){return this.caretIndex}get selectionStart(){return Math.min(this.caretIndex,this.anchor)}get selectionEnd(){return Math.max(this.caretIndex,this.anchor)}get hasSelection(){return this.caretIndex!==this.anchor}get selectedText(){return this.text.slice(this.selectionStart,this.selectionEnd)}setValue(e){this.text=this.limit(e),this.caretIndex=this.text.length,this.anchor=this.caretIndex}setCaret(e,t=!1){this.caretIndex=Math.max(0,Math.min(this.text.length,e)),t||(this.anchor=this.caretIndex)}insert(e){e.length!==0&&this.replaceSelection(e)}backspace(){if(this.hasSelection){this.replaceSelection(``);return}this.caretIndex!==0&&(this.text=this.text.slice(0,this.caretIndex-1)+this.text.slice(this.caretIndex),this.setCaret(this.caretIndex-1))}deleteForward(){if(this.hasSelection){this.replaceSelection(``);return}this.caretIndex>=this.text.length||(this.text=this.text.slice(0,this.caretIndex)+this.text.slice(this.caretIndex+1),this.setCaret(this.caretIndex))}moveCaret(e,t=!1){this.setCaret(this.caretIndex+e,t)}moveToStart(e=!1){this.setCaret(0,e)}moveToEnd(e=!1){this.setCaret(this.text.length,e)}selectAll(){this.anchor=0,this.caretIndex=this.text.length}clearSelection(){this.anchor=this.caretIndex}replaceSelection(e){let t=this.selectionStart,n=this.selectionEnd,r=this.text.slice(0,t)+this.text.slice(n),i=this.maxLength!==void 0&&r.length+e.length>this.maxLength?e.slice(0,Math.max(0,this.maxLength-r.length)):e;this.text=this.text.slice(0,t)+i+this.text.slice(n),this.setCaret(t+i.length)}limit(e){return this.maxLength!==void 0&&e.length>this.maxLength?e.slice(0,this.maxLength):e}},aF=class{constructor(e){this.onChange=new p,this.current=0,this.sortKey_=null,this.ascending=!0,this.columns_=[...e.columns],this.rows_=[...e.rows??[]],this.pageSize_=e.pageSize??0,this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get columns(){return this.columns_}get rows(){return this.rows_}get pageSize(){return this.pageSize_}get sortKey(){return this.sortKey_}get sortAscending(){return this.ascending}get selectedIndex(){return this.current}get selected(){return this.rows_[this.current]??null}get page(){return this.pageSize_>0?Math.floor(this.current/this.pageSize_):0}get pageCount(){return this.pageSize_>0?Math.max(1,Math.ceil(this.rows_.length/this.pageSize_)):1}get pageRows(){if(this.pageSize_<=0)return this.rows_;let e=this.page*this.pageSize_;return this.rows_.slice(e,e+this.pageSize_)}setRows(e){this.rows_=[...e],this.current=this.firstEnabled(),this.onChange.dispatch()}setColumns(e){this.columns_=[...e],this.sortKey_&&!this.columns_.some(e=>e.key===this.sortKey_)&&(this.sortKey_=null),this.onChange.dispatch()}setPageSize(e){this.pageSize_=Math.max(0,e),this.onChange.dispatch()}sortBy(e){let t=this.columns_.find(t=>t.key===e);if(!t)return;this.sortKey_===e?this.ascending=!this.ascending:(this.sortKey_=e,this.ascending=!0);let n=t.compare??((t,n)=>sF(oF(t,e),oF(n,e)));this.rows_.sort((e,t)=>(this.ascending?1:-1)*n(e,t)),this.current=this.firstEnabled(),this.onChange.dispatch()}select(e){e<0||e>=this.rows_.length||this.disabledOf(this.rows_[e])||(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows_.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows_[n])){this.current=n,this.onChange.dispatch();return}}}setPage(e){if(this.pageSize_<=0)return;let t=Math.max(0,Math.min(this.pageCount-1,e))*this.pageSize_,n=Math.min(t+this.pageSize_,this.rows_.length);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e])){this.current=e,this.onChange.dispatch();return}}nextPage(e=1){this.setPage(this.page+e)}firstEnabled(){let e=this.rows_.findIndex(e=>!this.disabledOf(e));return e===-1?0:e}};function oF(e,t){return e&&typeof e==`object`?e[t]:void 0}function sF(e,t){return e===t?0:e===void 0?-1:t===void 0?1:typeof e==`number`&&typeof t==`number`?e-t:String(e).localeCompare(String(t))}var cF=class{constructor(e){this.onChange=new p,this.expanded=new Set,this.current=0,this.roots_=e.roots;for(let t of e.expanded??[])this.expanded.add(t);this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get roots(){return this.roots_}get rows(){let e=[],t=(n,r)=>{for(let i of n){let n=(i.children?.length??0)>0,a=n&&this.expanded.has(i.id);e.push({node:i,depth:r,expanded:a,hasChildren:n}),a&&t(i.children,r+1)}};return t(this.roots_,0),e}get selectedIndex(){return this.current}get selected(){return this.rows[this.current]?.node??null}isExpanded(e){return this.expanded.has(e)}expand(e){this.expanded.has(e)||(this.expanded.add(e),this.onChange.dispatch())}collapse(e){if(!this.expanded.has(e))return;let t=this.rows[this.current]?.node.id;if(this.expanded.delete(e),t!==void 0&&!this.rows.some(e=>e.node.id===t)){let t=this.rows.findIndex(t=>t.node.id===e);t>=0&&(this.current=t)}this.onChange.dispatch()}toggle(e){this.expanded.has(e)?this.collapse(e):this.expand(e)}expandAll(){let e=t=>{for(let n of t)n.children?.length&&(this.expanded.add(n.id),e(n.children))};e(this.roots_),this.onChange.dispatch()}collapseAll(){this.expanded.clear(),this.select(0),this.onChange.dispatch()}select(e){let t=this.rows[e];t&&!this.disabledOf(t.node)&&(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows[n].node)){this.current=n,this.onChange.dispatch();return}}}firstEnabled(){let e=this.rows.findIndex(e=>!this.disabledOf(e.node));return e===-1?0:e}};function lF(e,t,n){return Math.max(0,Math.min(Math.max(0,t-n),e))}var uF=class extends J{constructor(e){super(),this.onChange=new p,this.content=new J,this.maskShape=new ww,this.track=new ww,this.thumb=new ww,this.themeListener=()=>this.draw(),this.handleWheel=e=>{this.scrollBy(e.deltaY)},this.width_=e.width,this.height_=e.height,this.contentHeight_=Math.max(0,e.contentHeight??0),this.offset_=lF(e.offset??0,this.contentHeight_,this.height_),this.addChild(this.content),this.addChild(this.maskShape),this.addChild(this.track),this.addChild(this.thumb),this.content.mask=this.maskShape,this.eventMode=`static`,this.on(`wheel`,this.handleWheel),this.draw(),lM.add(this.themeListener)}get offset(){return this.offset_}get contentHeight(){return this.contentHeight_}get viewportHeight(){return this.height_}get maxOffset(){return Math.max(0,this.contentHeight_-this.height_)}get scrollable(){return this.maxOffset>0}setContentHeight(e){this.contentHeight_=Math.max(0,e),this.setOffset(lF(this.offset_,this.contentHeight_,this.height_))}resize(e,t){this.width_=e,this.height_=t,this.setOffset(lF(this.offset_,this.contentHeight_,this.height_))}scrollBy(e){this.setOffset(lF(this.offset_+e,this.contentHeight_,this.height_))}scrollTo(e){this.setOffset(lF(e,this.contentHeight_,this.height_))}scrollIntoView(e,t){e<this.offset_?this.scrollTo(e):e+t>this.offset_+this.height_&&this.scrollTo(e+t-this.height_)}setOffset(e){if(e===this.offset_){this.draw();return}this.offset_=e,this.draw(),this.onChange.dispatch(e)}draw(){let e=$();if(this.content.y=-this.offset_,this.maskShape.clear().rect(0,0,this.width_,this.height_).fill({color:16777215}),this.track.clear(),this.thumb.clear(),!this.scrollable)return;let t=this.width_-6;this.track.roundRect(t,0,6,this.height_,3).fill({color:e.color.panelFill});let n=Math.max(6,this.height_/this.contentHeight_*this.height_),r=this.offset_/this.maxOffset*(this.height_-n);this.thumb.roundRect(t,r,6,n,3).fill({color:e.color.textHighlight})}destroy(e){lM.remove(this.themeListener),super.destroy(e)}};function dF(e){switch(e){case`top`:case`bottom`:return{x:.5,y:e===`top`?0:1};case`left`:case`right`:return{x:e===`left`?0:1,y:.5};case`top-left`:return{x:0,y:0};case`top-right`:return{x:1,y:0};case`bottom-left`:return{x:0,y:1};case`bottom-right`:return{x:1,y:1};default:return{x:.5,y:.5}}}function fF(e,t,n={width:0,height:0}){let r=e.margin??0,i=t.x+r,a=t.y+r,o=Math.max(0,t.width-r*2),s=Math.max(0,t.height-r*2);if(e.anchor===`fill`){let t=i+(e.offsetX??0),n=a+(e.offsetY??0);return{x:t,y:n,width:e.width??Math.max(0,i+o-t),height:e.height??Math.max(0,a+s-n)}}let c=dF(e.anchor??`center`),l=e.alignX??c.x,u=e.alignY??c.y,d=e.width??n.width,f=e.height??n.height;return{x:i+l*Math.max(0,o-d)+(e.offsetX??0),y:a+u*Math.max(0,s-f)+(e.offsetY??0),width:d,height:f}}var pF=class{constructor(e){this.spec=e}get columns(){return this.spec.columns}get rows(){return this.spec.rows}columnSizes(e){return mF(this.spec.columns,e,this.gap)}rowSizes(e){return mF(this.spec.rows,e,this.gap)}rect(e,t,n,r={}){let i=this.columnSizes(n.width),a=this.rowSizes(n.height),o=r.columnSpan??1,s=r.rowSpan??1;return{x:n.x+gF(i,t,this.gap),y:n.y+gF(a,e,this.gap),width:_F(i,t,o,this.gap),height:_F(a,e,s,this.gap)}}get gap(){return this.spec.gap??0}};function mF(e,t,n){let r=n*Math.max(0,e.length-1),i=Math.max(0,t-r),a=e.reduce((e,t)=>e+(t.size??0),0),o=e.reduce((e,t)=>e+(t.grow??0),0),s=Math.max(0,i-a),c=0;return e.map((t,n)=>{if(t.size!==void 0)return t.size;if(!t.grow||o===0)return 0;let r=n===hF(e)?s-c:Math.floor(s*t.grow/o);return c+=r,r})}function hF(e){for(let t=e.length-1;t>=0;t--)if(e[t].grow)return t;return-1}function gF(e,t,n){let r=0;for(let i=0;i<t&&i<e.length;i++)r+=e[i]+n;return r}function _F(e,t,n,r){let i=0;for(let a=t;a<t+n&&a<e.length;a++)i+=e[a],a>t&&(i+=r);return Math.max(0,i)}var vF=[`idle`,`hover`,`pressed`,`disabled`,`selected`,`focused`],yF=class e{constructor(){this.map=new Map}static{this.ANY=`*`}define(e,t,n){let r=this.map.get(e)??{};r[t]={...r[t],...n},this.map.set(e,r)}has(e){return this.map.has(e)}widgets(){return[...this.map.keys()]}resolve(t,n=`idle`){return this.map.get(t)?.[n]??this.map.get(t)?.idle??this.map.get(e.ANY)?.[n]??this.map.get(e.ANY)?.idle??{}}statesOf(e){let t=this.map.get(e);return t?vF.filter(e=>t[e]!==void 0):[]}static from(t){let n=new e;for(let[e,r]of Object.entries(t))if(bF(r))for(let t of vF){let i=r[t];i&&n.define(e,t,i)}else n.define(e,`idle`,r);return n}};function bF(e){return vF.some(t=>e[t]!==void 0)}var xF=class extends J{constructor(e){super(),this.capturing=null,this.onKeyCaptured=e=>this.capturing?(e.preventDefault(),e.code===`Escape`?this.cancelCapture():this.finishCapture(this.capturing,e.code),!0):!1,this.actions=[...e.actions],this.labelFor=e.label??(e=>e),this.onConflict=e.onConflict??(()=>!0),this.list=new uN({width:e.width,height:e.height,rowHeight:e.rowHeight,items:this.rows()}),this.addChild(this.list)}rows(){return this.actions.map(e=>({text:this.rowText(e),value:e,disabled:this.capturing!==null&&this.capturing!==e}))}rowText(e){if(this.capturing===e)return`${this.labelFor(e)}: press a key...`;let t=Ie(e);return`${this.labelFor(e)}: ${t.length?t.join(`, `):`(unbound)`}`}refresh(){let e=this.list.selectedIndex;this.list.setItems(this.rows()),this.list.select(e)}startCapture(e){this.capturing=e,this.refresh(),queueMicrotask(()=>{this.capturing===e&&M.add(this.onKeyCaptured)})}cancelCapture(){M.remove(this.onKeyCaptured),this.capturing=null,this.refresh()}finishCapture(e,t){M.remove(this.onKeyCaptured),this.capturing=null;let n=Pe(t).filter(t=>t!==e);if(n.length>0&&!this.onConflict(t,e,n)){this.refresh();return}for(let e of n)Me(e,Ie(e).filter(e=>e!==t));Me(e,[t]),this.refresh()}get isCapturing(){return this.capturing!==null}handleAction(e){if(this.capturing)return!0;if(e===`confirm`){let e=this.list.selected?.value;return e&&this.startCapture(e),!0}return this.list.handleAction(e)}destroy(e){M.remove(this.onKeyCaptured),super.destroy(e)}},SF=class e extends J{constructor(t){super(),this.onClick=new p,this.onPress=new p,this.onRelease=new p,this.state=`idle`,this.themeListener=()=>this.draw(),this.width_=t.width,this.height_=t.height,this.disabled_=t.disabled??!1,this.skin=t.skin,this.labelOptions=t.label??{};let n=$();this.background=e.createBackground(this.skin,n),this.addChild(this.background),this.icon=t.icon??null,this.icon&&this.addChild(this.icon),this.labelText=t.text===void 0?null:new _M({align:`center`,...this.labelOptions,text:t.text}),this.labelText&&this.addChild(this.labelText),t.onClick&&this.onClick.add(t.onClick),t.onPress&&this.onPress.add(t.onPress),t.onRelease&&this.onRelease.add(t.onRelease),this.eventMode=`static`,this.on(`pointerover`,()=>this.setState(`hover`)),this.on(`pointerout`,()=>this.setState(`idle`)),this.on(`pointerdown`,()=>{this.setState(`pressed`),this.onPress.dispatch()}),this.on(`pointerup`,()=>{let e=this.state===`pressed`;this.setState(`hover`),e&&(this.onRelease.dispatch(),this.onClick.dispatch())}),this.on(`pointerupoutside`,()=>{let e=this.state===`pressed`;this.setState(`idle`),e&&this.onRelease.dispatch()}),this.setState(this.disabled_?`disabled`:`idle`),lM.add(this.themeListener)}static createBackground(e,t){return e?new rN(e.texture,{border:e.border}):t.panel?new rN(t.panel,{border:t.panelBorder}):new ww}resize(e,t){this.width_=e,this.height_=t,this.draw()}setText(e){e===void 0?(this.labelText?.destroy(),this.labelText=null):this.labelText?this.labelText.setText(e):(this.labelText=new _M({align:`center`,...this.labelOptions,text:e}),this.addChild(this.labelText)),this.layoutContent()}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.setState(e?`disabled`:`idle`)}setState(e){this.disabled_&&e!==`disabled`||(this.state=e,this.cursor=this.disabled_?`default`:`pointer`,this.eventMode=this.disabled_?`none`:`static`,this.draw())}layoutContent(){let e=$().direction===`rtl`;if(this.icon&&!this.labelText){this.icon.x=Math.round((this.width_-this.icon.width)/2),this.icon.y=Math.round((this.height_-this.icon.height)/2);return}if(this.icon&&this.labelText){let t=$().spacing,n=this.icon.width+t+this.labelText.width,r=Math.round((this.width_-n)/2);this.icon.x=e?r+this.labelText.width+t:r,this.icon.y=Math.round((this.height_-this.icon.height)/2),this.labelText.x=e?r:r+this.icon.width+t,this.labelText.y=Math.round((this.height_-this.labelText.height)/2);return}this.labelText&&(this.labelText.x=Math.round((this.width_-this.labelText.width)/2),this.labelText.y=Math.round((this.height_-this.labelText.height)/2))}draw(){let e=$(),t=this.state===`pressed`?10066329:this.state===`hover`?14540253:this.state===`disabled`?7829367:16777215;if(this.background instanceof rN)this.background.resize(this.width_,this.height_),this.background.tint=this.skin?.tints?.[this.state]??t;else{let t=this.state===`pressed`?e.color.selection:e.color.panelFill;this.background.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:t,alpha:this.state===`disabled`?.5:1}).stroke({color:e.color.panelBorder,width:1})}this.labelText?.setColor(this.disabled_?e.color.textDim:this.labelOptions.color??e.color.text),this.icon&&(this.icon.alpha=this.disabled_?.4:1),this.layoutContent()}destroy(e){lM.remove(this.themeListener),super.destroy(e)}},CF=class extends J{constructor(e){super(),this.track=new ww,this.fill=new ww,this.themeListener=()=>this.draw(),this.width_=e.width,this.height_=e.height,this.explicitColor=e.color!==void 0,this.fillColor=e.color??$().color.textHighlight,this.fraction=wF((e.value??1)/(e.max??1)),this.fillTexture=e.fillTexture,this.backgroundTexture=e.backgroundTexture,this.background_=e.background,this.roundUpToPixel=e.roundUpToPixel??!1,this.addChild(this.track),this.addChild(this.fill),this.draw(),lM.add(this.themeListener)}get value(){return this.fraction}setValue(e,t=1){this.fraction=wF(t>0?e/t:0),this.draw()}get color(){return this.fillColor}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}get background(){return this.background_??$().color.panelFill}resize(e,t){this.width_=e,this.height_=t,this.draw()}draw(){let e=$();if(this.explicitColor||(this.fillColor=e.color.textHighlight),this.track.clear().rect(0,0,this.width_,this.height_),this.track.fill(this.backgroundTexture?{texture:this.backgroundTexture}:{color:this.background}),this.fill.clear(),this.fraction>0){let t=this.width_*this.fraction,n=this.roundUpToPixel?Math.ceil(t):t,r=e.direction===`rtl`?this.width_-n:0;this.fill.rect(r,0,n,this.height_),this.fill.fill(this.fillTexture?this.explicitColor?{texture:this.fillTexture,color:this.fillColor}:{texture:this.fillTexture}:{color:this.fillColor})}}destroy(e){lM.remove(this.themeListener),super.destroy(e)}};function wF(e){return Math.max(0,Math.min(1,e))}function TF(e,t){return t<=0?1-e:t>=1||e<=t?1:1-(e-t)/(1-t)}function EF(e,t,n=!1){return n||e<=0?0:-t*e}function DF(e,t,n){return n<=0?e:Math.max(e,Math.min(n,t))}var OF=class extends J{constructor(e){super(),this.rising=new J,this.elapsed=0,this.done=!1,this.duration=e.duration??.8,this.rise=e.rise??24,this.hold=Math.min(1,Math.max(0,e.hold??0));let t=new _M({text:e.text,color:e.color,size:e.size});t.anchor.set(.5),this.rising.addChild(t),this.addChild(this.rising)}get finished(){return this.done}get riseOffset(){return this.rising.y}ageAtLeast(e){this.elapsed=DF(this.elapsed,this.duration,e)}update(e){if(this.done)return;this.elapsed=Math.min(this.duration,this.elapsed+e);let t=this.duration>0?this.elapsed/this.duration:1;this.rising.y=EF(t,this.rise,bn()),this.alpha=TF(t,this.hold),t>=1&&(this.done=!0,this.parent?.removeChild(this),this.destroy({children:!0}))}},kF=4;function AF(e){return Math.max(0,e)/5}function jF(e,t,n=4){let r=t.y-t.height/2;return e.y+e.height/2+n<=r?e.y:r-e.height/2-n}function MF(e,t,n=4){let r=[];if(t.key===void 0)return r;let i=t;for(let a=e.length-1;a>=0;a--){let o=e[a];if(o.key!==t.key)continue;let s=jF(o,i,n);if(s===o.y)break;r.push({index:a,y:s,ageAtLeast:AF(r.length+1)}),i={...o,y:s}}return r}var NF=class extends J{constructor(...e){super(...e),this.live=[]}push(e){let t=new OF({text:e.text,color:e.color,size:e.size,duration:e.duration,rise:e.rise,hold:e.hold});e.scale!==void 0&&t.scale.set(e.scale);let n={key:e.key,x:e.x,y:e.y,height:t.height};for(let e of MF(this.live.map(e=>e.entry),n)){let t=this.live[e.index];t.entry.y=e.y,t.popup.y=e.y,t.popup.ageAtLeast(e.ageAtLeast)}return t.position.set(e.x,e.y),this.addChild(t),this.live.push({popup:t,entry:n}),t}update(e){for(let{popup:t}of this.live)t.update(e);for(let e=this.live.length-1;e>=0;e--)this.live[e].popup.finished&&this.live.splice(e,1)}get count(){return this.live.length}clear(){for(let{popup:e}of this.live)this.removeChild(e),e.destroy({children:!0});this.live.length=0}},PF=class extends J{constructor(e={}){super(),this.queue=[],this.current=null,this.phase=`fadeIn`,this.elapsed=0,this.fadeIn=e.fadeIn??.25,this.hold=e.hold??1,this.fadeOut=e.fadeOut??1.75,this.scaleFrom=e.scaleFrom??2}show(e){this.queue.push(e),this.current||this.start(this.queue.shift())}get isBusy(){return this.current!==null||this.queue.length>0}start(e){this.current=e,this.phase=`fadeIn`,this.elapsed=0,this.addChild(e),e.alpha=this.fadeIn>0?0:1,e.scale.set(this.fadeIn>0?this.scaleFrom:1)}update(e){let t=this.current;if(!t)return;if(this.elapsed+=e,this.phase===`fadeIn`){let e=this.fadeIn,n=e>0?Math.min(1,this.elapsed/e):1,r=En.easeOutCubic(n);t.alpha=r,t.scale.set(this.scaleFrom+(1-this.scaleFrom)*r),n>=1&&this.advance();return}if(this.phase===`hold`){this.elapsed>=this.hold&&this.advance();return}let n=this.fadeOut,r=n>0?Math.min(1,this.elapsed/n):1;t.alpha=1-r,r>=1&&this.finish()}advance(){this.phase=this.phase===`fadeIn`?`hold`:`fadeOut`,this.elapsed=0}finish(){let e=this.current;if(!e)return;this.removeChild(e),e.destroy({children:!0}),this.current=null;let t=this.queue.shift();t&&this.start(t)}},FF=class extends J{constructor(e={}){super(),this.viewWidth=0,this.viewHeight=0,this.panelWidth=0,this.panelHeight=0,this.pending=null,this.waited=0,this.delay=e.delay??.4,this.maxWidth=e.maxWidth??200,this.offsetX=e.offset?.x??12,this.offsetY=e.offset?.y??16,this.margin=e.margin??4,this.panel=new sN({width:0,height:0,modal:!1,closable:!1,dims:!1}),this.body=new _M({text:``,wrapWidth:this.maxWidth}),this.panel.content.addChild(this.body),this.addChild(this.panel),this.visible=!1}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.visible&&this.place()}hover(e,t,n){if(this.pending&&this.pending.text===e){this.pending.x=t,this.pending.y=n,this.visible&&this.place();return}this.pending={text:e,x:t,y:n},this.waited=0,this.visible=!1}leave(){this.pending=null,this.waited=0,this.visible=!1}get isShowing(){return this.visible}get text(){return this.pending?.text??null}get panelPosition(){return{x:this.panel.x,y:this.panel.y}}get size(){return{width:this.panelWidth,height:this.panelHeight}}update(e){if(!this.pending||this.visible||(this.waited+=e,this.waited<this.delay))return!1;this.body.setText(this.pending.text);let t=$(),n=(t.panel?t.panelBorder:2)+t.padding,r=this.measureBody();return this.panelWidth=Math.ceil(r.width)+n*2,this.panelHeight=Math.ceil(r.height)+n*2,this.panel.resize(this.panelWidth,this.panelHeight),this.visible=!0,this.place(),!0}measureBody(){return{width:this.body.width,height:this.body.height}}place(){let e=this.pending;if(!e)return;let t=this.panelWidth,n=this.panelHeight,r=e.x+this.offsetX,i=e.y+this.offsetY;this.viewWidth>0&&(r+t+this.margin>this.viewWidth&&(r=e.x-this.offsetX-t),r=Math.max(this.margin,Math.min(r,Math.max(this.margin,this.viewWidth-t-this.margin)))),this.viewHeight>0&&(i+n+this.margin>this.viewHeight&&(i=e.y-this.offsetY-n),i=Math.max(this.margin,Math.min(i,Math.max(this.margin,this.viewHeight-n-this.margin)))),this.panel.x=r,this.panel.y=i}},IF=class extends J{constructor(e){super(),this.topics=e.topics;let t=e.listWidth??Math.floor(e.width/3),n=e.width-t-$().spacing,r=$().direction===`rtl`;this.list=new uN({width:t,height:e.height,items:this.topics.map(e=>({text:e.title})),onHighlight:(e,t)=>this.showBody(t),onSelect:(e,t)=>this.showBody(t)}),this.list.x=r?e.width-t:0,this.addChild(this.list),this.body=new _M({wrapWidth:n}),this.body.x=r?0:t+$().spacing,this.addChild(this.body),this.topics.length>0&&this.showBody(this.list.selectedIndex)}showBody(e){this.body.setText(this.topics[e]?.body??``)}handleAction(e){return this.list.handleAction(e)}},LF=class e extends J{constructor(t){super(),this.text=new _M({text:e.format(t.stats),wrapWidth:t.width}),this.addChild(this.text)}setStats(t,n){this.text.setText(e.format(t)),n!==void 0&&(this.text.style.wordWrapWidth=n)}static format(e){return e.map(e=>`${e.label}: ${e.value}`).join(`
|
|
1341
|
-
`)}},
|
|
1339
|
+
`))}formatLine(e,t){return e.speaker===void 0?t:`${e.speaker}: ${t}`}playRevealedSounds(){let e=Math.floor(this.reveal.revealed);for(;this.nextCue<this.pageCues.length&&this.pageCues[this.nextCue].index<=e;)this.onSound?.(this.pageCues[this.nextCue].path),this.nextCue++}get pageComplete(){return _M(this.reveal)}update(e){if(!this.finished){if(!this.pageComplete){hM(this.reveal,e),this.playRevealedSounds(),this.renderBody();return}this.prompt.visible=!this.choiceList,!(this.autoAdvance===void 0||this.choiceList)&&(this.autoAdvanceElapsed+=e,this.autoAdvanceElapsed>=this.autoAdvance&&(this.autoAdvanceElapsed=0,this.advance()))}}handleAction(e){return this.delegate?super.handleAction(e):e===`confirm`?this.pageComplete?(this.advance(),!0):(gM(this.reveal),this.playRevealedSounds(),this.renderBody(),!0):!1}advance(){if(this.pageIndex<this.pages.length-1){this.pageIndex++,this.showPage(this.pageIndex);return}if(this.choices.length>0){this.showChoices();return}this.finish(void 0)}showChoices(){let e=$(),t=this.choices.map(e=>({text:e.text,disabled:e.disabled,value:e.value??e.text}));this.announce&&sN.announce(this.choices.map(e=>e.text).join(`, `));let 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 dN({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())}},YP=/[A-Za-z0-9]/;function XP(e,t){let{lineHeight:n,columnHeight:r}=t,i=t.rotate??YP,a=[],o=0,s=0;for(let t of e){if(t===`
|
|
1340
|
+
`){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 ZP=class extends J{constructor(e){super(),this.themeListener=e=>this.build(e),this.opts=e,this.build($()),uM.add(this.themeListener)}build(e){this.removeChildren().forEach(e=>e.destroy());let t=this.opts.size??e.font.size,n=Math.ceil(t*e.font.lineHeight),r=XP(this.opts.text,{lineHeight:n,columnHeight:this.opts.columnHeight,rotate:this.opts.rotate});for(let n of r){let r=new TO({text:n.char,style:{fontFamily:e.font.family,fontSize:t,fill:this.opts.color??e.color.text}});n.rotate&&(r.anchor.set(.5),r.rotation=Math.PI/2),r.x=n.x,r.y=n.y,this.addChild(r)}}destroy(e){uM.remove(this.themeListener),super.destroy(e)}};function QP(e,t=0,n=1){return n>t?Math.max(0,Math.min(1,(e-t)/(n-t))):0}function $P(e,t=0,n=1,r=0){let i=t+Math.max(0,Math.min(1,e))*(n-t);if(!(r>0))return i;let a=(String(r).split(`.`)[1]??``).length,o=t+Math.round((i-t)/r)*r;return Number(Math.max(t,Math.min(n,o)).toFixed(a))}var eF=class extends J{constructor(e){super(),this.onChange=new p,this.track=new ww,this.fill=new ww,this.knob=new ww,this.dragging=!1,this.themeListener=()=>this.draw(),this.handleDown=e=>{this.disabled_||(this.dragging=!0,this.setFraction(this.fractionAt(this.toLocal(e.global).x)))},this.handleMove=e=>{this.dragging&&!this.disabled_&&this.setFraction(this.fractionAt(this.toLocal(e.global).x))},this.handleUp=()=>{this.dragging=!1},this.width_=e.width,this.height_=e.height??6,this.knobSize=e.knobSize??Math.max(12,this.height_*2),this.min=e.min??0,this.max=e.max??1,this.step=e.step??0,this.value_=this.snap(e.value??this.min),this.disabled_=e.disabled??!1,this.addChild(this.track),this.addChild(this.fill),this.addChild(this.knob),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointerdown`,this.handleDown),this.on(`pointermove`,this.handleMove),this.on(`pointerup`,this.handleUp),this.on(`pointerupoutside`,this.handleUp),uM.add(this.themeListener)}get value(){return this.value_}get fraction(){return QP(this.value_,this.min,this.max)}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){let t=this.snap(e);if(t===this.value_){this.draw();return}this.value_=t,this.draw(),this.onChange.dispatch(t)}setFraction(e){this.setValue($P(e,this.min,this.max,this.step))}resize(e,t){this.width_=e,this.height_=t,this.draw()}get trackLength(){return Math.max(0,this.width_-this.knobSize)}snap(e){return $P(QP(e,this.min,this.max),this.min,this.max,this.step)}fractionAt(e){return this.trackLength>0?Math.max(0,Math.min(1,(e-this.knobSize/2)/this.trackLength)):0}draw(){let e=$(),t=this.disabled_?e.color.textDim:e.color.textHighlight,n=e.color.panelFill,r=(this.knobSize-this.height_)/2;this.track.clear().roundRect(0,r,this.width_,this.height_,this.height_/2).fill({color:n});let i=this.knobSize/2+this.fraction*this.trackLength;this.fill.clear(),i>this.knobSize/2&&this.fill.roundRect(this.knobSize/2,r,i-this.knobSize/2,this.height_,this.height_/2).fill({color:t}),this.knob.clear().circle(i,this.knobSize/2,this.knobSize/2).fill({color:t})}destroy(e){uM.remove(this.themeListener),super.destroy(e)}},tF=class extends J{constructor(e={}){super(),this.onChange=new p,this.box=new ww,this.themeListener=()=>this.draw(),this.handleTap=()=>{this.disabled_||this.toggle()},this.size_=e.size??20,this.checked_=e.checked??!1,this.disabled_=e.disabled??!1,this.addChild(this.box),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),uM.add(this.themeListener)}get checked(){return this.checked_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setChecked(e){if(e===this.checked_){this.draw();return}this.checked_=e,this.draw(),this.onChange.dispatch(e)}toggle(){this.setChecked(!this.checked_)}resize(e){this.size_=e,this.draw()}draw(){let e=$(),t=this.disabled_?e.color.textDim:e.color.textHighlight;if(this.box.clear().roundRect(0,0,this.size_,this.size_,4).fill({color:e.color.panelFill}).stroke({color:this.disabled_?e.color.textDim:e.color.panelBorder,width:2}),this.checked_){let e=this.size_*.25;this.box.moveTo(e,this.size_*.55).lineTo(this.size_*.45,this.size_-e).lineTo(this.size_-e,e).stroke({color:t,width:Math.max(2,this.size_*.12),cap:`round`,join:`round`})}}destroy(e){uM.remove(this.themeListener),super.destroy(e)}};function nF(e,t,n,r,i=1,a=!1){if(!(r>n))return n;let o=i>0?i:1,s=(String(o).split(`.`)[1]??``).length,c=Math.round((e-n)/o)+Math.round(t),l=Math.round((r-n)/o)+1,u=c;return u=a?(u%l+l)%l:Math.max(0,Math.min(l-1,u)),Number((n+u*o).toFixed(s))}var rF=class extends J{constructor(e={}){super(),this.onChange=new p,this.face=new ww,this.themeListener=()=>this.draw(),this.handleTap=e=>{this.disabled_||(this.toLocal(e.global).y<this.height_/2?this.increment():this.decrement())},this.width_=e.width??24,this.height_=e.height??32,this.min=e.min??0,this.max=e.max??9,this.step=e.step??1,this.wrap=e.wrap??!1,this.disabled_=e.disabled??!1,this.value_=nF(e.value??this.min,0,this.min,this.max,this.step,!1),this.addChild(this.face),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),uM.add(this.themeListener)}get value(){return this.value_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){this.commit(nF(e,0,this.min,this.max,this.step,this.wrap))}increment(){this.commit(nF(this.value_,1,this.min,this.max,this.step,this.wrap))}decrement(){this.commit(nF(this.value_,-1,this.min,this.max,this.step,this.wrap))}resize(e,t){this.width_=e,this.height_=t,this.draw()}commit(e){if(e===this.value_){this.draw();return}this.value_=e,this.draw(),this.onChange.dispatch(e)}draw(){let e=$(),t=this.disabled_?e.color.textDim:e.color.textHighlight;this.face.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:e.color.panelFill}).stroke({color:e.color.panelBorder,width:1});let n=this.width_/2,r=Math.min(this.width_/4,this.height_/5);this.face.moveTo(n-r,r*1.6).lineTo(n,r*.6).lineTo(n+r,r*1.6).closePath().fill({color:t}),this.face.moveTo(n-r,this.height_-r*1.6).lineTo(n,this.height_-r*.6).lineTo(n+r,this.height_-r*1.6).closePath().fill({color:t})}destroy(e){uM.remove(this.themeListener),super.destroy(e)}},iF=class{constructor(e){this.onChange=new p,this.open_=!1,this.options_=[...e.options],this.disabled_=e.disabled??!1;let t=e.selectedIndex??this.firstEnabled();this.current=this.options_[t]?.disabled?this.firstEnabled():t,this.highlight_=this.current}get options(){return this.options_}get selectedIndex(){return this.current}get selected(){return this.options_[this.current]??null}get isOpen(){return this.open_}get disabled(){return this.disabled_}get highlight(){return this.highlight_}setDisabled(e){this.disabled_=e,e&&(this.open_=!1)}setOptions(e){this.options_=[...e],this.current=this.firstEnabled(),this.highlight_=this.current,this.open_=!1}open(){this.disabled_||this.open_||(this.open_=!0,this.highlight_=this.current)}close(){this.open_=!1}toggleOpen(){this.open_?this.close():this.open()}move(e){if(!this.open_||this.options_.length===0)return;let t=this.options_.length,n=this.highlight_;for(let r=0;r<t;r++)if(n=((n+e)%t+t)%t,!this.options_[n].disabled){this.highlight_=n;return}}setHighlight(e){e<0||e>=this.options_.length||this.options_[e].disabled||(this.highlight_=e)}confirm(){if(!this.open_)return!1;let e=this.options_[this.highlight_];return!e||e.disabled?!1:(this.open_=!1,this.highlight_!==this.current&&(this.current=this.highlight_,this.onChange.dispatch({option:e,index:this.current})),!0)}cancel(){this.open_=!1,this.highlight_=this.current}firstEnabled(){let e=this.options_.findIndex(e=>!e.disabled);return e===-1?0:e}},aF=class{constructor(e={}){this.text=e.value??``,this.maxLength=e.maxLength,this.mask=e.mask??!1,this.maskCharacter=e.maskCharacter??`•`,this.caretIndex=this.text.length,this.anchor=this.caretIndex}get value(){return this.text}get maskedValue(){return this.mask?this.maskCharacter.repeat(this.text.length):this.text}get length(){return this.text.length}get caret(){return this.caretIndex}get selectionStart(){return Math.min(this.caretIndex,this.anchor)}get selectionEnd(){return Math.max(this.caretIndex,this.anchor)}get hasSelection(){return this.caretIndex!==this.anchor}get selectedText(){return this.text.slice(this.selectionStart,this.selectionEnd)}setValue(e){this.text=this.limit(e),this.caretIndex=this.text.length,this.anchor=this.caretIndex}setCaret(e,t=!1){this.caretIndex=Math.max(0,Math.min(this.text.length,e)),t||(this.anchor=this.caretIndex)}insert(e){e.length!==0&&this.replaceSelection(e)}backspace(){if(this.hasSelection){this.replaceSelection(``);return}this.caretIndex!==0&&(this.text=this.text.slice(0,this.caretIndex-1)+this.text.slice(this.caretIndex),this.setCaret(this.caretIndex-1))}deleteForward(){if(this.hasSelection){this.replaceSelection(``);return}this.caretIndex>=this.text.length||(this.text=this.text.slice(0,this.caretIndex)+this.text.slice(this.caretIndex+1),this.setCaret(this.caretIndex))}moveCaret(e,t=!1){this.setCaret(this.caretIndex+e,t)}moveToStart(e=!1){this.setCaret(0,e)}moveToEnd(e=!1){this.setCaret(this.text.length,e)}selectAll(){this.anchor=0,this.caretIndex=this.text.length}clearSelection(){this.anchor=this.caretIndex}replaceSelection(e){let t=this.selectionStart,n=this.selectionEnd,r=this.text.slice(0,t)+this.text.slice(n),i=this.maxLength!==void 0&&r.length+e.length>this.maxLength?e.slice(0,Math.max(0,this.maxLength-r.length)):e;this.text=this.text.slice(0,t)+i+this.text.slice(n),this.setCaret(t+i.length)}limit(e){return this.maxLength!==void 0&&e.length>this.maxLength?e.slice(0,this.maxLength):e}},oF=class{constructor(e){this.onChange=new p,this.current=0,this.sortKey_=null,this.ascending=!0,this.columns_=[...e.columns],this.rows_=[...e.rows??[]],this.pageSize_=e.pageSize??0,this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get columns(){return this.columns_}get rows(){return this.rows_}get pageSize(){return this.pageSize_}get sortKey(){return this.sortKey_}get sortAscending(){return this.ascending}get selectedIndex(){return this.current}get selected(){return this.rows_[this.current]??null}get page(){return this.pageSize_>0?Math.floor(this.current/this.pageSize_):0}get pageCount(){return this.pageSize_>0?Math.max(1,Math.ceil(this.rows_.length/this.pageSize_)):1}get pageRows(){if(this.pageSize_<=0)return this.rows_;let e=this.page*this.pageSize_;return this.rows_.slice(e,e+this.pageSize_)}setRows(e){this.rows_=[...e],this.current=this.firstEnabled(),this.onChange.dispatch()}setColumns(e){this.columns_=[...e],this.sortKey_&&!this.columns_.some(e=>e.key===this.sortKey_)&&(this.sortKey_=null),this.onChange.dispatch()}setPageSize(e){this.pageSize_=Math.max(0,e),this.onChange.dispatch()}sortBy(e){let t=this.columns_.find(t=>t.key===e);if(!t)return;this.sortKey_===e?this.ascending=!this.ascending:(this.sortKey_=e,this.ascending=!0);let n=t.compare??((t,n)=>cF(sF(t,e),sF(n,e)));this.rows_.sort((e,t)=>(this.ascending?1:-1)*n(e,t)),this.current=this.firstEnabled(),this.onChange.dispatch()}select(e){e<0||e>=this.rows_.length||this.disabledOf(this.rows_[e])||(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows_.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows_[n])){this.current=n,this.onChange.dispatch();return}}}setPage(e){if(this.pageSize_<=0)return;let t=Math.max(0,Math.min(this.pageCount-1,e))*this.pageSize_,n=Math.min(t+this.pageSize_,this.rows_.length);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e])){this.current=e,this.onChange.dispatch();return}}nextPage(e=1){this.setPage(this.page+e)}firstEnabled(){let e=this.rows_.findIndex(e=>!this.disabledOf(e));return e===-1?0:e}};function sF(e,t){return e&&typeof e==`object`?e[t]:void 0}function cF(e,t){return e===t?0:e===void 0?-1:t===void 0?1:typeof e==`number`&&typeof t==`number`?e-t:String(e).localeCompare(String(t))}var lF=class{constructor(e){this.onChange=new p,this.expanded=new Set,this.current=0,this.roots_=e.roots;for(let t of e.expanded??[])this.expanded.add(t);this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get roots(){return this.roots_}get rows(){let e=[],t=(n,r)=>{for(let i of n){let n=(i.children?.length??0)>0,a=n&&this.expanded.has(i.id);e.push({node:i,depth:r,expanded:a,hasChildren:n}),a&&t(i.children,r+1)}};return t(this.roots_,0),e}get selectedIndex(){return this.current}get selected(){return this.rows[this.current]?.node??null}isExpanded(e){return this.expanded.has(e)}expand(e){this.expanded.has(e)||(this.expanded.add(e),this.onChange.dispatch())}collapse(e){if(!this.expanded.has(e))return;let t=this.rows[this.current]?.node.id;if(this.expanded.delete(e),t!==void 0&&!this.rows.some(e=>e.node.id===t)){let t=this.rows.findIndex(t=>t.node.id===e);t>=0&&(this.current=t)}this.onChange.dispatch()}toggle(e){this.expanded.has(e)?this.collapse(e):this.expand(e)}expandAll(){let e=t=>{for(let n of t)n.children?.length&&(this.expanded.add(n.id),e(n.children))};e(this.roots_),this.onChange.dispatch()}collapseAll(){this.expanded.clear(),this.select(0),this.onChange.dispatch()}select(e){let t=this.rows[e];t&&!this.disabledOf(t.node)&&(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows[n].node)){this.current=n,this.onChange.dispatch();return}}}firstEnabled(){let e=this.rows.findIndex(e=>!this.disabledOf(e.node));return e===-1?0:e}};function uF(e,t,n){return Math.max(0,Math.min(Math.max(0,t-n),e))}var dF=class extends J{constructor(e){super(),this.onChange=new p,this.content=new J,this.maskShape=new ww,this.track=new ww,this.thumb=new ww,this.themeListener=()=>this.draw(),this.handleWheel=e=>{this.scrollBy(e.deltaY)},this.width_=e.width,this.height_=e.height,this.contentHeight_=Math.max(0,e.contentHeight??0),this.offset_=uF(e.offset??0,this.contentHeight_,this.height_),this.addChild(this.content),this.addChild(this.maskShape),this.addChild(this.track),this.addChild(this.thumb),this.content.mask=this.maskShape,this.eventMode=`static`,this.on(`wheel`,this.handleWheel),this.draw(),uM.add(this.themeListener)}get offset(){return this.offset_}get contentHeight(){return this.contentHeight_}get viewportHeight(){return this.height_}get maxOffset(){return Math.max(0,this.contentHeight_-this.height_)}get scrollable(){return this.maxOffset>0}setContentHeight(e){this.contentHeight_=Math.max(0,e),this.setOffset(uF(this.offset_,this.contentHeight_,this.height_))}resize(e,t){this.width_=e,this.height_=t,this.setOffset(uF(this.offset_,this.contentHeight_,this.height_))}scrollBy(e){this.setOffset(uF(this.offset_+e,this.contentHeight_,this.height_))}scrollTo(e){this.setOffset(uF(e,this.contentHeight_,this.height_))}scrollIntoView(e,t){e<this.offset_?this.scrollTo(e):e+t>this.offset_+this.height_&&this.scrollTo(e+t-this.height_)}setOffset(e){if(e===this.offset_){this.draw();return}this.offset_=e,this.draw(),this.onChange.dispatch(e)}draw(){let e=$();if(this.content.y=-this.offset_,this.maskShape.clear().rect(0,0,this.width_,this.height_).fill({color:16777215}),this.track.clear(),this.thumb.clear(),!this.scrollable)return;let t=this.width_-6;this.track.roundRect(t,0,6,this.height_,3).fill({color:e.color.panelFill});let n=Math.max(6,this.height_/this.contentHeight_*this.height_),r=this.offset_/this.maxOffset*(this.height_-n);this.thumb.roundRect(t,r,6,n,3).fill({color:e.color.textHighlight})}destroy(e){uM.remove(this.themeListener),super.destroy(e)}};function fF(e){switch(e){case`top`:case`bottom`:return{x:.5,y:e===`top`?0:1};case`left`:case`right`:return{x:e===`left`?0:1,y:.5};case`top-left`:return{x:0,y:0};case`top-right`:return{x:1,y:0};case`bottom-left`:return{x:0,y:1};case`bottom-right`:return{x:1,y:1};default:return{x:.5,y:.5}}}function pF(e,t,n={width:0,height:0}){let r=e.margin??0,i=t.x+r,a=t.y+r,o=Math.max(0,t.width-r*2),s=Math.max(0,t.height-r*2);if(e.anchor===`fill`){let t=i+(e.offsetX??0),n=a+(e.offsetY??0);return{x:t,y:n,width:e.width??Math.max(0,i+o-t),height:e.height??Math.max(0,a+s-n)}}let c=fF(e.anchor??`center`),l=e.alignX??c.x,u=e.alignY??c.y,d=e.width??n.width,f=e.height??n.height;return{x:i+l*Math.max(0,o-d)+(e.offsetX??0),y:a+u*Math.max(0,s-f)+(e.offsetY??0),width:d,height:f}}var mF=class{constructor(e){this.spec=e}get columns(){return this.spec.columns}get rows(){return this.spec.rows}columnSizes(e){return hF(this.spec.columns,e,this.gap)}rowSizes(e){return hF(this.spec.rows,e,this.gap)}rect(e,t,n,r={}){let i=this.columnSizes(n.width),a=this.rowSizes(n.height),o=r.columnSpan??1,s=r.rowSpan??1;return{x:n.x+_F(i,t,this.gap),y:n.y+_F(a,e,this.gap),width:vF(i,t,o,this.gap),height:vF(a,e,s,this.gap)}}get gap(){return this.spec.gap??0}};function hF(e,t,n){let r=n*Math.max(0,e.length-1),i=Math.max(0,t-r),a=e.reduce((e,t)=>e+(t.size??0),0),o=e.reduce((e,t)=>e+(t.grow??0),0),s=Math.max(0,i-a),c=0;return e.map((t,n)=>{if(t.size!==void 0)return t.size;if(!t.grow||o===0)return 0;let r=n===gF(e)?s-c:Math.floor(s*t.grow/o);return c+=r,r})}function gF(e){for(let t=e.length-1;t>=0;t--)if(e[t].grow)return t;return-1}function _F(e,t,n){let r=0;for(let i=0;i<t&&i<e.length;i++)r+=e[i]+n;return r}function vF(e,t,n,r){let i=0;for(let a=t;a<t+n&&a<e.length;a++)i+=e[a],a>t&&(i+=r);return Math.max(0,i)}var yF=[`idle`,`hover`,`pressed`,`disabled`,`selected`,`focused`],bF=class e{constructor(){this.map=new Map}static{this.ANY=`*`}define(e,t,n){let r=this.map.get(e)??{};r[t]={...r[t],...n},this.map.set(e,r)}has(e){return this.map.has(e)}widgets(){return[...this.map.keys()]}resolve(t,n=`idle`){return this.map.get(t)?.[n]??this.map.get(t)?.idle??this.map.get(e.ANY)?.[n]??this.map.get(e.ANY)?.idle??{}}statesOf(e){let t=this.map.get(e);return t?yF.filter(e=>t[e]!==void 0):[]}static from(t){let n=new e;for(let[e,r]of Object.entries(t))if(xF(r))for(let t of yF){let i=r[t];i&&n.define(e,t,i)}else n.define(e,`idle`,r);return n}};function xF(e){return yF.some(t=>e[t]!==void 0)}var SF=class extends J{constructor(e){super(),this.capturing=null,this.onKeyCaptured=e=>this.capturing?(e.preventDefault(),e.code===`Escape`?this.cancelCapture():this.finishCapture(this.capturing,e.code),!0):!1,this.actions=[...e.actions],this.labelFor=e.label??(e=>e),this.onConflict=e.onConflict??(()=>!0),this.list=new dN({width:e.width,height:e.height,rowHeight:e.rowHeight,items:this.rows()}),this.addChild(this.list)}rows(){return this.actions.map(e=>({text:this.rowText(e),value:e,disabled:this.capturing!==null&&this.capturing!==e}))}rowText(e){if(this.capturing===e)return`${this.labelFor(e)}: press a key...`;let t=Ie(e);return`${this.labelFor(e)}: ${t.length?t.join(`, `):`(unbound)`}`}refresh(){let e=this.list.selectedIndex;this.list.setItems(this.rows()),this.list.select(e)}startCapture(e){this.capturing=e,this.refresh(),queueMicrotask(()=>{this.capturing===e&&M.add(this.onKeyCaptured)})}cancelCapture(){M.remove(this.onKeyCaptured),this.capturing=null,this.refresh()}finishCapture(e,t){M.remove(this.onKeyCaptured),this.capturing=null;let n=Pe(t).filter(t=>t!==e);if(n.length>0&&!this.onConflict(t,e,n)){this.refresh();return}for(let e of n)Me(e,Ie(e).filter(e=>e!==t));Me(e,[t]),this.refresh()}get isCapturing(){return this.capturing!==null}handleAction(e){if(this.capturing)return!0;if(e===`confirm`){let e=this.list.selected?.value;return e&&this.startCapture(e),!0}return this.list.handleAction(e)}destroy(e){M.remove(this.onKeyCaptured),super.destroy(e)}},CF=class e extends J{constructor(t){super(),this.onClick=new p,this.onPress=new p,this.onRelease=new p,this.state=`idle`,this.themeListener=()=>this.draw(),this.width_=t.width,this.height_=t.height,this.disabled_=t.disabled??!1,this.skin=t.skin,this.labelOptions=t.label??{};let n=$();this.background=e.createBackground(this.skin,n),this.addChild(this.background),this.icon=t.icon??null,this.icon&&this.addChild(this.icon),this.labelText=t.text===void 0?null:new vM({align:`center`,...this.labelOptions,text:t.text}),this.labelText&&this.addChild(this.labelText),t.onClick&&this.onClick.add(t.onClick),t.onPress&&this.onPress.add(t.onPress),t.onRelease&&this.onRelease.add(t.onRelease),this.eventMode=`static`,this.on(`pointerover`,()=>this.setState(`hover`)),this.on(`pointerout`,()=>this.setState(`idle`)),this.on(`pointerdown`,()=>{this.setState(`pressed`),this.onPress.dispatch()}),this.on(`pointerup`,()=>{let e=this.state===`pressed`;this.setState(`hover`),e&&(this.onRelease.dispatch(),this.onClick.dispatch())}),this.on(`pointerupoutside`,()=>{let e=this.state===`pressed`;this.setState(`idle`),e&&this.onRelease.dispatch()}),this.setState(this.disabled_?`disabled`:`idle`),uM.add(this.themeListener)}static createBackground(e,t){return e?new iN(e.texture,{border:e.border}):t.panel?new iN(t.panel,{border:t.panelBorder}):new ww}resize(e,t){this.width_=e,this.height_=t,this.draw()}setText(e){e===void 0?(this.labelText?.destroy(),this.labelText=null):this.labelText?this.labelText.setText(e):(this.labelText=new vM({align:`center`,...this.labelOptions,text:e}),this.addChild(this.labelText)),this.layoutContent()}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.setState(e?`disabled`:`idle`)}setState(e){this.disabled_&&e!==`disabled`||(this.state=e,this.cursor=this.disabled_?`default`:`pointer`,this.eventMode=this.disabled_?`none`:`static`,this.draw())}layoutContent(){let e=$().direction===`rtl`;if(this.icon&&!this.labelText){this.icon.x=Math.round((this.width_-this.icon.width)/2),this.icon.y=Math.round((this.height_-this.icon.height)/2);return}if(this.icon&&this.labelText){let t=$().spacing,n=this.icon.width+t+this.labelText.width,r=Math.round((this.width_-n)/2);this.icon.x=e?r+this.labelText.width+t:r,this.icon.y=Math.round((this.height_-this.icon.height)/2),this.labelText.x=e?r:r+this.icon.width+t,this.labelText.y=Math.round((this.height_-this.labelText.height)/2);return}this.labelText&&(this.labelText.x=Math.round((this.width_-this.labelText.width)/2),this.labelText.y=Math.round((this.height_-this.labelText.height)/2))}draw(){let e=$(),t=this.state===`pressed`?10066329:this.state===`hover`?14540253:this.state===`disabled`?7829367:16777215;if(this.background instanceof iN)this.background.resize(this.width_,this.height_),this.background.tint=this.skin?.tints?.[this.state]??t;else{let t=this.state===`pressed`?e.color.selection:e.color.panelFill;this.background.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:t,alpha:this.state===`disabled`?.5:1}).stroke({color:e.color.panelBorder,width:1})}this.labelText?.setColor(this.disabled_?e.color.textDim:this.labelOptions.color??e.color.text),this.icon&&(this.icon.alpha=this.disabled_?.4:1),this.layoutContent()}destroy(e){uM.remove(this.themeListener),super.destroy(e)}},wF=class extends J{constructor(e){super(),this.track=new ww,this.fill=new ww,this.themeListener=()=>this.draw(),this.width_=e.width,this.height_=e.height,this.explicitColor=e.color!==void 0,this.fillColor=e.color??$().color.textHighlight,this.fraction=TF((e.value??1)/(e.max??1)),this.fillTexture=e.fillTexture,this.backgroundTexture=e.backgroundTexture,this.background_=e.background,this.roundUpToPixel=e.roundUpToPixel??!1,this.addChild(this.track),this.addChild(this.fill),this.draw(),uM.add(this.themeListener)}get value(){return this.fraction}setValue(e,t=1){this.fraction=TF(t>0?e/t:0),this.draw()}get color(){return this.fillColor}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}get background(){return this.background_??$().color.panelFill}resize(e,t){this.width_=e,this.height_=t,this.draw()}draw(){let e=$();if(this.explicitColor||(this.fillColor=e.color.textHighlight),this.track.clear().rect(0,0,this.width_,this.height_),this.track.fill(this.backgroundTexture?{texture:this.backgroundTexture}:{color:this.background}),this.fill.clear(),this.fraction>0){let t=this.width_*this.fraction,n=this.roundUpToPixel?Math.ceil(t):t,r=e.direction===`rtl`?this.width_-n:0;this.fill.rect(r,0,n,this.height_),this.fill.fill(this.fillTexture?this.explicitColor?{texture:this.fillTexture,color:this.fillColor}:{texture:this.fillTexture}:{color:this.fillColor})}}destroy(e){uM.remove(this.themeListener),super.destroy(e)}};function TF(e){return Math.max(0,Math.min(1,e))}function EF(e,t){return t<=0?1-e:t>=1||e<=t?1:1-(e-t)/(1-t)}function DF(e,t,n=!1){return n||e<=0?0:-t*e}function OF(e,t,n){return n<=0?e:Math.max(e,Math.min(n,t))}var kF=class extends J{constructor(e){super(),this.rising=new J,this.elapsed=0,this.done=!1,this.duration=e.duration??.8,this.rise=e.rise??24,this.hold=Math.min(1,Math.max(0,e.hold??0));let t=new vM({text:e.text,color:e.color,size:e.size});t.anchor.set(.5),this.rising.addChild(t),this.addChild(this.rising)}get finished(){return this.done}get riseOffset(){return this.rising.y}ageAtLeast(e){this.elapsed=OF(this.elapsed,this.duration,e)}update(e){if(this.done)return;this.elapsed=Math.min(this.duration,this.elapsed+e);let t=this.duration>0?this.elapsed/this.duration:1;this.rising.y=DF(t,this.rise,bn()),this.alpha=EF(t,this.hold),t>=1&&(this.done=!0,this.parent?.removeChild(this),this.destroy({children:!0}))}},AF=4;function jF(e){return Math.max(0,e)/5}function MF(e,t,n=4){let r=t.y-t.height/2;return e.y+e.height/2+n<=r?e.y:r-e.height/2-n}function NF(e,t,n=4){let r=[];if(t.key===void 0)return r;let i=t;for(let a=e.length-1;a>=0;a--){let o=e[a];if(o.key!==t.key)continue;let s=MF(o,i,n);if(s===o.y)break;r.push({index:a,y:s,ageAtLeast:jF(r.length+1)}),i={...o,y:s}}return r}var PF=class extends J{constructor(...e){super(...e),this.live=[]}push(e){let t=new kF({text:e.text,color:e.color,size:e.size,duration:e.duration,rise:e.rise,hold:e.hold});e.scale!==void 0&&t.scale.set(e.scale);let n={key:e.key,x:e.x,y:e.y,height:t.height};for(let e of NF(this.live.map(e=>e.entry),n)){let t=this.live[e.index];t.entry.y=e.y,t.popup.y=e.y,t.popup.ageAtLeast(e.ageAtLeast)}return t.position.set(e.x,e.y),this.addChild(t),this.live.push({popup:t,entry:n}),t}update(e){for(let{popup:t}of this.live)t.update(e);for(let e=this.live.length-1;e>=0;e--)this.live[e].popup.finished&&this.live.splice(e,1)}get count(){return this.live.length}clear(){for(let{popup:e}of this.live)this.removeChild(e),e.destroy({children:!0});this.live.length=0}},FF=class extends J{constructor(e={}){super(),this.queue=[],this.current=null,this.phase=`fadeIn`,this.elapsed=0,this.fadeIn=e.fadeIn??.25,this.hold=e.hold??1,this.fadeOut=e.fadeOut??1.75,this.scaleFrom=e.scaleFrom??2}show(e){this.queue.push(e),this.current||this.start(this.queue.shift())}get isBusy(){return this.current!==null||this.queue.length>0}start(e){this.current=e,this.phase=`fadeIn`,this.elapsed=0,this.addChild(e),e.alpha=this.fadeIn>0?0:1,e.scale.set(this.fadeIn>0?this.scaleFrom:1)}update(e){let t=this.current;if(!t)return;if(this.elapsed+=e,this.phase===`fadeIn`){let e=this.fadeIn,n=e>0?Math.min(1,this.elapsed/e):1,r=En.easeOutCubic(n);t.alpha=r,t.scale.set(this.scaleFrom+(1-this.scaleFrom)*r),n>=1&&this.advance();return}if(this.phase===`hold`){this.elapsed>=this.hold&&this.advance();return}let n=this.fadeOut,r=n>0?Math.min(1,this.elapsed/n):1;t.alpha=1-r,r>=1&&this.finish()}advance(){this.phase=this.phase===`fadeIn`?`hold`:`fadeOut`,this.elapsed=0}finish(){let e=this.current;if(!e)return;this.removeChild(e),e.destroy({children:!0}),this.current=null;let t=this.queue.shift();t&&this.start(t)}},IF=class extends J{constructor(e={}){super(),this.viewWidth=0,this.viewHeight=0,this.panelWidth=0,this.panelHeight=0,this.pending=null,this.waited=0,this.delay=e.delay??.4,this.maxWidth=e.maxWidth??200,this.offsetX=e.offset?.x??12,this.offsetY=e.offset?.y??16,this.margin=e.margin??4,this.panel=new cN({width:0,height:0,modal:!1,closable:!1,dims:!1}),this.body=new vM({text:``,wrapWidth:this.maxWidth}),this.panel.content.addChild(this.body),this.addChild(this.panel),this.visible=!1}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.visible&&this.place()}hover(e,t,n){if(this.pending&&this.pending.text===e){this.pending.x=t,this.pending.y=n,this.visible&&this.place();return}this.pending={text:e,x:t,y:n},this.waited=0,this.visible=!1}leave(){this.pending=null,this.waited=0,this.visible=!1}get isShowing(){return this.visible}get text(){return this.pending?.text??null}get panelPosition(){return{x:this.panel.x,y:this.panel.y}}get size(){return{width:this.panelWidth,height:this.panelHeight}}update(e){if(!this.pending||this.visible||(this.waited+=e,this.waited<this.delay))return!1;this.body.setText(this.pending.text);let t=$(),n=(t.panel?t.panelBorder:2)+t.padding,r=this.measureBody();return this.panelWidth=Math.ceil(r.width)+n*2,this.panelHeight=Math.ceil(r.height)+n*2,this.panel.resize(this.panelWidth,this.panelHeight),this.visible=!0,this.place(),!0}measureBody(){return{width:this.body.width,height:this.body.height}}place(){let e=this.pending;if(!e)return;let t=this.panelWidth,n=this.panelHeight,r=e.x+this.offsetX,i=e.y+this.offsetY;this.viewWidth>0&&(r+t+this.margin>this.viewWidth&&(r=e.x-this.offsetX-t),r=Math.max(this.margin,Math.min(r,Math.max(this.margin,this.viewWidth-t-this.margin)))),this.viewHeight>0&&(i+n+this.margin>this.viewHeight&&(i=e.y-this.offsetY-n),i=Math.max(this.margin,Math.min(i,Math.max(this.margin,this.viewHeight-n-this.margin)))),this.panel.x=r,this.panel.y=i}},LF=class extends J{constructor(e){super(),this.topics=e.topics;let t=e.listWidth??Math.floor(e.width/3),n=e.width-t-$().spacing,r=$().direction===`rtl`;this.list=new dN({width:t,height:e.height,items:this.topics.map(e=>({text:e.title})),onHighlight:(e,t)=>this.showBody(t),onSelect:(e,t)=>this.showBody(t)}),this.list.x=r?e.width-t:0,this.addChild(this.list),this.body=new vM({wrapWidth:n}),this.body.x=r?0:t+$().spacing,this.addChild(this.body),this.topics.length>0&&this.showBody(this.list.selectedIndex)}showBody(e){this.body.setText(this.topics[e]?.body??``)}handleAction(e){return this.list.handleAction(e)}},RF=class e extends J{constructor(t){super(),this.text=new vM({text:e.format(t.stats),wrapWidth:t.width}),this.addChild(this.text)}setStats(t,n){this.text.setText(e.format(t)),n!==void 0&&(this.text.style.wordWrapWidth=n)}static format(e){return e.map(e=>`${e.label}: ${e.value}`).join(`
|
|
1341
|
+
`)}},zF=class extends J{constructor(e){super(),this.backdrop=new ww,this.progress=new wF({width:240,height:10,value:0}),this.width_=e.width,this.height_=e.height,this.onRetry=e.onRetry,this.onCancel=e.onCancel,this.title=new vM({text:e.title??`Loading`,size:18,bold:!0,align:`center`}),this.status=new vM({text:`Preparing...`,align:`center`}),this.addChild(this.backdrop,this.title,this.status,this.progress),this.layout()}setSnapshot(e){let t=e.total>0?e.completed/e.total:0;this.progress.setValue(t),e.status===`failed`?this.status.setText(`Loading failed. Retry or cancel.`):e.status===`cancelled`?this.status.setText(`Loading cancelled.`):e.status===`ready`?this.status.setText(`Ready`):this.status.setText(e.current?`Loading ${e.current}...`:`Preparing...`)}bind(e){this.setSnapshot(e.snapshot);let t=e=>this.setSnapshot(e);return e.changed.add(t),()=>e.changed.remove(t)}retry(){this.onRetry?.()}cancel(){this.onCancel?.()}resize(e,t){this.width_=e,this.height_=t,this.layout()}layout(){let e=$().color;this.backdrop.clear().rect(0,0,this.width_,this.height_).fill({color:e.overlay,alpha:.92});let t=this.width_/2,n=this.height_/2;this.title.anchor.set(.5),this.status.anchor.set(.5),this.title.position.set(t,n-36),this.status.position.set(t,n-8),this.progress.position.set(t-120,n+16)}};function BF(e,t={}){return n=>new Promise(r=>{e.push(new JP({width:t.width??480,height:t.height??120,speed:t.speed??45,pages:[{text:n.text,speaker:n.speaker}],choices:n.choices,anchor:t.anchor??`bottom`,onDone:e=>r(e)}))})}function VF(e){let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function HF(e){return .2126*VF(e>>16&255)+.7152*VF(e>>8&255)+.0722*VF(e&255)}function UF(e,t){let[n,r]=[HF(e),HF(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function WF(e,t,n=`AA`,r=!1){let i=n===`AAA`?r?4.5:7:r?3:4.5;return UF(e,t)>=i}var GF={farLeft:.12,left:.28,center:.5,right:.72,farRight:.88},KF=class extends J{constructor(e,t){super(),this.backdropLayer=new J,this.actorLayer=new J,this.backdrop=null,this.outgoingBackdrop=null,this.actors=new Map,this.definitions=new Map,this.focused=null,this.tweener=new Dn,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 $s(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.tweener.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 Hk(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.tweener.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.tweener.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:GF[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)}update(e){this.tweener.update(e)}get isBusy(){return this.tweener.isBusy}},qF=class{constructor(e){this.state={answers:{}},this.cancelled=!1,this.historyLog=[],this.seenLines=new Set,this.skipSeen=!1,this.options=e}cancel(){this.cancelled=!0}get history(){return this.historyLog}async showLast(){let e=this.historyLog.at(-1);if(!e)return!1;let{windows:t}=this.options;return await new Promise(n=>{t.push(new JP({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:0,pages:[{text:e.text,speaker:e.speaker}],dims:!1,anchor:`bottom`,onDone:()=>n()}))}),!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),this.recordHistory(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 this.recordHistory(e.ask,e.as,e.speaker,t),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)}recordHistory(e,t,n,r){let i=n??(t?this.options.displayName?.(t)??t:void 0);this.seenLines.add(JF(t,e)),this.historyLog.push({text:e,speaker:i,chosen:r})}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),s=this.skipSeen&&!r&&this.seenLines.has(JF(t,e));return new Promise(t=>{a.push(new JP({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:s?0:this.options.speed??45,autoAdvance:s?0:void 0,mode:this.options.mode,pages:[{text:e,speaker:o}],choices:r,dims:!1,anchor:`bottom`,onDone:e=>t(e)}))})}};function JF(e,t){return`${e??``}\u0000${t}`}function YF(e){let t=XF(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=QF(e.body);continue}if(Object.prototype.hasOwnProperty.call(n,e.name))throw Error(`this twee source defines "${e.name}" twice`);n[e.name]=$F(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 XF(e){let t=[],n=null,r=[],i=()=>{n!==null&&t.push({name:n,body:r.join(`
|
|
1342
1342
|
`)})};for(let t of e.split(`
|
|
1343
|
-
`))t.startsWith(`::`)?(i(),n=
|
|
1344
|
-
`)){let t=$F(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 $F(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(eI(i.slice(a+2,o),n)),i=i.slice(o+2)}}function eI(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}}var tI=class{constructor(e){this.onChange=new p,this.onMusic=new p,this.index=0,this.beats=e}get length(){return this.beats.length}get position(){return this.index}get current(){return this.beats[this.index]??null}get done(){return this.beats.length===0||this.index>=this.beats.length-1}get music(){return this.current?.music??null}goTo(e){let t=Math.max(0,Math.min(this.beats.length-1,e));this.index=t,this.report()}advance(){return!this.done&&(this.goTo(this.index+1),!0)}back(){return this.index!==0&&(this.goTo(this.index-1),!0)}skip(){this.goTo(this.beats.length-1)}restart(){this.goTo(0)}report(){let e=this.current;e&&this.onChange.dispatch(e),this.onMusic.dispatch(this.music)}},nI=class extends J{constructor(e){super(),this.backdrop=new $s(K.EMPTY),this.handleAdvance=()=>{this.advance()},this.handleBeat=e=>{this.applyBeat(e)},this.sequence=e.sequence,this.textureFor=e.textureFor??(()=>null),this.playMusic=e.playMusic??(()=>{}),this.width_=e.width,this.height_=e.height,this.titleLabel=new _M({text:``,color:$().color.textHighlight}),this.textLabel=new _M({text:``,wrapWidth:this.width_*.8}),this.addChild(this.backdrop),this.addChild(this.titleLabel),this.addChild(this.textLabel),this.eventMode=`static`,this.on(`pointertap`,this.handleAdvance),this.sequence.onChange.add(this.handleBeat),this.sequence.onMusic.add(this.playMusic),this.applyBeat(this.sequence.current)}get current(){return this.sequence.current}advance(){return this.sequence.advance()}skip(){this.sequence.skip()}resize(e,t){this.width_=e,this.height_=t,this.applyBeat(this.current)}applyBeat(e){if(!e){this.backdrop.visible=!1;return}let t=e.image?this.textureFor(e.image):null;if(this.backdrop.visible=t!==null,t){this.backdrop.texture=t;let e=Math.max(this.width_/t.width,this.height_/t.height);this.backdrop.scale.set(e),this.backdrop.x=(this.width_-t.width*e)/2,this.backdrop.y=(this.height_-t.height*e)/2}this.titleLabel.setText(e.title??``),this.titleLabel.x=this.width_*.1,this.titleLabel.y=this.height_*.12,this.textLabel.setText(e.text),this.textLabel.x=this.width_*.1,this.textLabel.y=this.height_*.24,this.textLabel.style.wordWrapWidth=this.width_*.8}destroy(e){this.sequence.onChange.remove(this.handleBeat),this.sequence.onMusic.remove(this.playMusic),super.destroy(e)}},rI=[[0,-1],[1,0],[0,1],[-1,0]],iI=[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],aI=[[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[0,1]],oI=[[1,1],[1,0],[0,-1],[-1,0],[-1,1],[0,1]];function sI(e){return e===4?rI:iI}var cI={passable:!1,transparent:!1},lI={passable:!0,transparent:!0},uI=class e{constructor(e,t,n,r=0,i=`square`,a){if(this.rooms=[],this.width=e,this.shape=i,this.height=t,a!==void 0&&(!Number.isFinite(a)||a<0))throw Error(`viewDistance must be a finite non-negative number`);this.viewDistance=a,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`?sn(e,t):sI(n).map(([n,r])=>({x:e+n,y:t+r}))}forEachNeighbor(e,t,n,r){let i=this.shape===`hex`?e&1?oI:aI:sI(n);for(let[n,a]of i)r(e+n,t+a)}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)]??cI}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})),...this.viewDistance===void 0?{}:{viewDistance:this.viewDistance}}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape,n.viewDistance);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function dI(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function fI(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 pI={id:`hall`,paint:(e,t,n)=>e.fillRect(t,n)};function mI(e){return Math.min(e.right-e.left+1,e.bottom-e.top+1)}function hI(e){return Math.max(e.right-e.left+1,e.bottom-e.top+1)}function gI(e,t){let n=mI(t),r=hI(t);return e.filter(e=>n>=(e.minSize??0)&&r<=(e.maxSize??1/0))}function _I(e,t){let n=gI(e,t);if(n.length===0)return null;let r=le(n.map(e=>e.weight??1));return r===null?null:n[r]}var vI=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function yI(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=[],hooks:u,builders:d}=e,f=new uI(t,n,[...vI,...l],s),p=[],m=[],h=[],g=0;for(let e=0;e<r*6&&p.length<r;e++){let e=ae(i,a),r=ae(i,a),o=O(1,Math.max(2,t-e-1)),s=O(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};if(l.right>=t-1||l.bottom>=n-1){g++;continue}if(p.some(e=>fI(l,e,2))){g++;continue}p.push(l);let m=(d?.length?_I(d,l):null)??pI;m.paint(f,l,c),h.push(m.id),u?.onRoomPlaced?.(l,p.length-1)}for(let e=1;e<p.length;e++){xI(f,dI(p[e-1]),dI(p[e]),c);let t={a:e-1,b:e,extra:!1};m.push(t),u?.onCorridorCarved?.(t,p[e-1],p[e])}for(let e=0;e<o&&p.length>2;e++){let e=O(p.length),t=O(p.length);if(e!==t){xI(f,dI(p[e]),dI(p[t]),c);let n={a:e,b:t,extra:!0};m.push(n),u?.onCorridorCarved?.(n,p[e],p[t])}}return f.rooms=p,{level:f,graph:m,retries:g,roomBuilders:h}}function bI(e){return yI(e).level}function xI(e,t,n,r){se(.5)?(SI(e,t.x,n.x,t.y,!0,r),SI(e,t.y,n.y,n.x,!1,r)):(SI(e,t.y,n.y,t.x,!1,r),SI(e,t.x,n.x,n.y,!0,r))}function SI(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 CI(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[O(n.length)]:null}function wI(e,t){let n=null,r=-1;for(let i of e.rooms){let e=dI(i),a=(e.x-t.x)**2+(e.y-t.y)**2;a>r&&(r=a,n=i)}return n}var TI=class e{constructor(){this.defs=new Map,this.placed=new Map}define(e,t){this.defs.set(e,t)}place(e,t){if(!this.defs.has(t))throw Error(`FeatureLayer.place: no definition for kind "${t}"`);this.placed.set(e,t)}has(e){return this.placed.has(e)}kindAt(e){return this.placed.get(e)}remove(e){this.placed.delete(e)}inspect(e,t){this.defAt(e)?.inspect?.(e,t)}interact(e,t){let n=this.defAt(e);n&&(n.interact&&n.interact(e,t)===!1||(n.consequence?.(e,t),n.persistent===!1&&this.remove(e)))}defAt(e){let t=this.placed.get(e);return t===void 0?void 0:this.defs.get(t)}toJSON(){return{cells:[...this.placed.entries()]}}static fromJSON(t,n){let r=new e;for(let[e,n]of t)r.define(e,n);for(let[e,t]of n.cells)r.place(e,t);return r}};function EI(e,t=[],n=!0){let r=[],i=e.map(e=>e.value);t.forEach((e,t)=>{if(e.enabled===!1){r.push({step:`rare`,index:t,outcome:`deferred`});return}let n=se(e.chance);r.push({step:`rare`,index:t,outcome:n?`added`:`skipped`}),n&&i.push(e.value)});for(let t=0;t<e.length;t++){let n=e[t].alternative;if(!n)continue;let a=se(n.chance);r.push({step:`alternative`,index:t,outcome:a?`swapped`:`kept`}),a&&(i[t]=n.value)}return n&&(ue(i),r.push({step:`shuffle`,index:-1,outcome:`shuffled`})),{roster:i,trace:r}}function DI(e,t){return e.length===t.length&&e.every((e,n)=>e.a===t[n].a&&e.b===t[n].b&&e.extra===t[n].extra)}function OI(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function kI(e,t){if(e.length!==t.length)return!1;let n=[...e].sort((e,t)=>e[0]-t[0]),r=[...t].sort((e,t)=>e[0]-t[0]);return n.every(([e,t],n)=>e===r[n][0]&&t===r[n][1])}function AI(e,t){let n=[];return e.retries!==t.retries&&n.push({stage:`graph`,field:`retries`,expected:e.retries,actual:t.retries}),DI(e.graph,t.graph)||n.push({stage:`graph`,field:`graph`,expected:e.graph,actual:t.graph}),(e.width!==t.width||e.height!==t.height||!OI(e.terrain,t.terrain))&&n.push({stage:`paint`,field:`terrain`,expected:e.terrain,actual:t.terrain}),(e.roomBuilders.length!==t.roomBuilders.length||e.roomBuilders.some((e,n)=>e!==t.roomBuilders[n]))&&n.push({stage:`paint`,field:`roomBuilders`,expected:e.roomBuilders,actual:t.roomBuilders}),kI(e.features,t.features)||n.push({stage:`paint`,field:`features`,expected:e.features,actual:t.features}),JSON.stringify(e.content)!==JSON.stringify(t.content)&&n.push({stage:`paint`,field:`content`,expected:e.content,actual:t.content}),e.rngDraws!==t.rngDraws&&n.push({stage:`paint`,field:`rngDraws`,expected:e.rngDraws,actual:t.rngDraws}),n}function jI(e,t=2){let n=e(),r=[];for(let i=1;i<t;i++)r.push(...AI(n,e()));return r}var MI=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)*MI,e=e*69069+1>>>0,this._s1=e*MI,e=e*69069+1>>>0,this._s2=e*MI,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*MI;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 NI=class{getContainer(){return null}setOptions(e){this._options=e}},PI=class extends NI{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 FI(e){return e.charAt(0).toUpperCase()+e.substring(1)}function II(e,...t){let n=II.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=FI(d)),d})}II.map={s:`toString`};var LI=class e extends PI{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}};LI.cache=!1;var RI={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]]},zI=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=[RI[8][7],RI[8][1],RI[8][3],RI[8][5]];break;case 6:i=RI[6],a=1,o=[-1,1];break;case 8:i=RI[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}},BI=class extends zI{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)}},VI=class extends zI{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}},HI=[[-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]],UI={DiscreteShadowcasting:BI,PreciseShadowcasting:VI,RecursiveShadowcasting:class extends zI{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<HI.length;i++)this._renderOctant(e,t,HI[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,HI[o],n,i),this._renderOctant(e,t,HI[a],n,i),this._renderOctant(e,t,HI[r],n,i),this._renderOctant(e,t,HI[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,HI[r],n,i),this._renderOctant(e,t,HI[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 WI=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=RI[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}},GI={Dijkstra:class extends WI{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 WI{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 KI(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function qI(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 JI(e,t,n,r={}){let i=e.shape===`hex`?un(t,n):qI(t,n),a=r.stop??`opaque`,o=[],s=null;for(let t of i)if(o.push(t),o.length!==1&&a!==`none`&&(a===`outside`&&!e.inside(t.x,t.y)||a===`opaque`&&e.inside(t.x,t.y)&&!e.transparent(t.x,t.y)||a===`impassable`&&e.inside(t.x,t.y)&&!e.passable(t.x,t.y))){s=t;break}return{cells:o,stop:s}}function YI(e,t,n){let r=e.shape===`hex`?un(t,n):qI(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 XI(e,t,n,r){return!((e.shape===`hex`?cn(t,n):KI(t,n))>r.range||(r.requireLineOfSight??!0)&&!YI(e,t,n))}function ZI(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return qI(e,t);case`cone`:return eL(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 QI(e,t,n,r){return e.shape===`hex`?r.kind===`single`?[{...n}]:r.kind===`line`?un(t,n):r.kind===`burst`?dn(n,r.radius):$I(t,n,r.width):ZI(t,n,r)}function $I(e,t,n){let r=cn(e,t);if(r===0)return[{...e}];let i=un(e,t),a=[];for(let t=1;t<=r;t++){let o=i[t],s=Math.round(t/r*n);for(let n of dn(o,s))cn(e,n)===t&&a.push(n)}return a}function eL(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}var tL=.5;function nL(e){return e<0?-Math.round(-e):Math.round(e)}function rL(e,t,n,r){if(!Number.isFinite(r.degrees)||r.degrees<0)throw Error(`a cone sector needs a finite non-negative angle in degrees`);if(!Number.isFinite(r.range)||r.range<0)throw Error(`a cone sector needs a finite non-negative range`);let i=n.x-t.x,a=n.y-t.y;if(i===0&&a===0)return[{...t}];let o=Math.atan2(a,i),s=r.degrees*Math.PI/360,c=Math.max(1,Math.round(r.degrees/tL)),l=r.stop??`opaque`,u=new Set,d=[];for(let n=0;n<=c;n++){let i=o-s+2*s*n/c,a={x:t.x+nL(Math.cos(i)*r.range),y:t.y+nL(Math.sin(i)*r.range)};for(let n of JI(e,t,a,{stop:l}).cells){if(n.x===t.x&&n.y===t.y||!e.inside(n.x,n.y))continue;let r=e.index(n.x,n.y);u.has(r)||(u.add(r),d.push({x:n.x,y:n.y}))}}return d}function iL(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=KI(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 aL(e,t,n=1){for(let n of t)if(e<=n.max)return n.multiplier;return n}function oL(e,t){return t.length===0?1:t[Math.min(e,t.length-1)]}function sL(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 cL=class{constructor(e,t){if(this.onMove=new p,this.onConfirm=new p,this.onCancel=new p,!Number.isFinite(t.range)||t.range<0)throw Error(`targeting range must be a finite non-negative number`);this.level=e,this.origin={...t.origin},this.range=t.range,this.requireLineOfSight=t.requireLineOfSight??!0,this.validate=t.validate,this.shape=t.shape??{kind:`single`},this.cursor={...t.cursor??t.origin}}get target(){return{...this.cursor}}get distance(){return this.level.shape===`hex`?cn(this.origin,this.cursor):KI(this.origin,this.cursor)}get inRange(){return this.distance<=this.range}get inSight(){return YI(this.level,this.origin,this.cursor)}get valid(){return!this.inRange||this.requireLineOfSight&&!this.inSight?!1:!this.validate||this.validate(this.cursor)}move(e,t){if(this.level.shape===`hex`){let n=this.level.neighbors(this.cursor.x,this.cursor.y).find(n=>n.x-this.cursor.x===e&&n.y-this.cursor.y===t);n&&this.moveTo(n);return}this.moveTo({x:this.cursor.x+e,y:this.cursor.y+t})}moveTo(e){this.level.inside(e.x,e.y)&&(this.cursor={x:e.x,y:e.y},this.onMove.dispatch({...this.cursor}))}setShape(e){this.shape=e}preview(){return this.valid?QI(this.level,this.origin,this.cursor,this.shape):[]}confirm(){if(!this.valid)return null;let e={origin:{...this.origin},target:{...this.cursor},shape:this.shape,cells:this.preview()};return this.onConfirm.dispatch(e),e}cancel(){this.onCancel.dispatch()}},lL=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 UI.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n=this.level.viewDistance??Math.max(this.level.width,this.level.height),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 dn(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=un(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 dn(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=un(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)||KI(a,{x:t,y:o})>n)continue;let e=qI(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)}},uL=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)}},dL=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 GI.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;this.level.forEachNeighbor(o,s,t.topology??8,(e,t)=>{if(!i(e,t,o,s))return;let r=this.level.index(e,t);n[r]===-1&&(n[r]=c,a.push(r))})}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;return this.level.forEachNeighbor(e.x,e.y,n.topology??8,(n,i)=>{if(!r(e.x,e.y,n,i))return;let s=t[this.level.index(n,i)];s!==-1&&s<o&&(o=s,a={x:n,y:i})}),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);this.level.forEachNeighbor(r.x,r.y,n.topology??8,(e,t)=>{if(!i(r.x,r.y,e,t))return;let n=this.level.index(e,t);o.has(n)||(o.add(n),a.set(n,r),s.push({x:e,y:t}))})}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()}},fL=class e{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,n=e.priority??0){if(!Number.isFinite(t)||t<0)throw Error(`scheduler delay must be finite and non-negative`);if(!Number.isFinite(n))throw Error(`scheduler priority must be finite`);this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++,priority:n}),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()}postpone(e,t){let n=this.entries.find(t=>t.actor===e);n&&(n.time+=t,n.sequence=this.sequence++,this.sort())}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}toJSON(e){return{now:this.now,sequence:this.sequence,entries:this.entries.map(t=>({id:e(t.actor),time:t.time,sequence:t.sequence,...t.priority===0?{}:{priority:t.priority}}))}}static restore(t,n){let r=new e;return r.now=t.now,r.sequence=t.sequence,r.entries=t.entries.map(e=>({actor:n(e.id),time:e.time,sequence:e.sequence,priority:e.priority??0})),r.sort(),r}sort(){this.entries.sort((e,t)=>e.time-t.time||t.priority-e.priority||e.sequence-t.sequence)}};function pL(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:mL(e,n,a)};let c=new lL(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:hL(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:mL(e,n,a)}}function mL(e,t,n){return ce(gL(e,t,n))}function hL(e,t,n,r){let i=gL(e,t,r),a=null,o=_L(t,n);for(let e of i){let t=_L(e,n);t>o&&(o=t,a=e)}return a}function gL(e,t,n){let r=n.blocked,i=[];for(let[a,o]of sI(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 _L(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var vL=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}},yL=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}},bL=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}check(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}},xL=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}advance(e=1){for(let[t,n]of this.remaining)n<=e?this.remaining.delete(t):this.remaining.set(t,n-e)}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}},SL=class extends x{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}},CL=class{constructor(e){this.detected=!1,this.radius=e.radius}get isDetected(){return this.detected}checkDetection(e,t){if(this.detected)return!1;let n=t.some(t=>KI(e,t)<=this.radius);return n&&(this.detected=!0),n}reset(){this.detected=!1}},wL=class e{constructor(e){this.streak=0,this.lastTurn=-1/0,this.window=e}get count(){return this.streak}trigger(e){return this.streak=e-this.lastTurn<=this.window?this.streak+1:1,this.lastTurn=e,this.streak}isActive(e){return e-this.lastTurn<=this.window}reset(){this.streak=0,this.lastTurn=-1/0}toJSON(){return{streak:this.streak,lastTurn:this.lastTurn}}static fromJSON(t,n){let r=new e(t);return r.streak=n.streak,r.lastTurn=n.lastTurn,r}},TL=class e{constructor(e){if(this.index=-1,this.remaining=0,e.length===0)throw Error(`a multi-stage ability needs at least one stage`);this.stages=e}get active(){return this.index>=0}get stage(){return this.index>=0?this.stages[this.index]:null}start(){return!this.active&&(this.index=0,this.remaining=this.stages[0].duration,!0)}advance(){return!this.active||(this.remaining--,this.remaining>0)?null:(this.index++,this.index>=this.stages.length?(this.index=-1,`done`):(this.remaining=this.stages[this.index].duration,this.stages[this.index].name))}cancel(){this.index=-1,this.remaining=0}toJSON(){return{index:this.index,remaining:this.remaining}}static fromJSON(t,n){let r=new e(t);return r.index=n.index,r.remaining=n.remaining,r}},EL=class e{constructor(e){if(this.index=0,this.state=`idle`,typeof e.damage!=`function`&&!Number.isFinite(e.damage))throw Error(`beam damage must be a finite number or a function`);if(typeof e.damage==`number`&&e.damage<0)throw Error(`beam damage must be non-negative`);if(this.options=e,this.shape=e.shape??(e.fronts?`fronts`:`line`),e.fronts){let t=e.fronts([{...e.from}],0);this.fronts=t.length?[t.map(e=>({...e}))]:[]}else this.fronts=QI(e.level,e.from,e.target,{kind:`line`}).slice(1).map(e=>[{...e}])}get active(){return this.state===`active`}get done(){return this.state===`done`||this.state===`blocked`||this.state===`cancelled`}get beamShape(){return this.shape}get currentPath(){return this.fronts.flat().map(e=>({...e}))}start(){return this.state===`idle`&&(this.state=this.fronts.length===0?`done`:`active`,!0)}advance(){if(this.state!==`active`)return this.inactiveStep();let e=this.fronts[this.index]??[],t=Math.max(0,this.fronts.length-this.index-1),n=[],r=[],i=0;for(let a of e){let e={cell:{...a},step:this.index,remaining:t};if(!this.blocked(a,e)){n.push({...a}),this.options.onCell?.({...a},e);for(let t of this.options.targetsAt?.(a)??[]){let n=typeof this.options.damage==`function`?this.options.damage(t,e):this.options.damage;if(!Number.isFinite(n)||n<0)throw Error(`beam damage callback must return a non-negative finite number`);i+=n,r.push(t),this.options.applyDamage?.(t,n,e)}}}let a=this.index;if(this.index++,this.options.fronts&&n.length>0){let e=this.options.fronts(n.map(e=>({...e})),this.index);e.length&&this.fronts.push(e.map(e=>({...e})))}return n.length===0?this.state=`blocked`:this.index>=this.fronts.length&&(this.state=`done`),{status:n.length===0?`blocked`:this.state,cell:n[0]?{...n[0]}:null,cells:n.map(e=>({...e})),step:a,remaining:t,targets:[...r],damage:i}}cancel(){(this.state===`active`||this.state===`idle`)&&(this.state=`cancelled`)}toJSON(){return{state:this.state,fronts:this.fronts.map(e=>e.map(e=>({...e}))),index:this.index,shape:this.shape}}static fromJSON(t,n){let r=n.shape??(t.fronts?`fronts`:`line`);if(t.shape!==void 0&&t.shape!==r)throw Error(`beam save is shape "${r}", not "${t.shape}"`);let i=Object.create(e.prototype);return i.options=t,i.shape=r,i.fronts=n.fronts?n.fronts.map(e=>e.map(e=>({...e}))):(n.path??[]).map(e=>[{...e}]),i.index=n.index,i.state=n.state,i}blocked(e,t){let n=this.options.blocker??(this.options.stopAtOpaque===!1?`none`:`terrain`),r=!1;return n===`terrain`?r=!this.options.level.inside(e.x,e.y)||!this.options.level.transparent(e.x,e.y):n!==`none`&&(r=n({...e},t)===!0),r||this.options.isBlocked?.({...e},t)===!0}inactiveStep(){return{status:this.state,cell:null,cells:[],step:this.index,remaining:Math.max(0,this.fronts.length-this.index),targets:[],damage:0}}};function DL(e,t={}){return(t.within?[...t.within]:AL(e.cellCount)).filter(n=>!(t.occupied?.has(n)||t.terrain&&!t.terrain.has(e.terrain[n])))}function OL(e,t,n){let r=new Set([t]),i=[t];for(let t=0;t<Math.max(0,n);t++){let t=[];for(let n of i)e.forEachNeighbor(e.xOf(n),e.yOf(n),8,(n,i)=>{if(!e.inside(n,i))return;let a=e.index(n,i);r.has(a)||(r.add(a),t.push(a))});i=t}return r.delete(t),[...r]}function kL(e,t){let n=[...new Set(e)];ue(n);let r=n.slice(0,Math.max(0,t));return{cells:r,trace:{requested:t,available:n.length,selected:r}}}function AL(e){let t=Array(e);for(let n=0;n<e;n++)t[n]=n;return t}var jL=l({AbilityCycle:()=>xL,BossPhases:()=>bL,CombatHooks:()=>SL,DUNGEON_KINDS:()=>vI,Doors:()=>yL,Elevation:()=>uL,FLOOR:()=>lI,FeatureLayer:()=>TI,FieldOfView:()=>lL,Level:()=>uI,MultiStageAbility:()=>TL,MultiTurnBeam:()=>EL,Pathfinder:()=>dL,Scheduler:()=>fL,Secrets:()=>vL,Stealth:()=>CL,TargetingController:()=>cL,TriggerTracker:()=>wL,WALL:()=>cI,areaFalloffMultiplier:()=>oL,ballistica:()=>JI,canTarget:()=>XI,candidateCells:()=>DL,cellsNear:()=>OL,chainTargets:()=>iL,chebyshevDistance:()=>KI,checkDeterminism:()=>jI,compareDungeonArtifacts:()=>AI,coneCells:()=>eL,coneSector:()=>rL,decideMonsterAI:()=>pL,eligibleBuilders:()=>gI,findFreeCell:()=>CI,furthestRoom:()=>wI,generateDungeon:()=>bI,generateDungeonGraph:()=>yI,hallBuilder:()=>pI,hasLineOfSight:()=>YI,hexConeCells:()=>$I,knockbackPath:()=>sL,neighbourOffsets:()=>sI,pickBuilder:()=>_I,rangeMultiplier:()=>aL,rectCenter:()=>dI,rectsOverlap:()=>fI,resolveArea:()=>ZI,resolveAreaOnLevel:()=>QI,rollRoster:()=>EI,selectDistinctCells:()=>kL,traceLine:()=>qI});function ML(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 NL=class e{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]=ML(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=ML(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}toJSON(){return{base:{...this.baseValues}}}static fromJSON(t,n){let r=new e(t);return r.baseValues={...t.base,...n.base},r.cache=null,r}};function PL(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var FL=class e{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}toJSON(){return{level:this.level,experience:this.experience}}static fromJSON(t,n){return new e(t,n)}};function IL(e,t,n=()=>ae(1,20)){return e+n()>=t}var LL=class e{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}toJSON(){return{points:this.available}}static fromJSON(t,n,r){let i=new e(t,n);return i.available=r.points,i}},RL=class e{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);return this.wear(e,t),n}wear(e,t){this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t})}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}"`)}toJSON(e){return{worn:[...this.worn].map(([t,n])=>[t,e(n)])}}static fromJSON(t,n){let r=new e(t.slots,t.stats??null,{locked:t.locked});for(let[e,i]of n.worn)r.assertSlot(e),r.wear(e,t.resolve(i));return r}},zL=class e{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,t){return this.slots.find(n=>n.id===e&&(t===void 0||n.instanceId===t))}add(e){if(!Number.isFinite(e.quantity)||e.quantity<=0||e.weight!==void 0&&(!Number.isFinite(e.weight)||e.weight<0)||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&&t.instanceId===e.instanceId);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t,n){if(t!==void 0&&(!Number.isFinite(t)||t<=0))return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r];i.quantity-=t??i.quantity,i.quantity<=0&&this.slots.splice(r,1)}take(e,t=1,n){if(!Number.isFinite(t)||t<=0)return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r],a=Math.min(Math.floor(t),i.quantity);if(a<=0)return;let o={...i,quantity:a};return i.quantity-=a,i.quantity<=0&&this.slots.splice(r,1),o}toJSON(){return{capacity:this.capacity,slots:this.slots.map(e=>({id:e.id,quantity:e.quantity,instanceId:e.instanceId,identified:e.identified,cursed:e.cursed,blessed:e.blessed,level:e.level,affix:e.affix,durability:e.durability,maxDurability:e.maxDurability,contents:e.contents?.toJSON()}))}}static fromJSON(t,n){let r=new e({capacity:n.capacity});return r.slots=n.slots.map(n=>{let r=t.get(n.id);if(!r)throw Error(`Inventory.fromJSON: no definition for item "${n.id}"`);let{contents:i,...a}=n,o={...r,...BL(a),id:n.id,quantity:n.quantity};return i&&(o.contents=e.fromJSON(t,i)),o}),r}};function BL(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function VL(e,t){return t.matches?t.matches(e):t.category===void 0?typeof t.id==`string`?e.id===t.id:(t.id??[]).includes(e.id):e.category===t.category}function HL(e){return e.matches!==void 0||e.category!==void 0||e.id!==void 0}function UL(e,t){let n=new Map;for(let t of e.items)n.set(t,t.quantity);let r=new Map;for(let i of t.ingredients){if(!HL(i))throw Error(`recipe ingredient must name an id, a category, or a matches predicate`);if(!Number.isFinite(i.quantity)||i.quantity<=0)throw Error(`recipe ingredient quantity must be a positive number`);let t=i.quantity;for(let a of e.items){if(t<=0)break;let e=n.get(a)??0;if(e<=0||!VL(a,i))continue;let o=Math.min(e,t);n.set(a,e-o),t-=o,r.set(a,(r.get(a)??0)+o)}if(t>0)return!1}for(let[t,n]of r)e.remove(t.id,n,t.instanceId);if(e.add(t.result))return!0;for(let[t,n]of r)e.add({...t,quantity:n});return!1}function WL(e,t){let n=e.add({duration:t.duration,tick:e=>t.tick?.(e),onExpire:t.onExpire});return{cancel:()=>{e.remove(n),t.onExpire()}}}function GL(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});return WL(t,{duration:n.duration,tick:n.tick,onExpire:()=>e.removeModifiersFrom(r)})}function KL(e,t={}){let n=e.entries.filter(e=>e.weight>0&&(t.curse===void 0||!!e.curse===t.curse)&&(t.predicate?.(e)??!0));if(n.length===0)return null;let r=le(n.map(e=>e.weight));return r===null?null:n[r]}function qL(e){return e.affix}function JL(e,t){let n=e.affix!==void 0;e.affix=t.id,t.curse?e.cursed=!0:n&&(e.cursed=!1)}function YL(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function XL(e,t){if(e.affix===void 0){YL(t);return}t.affix=e.affix,t.cursed=e.cursed??!1}function ZL(e,t){return!(e.trigger!==t.trigger||e.kinds&&(t.kind===void 0||!e.kinds.includes(t.kind)))}function QL(e){e.identified=!0}function $L(e,t,n=`keep`){return Number.isFinite(t)?(e.level=(e.level??0)+t,n===`remove`&&YL(e),e.level):e.level??0}function eR(e,t){return e.maxDurability===void 0?!1:!Number.isFinite(t)||t<=0?(e.durability??e.maxDurability)<=0:(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function tR(e,t){e.maxDurability!==void 0&&(!Number.isFinite(t)||t<=0||(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t)))}function nR(e,t,n){let r=new Map;for(let t of Object.keys(n.fields))r.set(t,e[t]),e[t]=n.fields[t];return WL(t,{duration:n.duration,tick:n.tick,onExpire:()=>{for(let[t,n]of r)e[t]=n}})}var rR=class e{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}refund(e=1){let t=Math.min(e,this.max-this.value);return this.value+=t,t}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)}}toJSON(){return{current:this.value,progress:this.progress}}static fromJSON(t,n){let r=new e({...t,current:n.current});return r.progress=n.progress,r}};function iR(e){if(e.entries.length===0||!se(e.chance??1))return null;let t=le(e.entries.map(e=>e.weight));if(t===null)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var aR=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 oR(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}function sR(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=O(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 cR=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=sR(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 lR(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 uR(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):(n.add({...s,quantity:i}),!1))}function dR(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 fR(e){let t=new Map;for(let n of e)t.set(n.stat,(t.get(n.stat)??0)+n.amount);return t}function pR(e,t){return[...fR(dR(t))].every(([t,n])=>e.base(t)>=n)}function mR(e,t){let n=fR(dR(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}function hR(e,t,n=1){for(let[r,i]of fR(dR(t)))e.setBase(r,e.base(r)+i*n)}function gR(e,t,n,r){return mR(e,t)?n.refund(Math.floor(t.amount/r)):0}var _R=class e{constructor(){this.layers=[]}add(e,t=0){e<=0||this.layers.push({amount:e,decayPerTick:t})}get total(){return this.layers.reduce((e,t)=>e+t.amount,0)}get layerCount(){return this.layers.length}absorb(e){let t=e,n=0;for(;t>0&&this.layers.length>0;){let e=this.layers[this.layers.length-1],r=Math.min(e.amount,t);e.amount-=r,t-=r,n+=r,e.amount<=0&&this.layers.pop()}return n}advance(e=1){for(let t=this.layers.length-1;t>=0;t--){let n=this.layers[t];n.decayPerTick&&(n.amount-=n.decayPerTick*e,n.amount<=0&&this.layers.splice(t,1))}}clear(){this.layers=[]}toJSON(){return{layers:this.layers.map(e=>({...e}))}}static fromJSON(t){let n=new e;return n.layers=t.layers.map(e=>({...e})),n}};function vR(e,t,n){return ue([...t]).slice(0,Math.min(n,t.length)).map(t=>{let n=Symbol(`trait:${t.name}`);for(let r of t.modifiers)e.addModifier({...r,source:n});return{trait:t,source:n}})}var yR=class{constructor(){this.affected=new Map}update(e,t){let n=new Set(e),r=e.filter(e=>!!e.aura),i=new Set(r);for(let i of r){let r=this.affected.get(i);r||(r=new Map,this.affected.set(i,r));for(let n of e){if(n===i)continue;let e=t(i,n),a=r.get(n);if(e&&!a){let e=Symbol(`aura:${i.aura.name}`);for(let t of i.aura.modifiers)n.stats.addModifier({...t,source:e});r.set(n,e)}else!e&&a&&(n.stats.removeModifiersFrom(a),r.delete(n))}for(let[e,t]of[...r])n.has(e)||(e.stats.removeModifiersFrom(t),r.delete(e))}for(let[e,t]of[...this.affected])if(!i.has(e)){for(let[e,n]of t)e.stats.removeModifiersFrom(n);this.affected.delete(e)}}},bR=class e{constructor(e){if(this.points=new Map,e.some(e=>!e.id||!Number.isFinite(e.threshold)||e.threshold<0))throw Error(`support levels need an id and a non-negative threshold`);this.levels=[...e].sort((e,t)=>e.threshold-t.threshold)}get(e,t){return this.points.get(xR(e,t))??0}level(e,t){let n=this.get(e,t),r=null;for(let e of this.levels){if(e.threshold>n)break;r=e}return r}add(e,t,n){if(!e||!t||e===t)throw Error(`support needs two different named units`);if(!Number.isFinite(n))throw Error(`support amount must be finite, got ${n}`);let r=this.level(e,t),i=xR(e,t),a=Math.max(0,(this.points.get(i)??0)+n);return this.points.set(i,a),{a:e,b:t,points:a,previousLevel:r,level:this.level(e,t)}}toJSON(){return{pairs:[...this.points].map(([e,t])=>{let[n,r]=e.split(`\0`);return[n,r,t]})}}static fromJSON(t,n){let r=new e(t);for(let[e,t,i]of n.pairs){if(!e||!t||e===t||!Number.isFinite(i)||i<0)throw Error(`invalid support save data`);let n=xR(e,t);if(r.points.has(n))throw Error(`invalid support save data: duplicate pair "${e}" / "${t}"`);r.points.set(n,i)}return r}};function xR(e,t){return[e,t].sort().join(`\0`)}var SR=new Set([`id`,`growth`,`level`,`startingAffix`,`startingItem`,`lowHpReaction`]);function CR(e,t={},n){let r=new NL({base:OR(e)}),i;e.growth!==void 0&&(i=new FL(DR(e,t),{level:e.level??1}));let a;if(e.startingItem!==void 0){let n=t.items?.[e.startingItem];if(!n)throw Error(`entity template "${e.id}": unknown starting item "${e.startingItem}"`);if(a=n(),e.startingAffix!==void 0){let n=t.affixes?.[e.startingAffix];if(!n)throw Error(`entity template "${e.id}": unknown affix "${e.startingAffix}"`);JL(a,n)}}else if(e.startingAffix!==void 0)throw Error(`entity template "${e.id}": a starting affix needs a starting item to carry it`);let o=new $t,s={id:e.id,stats:r,progression:i,item:a,reactions:o};if(e.lowHpReaction!==void 0){if(!n)throw Error(`entity template "${e.id}": names a lowHpReaction threshold but no onLowHp callback was given`);let t=e.lowHpReaction;o.add({id:`low-hp`,when:e=>e.hp/e.maxHp<=t,action:()=>n(s)})}return s}function wR(e,t={},n){return e.map(e=>CR(e,t,n))}function TR(e){let t={stats:e.stats.toJSON()};return e.progression&&(t.progression=e.progression.toJSON()),e.item&&(t.item=e.item),t}function ER(e,t,n,r){let i=CR(e,t,r);if(i.stats=NL.fromJSON({base:OR(e)},n.stats),n.progression!==void 0){if(!i.progression)throw Error(`entity template "${e.id}": save data has progression but the row names no growth curve`);i.progression=FL.fromJSON(DR(e,t),n.progression)}return n.item!==void 0&&(i.item=n.item),i}function DR(e,t){let n=t.growthCurves?.[e.growth??``];if(!n)throw Error(`entity template "${e.id}": unknown growth curve "${e.growth}"`);return n}function OR(e){let t={};for(let[n,r]of Object.entries(e))if(!SR.has(n)){if(typeof r!=`number`)throw Error(`entity template "${e.id}": stat "${n}" must be a number, got ${typeof r}`);t[n]=r}return t}var kR=l({Advancement:()=>aR,Appearances:()=>cR,AuraField:()=>yR,Barrier:()=>_R,Charges:()=>rR,EquipmentSlots:()=>RL,Inventory:()=>zL,Progression:()=>FL,SkillPoints:()=>LL,StatBlock:()=>NL,SupportLedger:()=>bR,affixOf:()=>qL,applyAffix:()=>JL,applyItemStatusEffect:()=>nR,applyStatusEffect:()=>GL,assignAppearances:()=>sR,assignTraits:()=>vR,buildEntities:()=>wR,buildEntity:()=>CR,buy:()=>lR,canAfford:()=>pR,composeModifiers:()=>ML,convertToCharges:()=>gR,copyAffix:()=>XL,craft:()=>UL,damageItem:()=>eR,enchant:()=>$L,fromEntitySaveState:()=>ER,identify:()=>QL,matchesContext:()=>ZL,powerCurve:()=>PL,refund:()=>hR,removeAffix:()=>YL,repairItem:()=>tR,rollAffix:()=>KL,rollLoot:()=>iR,scaledModifiers:()=>oR,sell:()=>uR,skillCheck:()=>IL,spend:()=>mR,toEntitySaveState:()=>TR}),AR=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)}},jR=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()]}},MR=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 NR(e){if(e.entries.length===0||!se(e.rate))return null;let t=le(e.entries.map(e=>e.weight));return t===null?null:e.entries[t].value}var PR=class e{constructor(e={}){if(this.changed=new p,this.dayLength=e.dayLength??120,!(this.dayLength>0))throw Error(`an environment day must be longer than zero seconds`);if(this.boundaries=e.phaseBoundaries??[.2,.7,.8],this.boundaries[0]<=0||this.boundaries[0]>=this.boundaries[1]||this.boundaries[1]>=this.boundaries[2]||this.boundaries[2]>=1)throw Error(`environment phase boundaries must be ascending fractions strictly between 0 and 1`);if(this.seconds_=e.startSeconds??0,this.weather_=e.startWeather??`clear`,!Number.isFinite(this.seconds_))throw Error(`environment startSeconds must be finite`)}get day(){return Math.floor(this.seconds_/this.dayLength)}get seconds(){return this.seconds_}get weather(){return this.weather_}get phase(){let e=(this.seconds_%this.dayLength+this.dayLength)%this.dayLength/this.dayLength;return e<this.boundaries[0]?`dawn`:e<this.boundaries[1]?`day`:e<this.boundaries[2]?`dusk`:`night`}get night(){return this.phase===`night`}update(e){if(!Number.isFinite(e)||e<0)throw Error(`environment update must be non-negative, got ${e}`);this.seconds_+=e;let t=this.toJSON();return this.changed.dispatch(t),t}setWeather(e){if(!e)throw Error(`weather needs a non-empty id`);this.weather_=e;let t=this.toJSON();return this.changed.dispatch(t),t}toJSON(){return{day:this.day,seconds:this.seconds_,phase:this.phase,weather:this.weather_}}static fromJSON(t,n){return new e({...t,startSeconds:n.seconds,startWeather:n.weather})}},FR=class e{constructor(e){if(e.sides.length===0)throw Error(`SideTurns needs at least one side`);if(e.schedule.length===0)throw Error(`SideTurns needs a non-empty schedule`);let t=e.round??1,n=e.sideIndex??0,r=e.timeIndex??0;if(!Number.isInteger(t)||t<1)throw Error(`SideTurns round must be a positive integer`);if(n<0||n>=e.sides.length)throw Error(`SideTurns side index ${n} is outside ${e.sides.length} sides`);if(r<0||r>=e.schedule.length)throw Error(`SideTurns time index ${r} is outside ${e.schedule.length} times`);this.sides=[...e.sides],this.schedule=[...e.schedule],this.areas=e.areas??[],this.state={round:t,sideIndex:n,timeIndex:r}}get round(){return this.state.round}get side(){return this.sides[this.state.sideIndex]}get timeIndex(){return this.state.timeIndex}get timeOfDay(){return this.schedule[this.state.timeIndex]}get snapshot(){return{...this.state}}timeOfDayAt(e,t){for(let n of this.areas)if(n.contains(e,t))return n.times[this.state.timeIndex]??this.timeOfDay;return this.timeOfDay}lawfulBonusAt(e,t,n){return IR(e,this.timeOfDayAt(t,n).lawfulBonus)}advance(){let e=!1;return this.state.sideIndex++,this.state.sideIndex>=this.sides.length&&(this.state.sideIndex=0,this.state.round++,this.state.timeIndex=(this.state.timeIndex+1)%this.schedule.length,e=!0),{side:this.side,round:this.state.round,newRound:e}}toJSON(){return this.snapshot}static fromJSON(t,n){return new e({...t,round:n.round,sideIndex:n.sideIndex,timeIndex:n.timeIndex})}};function IR(e,t){switch(e){case`lawful`:return t;case`chaotic`:return-t;default:return 0}}var LR=l({EnvironmentClock:()=>PR,Overworld:()=>jR,SideTurns:()=>FR,TurnClock:()=>MR,World:()=>AR,alignmentBonus:()=>IR,rollEncounter:()=>NR});function RR(e,t,n={}){let r=n.pick??O,i=0;return t.forEach((t,n)=>{zR(t,t.name??`#${n+1}`,e.shape);let a=BR(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 zR(e,t,n){if(e.topology&&(n===`square`||n===`hex`)&&e.topology!==n)throw Error(`automap rule "${t}" targets ${e.topology} cells, but the map is ${n}`);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 r=e.width*e.height;for(let[n,i]of Object.entries(e.input))if(i.length!==r)throw Error(`automap rule "${t}" input "${n}" has ${i.length} cells, but the pattern is ${r}`);e.outputs.forEach((e,n)=>{for(let[i,a]of Object.entries(e))if(a.length!==r)throw Error(`automap rule "${t}" output ${n+1} "${i}" has ${a.length} cells, but the pattern is ${r}`)})}function BR(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)VR(e,t,i,r)&&n.push([i,r]);return n}function VR(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 HR=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 UR(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function WR(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>UR(e,t))&&(n=r);return n}var GR=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=UR(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){return this.options.present({text:e,speaker:t,choices:n})}};function KR(e,t){t&&e.has?.(t)&&e.play?.(t)}var qR=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=JR(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=JR(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=YR(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=YR(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(){KR(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){KR(this.sprite,this.options.idleAnimation?.(this.facing))}};function JR(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function YR(e,t,n){return e+(t-e)*n}var XR=class{constructor(e,t,n,r={}){this.facing=0,this.moving=!1,this.sprite=e,this.x=t,this.y=n,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.moving}move(e,t,n){let r=Math.hypot(e,t);r>0?(this.facing=Math.atan2(t,e),this.x+=e/r*this.speed*n,this.y+=t/r*this.speed*n,this.moving||(this.moving=!0,this.playWalk())):this.moving&&(this.moving=!1,this.playIdle()),this.place(),this.sprite.update?.(n)}turnTo(e,t){this.moving||e===0&&t===0||(this.facing=Math.atan2(t,e),this.playIdle())}place(){this.sprite.x=this.x,this.sprite.y=this.y}playWalk(){KR(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){KR(this.sprite,this.options.idleAnimation?.(this.facing))}};function ZR(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function QR(e,t){let n=e.x-t.x,r=e.y-t.y,i=e.radius+t.radius;return n*n+r*r<i*i}function $R(e,t){let n=Wn(e.x,t.x,t.x+t.width),r=Wn(e.y,t.y,t.y+t.height),i=e.x-n,a=e.y-r;return i*i+a*a<e.radius*e.radius}function ez(e,t,n,r){let{tileSize:i,isSolid:a}=r;if(!(i>0))throw Error(`collision tileSize must be positive`);let o=tz(e.x,e.y,e.width,e.height,t,i,a,!0);return{x:o,y:tz(o,e.y,e.width,e.height,n,i,a,!1)}}function tz(e,t,n,r,i,a,o,s){if(i===0)return s?e:t;let c=s?e:t,l=s?n:r,u=c+i,d=Math.floor((s?t:e)/a),f=Math.floor(((s?t+r:e+n)-1e-6)/a),p=(e,t)=>s?o(e,t):o(t,e);if(i>0){let e=Math.floor((c+l-1e-6)/a),t=Math.floor((u+l-1e-6)/a);for(let n=e+1;n<=t;n++)for(let e=d;e<=f;e++)if(p(n,e))return n*a-l}else{let e=Math.floor(c/a),t=Math.floor(u/a);for(let n=e-1;n>=t;n--)for(let e=d;e<=f;e++)if(p(n,e))return(n+1)*a}return u}var nz=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map,this.tracked=null}define(e){this.definitions.set(e.id,e)}track(e){e!==null&&this.require(e),this.tracked=e}trackedQuest(){return this.tracked!==null&&this.status(this.tracked)===`active`?this.tracked:null}trackedLocation(){let e=this.trackedQuest();return e?this.currentStage(e)?.location??null:null}markerFor(e,t){return e.some(e=>this.status(e)===`active`&&this.stageSatisfied(e,t))?`turnIn`:e.some(e=>this.status(e)===`available`)?`offer`:`none`}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}advanceStage(e,t){return this.stageSatisfied(e,t)?(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0):!1}stageSatisfied(e,t){let n=this.currentStage(e);return n?n.condition?UR(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target:!1}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex],tracked:this.tracked}}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 n.tracked&&(r.tracked=n.tracked),r}};function rz(e){let t=[],n=new Map;for(let r of e){let e=n.get(r.questId);e||(e={id:r.questId,stages:[]},r.requires!==void 0&&(e.requires=r.requires),n.set(r.questId,e),t.push(r.questId)),e.stages.push(iz(e.id,r))}return t.map(e=>n.get(e))}function iz(e,t){if(t.conditionSwitch!==void 0&&t.conditionVariable!==void 0)throw Error(`quest "${e}": a stage row cannot name both a condition switch and a condition variable`);let n={};if(t.conditionSwitch!==void 0){if(t.conditionEquals===void 0)throw Error(`quest "${e}": conditionSwitch needs a conditionEquals`);n.condition={switch:t.conditionSwitch,equals:t.conditionEquals}}else if(t.conditionVariable!==void 0){if(t.conditionAtLeast===void 0)throw Error(`quest "${e}": conditionVariable needs a conditionAtLeast`);n.condition={variable:t.conditionVariable,atLeast:t.conditionAtLeast}}if(t.counterVariable!==void 0){if(t.counterTarget===void 0)throw Error(`quest "${e}": counterVariable needs a counterTarget`);n.counter={variable:t.counterVariable,target:t.counterTarget}}if(t.description!==void 0&&(n.description=t.description),t.locationMap!==void 0||t.locationX!==void 0||t.locationY!==void 0){if(t.locationX===void 0||t.locationY===void 0)throw Error(`quest "${e}": a stage location needs both locationX and locationY`);n.location={x:t.locationX,y:t.locationY},t.locationMap!==void 0&&(n.location.map=t.locationMap)}return n}var az=class{constructor(e){this.name=e}},oz=4,sz=8,cz=new WeakMap;function lz(e){return cz.get(e)}function uz(e,t){return cz.set(e,t),e}var dz=class{constructor(e){this.pos=0,this.symbols=[],this.objects=[],this.bytes=e}byte(){if(this.pos>=this.bytes.length)throw Error(`Marshal: unexpected end of input`);return this.bytes[this.pos++]}take(e){if(e<0)throw Error(`Marshal: negative length`);let t=this.bytes.subarray(this.pos,this.pos+e);if(t.length<e)throw Error(`Marshal: unexpected end of input`);return this.pos+=e,t}readFixnum(){let e=this.byte()<<24>>24;if(e===0)return 0;if(e>=5&&e<=127)return e-5;if(e<=-5&&e>=-128)return e+5;if(e>0){let t=0;for(let n=0;n<e;n++)t|=this.byte()<<8*n;return t>>>0}let t=-e,n=0;for(let e=0;e<t;e++)n|=this.byte()<<8*e;return(n>>>0)-2**(8*t)}readBytes(){return this.take(this.readFixnum())}readSymbol(){let e=new TextDecoder().decode(this.readBytes());return this.symbols.push(e),e}readSymbolLink(){let e=this.readFixnum(),t=this.symbols[e];if(t===void 0)throw Error(`Marshal: symbol link ${e} out of range`);return t}readSymbolValue(){let e=String.fromCharCode(this.byte());if(e===`:`)return this.readSymbol();if(e===`;`)return this.readSymbolLink();throw Error(`Marshal: expected a symbol, got tag "${e}"`)}link(e){return this.objects.push(e),e}readBignum(){let e=String.fromCharCode(this.byte())===`-`?-1:1,t=this.readFixnum(),n=0,r=1;for(let e=0;e<t;e++)n+=(this.byte()|this.byte()<<8)*r,r*=65536;return e*n}readFloat(){let e=new TextDecoder().decode(this.readBytes());return e===`inf`?1/0:e===`-inf`?-1/0:e===`nan`?NaN:Number(e)}readArray(){let e=[];this.link(e);let t=this.readFixnum();for(let n=0;n<t;n++)e.push(this.readValue());return e}readHash(e){let t=new Map;this.link(t);let n=this.readFixnum();for(let e=0;e<n;e++)t.set(this.readValue(),this.readValue());return e&&cz.set(t,this.readValue()),t}readIvars(e){let t={};for(let n=0;n<e;n++)t[this.readSymbolValue()]=this.readValue();return t}readObject(){let e={class:``,ivars:{}};return this.link(e),e.class=this.readSymbolValue(),e.ivars=this.readIvars(this.readFixnum()),e}readIvarWrapped(){let e=this.readValue();return this.readIvars(this.readFixnum()),e}readUserDefined(){let e={class:``,raw:new Uint8Array};return this.link(e),e.class=this.readSymbolValue(),e.raw=this.readBytes().slice(),e}readUserMarshal(){let e={class:``,value:null};return this.link(e),e.class=this.readSymbolValue(),e.value=this.readValue(),e}readValue(){let e=String.fromCharCode(this.byte());switch(e){case`0`:return null;case`T`:return!0;case`F`:return!1;case`i`:return this.readFixnum();case`l`:return this.link(this.readBignum());case`f`:return this.link(this.readFloat());case`:`:return this.readSymbol();case`;`:return this.readSymbolLink();case`"`:return this.link(new TextDecoder().decode(this.readBytes()));case`[`:return this.readArray();case`{`:return this.readHash(!1);case`}`:return this.readHash(!0);case`o`:return this.readObject();case`I`:return this.readIvarWrapped();case`u`:return this.readUserDefined();case`U`:return this.readUserMarshal();case`@`:{let e=this.readFixnum(),t=this.objects[e];if(t===void 0)throw Error(`Marshal: object link ${e} out of range`);return t}default:throw Error(`Marshal: unsupported tag "${e}" (0x${e.charCodeAt(0).toString(16)})`)}}readDocument(){let e=this.byte(),t=this.byte();if(e!==oz||t>sz)throw Error(`Marshal: unsupported version ${e}.${t} (expected ${oz}.${sz} or lower)`);return this.readValue()}};function fz(e){return new dz(e).readDocument()}function pz(e){return typeof e==`object`&&!!e&&`class`in e&&`ivars`in e}function mz(e){let t=[oz,sz];return hz(t,e),new Uint8Array(t)}function hz(e,t){if(t==null)e.push(gz(`0`));else if(t===!0)e.push(gz(`T`));else if(t===!1)e.push(gz(`F`));else if(t instanceof az)e.push(gz(`:`)),_z(e,t.name);else if(typeof t==`number`)Number.isInteger(t)&&Math.abs(t)<2**30?(e.push(gz(`i`)),vz(e,t)):(e.push(gz(`f`)),_z(e,Number.isFinite(t)?String(t):t>0?`inf`:t<0?`-inf`:`nan`));else if(typeof t==`string`)e.push(gz(`"`)),_z(e,t);else if(Array.isArray(t)){e.push(gz(`[`)),vz(e,t.length);for(let n of t)hz(e,n)}else if(t instanceof Map){let n=cz.has(t);e.push(gz(n?`}`:`{`)),vz(e,t.size);for(let[n,r]of t)hz(e,n),hz(e,r);n&&hz(e,cz.get(t))}else if(pz(t)){e.push(gz(`o`)),e.push(gz(`:`)),_z(e,t.class);let n=Object.entries(t.ivars);vz(e,n.length);for(let[t,r]of n)e.push(gz(`:`)),_z(e,t),hz(e,r)}else throw Error(`Marshal: cannot encode a value of type ${typeof t}`)}function gz(e){return e.charCodeAt(0)}function _z(e,t){let n=new TextEncoder().encode(t);vz(e,n.length);for(let t of n)e.push(t)}function vz(e,t){if(t===0){e.push(0);return}if(t>0&&t<=122){e.push(t+5);return}if(t<0&&t>=-123){e.push(t-5&255);return}if(t>0){for(let n=1;n<=4;n++)if(t<2**(8*n)){e.push(n);for(let r=0;r<n;r++)e.push(t>>>8*r&255);return}}else for(let n=1;n<=4;n++)if(t>=-(2**(8*n))){e.push(-n&255);let r=t+2**(8*n);for(let t=0;t<n;t++)e.push(r>>>8*t&255);return}throw Error(`Marshal: integer ${t} is out of range for a Fixnum`)}var yz=l({AUTOMAP_EMPTY:()=>-1,EventRunner:()=>GR,FreeMover:()=>XR,GameState:()=>HR,GridMover:()=>qR,QuestLog:()=>nz,RubySymbol:()=>az,aabbOverlap:()=>ZR,activePage:()=>WR,automap:()=>RR,circleAabbOverlap:()=>$R,circleOverlap:()=>QR,conditionHolds:()=>UR,decodeMarshal:()=>fz,encodeMarshal:()=>mz,hashDefaultOf:()=>lz,questsFromRows:()=>rz,resolveAabbAgainstTiles:()=>ez,withHashDefault:()=>uz}),bz=PL(20,2,100),xz=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new FL(e.species.growth??bz,{level:e.level??1}),this.stats=new NL({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}}},Sz=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)}},Cz=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 wz(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function Tz(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var Ez=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 Dz(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 Oz(e,t,n,r){let i=null,a=kz(e,n,r);return t.forEach((e,t)=>{let o=kz(e.types,n,r);o<a&&(a=o,i=t)}),i}function kz(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var Az=class extends x{},jz=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(e=1){for(let[t,n]of this.conditions)n.duration!==void 0&&(n.duration-=e,n.duration<=0&&this.conditions.delete(t))}},Mz=class{constructor(e){this.chanceToHit=Nz(e.chanceToHit??1),this.strikeDuration=Math.max(0,e.strikeDuration??0),this.totalDamage=Math.max(0,e.damage)*Math.max(0,e.strikes),this.expectedDamage=this.totalDamage*this.chanceToHit,this.defenderHp0=e.defender.hp;let t=[],n=e.defender.hp;for(let r=0;r<=e.strikes;r++)r>0&&(e.hits?.[r-1]??!0)&&(n-=Math.max(0,e.damage)),t.push({strike:r,time:r*this.strikeDuration,attackerHp:e.attacker.hp,defenderHp:Math.max(0,n),defenderDamage:this.defenderHp0-Math.max(0,n)});this.frames=t}get duration(){return this.strikeDuration*(this.frames.length-1)}get defenderKilled(){return this.frames[this.frames.length-1].defenderHp===0}sampleAt(e){let t=this.frames.length-1;if(this.strikeDuration<=0)return this.frames[t];let n=0;for(let r=0;r<=t&&this.frames[r].time<=e+1e-9;r++)n=r;return this.frames[n]}};function Nz(e){return Math.max(0,Math.min(1,e))}var Pz=class{constructor(e){this.onChange=new p,this.stage_=`attacker`,this.charge=null,this.victim=null,this.highlight_=0,this.units=e.units,this.side=e.side,this.disabledOf=e.disabled??(e=>e.disabled??!1),this.canTarget=e.canTarget??(()=>!0)}get stage(){return this.stage_}get attacker(){return this.charge}get target(){return this.victim}get done(){return this.charge!==null&&this.victim!==null}get candidates(){return this.units.filter(e=>(this.side===void 0||e.side===this.side)&&!this.disabledOf(e))}get targets(){let e=this.charge;return e?this.units.filter(t=>t.id!==e.id&&!this.disabledOf(t)&&(e.side===void 0||t.side!==e.side)&&this.canTarget(e,t)):[]}get highlight(){return this.highlight_}get highlighted(){return this.active()[this.highlight_]??null}move(e){let t=this.active();t.length!==0&&(this.highlight_=((this.highlight_+e)%t.length+t.length)%t.length,this.onChange.dispatch())}select(){let e=this.highlighted;return e?(this.stage_===`attacker`?(this.charge=e,this.stage_=`target`,this.highlight_=0):this.victim=e,this.onChange.dispatch(),!0):!1}back(){if(this.stage_===`attacker`)return;let e=this.charge;this.charge=null,this.victim=null,this.stage_=`attacker`;let t=e?this.candidates.findIndex(t=>t.id===e.id):-1;this.highlight_=t>=0?t:0,this.onChange.dispatch()}reset(){this.charge=null,this.victim=null,this.stage_=`attacker`,this.highlight_=0,this.onChange.dispatch()}active(){return this.stage_===`attacker`?this.candidates:this.targets}},Fz=class{constructor(e){this.onChange=new p,this.built=null,this.elapsed_=0,this.handleSelectorChange=()=>{if(this.selector.done&&this.attacker&&this.target){let e=this.damageFor(this.attacker,this.target);this.built=new Mz({attacker:{hp:this.attacker.hp??0,name:this.attacker.id},defender:{hp:this.target.hp??0,name:this.target.id},damage:e.damage,strikes:e.strikes,...e.chanceToHit===void 0?{}:{chanceToHit:e.chanceToHit},...e.hits===void 0?{}:{hits:e.hits},strikeDuration:this.strikeDuration}),this.elapsed_=0}else this.built=null;this.onChange.dispatch()},this.damageFor=e.damageFor,this.strikeDuration=e.strikeDuration??0,this.selector=new Pz({units:e.units,...e.side===void 0?{}:{side:e.side},...e.disabled===void 0?{}:{disabled:e.disabled},...e.canTarget===void 0?{}:{canTarget:e.canTarget}}),this.selector.onChange.add(this.handleSelectorChange)}get stage(){return this.selector.stage}get attacker(){return this.selector.attacker}get target(){return this.selector.target}get preview(){return this.built}get elapsed(){return this.elapsed_}get finished(){return this.built!==null&&this.elapsed_>=this.built.duration}get frame(){return this.built?this.built.sampleAt(this.elapsed_):null}move(e){this.selector.move(e)}select(){return this.selector.select()}back(){this.selector.back()}update(e){return this.built?(this.elapsed_=Math.min(this.built.duration,this.elapsed_+Math.max(0,e)),this.frame):null}finish(){this.built&&(this.elapsed_=this.built.duration)}reset(){this.selector.reset(),this.built=null,this.elapsed_=0}},Iz=class{constructor(){this.onChange=new p,this.planned=[],this.undone=[]}get plans(){return this.planned}get isEmpty(){return this.planned.length===0}get canUndo(){return this.planned.length>0}get canRedo(){return this.undone.length>0}plannedFor(e){return this.planned.find(t=>t.unit===e)}plan(e){let t=this.planned.findIndex(t=>t.unit===e.unit);t>=0?this.planned[t]=e:this.planned.push(e),this.undone=[],this.onChange.dispatch()}undo(){let e=this.planned.pop();return e?(this.undone.push(e),this.onChange.dispatch(),e):null}redo(){let e=this.undone.pop();return e?(this.planned=this.planned.filter(t=>t.unit!==e.unit),this.planned.push(e),this.onChange.dispatch(),e):null}clear(){(this.planned.length!==0||this.undone.length!==0)&&(this.planned=[],this.undone=[],this.onChange.dispatch())}commit(){let e=this.planned;return this.planned=[],this.undone=[],e.length>0&&this.onChange.dispatch(),e}},Lz=class e{constructor(){this.counts=new Map}record(e,t,n=1){let r=this.counts.get(e)??new Map;r.set(t,(r.get(t)??0)+n),this.counts.set(e,r)}forType(e,t){return this.counts.get(e)?.get(t)??0}total(e){let t=this.counts.get(e);if(!t)return 0;let n=0;for(let e of t.values())n+=e;return n}breakdown(e){let t=this.counts.get(e);return t?[...t.entries()].map(([e,t])=>({unitType:e,count:t})):[]}toJSON(){return{counts:[...this.counts].map(([e,t])=>[e,[...t]])}}static fromJSON(t){let n=new e;for(let[e,r]of t.counts)n.counts.set(e,new Map(r));return n}},Rz=l({AttackDialog:()=>Fz,AttackPreview:()=>Mz,BattleHooks:()=>Az,BattleStats:()=>Lz,Creature:()=>xz,Field:()=>jz,Party:()=>Cz,StatStages:()=>Ez,TypeMatrix:()=>Sz,UnitSelector:()=>Pz,Whiteboard:()=>Iz,battleOrder:()=>wz,checkEvolution:()=>Tz,chooseMove:()=>Dz,chooseSwitch:()=>Oz});function zz(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 Bz(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function Vz(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:zz(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(Wz(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 $z(n,`white`),$z(n,`black`),o}function Hz(e){return e===`white`?`black`:`white`}function Uz(e){return e&7}function Wz(e){return e>>3}function Gz(e,t){return e>=0&&e<8&&t>=0&&t<8}function Kz(){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 qz(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 Jz=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],Yz=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],Xz=[[1,1],[-1,1],[-1,-1],[1,-1]],Zz=[[1,0],[0,1],[-1,0],[0,-1]];function Qz(e,t,n){let r=Uz(t),i=Wz(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!Gz(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 Jz){if(!Gz(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 Yz){if(!Gz(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:Xz,kinds:[`bishop`,`queen`]},{steps:Zz,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(;Gz(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 $z(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 eB(e,t){return Qz(e.board,$z(e.board,t),Hz(t))}function tB(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=Uz(t),a=Wz(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;Gz(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(Gz(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(!Gz(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 Jz){if(!Gz(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(Xz);break;case`rook`:o(Zz);break;case`queen`:o(Xz),o(Zz);break;case`king`:{for(let[o,s]of Yz){if(!Gz(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&&!eB(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!Qz(e.board,o+5,Hz(n.side))&&!Qz(e.board,o+6,Hz(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]&&!Qz(e.board,o+3,Hz(n.side))&&!Qz(e.board,o+2,Hz(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function nB(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${Bz(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[rB(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[rB(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=Hz(n.side)}function rB(e,t){let n=Uz(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function iB(e){let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of tB(e,n)){let n=qz(e);nB(n,r),!eB(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function aB(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${Bz(t.from)} to move`);let r=tB(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${Bz(t.from)}-${Bz(t.to)} is not a legal move here`);let i=qz(e);if(nB(i,r),eB(i,e.turn))throw Error(`${Bz(t.from)}-${Bz(t.to)} leaves the king in check`);nB(e,r)}function oB(e){return iB(e).length>0?`ongoing`:eB(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var sB=1e5;function cB(e,t,n){if(!Number.isInteger(n.depth)||n.depth<1)throw RangeError(`depth must be a positive integer`);let r=n.maxNodes??sB;if(!Number.isInteger(r)||r<1)throw RangeError(`maxNodes must be a positive integer`);let i=e.currentPlayer(t),a=0,o=0,s,c=(t,l,u,d)=>{if(n.signal?.aborted)return s=`cancelled`,0;if(++a>r)return s=`budget-exceeded`,0;let f=e.currentPlayer(t)===i;if(n.onNode?.(l,f),l===0||e.isTerminal(t))return e.evaluate(t,i);let p=e.moves(t);if(!p.length)return e.evaluate(t,i);let m=f?-1/0:1/0;for(let n of p){let r=c(e.apply(t,n),l-1,u,d);if(s)return r;if(f?(m=Math.max(m,r),u=Math.max(u,m)):(m=Math.min(m,r),d=Math.min(d,m)),d<=u){o++;break}}return m},l=e.moves(t),u=null,d=e.evaluate(t,i);if(!e.isTerminal(t)&&l.length){let r=e.currentPlayer(t)===i,a=r?-1/0:1/0,o=-1/0,f=1/0;for(let i of l){let l=c(e.apply(t,i),n.depth-1,o,f);if(s)break;(u===null||(r?l>a:l<a))&&(u=i,a=l),r?o=Math.max(o,a):f=Math.min(f,a)}u!==null&&(d=a)}return{move:s?null:u,score:d,depth:n.depth,nodes:a,cutoffs:o,status:s??`complete`,state:t}}var lB=1e5,uB={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function dB(e,t={}){return fB(e,t).move}function fB(e,t={}){let n=cB(pB,e,{depth:Math.max(1,Math.floor(t.depth??3)),maxNodes:t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes))});return{move:n.move,score:n.score,nodes:n.nodes}}var pB={currentPlayer:e=>e.turn===`white`?1:-1,moves:e=>gB(e,iB(e)),apply:(e,t)=>{let n=qz(e);return aB(n,t),n},isTerminal:e=>oB(e)!==`ongoing`,evaluate:(e,t)=>oB(e)===`ongoing`?mB(e,t):hB(e,t)};function mB(e,t){let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*uB[t.kind]);return t===1?n:-n}function hB(e,t){let n=oB(e);return n===`stalemate`||!eB(e,e.turn)?0:(n===`white-wins`?1:-1)===t?lB:-1e5}function gB(e,t){return t.slice().sort((t,n)=>_B(e,n)-_B(e,t))}function _B(e,t){let n=e.board[t.to];return(t.promotion?uB[t.promotion]:0)*10+(n?uB[n.kind]:0)}var vB=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 yB(){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 bB(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=>SB(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>SB(e,t,!1)):[]}function xB(e,t){if(!bB(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||SB(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function SB(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 CB(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 wB(e,t,n){let r=OB(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 kB(e.size,r)){if(i[t]!==a||jB(i,e.size,t)!==0)continue;let n=AB(i,e.size,t);n.length===1&&(s=n[0]);for(let e of n)i[e]=null;o+=n.length}if(jB(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&jB(i,e.size,r)===1?s:null,e.board=i,e.turn=a,e.passes=0}function TB(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function EB(e){return e.passes>=2?`finished`:`ongoing`}function DB(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=AB(e.board,e.size,r),a=new Set;for(let t of i)for(let n of kB(e.size,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 OB(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 kB(e,t){let n=t%e,r=Math.floor(t/e),i=[];return n>0&&i.push(t-1),n<e-1&&i.push(t+1),r>0&&i.push(t-e),r<e-1&&i.push(t+e),i}function AB(e,t,n){let r=e[n],i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(!(o.has(n)||e[n]!==r)){o.add(n),i.push(n);for(let e of kB(t,n))a.push(e)}}return i}function jB(e,t,n){let r=AB(e,t,n),i=new Set;for(let n of r)for(let r of kB(t,n))e[r]===null&&i.add(r);return i.size}function MB(){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 NB(){let e=qB(2,6);return e[0]===e[1]?[...e,...e]:e}function PB(e,t){let n=e.turn===`white`?1:-1,r=n===1?[18,23]:[0,5],i=e=>n===1?24-e:e+1,a=!0,o=1/0;for(let t=0;t<24;t++)e.points[t]*n<=0||((t<r[0]||t>r[1])&&(a=!1),o=Math.min(o,i(t)));let s=(e,t)=>{if(!a)return!1;let n=i(e);return t===n||t>n&&n===o},c=[];for(let r of t){if(e.bar[e.turn]>0){let t=e.turn===`white`?r-1:24-r;IB(e,t,n)&&c.push({from:`bar`,to:t,die:r});continue}for(let t=0;t<24;t++)if(e.points[t]*n>0){let i=t+r*n;i<0||i>=24?s(t,r)&&c.push({from:t,to:`off`,die:r}):IB(e,i,n)&&c.push({from:t,to:i,die:r})}}return c}function FB(e,t){if(!PB(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 IB(e,t,n){return e.points[t]*n>=-1}function LB(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 RB(e){return ue(e)}function zB(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 BB(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 VB(e){let t=LB();return e===void 0?RB(t):re(e,()=>RB(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function HB(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 UB(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:!KB(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 WB(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 GB(e){return e.foundations.every(e=>e.length===13)}function KB(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 qB(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},()=>ae(1,t))}function JB(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return qB(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var YB=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=qB(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=ae(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 XB(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 ZB(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 QB(e,t,n){return cV(e,t,n)&&!sV(e,t,n)}function $B(e,t){if(!QB(e,t.x,t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t,maxActions:t.maxActions??t.actions}),e.turn||=t.owner}function eV(e,t){let n=oV(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=fV(e,n,dV(e,n)),i=[];for(let a=0;a<e.height;a++)for(let o=0;o<e.width;o++){if(o===n.x&&a===n.y||!e.cells[a*e.width+o].passable||sV(e,o,a))continue;let s=pV(e,n,o,a,n.actions,r);s!==null&&i.push({unit:t,x:o,y:a,cost:s})}return i}function tV(e,t){let n=eV(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=oV(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function nV(e,t){let n=oV(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 rV(e,t,n){let r=oV(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||uV(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 iV(e,t,n,r){let i=oV(e,t),a=oV(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(uV(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 aV(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=t.maxActions??t.actions,t.overwatch=!1)}function oV(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function sV(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function cV(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function lV(e,t,n){return e.shape===`hex`?sn(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function uV(e,t,n){return e.shape===`hex`?cn(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function dV(e,t){return new Set(e.units.filter(n=>n.owner!==t.owner&&lV(e,t.x,t.y).some(e=>e.x===n.x&&e.y===n.y)).map(e=>e.id))}function fV(e,t,n){let r=new Set;for(let i of e.units)if(!(i.owner===t.owner||n.has(i.id)))for(let t of lV(e,i.x,i.y))r.add(`${t.x},${t.y}`);return r}function pV(e,t,n,r,i,a){let o=[{x:t.x,y:t.y,distance:0}],s=0,c=new Set([`${t.x},${t.y}`]);for(;s<o.length;){let t=o[s++];if(t.x===n&&t.y===r)return t.distance;if(!(t.distance>=i||t.distance>0&&a.has(`${t.x},${t.y}`)))for(let i of lV(e,t.x,t.y)){let a=`${i.x},${i.y}`;cV(e,i.x,i.y)&&!c.has(a)&&e.cells[i.y*e.width+i.x].passable&&(!sV(e,i.x,i.y)||i.x===n&&i.y===r)&&(c.add(a),o.push({x:i.x,y:i.y,distance:t.distance+1}))}}return null}var mV=class{constructor(e,t){if(this.visible=new Map,this.explored=new Map,this.shared=new Map,e<1||t<1)throw Error(`fog needs positive dimensions`);this.width=e,this.height=t}share(e){let t=[...new Set(e)].filter(e=>!!e);if(t.length===0)return;let n=new Set(t);for(let e of t)for(let t of this.shared.get(e)??[])n.add(t);for(let e of n)this.shared.set(e,n)}sync(e,t,n){if(!e)throw Error(`fog needs a faction id`);let r=new Set;for(let e of t)for(let t of n(e))this.inside(t.x,t.y)&&r.add(this.index(t.x,t.y));this.visible.set(e,r);let i=this.explored.get(e)??new Set;for(let e of r)i.add(e);this.explored.set(e,i)}reveal(e,t){if(!e)throw Error(`fog needs a faction id`);let n=this.explored.get(e)??new Set;for(let e of t)this.inside(e.x,e.y)&&n.add(this.index(e.x,e.y));this.explored.set(e,n)}isVisible(e,t,n){return this.seenBy(this.visible,e,this.index(t,n))}sees(e){return(t,n)=>this.isVisible(e,t,n)}isExplored(e,t,n){return this.seenBy(this.explored,e,this.index(t,n))}visibleCells(e){return this.cellsSeenBy(this.visible,e)}exploredCells(e){return this.cellsSeenBy(this.explored,e)}seenBy(e,t,n){let r=this.shared.get(t);if(!r)return e.get(t)?.has(n)??!1;for(let t of r)if(e.get(t)?.has(n))return!0;return!1}cellsSeenBy(e,t){let n=this.shared.get(t);if(!n)return[...e.get(t)??[]];let r=new Set;for(let t of n)for(let n of e.get(t)??[])r.add(n);return[...r].sort((e,t)=>e-t)}inside(e,t){return e>=0&&t>=0&&e<this.width&&t<this.height}index(e,t){return this.inside(e,t)?t*this.width+e:-1}};function hV(e){return{currency:e,pool:[]}}function gV(e,t,n,r){return e.currency<r||!QB(t,n.x,n.y)?!1:($B(t,n),e.currency-=r,!0)}function _V(e,t,n,r,i){let a=e.pool.findIndex(e=>e.id===n);return a===-1||!QB(t,r,i)?!1:($B(t,{...e.pool[a],x:r,y:i}),e.pool.splice(a,1),!0)}function vV(e,t,n){let r=t.units.findIndex(e=>e.id===n);if(r===-1)return!1;let{x:i,y:a,...o}=t.units[r];return e.pool.push(o),t.units.splice(r,1),!0}function yV(e,t,n){return e.units.filter(e=>e.owner===t).length*(n.incomePerUnit-n.upkeepPerUnit)}function bV(e,t,n,r){return e.currency+=yV(t,n,r),e.currency}function xV(e,t,n,r){if(e<1||t<1)throw Error(`a skirmish map needs positive dimensions`);let i=r??Object.keys(n)[0];if(!i||!n[i])throw Error(`a skirmish map needs at least one terrain kind`);return{width:e,height:t,terrainTable:n,cells:Array.from({length:e*t},()=>({terrain:i})),units:[],turn:``,round:1}}function SV(e,t,n,r,i=!1){if(!MV(e,t,n))throw Error(`cell is outside the skirmish map`);if(!e.terrainTable[r])throw Error(`unknown skirmish terrain "${r}"`);e.cells[n*e.width+t]=i?{terrain:r,village:!0}:{terrain:r}}function CV(e,t,n){return MV(e,t,n)&&FV(e,t,n)<1/0&&!NV(e,t,n)}function wV(e,t){if(!CV(e,t.x,t.y))throw Error(`skirmish unit cannot be placed there`);e.units.push({...t,remainingMoves:t.moves}),e.turn||=t.owner}function TV(e,t){let n=jV(e,t),r=n.remainingMoves??n.moves;if(n.owner!==e.turn||r<=0)return[];let i=new Set(e.units.filter(e=>e.id!==n.id).map(e=>`${e.x},${e.y}`)),a=IV(e,n,r,i),o=[];for(let s=0;s<e.height;s++)for(let c=0;c<e.width;c++){if(c===n.x&&s===n.y||FV(e,c,s)===1/0||i.has(`${c},${s}`))continue;let l=a.get(`${c},${s}`);l!==void 0&&l<=r&&o.push({unit:t,x:c,y:s,cost:l})}return o}function EV(e,t){let n=TV(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal skirmish move`);let r=jV(e,t.unit);r.x=t.x,r.y=t.y,r.remainingMoves=(r.remainingMoves??r.moves)-n.cost;let i=e.cells[t.y*e.width+t.x];i.village&&(i.owner=r.owner)}function DV(e,t,n){let r=jV(e,t),i=jV(e,n);if(r.owner!==e.turn||r.owner===i.owner)throw Error(`invalid skirmish attack`);if(cn(r,i)!==1)throw Error(`skirmish combat is adjacency-only`);let a=[OV(e,r,i)];return i.hp>0&&a.push(OV(e,i,r)),e.units=e.units.filter(e=>e.hp>0),{strikes:a}}function OV(e,t,n){let r=PV(e,n.x,n.y).defense,i=se(Math.max(0,Math.min(1,t.hitChance*(1-r)))),a=i?Math.min(t.attack,n.hp):0;return n.hp-=a,{attacker:t.id,defender:n.id,hit:i,damage:a,killed:n.hp<=0}}function kV(e,t,n,r){return n+e.cells.filter(e=>e.village&&e.owner===t).length*r}function AV(e,t=0){let n=[...new Set(e.units.map(e=>e.owner))];if(n.length===0)return;let r=n.indexOf(e.turn)+1;r>=n.length&&e.round++,e.turn=n[r%n.length];for(let n of e.units){if(n.owner!==e.turn)continue;n.remainingMoves=n.moves;let r=e.cells[n.y*e.width+n.x];r.village&&r.owner===n.owner&&t>0&&(n.hp=Math.min(n.maxHp,n.hp+t))}}function jV(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown skirmish unit "${t}"`);return n}function MV(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function NV(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function PV(e,t,n){return e.terrainTable[e.cells[n*e.width+t].terrain]}function FV(e,t,n){return PV(e,t,n).moveCost}function IV(e,t,n,r){let i=[],a=(e,t)=>{[i[e],i[t]]=[i[t],i[e]]},o=e=>{i.push(e);let t=i.length-1;for(;t>0;){let e=t-1>>1;if(i[e].cost<=i[t].cost)break;a(t,e),t=e}},s=()=>{if(i.length===0)return;let e=i[0],t=i.pop();if(i.length>0){i[0]=t;let e=0;for(;;){let t=e*2+1,n=t+1,r=e;if(t<i.length&&i[t].cost<i[r].cost&&(r=t),n<i.length&&i[n].cost<i[r].cost&&(r=n),r===e)break;a(e,r),e=r}}return e},c=new Map([[`${t.x},${t.y}`,0]]);for(o({x:t.x,y:t.y,cost:0});;){let t=s();if(t===void 0)break;let i=`${t.x},${t.y}`;if(!(t.cost>(c.get(i)??1/0)))for(let i of sn(t.x,t.y)){if(!MV(e,i.x,i.y))continue;let a=FV(e,i.x,i.y);if(a===1/0||r.has(`${i.x},${i.y}`))continue;let s=t.cost+a;if(s>n)continue;let l=`${i.x},${i.y}`;s<(c.get(l)??1/0)&&(c.set(l,s),o({x:i.x,y:i.y,cost:s}))}}return c}var LV=l({BoardGrid:()=>vB,DiceCup:()=>YB,FactionFog:()=>mV,addSkirmishUnit:()=>wV,addTacticalUnit:()=>$B,applyBackgammonMove:()=>FB,applyCheckersMove:()=>xB,applyMove:()=>aB,applyUpkeep:()=>bV,armyIncome:()=>yV,backgammonMoves:()=>PB,bankUnit:()=>vV,canPlaceSkirmishUnit:()=>CV,canPlaceTacticalUnit:()=>QB,checkersMoves:()=>bB,chessGame:()=>pB,chooseMove:()=>dB,cloneChess:()=>qz,createDeck:()=>LB,deal:()=>zB,dealSolitaire:()=>VB,drawSolitaire:()=>HB,endSkirmishTurn:()=>AV,endTacticalTurn:()=>aV,gameResult:()=>oB,goResult:()=>EB,goScore:()=>DB,inCheck:()=>eB,legalMoves:()=>iB,moveSkirmishUnit:()=>EV,moveSolitaireTableau:()=>UB,moveSolitaireToFoundation:()=>WB,moveTacticalUnit:()=>tV,parseFen:()=>Vz,passGo:()=>TB,playGo:()=>wB,recall:()=>_V,recruit:()=>gV,rollBackgammonDice:()=>NB,rollDice:()=>qB,rollExpression:()=>JB,scoreDice:()=>XB,search:()=>fB,setSkirmishTerrain:()=>SV,setTacticalOverwatch:()=>nV,shuffleDeck:()=>RB,skirmishAttack:()=>DV,skirmishIncome:()=>kV,skirmishMoves:()=>TV,solitaireWon:()=>GB,sq:()=>zz,squareName:()=>Bz,startingArmy:()=>hV,startingBackgammon:()=>MB,startingCheckers:()=>yB,startingChess:()=>Kz,startingGo:()=>CB,startingSkirmish:()=>xV,startingTactics:()=>ZB,tacticalAttack:()=>iV,tacticalMoves:()=>eV,trickWinner:()=>BB,triggerTacticalOverwatch:()=>rV});function RV(e){return new Audio(AA(e))}var zV=new p,BV=class{constructor(e,t={}){this.next=0;let n=Math.max(1,t.poolSize??4),r=t.create??RV;this.volume=t.volume??1,this.caption=t.caption,this.pool=Array.from({length:n},()=>r(e))}play(e=1){let t=this.pool[this.next];this.next=(this.next+1)%this.pool.length,t.volume=this.volume*e,t.currentTime=0,Promise.resolve(t.play()).catch(()=>{}),this.caption&&zV.dispatch({text:this.caption})}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}},VV=class{constructor(e={}){this.current=null,this.fades=[],this.trackQueue=null,this.playlistFade=1,this.volume=e.volume??1,this.create=e.create??RV}play(e,t=1){this.trackQueue=null,this.start(e,t,!0)}playTracks(e,t=1){if(e.length===0){this.stop(t);return}this.trackQueue=[...e],this.playlistFade=t,this.startNextTrack()}startNextTrack(){if(!this.trackQueue?.length)return;let e=this.trackQueue.shift();this.trackQueue.push(e),this.start(e,this.playlistFade,!1)}start(e,t,n){let r=this.create(e);r.loop=n,!n&&r.onended!==void 0&&(r.onended=()=>{this.current===r&&this.startNextTrack()});let i=this.current;if(this.current=r,t<=0){r.volume=this.volume,Promise.resolve(r.play()).catch(()=>{}),i?.pause();return}r.volume=0,Promise.resolve(r.play()).catch(()=>{}),this.fades.push({audio:r,elapsed:0,duration:t,from:0,to:this.volume,stopAtEnd:!1}),i&&this.fades.push({audio:i,elapsed:0,duration:t,from:i.volume,to:0,stopAtEnd:!0})}stop(e=1){this.trackQueue=null;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))}}},HV=class{constructor(e){this.states=new Map,this.cues=new Map,this.currentTrack=null,this.music=e}define(e,t){this.states.set(e,t)}enter(e){let t=this.states.get(e);if(!t)throw Error(`Orchestrator: no state defined for "${e}"`);t.track!==this.currentTrack&&(this.music.play(t.track,t.fadeDuration),this.currentTrack=t.track)}on(e,t){this.cues.set(e,t)}trigger(e){this.cues.get(e)?.play()}};function UV(e={}){let t=e.waveform??`square`,n=e.frequency??440,r=e.duration??.15,i=e.volume??.3,a=e.decay??8,o=e.sampleRate??22050,s=e.seed??1;if(!(r>0))throw Error(`tone duration must be positive`);if(t!==`noise`&&!(n>0))throw Error(`tone frequency must be positive`);if(!(o>0))throw Error(`tone sample rate must be positive`);let c=Math.max(1,Math.round(r*o)),l=new Float32Array(c);for(let e=0;e<c;e++){let r=e/o,u=a>0?Math.exp(-a*e/c):1,d=2*Math.PI*n*r;l[e]=i*u*GV(t,d,s,e)}return qV(l,o)}function WV(e={},t=e=>new Audio(e)){let n=t(UV(e));return Promise.resolve(n.play()).catch(()=>{}),n}function GV(e,t,n,r){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`triangle`:{let e=t/(2*Math.PI),n=e-Math.floor(e);return 4*Math.abs(n-.5)-1}case`noise`:return KV(n,r)}}function KV(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function qV(e,t){let n=e.length*2,r=new ArrayBuffer(44+n),i=new DataView(r);JV(i,0,`RIFF`),i.setUint32(4,36+n,!0),JV(i,8,`WAVE`),JV(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*2,!0),i.setUint16(32,2,!0),i.setUint16(34,16,!0),JV(i,36,`data`),i.setUint32(40,n,!0);let a=44;for(let t of e){let e=Math.max(-1,Math.min(1,t));i.setInt16(a,Math.round(e*(e<0?32768:32767)),!0),a+=2}let o=``,s=new Uint8Array(r);for(let e of s)o+=String.fromCharCode(e);return`data:audio/wav;base64,${btoa(o)}`}function JV(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}var YV=5e5;function XV(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=e=>{let n=``;for(let i=0;i<e;i++)n+=String.fromCharCode(t[r+i]);return r+=e,n},a=()=>{let e=n.getUint32(r,!1);return r+=4,e},o=()=>{let e=n.getUint16(r,!1);return r+=2,e},s=()=>{let e=0;for(;;){let n=t[r++];if(e=e<<7|n&127,!(n&128))return e}};if(i(4)!==`MThd`||a()!==6)throw Error(`invalid MIDI header chunk`);let c=o(),l=o(),u=o();if(c!==0&&c!==1)throw Error(`unsupported MIDI format ${c}`);if(u&32768)throw Error(`SMPTE-based MIDI timing is not supported`);let d=u,f=[];for(let e=0;e<l;e++){let e=i(4),n=a();if(e!==`MTrk`){r+=n;continue}let o=r+n,c=0,l=0;for(;r<o;){c+=s();let e=t[r];if(e<128?e=l:(r++,e<240&&(l=e)),e===255){let e=t[r++],n=s();if(e===81&&n===3){let e=t[r]<<16|t[r+1]<<8|t[r+2];f.push({tick:c,type:`tempo`,microsecondsPerQuarter:e})}r+=n}else if(e===240||e===247)r+=s();else{let n=e&240,i=e&15;if(n===128||n===144){let e=t[r++],a=t[r++],o=n===144&&a>0;f.push({tick:c,type:o?`noteOn`:`noteOff`,note:e,velocity:a,channel:i})}else if(n===160||n===176||n===224)r+=2;else if(n===192||n===208)r+=1;else throw Error(`unsupported MIDI status byte 0x${e.toString(16)}`)}}}return f.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:d,events:f}}function ZV(e){let t=[],n=new Map,r=YV,i=0,a=0;for(let o of e.events){if(a+=(o.tick-i)*r/e.ticksPerQuarter/1e6,i=o.tick,o.type===`tempo`){r=o.microsecondsPerQuarter;continue}let s=`${o.channel}:${o.note}`;if(o.type===`noteOn`)n.set(s,{time:a,velocity:o.velocity});else{let e=n.get(s);e&&(t.push({time:e.time,duration:Math.max(.01,a-e.time),note:o.note,velocity:e.velocity,channel:o.channel}),n.delete(s))}}for(let[e,r]of n){let[n,i]=e.split(`:`).map(Number);t.push({time:r.time,duration:.3,note:i,velocity:r.velocity,channel:n})}return t.sort((e,t)=>e.time-t.time)}function QV(e){return 440*2**((e-69)/12)}var $V=class{constructor(e,t={}){this.elapsed=0,this.index=0,this.playing=!1,this.notes=ZV(e),this.playFn=t.play??WV,this.waveform=t.waveform??`square`,this.volume=t.volume??.2}play(){this.playing=this.index<this.notes.length}pause(){this.playing=!1}stop(){this.playing=!1,this.elapsed=0,this.index=0}update(e){if(this.playing){for(this.elapsed+=e;this.index<this.notes.length&&this.notes[this.index].time<=this.elapsed;){let e=this.notes[this.index];this.playFn({waveform:this.waveform,frequency:QV(e.note),duration:e.duration,volume:this.volume*(e.velocity/127)}),this.index++}this.index>=this.notes.length&&(this.playing=!1)}}get isPlaying(){return this.playing}get duration(){let e=this.notes.at(-1);return e?e.time+e.duration:0}};function eH(e,t={}){let n=t.refDistance??1,r=t.maxDistance??1/0,i=t.rolloff??1;if(!(e>n))return 1;if(!(e<r))return 0;let a=(n/e)**+i;return Math.max(0,Math.min(1,a))}function tH(e,t){let n=t.x-e.x,r=t.y-e.y,i=Math.hypot(n,r);if(i===0)return 0;let a=Math.sin(e.facing),o=Math.cos(e.facing),s=(n*a+r*o)/i;return Math.max(-1,Math.min(1,s))}var nH=class{constructor(e={}){this.x=e.x??0,this.y=e.y??0,this.facing=e.facing??0}moveTo(e,t){this.x=e,this.y=t}face(e){this.facing=e}},rH=class{constructor(e,t={}){this.sound=e,this.x=t.x??0,this.y=t.y??0,this.falloff={refDistance:t.refDistance,maxDistance:t.maxDistance,rolloff:t.rolloff}}moveTo(e,t){this.x=e,this.y=t}gainTo(e){return eH(Math.hypot(this.x-e.x,this.y-e.y),this.falloff)}panTo(e){return tH(e,this)}playFor(e){let t=this.gainTo(e);return t<=0?0:(this.sound.play(t),t)}},iH=l({AudioListener:()=>nH,MidiPlayer:()=>$V,Music:()=>VV,Orchestrator:()=>HV,Sound:()=>BV,SoundSource:()=>rH,audioGain:()=>eH,audioPan:()=>tH,createAudio:()=>RV,noteToFrequency:()=>QV,onCaption:()=>zV,parseMidi:()=>XV,playTone:()=>WV,scheduleMidi:()=>ZV,synthesizeTone:()=>UV});function aH(e,t){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`Turn budget must be a non-negative safe integer`);let n=0;for(;n<t;){if(e.finished())return{status:`finished`,steps:n};let t=e.scheduler.peek();if(t===null)return{status:`empty`,steps:n};if(e.needsInput(t))return{status:`input`,actor:t,steps:n};let r=e.act(t);if(r!==null){if(!Number.isFinite(r)||r<0)throw RangeError(`Action cost must be finite and non-negative, or null`);e.scheduler.spend(r)}n++}return{status:`limit`,steps:n}}function oH(e){let t=e.state,n=e.status??`ready`,r=[],i=0;for(let a of e.commands){if(n===`finished`)break;let o=e.step(t,a,e.random);t=o.state,n=o.status;for(let e of o.events)r.push(e);i++}return{state:t,events:r,status:n,processedCommands:i}}var sH=class e{constructor(e){if(this._reminders=[],this._results={},this.levels=new Map(e.levels.map(e=>[e.id,e])),this.levels.size!==e.levels.length)throw Error(`campaign level ids must be unique`);if(!this.levels.has(e.start))throw Error(`unknown campaign start level: ${e.start}`);this._currentLevel=e.start,this._state=structuredClone(e.state)}get currentLevel(){return this._currentLevel}get state(){return structuredClone(this._state)}get reminders(){return[...this._reminders]}get results(){return structuredClone(this._results)}playCurrent(){if(!this._currentLevel)throw Error(`campaign has no current level`);let e=this.levels.get(this._currentLevel);return this.completeCurrent(e.run(this.state,{levelId:e.id}))}completeCurrent(e){if(!this._currentLevel)throw Error(`campaign has no current level`);let t=this._currentLevel;if(this._state=structuredClone(e.state),e.result!==void 0&&(this._results[t]=structuredClone(e.result)),this._reminders=[...e.reminders??[]],e.outcome!==`completed`)this._currentLevel=null;else if(e.next===void 0)throw Error(`campaign level ${t} did not choose a next level`);else{if(e.next!==null&&!this.levels.has(e.next))throw Error(`unknown campaign transition: ${t} -> ${e.next}`);this._currentLevel=e.next}return{...e,state:this.state}}snapshot(){return{currentLevel:this._currentLevel,state:this.state,reminders:this.reminders,results:this.results}}static restore(t,n){let r=t.currentLevel??n.levels[0]?.id;if(!r)throw Error(`campaign restore requires at least one level`);let i=new e({levels:n.levels,start:r,state:t.state});return i._currentLevel=t.currentLevel,i._reminders=[...t.reminders],i._results=structuredClone(t.results),i}};function cH(e){let t=new w(e.seed);return{...oH({state:structuredClone(e.initialState),commands:e.commands,status:e.status,random:t,step:e.step}),seed:e.seed,random:t.getState()}}function lH(e,t,n){let r=uH.restore({...e,journal:[]},n),i=e=>({valid:!1,checked:e.index,state:r.state,journal:r.journal.toJSON(),mismatch:e});for(let e=0;e<t.length;e++){let n=t[e];if(n.sequence!==e)return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`sequence`});let a;try{a=r.dispatch(n.action)}catch(t){return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`execution`,error:t instanceof Error?t.message:String(t)})}if(Rn(a.events)!==Rn(n.events))return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:a.events,reason:`events`})}return n.expectedFinalState!==void 0&&Rn(r.state)!==Rn(n.expectedFinalState)?i({index:t.length,action:t.at(-1)?.action,expectedEvents:[],actualEvents:[],reason:`final-state`}):{valid:!0,checked:t.length,state:r.state,journal:r.journal.toJSON()}}var uH=class e{constructor(e){this._state=e.state,this._scheduler=e.scheduler,this.random=e.random,this.rule=e.rule,this.actorId=e.actorId,this.journal=e.journal??new Xt,this.actorOf=e.history?.actorOf??null,this.history=e.history?new On(e.history):null,this.history&&this.history.push(this.historySnapshot())}get scheduler(){return this._scheduler}get state(){return this._state}dispatch(e){let t=this.rule(this._state,e,{random:this.random,scheduler:this._scheduler});return this._state=t.state,t.cost!=null&&this._scheduler.spend(t.cost),this.journal.append(e,t.events),this.history&&this.history.push(this.historySnapshot()),t}get canUndo(){return this.history?.canUndo??!1}get canRedo(){return this.history?.canRedo??!1}undo(){if(!this.history||!this.actorOf)return null;let e=this.history.undo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}redo(){if(!this.history||!this.actorOf)return null;let e=this.history.redo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}snapshot(e=1){return{version:e,state:this._state,scheduler:this.scheduler.toJSON(this.actorId),random:this.random.getState(),journal:this.journal.toJSON()}}static restore(t,n){let r=new w;r.setState(t.random);let i=fL.restore(t.scheduler,n.actorOf);return new e({state:t.state,scheduler:i,random:r,journal:Xt.fromJSON(t.journal??[]),rule:n.rule,actorId:n.actorId})}historySnapshot(){return structuredClone(this.snapshot())}restoreCheckpoint(e){if(!this.actorOf)throw Error(`simulation history needs actorOf to restore a checkpoint`);this._state=structuredClone(e.state),this._scheduler=fL.restore(e.scheduler,this.actorOf),this.random.setState(e.random),this.journal.replace(e.journal??[])}},dH=class e{constructor(e){this.followUps=[],this.runtime=e.runtime,this.queue=new Pn({play:e.play}),this.followUpOf=e.followUp}get locked(){return this.queue.isBusy}submit(e){return this.locked?null:this.commit(e)}update(e){this.queue.update(e),this.drainFollowUps()}cancel(){this.queue.clear(),this.followUps=[]}snapshot(e=1){return this.runtime.snapshot(e)}static restore(t,n){let r=uH.restore(t,{rule:n.rule,actorOf:n.actorOf,actorId:n.actorId});return new e({runtime:r,play:n.play,followUp:n.followUp})}commit(e){let t=this.runtime.dispatch(e);return this.queue.enqueue(t.events),this.followUpOf&&this.followUps.push(...this.followUpOf(t)),this.drainFollowUps(),t}drainFollowUps(){for(;!this.queue.isBusy&&this.followUps.length>0;){let e=this.followUps.shift();this.commit(e)}}},fH=class{constructor(e){this.saves=new jt(e)}save(e,t,n){this.saves.save(e,{campaign:t.campaign.snapshot(),world:t.world,simulation:t.simulation?t.simulation.snapshot():null},n)}load(e){return this.saves.load(e)?.state??null}list(){return this.saves.list()}delete(e){this.saves.delete(e)}},pH=l({Campaign:()=>sH,CampaignSave:()=>fH,EventPresentation:()=>dH,Scheduler:()=>fL,SimulationRuntime:()=>uH,advanceToInput:()=>aH,runHeadlessScenario:()=>cH,runScenario:()=>oH,validateSimulationReplay:()=>lH}),mH=d(c(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.JSON5=r()})(e,(function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}var t=e(function(e){var t=e.exports=typeof window<`u`&&window.Math==Math?window:typeof self<`u`&&self.Math==Math?self:Function(`return this`)();typeof __g==`number`&&(__g=t)}),n=e(function(e){var t=e.exports={version:`2.6.5`};typeof __e==`number`&&(__e=t)});n.version;var r=function(e){return typeof e==`object`?e!==null:typeof e==`function`},i=function(e){if(!r(e))throw TypeError(e+` is not an object!`);return e},a=function(e){try{return!!e()}catch{return!0}},o=!a(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7}),s=t.document,c=r(s)&&r(s.createElement),l=function(e){return c?s.createElement(e):{}},u=!o&&!a(function(){return Object.defineProperty(l(`div`),"a",{get:function(){return 7}}).a!=7}),d=function(e,t){if(!r(e))return e;var n,i;if(t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e))||typeof(n=e.valueOf)==`function`&&!r(i=n.call(e))||!t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e)))return i;throw TypeError(`Can't convert object to primitive value`)},f=Object.defineProperty,p={f:o?Object.defineProperty:function(e,t,n){if(i(e),t=d(t,!0),i(n),u)try{return f(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported!`);return`value`in n&&(e[t]=n.value),e}},m=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}},h=o?function(e,t,n){return p.f(e,t,m(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},v=0,y=Math.random(),b=function(e){return`Symbol(${e===void 0?``:e})_${(++v+y).toString(36)}`},x=e(function(e){var r=`__core-js_shared__`,i=t[r]||(t[r]={});(e.exports=function(e,t){return i[e]||(i[e]=t===void 0?{}:t)})(`versions`,[]).push({version:n.version,mode:`global`,copyright:`© 2019 Denis Pushkarev (zloirock.ru)`})})(`native-function-to-string`,Function.toString),S=e(function(e){var r=b(`src`),i=`toString`,a=(``+x).split(i);n.inspectSource=function(e){return x.call(e)},(e.exports=function(e,n,i,o){var s=typeof i==`function`;s&&(_(i,`name`)||h(i,`name`,n)),e[n]!==i&&(s&&(_(i,r)||h(i,r,e[n]?``+e[n]:a.join(String(n)))),e===t?e[n]=i:o?e[n]?e[n]=i:h(e,n,i):(delete e[n],h(e,n,i)))})(Function.prototype,i,function(){return typeof this==`function`&&this[r]||x.call(this)})}),C=function(e){if(typeof e!=`function`)throw TypeError(e+` is not a function!`);return e},w=function(e,t,n){if(C(e),t===void 0)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},ee=`prototype`,T=function(e,r,i){var a=e&T.F,o=e&T.G,s=e&T.S,c=e&T.P,l=e&T.B,u=o?t:s?t[r]||(t[r]={}):(t[r]||{})[ee],d=o?n:n[r]||(n[r]={}),f=d[ee]||(d[ee]={}),p,m,g,_;for(p in o&&(i=r),i)m=!a&&u&&u[p]!==void 0,g=(m?u:i)[p],_=l&&m?w(g,t):c&&typeof g==`function`?w(Function.call,g):g,u&&S(u,p,g,e&T.U),d[p]!=g&&h(d,p,_),c&&f[p]!=g&&(f[p]=g)};t.core=n,T.F=1,T.G=2,T.S=4,T.P=8,T.B=16,T.W=32,T.U=64,T.R=128;var E=T,te=Math.ceil,ne=Math.floor,re=function(e){return isNaN(e=+e)?0:(e>0?ne:te)(e)},ie=function(e){if(e==null)throw TypeError(`Can't call method on `+e);return e},D=function(e){return function(t,n){var r=String(ie(t)),i=re(n),a=r.length,o,s;return i<0||i>=a?e?``:void 0:(o=r.charCodeAt(i),o<55296||o>56319||i+1===a||(s=r.charCodeAt(i+1))<56320||s>57343?e?r.charAt(i):o:e?r.slice(i,i+2):(o-55296<<10)+(s-56320)+65536)}}(!1);E(E.P,`String`,{codePointAt:function(e){return D(this,e)}}),n.String.codePointAt;var O=Math.max,ae=Math.min,oe=function(e,t){return e=re(e),e<0?O(e+t,0):ae(e,t)},se=String.fromCharCode,ce=String.fromCodePoint;E(E.S+E.F*(!!ce&&ce.length!=1),`String`,{fromCodePoint:function(e){for(var t=arguments,n=[],r=arguments.length,i=0,a;r>i;){if(a=+t[i++],oe(a,1114111)!==a)throw RangeError(a+` is not a valid code point`);n.push(a<65536?se(a):se(((a-=65536)>>10)+55296,a%1024+56320))}return n.join(``)}}),n.String.fromCodePoint;var le={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},k={isSpaceSeparator:function(e){return typeof e==`string`&&le.Space_Separator.test(e)},isIdStartChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`$`||e===`_`||le.ID_Start.test(e))},isIdContinueChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`$`||e===`_`||e===``||e===``||le.ID_Continue.test(e))},isDigit:function(e){return typeof e==`string`&&/[0-9]/.test(e)},isHexDigit:function(e){return typeof e==`string`&&/[0-9A-Fa-f]/.test(e)}},ue,de,fe,pe,me,he,ge,_e,ve,ye=function(e,t){ue=String(e),de=`start`,fe=[],pe=0,me=1,he=0,ge=void 0,_e=void 0,ve=void 0;do ge=Ce(),je[de]();while(ge.type!==`eof`);return typeof t==`function`?be({"":ve},``,t):ve};function be(e,t,n){var r=e[t];if(typeof r==`object`&&r){if(Array.isArray(r))for(var i=0;i<r.length;i++){var a=String(i),o=be(r,a,n);o===void 0?delete r[a]:Object.defineProperty(r,a,{value:o,writable:!0,enumerable:!0,configurable:!0})}else for(var s in r){var c=be(r,s,n);c===void 0?delete r[s]:Object.defineProperty(r,s,{value:c,writable:!0,enumerable:!0,configurable:!0})}}return n.call(e,t,r)}var A,j,xe,Se,M;function Ce(){for(A=`default`,j=``,xe=!1,Se=1;;){M=we();var e=Te[A]();if(e)return e}}function we(){if(ue[pe])return String.fromCodePoint(ue.codePointAt(pe))}function N(){var e=we();return e===`
|
|
1343
|
+
`))t.startsWith(`::`)?(i(),n=ZF(t),r=[]):n!==null&&r.push(t);return i(),t}function ZF(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 QF(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 $F(e,t){let n=[],r=[];for(let i of t.split(`
|
|
1344
|
+
`)){let t=eI(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 eI(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(tI(i.slice(a+2,o),n)),i=i.slice(o+2)}}function tI(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}}var nI=class{constructor(e){this.onChange=new p,this.onMusic=new p,this.index=0,this.beats=e}get length(){return this.beats.length}get position(){return this.index}get current(){return this.beats[this.index]??null}get done(){return this.beats.length===0||this.index>=this.beats.length-1}get music(){return this.current?.music??null}goTo(e){let t=Math.max(0,Math.min(this.beats.length-1,e));this.index=t,this.report()}advance(){return!this.done&&(this.goTo(this.index+1),!0)}back(){return this.index!==0&&(this.goTo(this.index-1),!0)}skip(){this.goTo(this.beats.length-1)}restart(){this.goTo(0)}report(){let e=this.current;e&&this.onChange.dispatch(e),this.onMusic.dispatch(this.music)}},rI=class extends J{constructor(e){super(),this.backdrop=new $s(K.EMPTY),this.handleAdvance=()=>{this.advance()},this.handleBeat=e=>{this.applyBeat(e)},this.sequence=e.sequence,this.textureFor=e.textureFor??(()=>null),this.playMusic=e.playMusic??(()=>{}),this.width_=e.width,this.height_=e.height,this.titleLabel=new vM({text:``,color:$().color.textHighlight}),this.textLabel=new vM({text:``,wrapWidth:this.width_*.8}),this.addChild(this.backdrop),this.addChild(this.titleLabel),this.addChild(this.textLabel),this.eventMode=`static`,this.on(`pointertap`,this.handleAdvance),this.sequence.onChange.add(this.handleBeat),this.sequence.onMusic.add(this.playMusic),this.applyBeat(this.sequence.current)}get current(){return this.sequence.current}advance(){return this.sequence.advance()}skip(){this.sequence.skip()}resize(e,t){this.width_=e,this.height_=t,this.applyBeat(this.current)}applyBeat(e){if(!e){this.backdrop.visible=!1;return}let t=e.image?this.textureFor(e.image):null;if(this.backdrop.visible=t!==null,t){this.backdrop.texture=t;let e=Math.max(this.width_/t.width,this.height_/t.height);this.backdrop.scale.set(e),this.backdrop.x=(this.width_-t.width*e)/2,this.backdrop.y=(this.height_-t.height*e)/2}this.titleLabel.setText(e.title??``),this.titleLabel.x=this.width_*.1,this.titleLabel.y=this.height_*.12,this.textLabel.setText(e.text),this.textLabel.x=this.width_*.1,this.textLabel.y=this.height_*.24,this.textLabel.style.wordWrapWidth=this.width_*.8}destroy(e){this.sequence.onChange.remove(this.handleBeat),this.sequence.onMusic.remove(this.playMusic),super.destroy(e)}},iI=[[0,-1],[1,0],[0,1],[-1,0]],aI=[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],oI=[[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[0,1]],sI=[[1,1],[1,0],[0,-1],[-1,0],[-1,1],[0,1]];function cI(e){return e===4?iI:aI}var lI={passable:!1,transparent:!1},uI={passable:!0,transparent:!0},dI=class e{constructor(e,t,n,r=0,i=`square`,a){if(this.rooms=[],this.width=e,this.shape=i,this.height=t,a!==void 0&&(!Number.isFinite(a)||a<0))throw Error(`viewDistance must be a finite non-negative number`);this.viewDistance=a,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`?sn(e,t):cI(n).map(([n,r])=>({x:e+n,y:t+r}))}forEachNeighbor(e,t,n,r){let i=this.shape===`hex`?e&1?sI:oI:cI(n);for(let[n,a]of i)r(e+n,t+a)}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)]??lI}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})),...this.viewDistance===void 0?{}:{viewDistance:this.viewDistance}}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape,n.viewDistance);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function fI(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function pI(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 mI={id:`hall`,paint:(e,t,n)=>e.fillRect(t,n)};function hI(e){return Math.min(e.right-e.left+1,e.bottom-e.top+1)}function gI(e){return Math.max(e.right-e.left+1,e.bottom-e.top+1)}function _I(e,t){let n=hI(t),r=gI(t);return e.filter(e=>n>=(e.minSize??0)&&r<=(e.maxSize??1/0))}function vI(e,t){let n=_I(e,t);if(n.length===0)return null;let r=le(n.map(e=>e.weight??1));return r===null?null:n[r]}var yI=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function bI(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=[],hooks:u,builders:d}=e,f=new dI(t,n,[...yI,...l],s),p=[],m=[],h=[],g=0;for(let e=0;e<r*6&&p.length<r;e++){let e=ae(i,a),r=ae(i,a),o=O(1,Math.max(2,t-e-1)),s=O(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};if(l.right>=t-1||l.bottom>=n-1){g++;continue}if(p.some(e=>pI(l,e,2))){g++;continue}p.push(l);let m=(d?.length?vI(d,l):null)??mI;m.paint(f,l,c),h.push(m.id),u?.onRoomPlaced?.(l,p.length-1)}for(let e=1;e<p.length;e++){SI(f,fI(p[e-1]),fI(p[e]),c);let t={a:e-1,b:e,extra:!1};m.push(t),u?.onCorridorCarved?.(t,p[e-1],p[e])}for(let e=0;e<o&&p.length>2;e++){let e=O(p.length),t=O(p.length);if(e!==t){SI(f,fI(p[e]),fI(p[t]),c);let n={a:e,b:t,extra:!0};m.push(n),u?.onCorridorCarved?.(n,p[e],p[t])}}return f.rooms=p,{level:f,graph:m,retries:g,roomBuilders:h}}function xI(e){return bI(e).level}function SI(e,t,n,r){se(.5)?(CI(e,t.x,n.x,t.y,!0,r),CI(e,t.y,n.y,n.x,!1,r)):(CI(e,t.y,n.y,t.x,!1,r),CI(e,t.x,n.x,n.y,!0,r))}function CI(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 wI(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[O(n.length)]:null}function TI(e,t){let n=null,r=-1;for(let i of e.rooms){let e=fI(i),a=(e.x-t.x)**2+(e.y-t.y)**2;a>r&&(r=a,n=i)}return n}var EI=class e{constructor(){this.defs=new Map,this.placed=new Map}define(e,t){this.defs.set(e,t)}place(e,t){if(!this.defs.has(t))throw Error(`FeatureLayer.place: no definition for kind "${t}"`);this.placed.set(e,t)}has(e){return this.placed.has(e)}kindAt(e){return this.placed.get(e)}remove(e){this.placed.delete(e)}inspect(e,t){this.defAt(e)?.inspect?.(e,t)}interact(e,t){let n=this.defAt(e);n&&(n.interact&&n.interact(e,t)===!1||(n.consequence?.(e,t),n.persistent===!1&&this.remove(e)))}defAt(e){let t=this.placed.get(e);return t===void 0?void 0:this.defs.get(t)}toJSON(){return{cells:[...this.placed.entries()]}}static fromJSON(t,n){let r=new e;for(let[e,n]of t)r.define(e,n);for(let[e,t]of n.cells)r.place(e,t);return r}};function DI(e,t=[],n=!0){let r=[],i=e.map(e=>e.value);t.forEach((e,t)=>{if(e.enabled===!1){r.push({step:`rare`,index:t,outcome:`deferred`});return}let n=se(e.chance);r.push({step:`rare`,index:t,outcome:n?`added`:`skipped`}),n&&i.push(e.value)});for(let t=0;t<e.length;t++){let n=e[t].alternative;if(!n)continue;let a=se(n.chance);r.push({step:`alternative`,index:t,outcome:a?`swapped`:`kept`}),a&&(i[t]=n.value)}return n&&(ue(i),r.push({step:`shuffle`,index:-1,outcome:`shuffled`})),{roster:i,trace:r}}function OI(e,t){return e.length===t.length&&e.every((e,n)=>e.a===t[n].a&&e.b===t[n].b&&e.extra===t[n].extra)}function kI(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function AI(e,t){if(e.length!==t.length)return!1;let n=[...e].sort((e,t)=>e[0]-t[0]),r=[...t].sort((e,t)=>e[0]-t[0]);return n.every(([e,t],n)=>e===r[n][0]&&t===r[n][1])}function jI(e,t){let n=[];return e.retries!==t.retries&&n.push({stage:`graph`,field:`retries`,expected:e.retries,actual:t.retries}),OI(e.graph,t.graph)||n.push({stage:`graph`,field:`graph`,expected:e.graph,actual:t.graph}),(e.width!==t.width||e.height!==t.height||!kI(e.terrain,t.terrain))&&n.push({stage:`paint`,field:`terrain`,expected:e.terrain,actual:t.terrain}),(e.roomBuilders.length!==t.roomBuilders.length||e.roomBuilders.some((e,n)=>e!==t.roomBuilders[n]))&&n.push({stage:`paint`,field:`roomBuilders`,expected:e.roomBuilders,actual:t.roomBuilders}),AI(e.features,t.features)||n.push({stage:`paint`,field:`features`,expected:e.features,actual:t.features}),JSON.stringify(e.content)!==JSON.stringify(t.content)&&n.push({stage:`paint`,field:`content`,expected:e.content,actual:t.content}),e.rngDraws!==t.rngDraws&&n.push({stage:`paint`,field:`rngDraws`,expected:e.rngDraws,actual:t.rngDraws}),n}function MI(e,t=2){let n=e(),r=[];for(let i=1;i<t;i++)r.push(...jI(n,e()));return r}var NI=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)*NI,e=e*69069+1>>>0,this._s1=e*NI,e=e*69069+1>>>0,this._s2=e*NI,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*NI;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 PI=class{getContainer(){return null}setOptions(e){this._options=e}},FI=class extends PI{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 II(e){return e.charAt(0).toUpperCase()+e.substring(1)}function LI(e,...t){let n=LI.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=II(d)),d})}LI.map={s:`toString`};var RI=class e extends FI{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}};RI.cache=!1;var zI={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]]},BI=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=[zI[8][7],zI[8][1],zI[8][3],zI[8][5]];break;case 6:i=zI[6],a=1,o=[-1,1];break;case 8:i=zI[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}},VI=class extends BI{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)}},HI=class extends BI{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}},UI=[[-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]],WI={DiscreteShadowcasting:VI,PreciseShadowcasting:HI,RecursiveShadowcasting:class extends BI{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<UI.length;i++)this._renderOctant(e,t,UI[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,UI[o],n,i),this._renderOctant(e,t,UI[a],n,i),this._renderOctant(e,t,UI[r],n,i),this._renderOctant(e,t,UI[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,UI[r],n,i),this._renderOctant(e,t,UI[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 GI=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=zI[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}},KI={Dijkstra:class extends GI{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 GI{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 qI(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function JI(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 YI(e,t,n,r={}){let i=e.shape===`hex`?un(t,n):JI(t,n),a=r.stop??`opaque`,o=[],s=null;for(let t of i)if(o.push(t),o.length!==1&&a!==`none`&&(a===`outside`&&!e.inside(t.x,t.y)||a===`opaque`&&e.inside(t.x,t.y)&&!e.transparent(t.x,t.y)||a===`impassable`&&e.inside(t.x,t.y)&&!e.passable(t.x,t.y))){s=t;break}return{cells:o,stop:s}}function XI(e,t,n){let r=e.shape===`hex`?un(t,n):JI(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 ZI(e,t,n,r){return!((e.shape===`hex`?cn(t,n):qI(t,n))>r.range||(r.requireLineOfSight??!0)&&!XI(e,t,n))}function QI(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return JI(e,t);case`cone`:return tL(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 $I(e,t,n,r){return e.shape===`hex`?r.kind===`single`?[{...n}]:r.kind===`line`?un(t,n):r.kind===`burst`?dn(n,r.radius):eL(t,n,r.width):QI(t,n,r)}function eL(e,t,n){let r=cn(e,t);if(r===0)return[{...e}];let i=un(e,t),a=[];for(let t=1;t<=r;t++){let o=i[t],s=Math.round(t/r*n);for(let n of dn(o,s))cn(e,n)===t&&a.push(n)}return a}function tL(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}var nL=.5;function rL(e){return e<0?-Math.round(-e):Math.round(e)}function iL(e,t,n,r){if(!Number.isFinite(r.degrees)||r.degrees<0)throw Error(`a cone sector needs a finite non-negative angle in degrees`);if(!Number.isFinite(r.range)||r.range<0)throw Error(`a cone sector needs a finite non-negative range`);let i=n.x-t.x,a=n.y-t.y;if(i===0&&a===0)return[{...t}];let o=Math.atan2(a,i),s=r.degrees*Math.PI/360,c=Math.max(1,Math.round(r.degrees/nL)),l=r.stop??`opaque`,u=new Set,d=[];for(let n=0;n<=c;n++){let i=o-s+2*s*n/c,a={x:t.x+rL(Math.cos(i)*r.range),y:t.y+rL(Math.sin(i)*r.range)};for(let n of YI(e,t,a,{stop:l}).cells){if(n.x===t.x&&n.y===t.y||!e.inside(n.x,n.y))continue;let r=e.index(n.x,n.y);u.has(r)||(u.add(r),d.push({x:n.x,y:n.y}))}}return d}function aL(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=qI(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 oL(e,t,n=1){for(let n of t)if(e<=n.max)return n.multiplier;return n}function sL(e,t){return t.length===0?1:t[Math.min(e,t.length-1)]}function cL(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 lL=class{constructor(e,t){if(this.onMove=new p,this.onConfirm=new p,this.onCancel=new p,!Number.isFinite(t.range)||t.range<0)throw Error(`targeting range must be a finite non-negative number`);this.level=e,this.origin={...t.origin},this.range=t.range,this.requireLineOfSight=t.requireLineOfSight??!0,this.validate=t.validate,this.shape=t.shape??{kind:`single`},this.cursor={...t.cursor??t.origin}}get target(){return{...this.cursor}}get distance(){return this.level.shape===`hex`?cn(this.origin,this.cursor):qI(this.origin,this.cursor)}get inRange(){return this.distance<=this.range}get inSight(){return XI(this.level,this.origin,this.cursor)}get valid(){return!this.inRange||this.requireLineOfSight&&!this.inSight?!1:!this.validate||this.validate(this.cursor)}move(e,t){if(this.level.shape===`hex`){let n=this.level.neighbors(this.cursor.x,this.cursor.y).find(n=>n.x-this.cursor.x===e&&n.y-this.cursor.y===t);n&&this.moveTo(n);return}this.moveTo({x:this.cursor.x+e,y:this.cursor.y+t})}moveTo(e){this.level.inside(e.x,e.y)&&(this.cursor={x:e.x,y:e.y},this.onMove.dispatch({...this.cursor}))}setShape(e){this.shape=e}preview(){return this.valid?$I(this.level,this.origin,this.cursor,this.shape):[]}confirm(){if(!this.valid)return null;let e={origin:{...this.origin},target:{...this.cursor},shape:this.shape,cells:this.preview()};return this.onConfirm.dispatch(e),e}cancel(){this.onCancel.dispatch()}},uL=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 WI.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n=this.level.viewDistance??Math.max(this.level.width,this.level.height),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 dn(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=un(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 dn(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=un(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)||qI(a,{x:t,y:o})>n)continue;let e=JI(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)}},dL=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)}},fL=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 KI.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;this.level.forEachNeighbor(o,s,t.topology??8,(e,t)=>{if(!i(e,t,o,s))return;let r=this.level.index(e,t);n[r]===-1&&(n[r]=c,a.push(r))})}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;return this.level.forEachNeighbor(e.x,e.y,n.topology??8,(n,i)=>{if(!r(e.x,e.y,n,i))return;let s=t[this.level.index(n,i)];s!==-1&&s<o&&(o=s,a={x:n,y:i})}),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);this.level.forEachNeighbor(r.x,r.y,n.topology??8,(e,t)=>{if(!i(r.x,r.y,e,t))return;let n=this.level.index(e,t);o.has(n)||(o.add(n),a.set(n,r),s.push({x:e,y:t}))})}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()}},pL=class e{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,n=e.priority??0){if(!Number.isFinite(t)||t<0)throw Error(`scheduler delay must be finite and non-negative`);if(!Number.isFinite(n))throw Error(`scheduler priority must be finite`);this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++,priority:n}),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()}postpone(e,t){let n=this.entries.find(t=>t.actor===e);n&&(n.time+=t,n.sequence=this.sequence++,this.sort())}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}toJSON(e){return{now:this.now,sequence:this.sequence,entries:this.entries.map(t=>({id:e(t.actor),time:t.time,sequence:t.sequence,...t.priority===0?{}:{priority:t.priority}}))}}static restore(t,n){let r=new e;return r.now=t.now,r.sequence=t.sequence,r.entries=t.entries.map(e=>({actor:n(e.id),time:e.time,sequence:e.sequence,priority:e.priority??0})),r.sort(),r}sort(){this.entries.sort((e,t)=>e.time-t.time||t.priority-e.priority||e.sequence-t.sequence)}};function mL(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:hL(e,n,a)};let c=new uL(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:gL(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:hL(e,n,a)}}function hL(e,t,n){return ce(_L(e,t,n))}function gL(e,t,n,r){let i=_L(e,t,r),a=null,o=vL(t,n);for(let e of i){let t=vL(e,n);t>o&&(o=t,a=e)}return a}function _L(e,t,n){let r=n.blocked,i=[];for(let[a,o]of cI(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 vL(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var yL=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}},bL=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}},xL=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}check(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}},SL=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}advance(e=1){for(let[t,n]of this.remaining)n<=e?this.remaining.delete(t):this.remaining.set(t,n-e)}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}},CL=class extends x{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}},wL=class{constructor(e){this.detected=!1,this.radius=e.radius}get isDetected(){return this.detected}checkDetection(e,t){if(this.detected)return!1;let n=t.some(t=>qI(e,t)<=this.radius);return n&&(this.detected=!0),n}reset(){this.detected=!1}},TL=class e{constructor(e){this.streak=0,this.lastTurn=-1/0,this.window=e}get count(){return this.streak}trigger(e){return this.streak=e-this.lastTurn<=this.window?this.streak+1:1,this.lastTurn=e,this.streak}isActive(e){return e-this.lastTurn<=this.window}reset(){this.streak=0,this.lastTurn=-1/0}toJSON(){return{streak:this.streak,lastTurn:this.lastTurn}}static fromJSON(t,n){let r=new e(t);return r.streak=n.streak,r.lastTurn=n.lastTurn,r}},EL=class e{constructor(e){if(this.index=-1,this.remaining=0,e.length===0)throw Error(`a multi-stage ability needs at least one stage`);this.stages=e}get active(){return this.index>=0}get stage(){return this.index>=0?this.stages[this.index]:null}start(){return!this.active&&(this.index=0,this.remaining=this.stages[0].duration,!0)}advance(){return!this.active||(this.remaining--,this.remaining>0)?null:(this.index++,this.index>=this.stages.length?(this.index=-1,`done`):(this.remaining=this.stages[this.index].duration,this.stages[this.index].name))}cancel(){this.index=-1,this.remaining=0}toJSON(){return{index:this.index,remaining:this.remaining}}static fromJSON(t,n){let r=new e(t);return r.index=n.index,r.remaining=n.remaining,r}},DL=class e{constructor(e){if(this.index=0,this.state=`idle`,typeof e.damage!=`function`&&!Number.isFinite(e.damage))throw Error(`beam damage must be a finite number or a function`);if(typeof e.damage==`number`&&e.damage<0)throw Error(`beam damage must be non-negative`);if(this.options=e,this.shape=e.shape??(e.fronts?`fronts`:`line`),e.fronts){let t=e.fronts([{...e.from}],0);this.fronts=t.length?[t.map(e=>({...e}))]:[]}else this.fronts=$I(e.level,e.from,e.target,{kind:`line`}).slice(1).map(e=>[{...e}])}get active(){return this.state===`active`}get done(){return this.state===`done`||this.state===`blocked`||this.state===`cancelled`}get beamShape(){return this.shape}get currentPath(){return this.fronts.flat().map(e=>({...e}))}start(){return this.state===`idle`&&(this.state=this.fronts.length===0?`done`:`active`,!0)}advance(){if(this.state!==`active`)return this.inactiveStep();let e=this.fronts[this.index]??[],t=Math.max(0,this.fronts.length-this.index-1),n=[],r=[],i=0;for(let a of e){let e={cell:{...a},step:this.index,remaining:t};if(!this.blocked(a,e)){n.push({...a}),this.options.onCell?.({...a},e);for(let t of this.options.targetsAt?.(a)??[]){let n=typeof this.options.damage==`function`?this.options.damage(t,e):this.options.damage;if(!Number.isFinite(n)||n<0)throw Error(`beam damage callback must return a non-negative finite number`);i+=n,r.push(t),this.options.applyDamage?.(t,n,e)}}}let a=this.index;if(this.index++,this.options.fronts&&n.length>0){let e=this.options.fronts(n.map(e=>({...e})),this.index);e.length&&this.fronts.push(e.map(e=>({...e})))}return n.length===0?this.state=`blocked`:this.index>=this.fronts.length&&(this.state=`done`),{status:n.length===0?`blocked`:this.state,cell:n[0]?{...n[0]}:null,cells:n.map(e=>({...e})),step:a,remaining:t,targets:[...r],damage:i}}cancel(){(this.state===`active`||this.state===`idle`)&&(this.state=`cancelled`)}toJSON(){return{state:this.state,fronts:this.fronts.map(e=>e.map(e=>({...e}))),index:this.index,shape:this.shape}}static fromJSON(t,n){let r=n.shape??(t.fronts?`fronts`:`line`);if(t.shape!==void 0&&t.shape!==r)throw Error(`beam save is shape "${r}", not "${t.shape}"`);let i=Object.create(e.prototype);return i.options=t,i.shape=r,i.fronts=n.fronts?n.fronts.map(e=>e.map(e=>({...e}))):(n.path??[]).map(e=>[{...e}]),i.index=n.index,i.state=n.state,i}blocked(e,t){let n=this.options.blocker??(this.options.stopAtOpaque===!1?`none`:`terrain`),r=!1;return n===`terrain`?r=!this.options.level.inside(e.x,e.y)||!this.options.level.transparent(e.x,e.y):n!==`none`&&(r=n({...e},t)===!0),r||this.options.isBlocked?.({...e},t)===!0}inactiveStep(){return{status:this.state,cell:null,cells:[],step:this.index,remaining:Math.max(0,this.fronts.length-this.index),targets:[],damage:0}}};function OL(e,t={}){return(t.within?[...t.within]:jL(e.cellCount)).filter(n=>!(t.occupied?.has(n)||t.terrain&&!t.terrain.has(e.terrain[n])))}function kL(e,t,n){let r=new Set([t]),i=[t];for(let t=0;t<Math.max(0,n);t++){let t=[];for(let n of i)e.forEachNeighbor(e.xOf(n),e.yOf(n),8,(n,i)=>{if(!e.inside(n,i))return;let a=e.index(n,i);r.has(a)||(r.add(a),t.push(a))});i=t}return r.delete(t),[...r]}function AL(e,t){let n=[...new Set(e)];ue(n);let r=n.slice(0,Math.max(0,t));return{cells:r,trace:{requested:t,available:n.length,selected:r}}}function jL(e){let t=Array(e);for(let n=0;n<e;n++)t[n]=n;return t}var ML=l({AbilityCycle:()=>SL,BossPhases:()=>xL,CombatHooks:()=>CL,DUNGEON_KINDS:()=>yI,Doors:()=>bL,Elevation:()=>dL,FLOOR:()=>uI,FeatureLayer:()=>EI,FieldOfView:()=>uL,Level:()=>dI,MultiStageAbility:()=>EL,MultiTurnBeam:()=>DL,Pathfinder:()=>fL,Scheduler:()=>pL,Secrets:()=>yL,Stealth:()=>wL,TargetingController:()=>lL,TriggerTracker:()=>TL,WALL:()=>lI,areaFalloffMultiplier:()=>sL,ballistica:()=>YI,canTarget:()=>ZI,candidateCells:()=>OL,cellsNear:()=>kL,chainTargets:()=>aL,chebyshevDistance:()=>qI,checkDeterminism:()=>MI,compareDungeonArtifacts:()=>jI,coneCells:()=>tL,coneSector:()=>iL,decideMonsterAI:()=>mL,eligibleBuilders:()=>_I,findFreeCell:()=>wI,furthestRoom:()=>TI,generateDungeon:()=>xI,generateDungeonGraph:()=>bI,hallBuilder:()=>mI,hasLineOfSight:()=>XI,hexConeCells:()=>eL,knockbackPath:()=>cL,neighbourOffsets:()=>cI,pickBuilder:()=>vI,rangeMultiplier:()=>oL,rectCenter:()=>fI,rectsOverlap:()=>pI,resolveArea:()=>QI,resolveAreaOnLevel:()=>$I,rollRoster:()=>DI,selectDistinctCells:()=>AL,traceLine:()=>JI});function NL(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 PL=class e{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]=NL(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=NL(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}toJSON(){return{base:{...this.baseValues}}}static fromJSON(t,n){let r=new e(t);return r.baseValues={...t.base,...n.base},r.cache=null,r}};function FL(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var IL=class e{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}toJSON(){return{level:this.level,experience:this.experience}}static fromJSON(t,n){return new e(t,n)}};function LL(e,t,n=()=>ae(1,20)){return e+n()>=t}var RL=class e{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}toJSON(){return{points:this.available}}static fromJSON(t,n,r){let i=new e(t,n);return i.available=r.points,i}},zL=class e{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);return this.wear(e,t),n}wear(e,t){this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t})}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}"`)}toJSON(e){return{worn:[...this.worn].map(([t,n])=>[t,e(n)])}}static fromJSON(t,n){let r=new e(t.slots,t.stats??null,{locked:t.locked});for(let[e,i]of n.worn)r.assertSlot(e),r.wear(e,t.resolve(i));return r}},BL=class e{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,t){return this.slots.find(n=>n.id===e&&(t===void 0||n.instanceId===t))}add(e){if(!Number.isFinite(e.quantity)||e.quantity<=0||e.weight!==void 0&&(!Number.isFinite(e.weight)||e.weight<0)||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&&t.instanceId===e.instanceId);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t,n){if(t!==void 0&&(!Number.isFinite(t)||t<=0))return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r];i.quantity-=t??i.quantity,i.quantity<=0&&this.slots.splice(r,1)}take(e,t=1,n){if(!Number.isFinite(t)||t<=0)return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r],a=Math.min(Math.floor(t),i.quantity);if(a<=0)return;let o={...i,quantity:a};return i.quantity-=a,i.quantity<=0&&this.slots.splice(r,1),o}toJSON(){return{capacity:this.capacity,slots:this.slots.map(e=>({id:e.id,quantity:e.quantity,instanceId:e.instanceId,identified:e.identified,cursed:e.cursed,blessed:e.blessed,level:e.level,affix:e.affix,durability:e.durability,maxDurability:e.maxDurability,contents:e.contents?.toJSON()}))}}static fromJSON(t,n){let r=new e({capacity:n.capacity});return r.slots=n.slots.map(n=>{let r=t.get(n.id);if(!r)throw Error(`Inventory.fromJSON: no definition for item "${n.id}"`);let{contents:i,...a}=n,o={...r,...VL(a),id:n.id,quantity:n.quantity};return i&&(o.contents=e.fromJSON(t,i)),o}),r}};function VL(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function HL(e,t){return t.matches?t.matches(e):t.category===void 0?typeof t.id==`string`?e.id===t.id:(t.id??[]).includes(e.id):e.category===t.category}function UL(e){return e.matches!==void 0||e.category!==void 0||e.id!==void 0}function WL(e,t){let n=new Map;for(let t of e.items)n.set(t,t.quantity);let r=new Map;for(let i of t.ingredients){if(!UL(i))throw Error(`recipe ingredient must name an id, a category, or a matches predicate`);if(!Number.isFinite(i.quantity)||i.quantity<=0)throw Error(`recipe ingredient quantity must be a positive number`);let t=i.quantity;for(let a of e.items){if(t<=0)break;let e=n.get(a)??0;if(e<=0||!HL(a,i))continue;let o=Math.min(e,t);n.set(a,e-o),t-=o,r.set(a,(r.get(a)??0)+o)}if(t>0)return!1}for(let[t,n]of r)e.remove(t.id,n,t.instanceId);if(e.add(t.result))return!0;for(let[t,n]of r)e.add({...t,quantity:n});return!1}function GL(e,t){let n=e.add({duration:t.duration,tick:e=>t.tick?.(e),onExpire:t.onExpire});return{cancel:()=>{e.remove(n),t.onExpire()}}}function KL(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});return GL(t,{duration:n.duration,tick:n.tick,onExpire:()=>e.removeModifiersFrom(r)})}function qL(e,t={}){let n=e.entries.filter(e=>e.weight>0&&(t.curse===void 0||!!e.curse===t.curse)&&(t.predicate?.(e)??!0));if(n.length===0)return null;let r=le(n.map(e=>e.weight));return r===null?null:n[r]}function JL(e){return e.affix}function YL(e,t){let n=e.affix!==void 0;e.affix=t.id,t.curse?e.cursed=!0:n&&(e.cursed=!1)}function XL(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function ZL(e,t){if(e.affix===void 0){XL(t);return}t.affix=e.affix,t.cursed=e.cursed??!1}function QL(e,t){return!(e.trigger!==t.trigger||e.kinds&&(t.kind===void 0||!e.kinds.includes(t.kind)))}function $L(e){e.identified=!0}function eR(e,t,n=`keep`){return Number.isFinite(t)?(e.level=(e.level??0)+t,n===`remove`&&XL(e),e.level):e.level??0}function tR(e,t){return e.maxDurability===void 0?!1:!Number.isFinite(t)||t<=0?(e.durability??e.maxDurability)<=0:(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function nR(e,t){e.maxDurability!==void 0&&(!Number.isFinite(t)||t<=0||(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t)))}function rR(e,t,n){let r=new Map;for(let t of Object.keys(n.fields))r.set(t,e[t]),e[t]=n.fields[t];return GL(t,{duration:n.duration,tick:n.tick,onExpire:()=>{for(let[t,n]of r)e[t]=n}})}var iR=class e{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}refund(e=1){let t=Math.min(e,this.max-this.value);return this.value+=t,t}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)}}toJSON(){return{current:this.value,progress:this.progress}}static fromJSON(t,n){let r=new e({...t,current:n.current});return r.progress=n.progress,r}};function aR(e){if(e.entries.length===0||!se(e.chance??1))return null;let t=le(e.entries.map(e=>e.weight));if(t===null)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var oR=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 sR(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}function cR(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=O(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 lR=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=cR(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 uR(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 dR(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):(n.add({...s,quantity:i}),!1))}function fR(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 pR(e){let t=new Map;for(let n of e)t.set(n.stat,(t.get(n.stat)??0)+n.amount);return t}function mR(e,t){return[...pR(fR(t))].every(([t,n])=>e.base(t)>=n)}function hR(e,t){let n=pR(fR(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}function gR(e,t,n=1){for(let[r,i]of pR(fR(t)))e.setBase(r,e.base(r)+i*n)}function _R(e,t,n,r){return hR(e,t)?n.refund(Math.floor(t.amount/r)):0}var vR=class e{constructor(){this.layers=[]}add(e,t=0){e<=0||this.layers.push({amount:e,decayPerTick:t})}get total(){return this.layers.reduce((e,t)=>e+t.amount,0)}get layerCount(){return this.layers.length}absorb(e){let t=e,n=0;for(;t>0&&this.layers.length>0;){let e=this.layers[this.layers.length-1],r=Math.min(e.amount,t);e.amount-=r,t-=r,n+=r,e.amount<=0&&this.layers.pop()}return n}advance(e=1){for(let t=this.layers.length-1;t>=0;t--){let n=this.layers[t];n.decayPerTick&&(n.amount-=n.decayPerTick*e,n.amount<=0&&this.layers.splice(t,1))}}clear(){this.layers=[]}toJSON(){return{layers:this.layers.map(e=>({...e}))}}static fromJSON(t){let n=new e;return n.layers=t.layers.map(e=>({...e})),n}};function yR(e,t,n){return ue([...t]).slice(0,Math.min(n,t.length)).map(t=>{let n=Symbol(`trait:${t.name}`);for(let r of t.modifiers)e.addModifier({...r,source:n});return{trait:t,source:n}})}var bR=class{constructor(){this.affected=new Map}update(e,t){let n=new Set(e),r=e.filter(e=>!!e.aura),i=new Set(r);for(let i of r){let r=this.affected.get(i);r||(r=new Map,this.affected.set(i,r));for(let n of e){if(n===i)continue;let e=t(i,n),a=r.get(n);if(e&&!a){let e=Symbol(`aura:${i.aura.name}`);for(let t of i.aura.modifiers)n.stats.addModifier({...t,source:e});r.set(n,e)}else!e&&a&&(n.stats.removeModifiersFrom(a),r.delete(n))}for(let[e,t]of[...r])n.has(e)||(e.stats.removeModifiersFrom(t),r.delete(e))}for(let[e,t]of[...this.affected])if(!i.has(e)){for(let[e,n]of t)e.stats.removeModifiersFrom(n);this.affected.delete(e)}}},xR=class e{constructor(e){if(this.points=new Map,e.some(e=>!e.id||!Number.isFinite(e.threshold)||e.threshold<0))throw Error(`support levels need an id and a non-negative threshold`);this.levels=[...e].sort((e,t)=>e.threshold-t.threshold)}get(e,t){return this.points.get(SR(e,t))??0}level(e,t){let n=this.get(e,t),r=null;for(let e of this.levels){if(e.threshold>n)break;r=e}return r}add(e,t,n){if(!e||!t||e===t)throw Error(`support needs two different named units`);if(!Number.isFinite(n))throw Error(`support amount must be finite, got ${n}`);let r=this.level(e,t),i=SR(e,t),a=Math.max(0,(this.points.get(i)??0)+n);return this.points.set(i,a),{a:e,b:t,points:a,previousLevel:r,level:this.level(e,t)}}toJSON(){return{pairs:[...this.points].map(([e,t])=>{let[n,r]=e.split(`\0`);return[n,r,t]})}}static fromJSON(t,n){let r=new e(t);for(let[e,t,i]of n.pairs){if(!e||!t||e===t||!Number.isFinite(i)||i<0)throw Error(`invalid support save data`);let n=SR(e,t);if(r.points.has(n))throw Error(`invalid support save data: duplicate pair "${e}" / "${t}"`);r.points.set(n,i)}return r}};function SR(e,t){return[e,t].sort().join(`\0`)}var CR=new Set([`id`,`growth`,`level`,`startingAffix`,`startingItem`,`lowHpReaction`]);function wR(e,t={},n){let r=new PL({base:kR(e)}),i;e.growth!==void 0&&(i=new IL(OR(e,t),{level:e.level??1}));let a;if(e.startingItem!==void 0){let n=t.items?.[e.startingItem];if(!n)throw Error(`entity template "${e.id}": unknown starting item "${e.startingItem}"`);if(a=n(),e.startingAffix!==void 0){let n=t.affixes?.[e.startingAffix];if(!n)throw Error(`entity template "${e.id}": unknown affix "${e.startingAffix}"`);YL(a,n)}}else if(e.startingAffix!==void 0)throw Error(`entity template "${e.id}": a starting affix needs a starting item to carry it`);let o=new $t,s={id:e.id,stats:r,progression:i,item:a,reactions:o};if(e.lowHpReaction!==void 0){if(!n)throw Error(`entity template "${e.id}": names a lowHpReaction threshold but no onLowHp callback was given`);let t=e.lowHpReaction;o.add({id:`low-hp`,when:e=>e.hp/e.maxHp<=t,action:()=>n(s)})}return s}function TR(e,t={},n){return e.map(e=>wR(e,t,n))}function ER(e){let t={stats:e.stats.toJSON()};return e.progression&&(t.progression=e.progression.toJSON()),e.item&&(t.item=e.item),t}function DR(e,t,n,r){let i=wR(e,t,r);if(i.stats=PL.fromJSON({base:kR(e)},n.stats),n.progression!==void 0){if(!i.progression)throw Error(`entity template "${e.id}": save data has progression but the row names no growth curve`);i.progression=IL.fromJSON(OR(e,t),n.progression)}return n.item!==void 0&&(i.item=n.item),i}function OR(e,t){let n=t.growthCurves?.[e.growth??``];if(!n)throw Error(`entity template "${e.id}": unknown growth curve "${e.growth}"`);return n}function kR(e){let t={};for(let[n,r]of Object.entries(e))if(!CR.has(n)){if(typeof r!=`number`)throw Error(`entity template "${e.id}": stat "${n}" must be a number, got ${typeof r}`);t[n]=r}return t}var AR=l({Advancement:()=>oR,Appearances:()=>lR,AuraField:()=>bR,Barrier:()=>vR,Charges:()=>iR,EquipmentSlots:()=>zL,Inventory:()=>BL,Progression:()=>IL,SkillPoints:()=>RL,StatBlock:()=>PL,SupportLedger:()=>xR,affixOf:()=>JL,applyAffix:()=>YL,applyItemStatusEffect:()=>rR,applyStatusEffect:()=>KL,assignAppearances:()=>cR,assignTraits:()=>yR,buildEntities:()=>TR,buildEntity:()=>wR,buy:()=>uR,canAfford:()=>mR,composeModifiers:()=>NL,convertToCharges:()=>_R,copyAffix:()=>ZL,craft:()=>WL,damageItem:()=>tR,enchant:()=>eR,fromEntitySaveState:()=>DR,identify:()=>$L,matchesContext:()=>QL,powerCurve:()=>FL,refund:()=>gR,removeAffix:()=>XL,repairItem:()=>nR,rollAffix:()=>qL,rollLoot:()=>aR,scaledModifiers:()=>sR,sell:()=>dR,skillCheck:()=>LL,spend:()=>hR,toEntitySaveState:()=>ER}),jR=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)}},MR=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()]}},NR=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 PR(e){if(e.entries.length===0||!se(e.rate))return null;let t=le(e.entries.map(e=>e.weight));return t===null?null:e.entries[t].value}var FR=class e{constructor(e={}){if(this.changed=new p,this.dayLength=e.dayLength??120,!(this.dayLength>0))throw Error(`an environment day must be longer than zero seconds`);if(this.boundaries=e.phaseBoundaries??[.2,.7,.8],this.boundaries[0]<=0||this.boundaries[0]>=this.boundaries[1]||this.boundaries[1]>=this.boundaries[2]||this.boundaries[2]>=1)throw Error(`environment phase boundaries must be ascending fractions strictly between 0 and 1`);if(this.seconds_=e.startSeconds??0,this.weather_=e.startWeather??`clear`,!Number.isFinite(this.seconds_))throw Error(`environment startSeconds must be finite`)}get day(){return Math.floor(this.seconds_/this.dayLength)}get seconds(){return this.seconds_}get weather(){return this.weather_}get phase(){let e=(this.seconds_%this.dayLength+this.dayLength)%this.dayLength/this.dayLength;return e<this.boundaries[0]?`dawn`:e<this.boundaries[1]?`day`:e<this.boundaries[2]?`dusk`:`night`}get night(){return this.phase===`night`}update(e){if(!Number.isFinite(e)||e<0)throw Error(`environment update must be non-negative, got ${e}`);this.seconds_+=e;let t=this.toJSON();return this.changed.dispatch(t),t}setWeather(e){if(!e)throw Error(`weather needs a non-empty id`);this.weather_=e;let t=this.toJSON();return this.changed.dispatch(t),t}toJSON(){return{day:this.day,seconds:this.seconds_,phase:this.phase,weather:this.weather_}}static fromJSON(t,n){return new e({...t,startSeconds:n.seconds,startWeather:n.weather})}},IR=class e{constructor(e){if(e.sides.length===0)throw Error(`SideTurns needs at least one side`);if(e.schedule.length===0)throw Error(`SideTurns needs a non-empty schedule`);let t=e.round??1,n=e.sideIndex??0,r=e.timeIndex??0;if(!Number.isInteger(t)||t<1)throw Error(`SideTurns round must be a positive integer`);if(n<0||n>=e.sides.length)throw Error(`SideTurns side index ${n} is outside ${e.sides.length} sides`);if(r<0||r>=e.schedule.length)throw Error(`SideTurns time index ${r} is outside ${e.schedule.length} times`);this.sides=[...e.sides],this.schedule=[...e.schedule],this.areas=e.areas??[],this.state={round:t,sideIndex:n,timeIndex:r}}get round(){return this.state.round}get side(){return this.sides[this.state.sideIndex]}get timeIndex(){return this.state.timeIndex}get timeOfDay(){return this.schedule[this.state.timeIndex]}get snapshot(){return{...this.state}}timeOfDayAt(e,t){for(let n of this.areas)if(n.contains(e,t))return n.times[this.state.timeIndex]??this.timeOfDay;return this.timeOfDay}lawfulBonusAt(e,t,n){return LR(e,this.timeOfDayAt(t,n).lawfulBonus)}advance(){let e=!1;return this.state.sideIndex++,this.state.sideIndex>=this.sides.length&&(this.state.sideIndex=0,this.state.round++,this.state.timeIndex=(this.state.timeIndex+1)%this.schedule.length,e=!0),{side:this.side,round:this.state.round,newRound:e}}toJSON(){return this.snapshot}static fromJSON(t,n){return new e({...t,round:n.round,sideIndex:n.sideIndex,timeIndex:n.timeIndex})}};function LR(e,t){switch(e){case`lawful`:return t;case`chaotic`:return-t;default:return 0}}var RR=l({EnvironmentClock:()=>FR,Overworld:()=>MR,SideTurns:()=>IR,TurnClock:()=>NR,World:()=>jR,alignmentBonus:()=>LR,rollEncounter:()=>PR});function zR(e,t,n={}){let r=n.pick??O,i=0;return t.forEach((t,n)=>{BR(t,t.name??`#${n+1}`,e.shape);let a=VR(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 BR(e,t,n){if(e.topology&&(n===`square`||n===`hex`)&&e.topology!==n)throw Error(`automap rule "${t}" targets ${e.topology} cells, but the map is ${n}`);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 r=e.width*e.height;for(let[n,i]of Object.entries(e.input))if(i.length!==r)throw Error(`automap rule "${t}" input "${n}" has ${i.length} cells, but the pattern is ${r}`);e.outputs.forEach((e,n)=>{for(let[i,a]of Object.entries(e))if(a.length!==r)throw Error(`automap rule "${t}" output ${n+1} "${i}" has ${a.length} cells, but the pattern is ${r}`)})}function VR(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)HR(e,t,i,r)&&n.push([i,r]);return n}function HR(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 UR=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 WR(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function GR(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>WR(e,t))&&(n=r);return n}var KR=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=WR(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){return this.options.present({text:e,speaker:t,choices:n})}};function qR(e,t){t&&e.has?.(t)&&e.play?.(t)}var JR=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=YR(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=YR(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=XR(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=XR(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(){qR(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){qR(this.sprite,this.options.idleAnimation?.(this.facing))}};function YR(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function XR(e,t,n){return e+(t-e)*n}var ZR=class{constructor(e,t,n,r={}){this.facing=0,this.moving=!1,this.sprite=e,this.x=t,this.y=n,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.moving}move(e,t,n){let r=Math.hypot(e,t);r>0?(this.facing=Math.atan2(t,e),this.x+=e/r*this.speed*n,this.y+=t/r*this.speed*n,this.moving||(this.moving=!0,this.playWalk())):this.moving&&(this.moving=!1,this.playIdle()),this.place(),this.sprite.update?.(n)}turnTo(e,t){this.moving||e===0&&t===0||(this.facing=Math.atan2(t,e),this.playIdle())}place(){this.sprite.x=this.x,this.sprite.y=this.y}playWalk(){qR(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){qR(this.sprite,this.options.idleAnimation?.(this.facing))}};function QR(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function $R(e,t){let n=e.x-t.x,r=e.y-t.y,i=e.radius+t.radius;return n*n+r*r<i*i}function ez(e,t){let n=Wn(e.x,t.x,t.x+t.width),r=Wn(e.y,t.y,t.y+t.height),i=e.x-n,a=e.y-r;return i*i+a*a<e.radius*e.radius}function tz(e,t,n,r){let{tileSize:i,isSolid:a}=r;if(!(i>0))throw Error(`collision tileSize must be positive`);let o=nz(e.x,e.y,e.width,e.height,t,i,a,!0);return{x:o,y:nz(o,e.y,e.width,e.height,n,i,a,!1)}}function nz(e,t,n,r,i,a,o,s){if(i===0)return s?e:t;let c=s?e:t,l=s?n:r,u=c+i,d=Math.floor((s?t:e)/a),f=Math.floor(((s?t+r:e+n)-1e-6)/a),p=(e,t)=>s?o(e,t):o(t,e);if(i>0){let e=Math.floor((c+l-1e-6)/a),t=Math.floor((u+l-1e-6)/a);for(let n=e+1;n<=t;n++)for(let e=d;e<=f;e++)if(p(n,e))return n*a-l}else{let e=Math.floor(c/a),t=Math.floor(u/a);for(let n=e-1;n>=t;n--)for(let e=d;e<=f;e++)if(p(n,e))return(n+1)*a}return u}var rz=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map,this.tracked=null}define(e){this.definitions.set(e.id,e)}track(e){e!==null&&this.require(e),this.tracked=e}trackedQuest(){return this.tracked!==null&&this.status(this.tracked)===`active`?this.tracked:null}trackedLocation(){let e=this.trackedQuest();return e?this.currentStage(e)?.location??null:null}markerFor(e,t){return e.some(e=>this.status(e)===`active`&&this.stageSatisfied(e,t))?`turnIn`:e.some(e=>this.status(e)===`available`)?`offer`:`none`}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}advanceStage(e,t){return this.stageSatisfied(e,t)?(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0):!1}stageSatisfied(e,t){let n=this.currentStage(e);return n?n.condition?WR(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target:!1}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex],tracked:this.tracked}}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 n.tracked&&(r.tracked=n.tracked),r}};function iz(e){let t=[],n=new Map;for(let r of e){let e=n.get(r.questId);e||(e={id:r.questId,stages:[]},r.requires!==void 0&&(e.requires=r.requires),n.set(r.questId,e),t.push(r.questId)),e.stages.push(az(e.id,r))}return t.map(e=>n.get(e))}function az(e,t){if(t.conditionSwitch!==void 0&&t.conditionVariable!==void 0)throw Error(`quest "${e}": a stage row cannot name both a condition switch and a condition variable`);let n={};if(t.conditionSwitch!==void 0){if(t.conditionEquals===void 0)throw Error(`quest "${e}": conditionSwitch needs a conditionEquals`);n.condition={switch:t.conditionSwitch,equals:t.conditionEquals}}else if(t.conditionVariable!==void 0){if(t.conditionAtLeast===void 0)throw Error(`quest "${e}": conditionVariable needs a conditionAtLeast`);n.condition={variable:t.conditionVariable,atLeast:t.conditionAtLeast}}if(t.counterVariable!==void 0){if(t.counterTarget===void 0)throw Error(`quest "${e}": counterVariable needs a counterTarget`);n.counter={variable:t.counterVariable,target:t.counterTarget}}if(t.description!==void 0&&(n.description=t.description),t.locationMap!==void 0||t.locationX!==void 0||t.locationY!==void 0){if(t.locationX===void 0||t.locationY===void 0)throw Error(`quest "${e}": a stage location needs both locationX and locationY`);n.location={x:t.locationX,y:t.locationY},t.locationMap!==void 0&&(n.location.map=t.locationMap)}return n}var oz=class{constructor(e){this.name=e}},sz=4,cz=8,lz=new WeakMap;function uz(e){return lz.get(e)}function dz(e,t){return lz.set(e,t),e}var fz=class{constructor(e){this.pos=0,this.symbols=[],this.objects=[],this.bytes=e}byte(){if(this.pos>=this.bytes.length)throw Error(`Marshal: unexpected end of input`);return this.bytes[this.pos++]}take(e){if(e<0)throw Error(`Marshal: negative length`);let t=this.bytes.subarray(this.pos,this.pos+e);if(t.length<e)throw Error(`Marshal: unexpected end of input`);return this.pos+=e,t}readFixnum(){let e=this.byte()<<24>>24;if(e===0)return 0;if(e>=5&&e<=127)return e-5;if(e<=-5&&e>=-128)return e+5;if(e>0){let t=0;for(let n=0;n<e;n++)t|=this.byte()<<8*n;return t>>>0}let t=-e,n=0;for(let e=0;e<t;e++)n|=this.byte()<<8*e;return(n>>>0)-2**(8*t)}readBytes(){return this.take(this.readFixnum())}readSymbol(){let e=new TextDecoder().decode(this.readBytes());return this.symbols.push(e),e}readSymbolLink(){let e=this.readFixnum(),t=this.symbols[e];if(t===void 0)throw Error(`Marshal: symbol link ${e} out of range`);return t}readSymbolValue(){let e=String.fromCharCode(this.byte());if(e===`:`)return this.readSymbol();if(e===`;`)return this.readSymbolLink();throw Error(`Marshal: expected a symbol, got tag "${e}"`)}link(e){return this.objects.push(e),e}readBignum(){let e=String.fromCharCode(this.byte())===`-`?-1:1,t=this.readFixnum(),n=0,r=1;for(let e=0;e<t;e++)n+=(this.byte()|this.byte()<<8)*r,r*=65536;return e*n}readFloat(){let e=new TextDecoder().decode(this.readBytes());return e===`inf`?1/0:e===`-inf`?-1/0:e===`nan`?NaN:Number(e)}readArray(){let e=[];this.link(e);let t=this.readFixnum();for(let n=0;n<t;n++)e.push(this.readValue());return e}readHash(e){let t=new Map;this.link(t);let n=this.readFixnum();for(let e=0;e<n;e++)t.set(this.readValue(),this.readValue());return e&&lz.set(t,this.readValue()),t}readIvars(e){let t={};for(let n=0;n<e;n++)t[this.readSymbolValue()]=this.readValue();return t}readObject(){let e={class:``,ivars:{}};return this.link(e),e.class=this.readSymbolValue(),e.ivars=this.readIvars(this.readFixnum()),e}readIvarWrapped(){let e=this.readValue();return this.readIvars(this.readFixnum()),e}readUserDefined(){let e={class:``,raw:new Uint8Array};return this.link(e),e.class=this.readSymbolValue(),e.raw=this.readBytes().slice(),e}readUserMarshal(){let e={class:``,value:null};return this.link(e),e.class=this.readSymbolValue(),e.value=this.readValue(),e}readValue(){let e=String.fromCharCode(this.byte());switch(e){case`0`:return null;case`T`:return!0;case`F`:return!1;case`i`:return this.readFixnum();case`l`:return this.link(this.readBignum());case`f`:return this.link(this.readFloat());case`:`:return this.readSymbol();case`;`:return this.readSymbolLink();case`"`:return this.link(new TextDecoder().decode(this.readBytes()));case`[`:return this.readArray();case`{`:return this.readHash(!1);case`}`:return this.readHash(!0);case`o`:return this.readObject();case`I`:return this.readIvarWrapped();case`u`:return this.readUserDefined();case`U`:return this.readUserMarshal();case`@`:{let e=this.readFixnum(),t=this.objects[e];if(t===void 0)throw Error(`Marshal: object link ${e} out of range`);return t}default:throw Error(`Marshal: unsupported tag "${e}" (0x${e.charCodeAt(0).toString(16)})`)}}readDocument(){let e=this.byte(),t=this.byte();if(e!==sz||t>cz)throw Error(`Marshal: unsupported version ${e}.${t} (expected ${sz}.${cz} or lower)`);return this.readValue()}};function pz(e){return new fz(e).readDocument()}function mz(e){return typeof e==`object`&&!!e&&`class`in e&&`ivars`in e}function hz(e){let t=[sz,cz];return gz(t,e),new Uint8Array(t)}function gz(e,t){if(t==null)e.push(_z(`0`));else if(t===!0)e.push(_z(`T`));else if(t===!1)e.push(_z(`F`));else if(t instanceof oz)e.push(_z(`:`)),vz(e,t.name);else if(typeof t==`number`)Number.isInteger(t)&&Math.abs(t)<2**30?(e.push(_z(`i`)),yz(e,t)):(e.push(_z(`f`)),vz(e,Number.isFinite(t)?String(t):t>0?`inf`:t<0?`-inf`:`nan`));else if(typeof t==`string`)e.push(_z(`"`)),vz(e,t);else if(Array.isArray(t)){e.push(_z(`[`)),yz(e,t.length);for(let n of t)gz(e,n)}else if(t instanceof Map){let n=lz.has(t);e.push(_z(n?`}`:`{`)),yz(e,t.size);for(let[n,r]of t)gz(e,n),gz(e,r);n&&gz(e,lz.get(t))}else if(mz(t)){e.push(_z(`o`)),e.push(_z(`:`)),vz(e,t.class);let n=Object.entries(t.ivars);yz(e,n.length);for(let[t,r]of n)e.push(_z(`:`)),vz(e,t),gz(e,r)}else throw Error(`Marshal: cannot encode a value of type ${typeof t}`)}function _z(e){return e.charCodeAt(0)}function vz(e,t){let n=new TextEncoder().encode(t);yz(e,n.length);for(let t of n)e.push(t)}function yz(e,t){if(t===0){e.push(0);return}if(t>0&&t<=122){e.push(t+5);return}if(t<0&&t>=-123){e.push(t-5&255);return}if(t>0){for(let n=1;n<=4;n++)if(t<2**(8*n)){e.push(n);for(let r=0;r<n;r++)e.push(t>>>8*r&255);return}}else for(let n=1;n<=4;n++)if(t>=-(2**(8*n))){e.push(-n&255);let r=t+2**(8*n);for(let t=0;t<n;t++)e.push(r>>>8*t&255);return}throw Error(`Marshal: integer ${t} is out of range for a Fixnum`)}var bz=l({AUTOMAP_EMPTY:()=>-1,EventRunner:()=>KR,FreeMover:()=>ZR,GameState:()=>UR,GridMover:()=>JR,QuestLog:()=>rz,RubySymbol:()=>oz,aabbOverlap:()=>QR,activePage:()=>GR,automap:()=>zR,circleAabbOverlap:()=>ez,circleOverlap:()=>$R,conditionHolds:()=>WR,decodeMarshal:()=>pz,encodeMarshal:()=>hz,hashDefaultOf:()=>uz,questsFromRows:()=>iz,resolveAabbAgainstTiles:()=>tz,withHashDefault:()=>dz}),xz=FL(20,2,100),Sz=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new IL(e.species.growth??xz,{level:e.level??1}),this.stats=new PL({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}}},Cz=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)}},wz=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 Tz(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function Ez(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var Dz=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 Oz(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 kz(e,t,n,r){let i=null,a=Az(e,n,r);return t.forEach((e,t)=>{let o=Az(e.types,n,r);o<a&&(a=o,i=t)}),i}function Az(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var jz=class extends x{},Mz=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(e=1){for(let[t,n]of this.conditions)n.duration!==void 0&&(n.duration-=e,n.duration<=0&&this.conditions.delete(t))}},Nz=class{constructor(e){this.chanceToHit=Pz(e.chanceToHit??1),this.strikeDuration=Math.max(0,e.strikeDuration??0),this.totalDamage=Math.max(0,e.damage)*Math.max(0,e.strikes),this.expectedDamage=this.totalDamage*this.chanceToHit,this.defenderHp0=e.defender.hp;let t=[],n=e.defender.hp;for(let r=0;r<=e.strikes;r++)r>0&&(e.hits?.[r-1]??!0)&&(n-=Math.max(0,e.damage)),t.push({strike:r,time:r*this.strikeDuration,attackerHp:e.attacker.hp,defenderHp:Math.max(0,n),defenderDamage:this.defenderHp0-Math.max(0,n)});this.frames=t}get duration(){return this.strikeDuration*(this.frames.length-1)}get defenderKilled(){return this.frames[this.frames.length-1].defenderHp===0}sampleAt(e){let t=this.frames.length-1;if(this.strikeDuration<=0)return this.frames[t];let n=0;for(let r=0;r<=t&&this.frames[r].time<=e+1e-9;r++)n=r;return this.frames[n]}};function Pz(e){return Math.max(0,Math.min(1,e))}var Fz=class{constructor(e){this.onChange=new p,this.stage_=`attacker`,this.charge=null,this.victim=null,this.highlight_=0,this.units=e.units,this.side=e.side,this.disabledOf=e.disabled??(e=>e.disabled??!1),this.canTarget=e.canTarget??(()=>!0)}get stage(){return this.stage_}get attacker(){return this.charge}get target(){return this.victim}get done(){return this.charge!==null&&this.victim!==null}get candidates(){return this.units.filter(e=>(this.side===void 0||e.side===this.side)&&!this.disabledOf(e))}get targets(){let e=this.charge;return e?this.units.filter(t=>t.id!==e.id&&!this.disabledOf(t)&&(e.side===void 0||t.side!==e.side)&&this.canTarget(e,t)):[]}get highlight(){return this.highlight_}get highlighted(){return this.active()[this.highlight_]??null}move(e){let t=this.active();t.length!==0&&(this.highlight_=((this.highlight_+e)%t.length+t.length)%t.length,this.onChange.dispatch())}select(){let e=this.highlighted;return e?(this.stage_===`attacker`?(this.charge=e,this.stage_=`target`,this.highlight_=0):this.victim=e,this.onChange.dispatch(),!0):!1}back(){if(this.stage_===`attacker`)return;let e=this.charge;this.charge=null,this.victim=null,this.stage_=`attacker`;let t=e?this.candidates.findIndex(t=>t.id===e.id):-1;this.highlight_=t>=0?t:0,this.onChange.dispatch()}reset(){this.charge=null,this.victim=null,this.stage_=`attacker`,this.highlight_=0,this.onChange.dispatch()}active(){return this.stage_===`attacker`?this.candidates:this.targets}},Iz=class{constructor(e){this.onChange=new p,this.built=null,this.elapsed_=0,this.handleSelectorChange=()=>{if(this.selector.done&&this.attacker&&this.target){let e=this.damageFor(this.attacker,this.target);this.built=new Nz({attacker:{hp:this.attacker.hp??0,name:this.attacker.id},defender:{hp:this.target.hp??0,name:this.target.id},damage:e.damage,strikes:e.strikes,...e.chanceToHit===void 0?{}:{chanceToHit:e.chanceToHit},...e.hits===void 0?{}:{hits:e.hits},strikeDuration:this.strikeDuration}),this.elapsed_=0}else this.built=null;this.onChange.dispatch()},this.damageFor=e.damageFor,this.strikeDuration=e.strikeDuration??0,this.selector=new Fz({units:e.units,...e.side===void 0?{}:{side:e.side},...e.disabled===void 0?{}:{disabled:e.disabled},...e.canTarget===void 0?{}:{canTarget:e.canTarget}}),this.selector.onChange.add(this.handleSelectorChange)}get stage(){return this.selector.stage}get attacker(){return this.selector.attacker}get target(){return this.selector.target}get preview(){return this.built}get elapsed(){return this.elapsed_}get finished(){return this.built!==null&&this.elapsed_>=this.built.duration}get frame(){return this.built?this.built.sampleAt(this.elapsed_):null}move(e){this.selector.move(e)}select(){return this.selector.select()}back(){this.selector.back()}update(e){return this.built?(this.elapsed_=Math.min(this.built.duration,this.elapsed_+Math.max(0,e)),this.frame):null}finish(){this.built&&(this.elapsed_=this.built.duration)}reset(){this.selector.reset(),this.built=null,this.elapsed_=0}},Lz=class{constructor(){this.onChange=new p,this.planned=[],this.undone=[]}get plans(){return this.planned}get isEmpty(){return this.planned.length===0}get canUndo(){return this.planned.length>0}get canRedo(){return this.undone.length>0}plannedFor(e){return this.planned.find(t=>t.unit===e)}plan(e){let t=this.planned.findIndex(t=>t.unit===e.unit);t>=0?this.planned[t]=e:this.planned.push(e),this.undone=[],this.onChange.dispatch()}undo(){let e=this.planned.pop();return e?(this.undone.push(e),this.onChange.dispatch(),e):null}redo(){let e=this.undone.pop();return e?(this.planned=this.planned.filter(t=>t.unit!==e.unit),this.planned.push(e),this.onChange.dispatch(),e):null}clear(){(this.planned.length!==0||this.undone.length!==0)&&(this.planned=[],this.undone=[],this.onChange.dispatch())}commit(){let e=this.planned;return this.planned=[],this.undone=[],e.length>0&&this.onChange.dispatch(),e}},Rz=class e{constructor(){this.counts=new Map}record(e,t,n=1){let r=this.counts.get(e)??new Map;r.set(t,(r.get(t)??0)+n),this.counts.set(e,r)}forType(e,t){return this.counts.get(e)?.get(t)??0}total(e){let t=this.counts.get(e);if(!t)return 0;let n=0;for(let e of t.values())n+=e;return n}breakdown(e){let t=this.counts.get(e);return t?[...t.entries()].map(([e,t])=>({unitType:e,count:t})):[]}toJSON(){return{counts:[...this.counts].map(([e,t])=>[e,[...t]])}}static fromJSON(t){let n=new e;for(let[e,r]of t.counts)n.counts.set(e,new Map(r));return n}},zz=l({AttackDialog:()=>Iz,AttackPreview:()=>Nz,BattleHooks:()=>jz,BattleStats:()=>Rz,Creature:()=>Sz,Field:()=>Mz,Party:()=>wz,StatStages:()=>Dz,TypeMatrix:()=>Cz,UnitSelector:()=>Fz,Whiteboard:()=>Lz,battleOrder:()=>Tz,checkEvolution:()=>Ez,chooseMove:()=>Oz,chooseSwitch:()=>kz});function Bz(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 Vz(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function Hz(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:Bz(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(Gz(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 eB(n,`white`),eB(n,`black`),o}function Uz(e){return e===`white`?`black`:`white`}function Wz(e){return e&7}function Gz(e){return e>>3}function Kz(e,t){return e>=0&&e<8&&t>=0&&t<8}function qz(){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 Jz(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 Yz=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],Xz=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],Zz=[[1,1],[-1,1],[-1,-1],[1,-1]],Qz=[[1,0],[0,1],[-1,0],[0,-1]];function $z(e,t,n){let r=Wz(t),i=Gz(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!Kz(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 Yz){if(!Kz(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 Xz){if(!Kz(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:Zz,kinds:[`bishop`,`queen`]},{steps:Qz,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(;Kz(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 eB(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 tB(e,t){return $z(e.board,eB(e.board,t),Uz(t))}function nB(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=Wz(t),a=Gz(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;Kz(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(Kz(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(!Kz(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 Yz){if(!Kz(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(Zz);break;case`rook`:o(Qz);break;case`queen`:o(Zz),o(Qz);break;case`king`:{for(let[o,s]of Xz){if(!Kz(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&&!tB(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!$z(e.board,o+5,Uz(n.side))&&!$z(e.board,o+6,Uz(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]&&!$z(e.board,o+3,Uz(n.side))&&!$z(e.board,o+2,Uz(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function rB(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${Vz(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[iB(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[iB(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=Uz(n.side)}function iB(e,t){let n=Wz(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function aB(e){let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of nB(e,n)){let n=Jz(e);rB(n,r),!tB(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function oB(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${Vz(t.from)} to move`);let r=nB(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${Vz(t.from)}-${Vz(t.to)} is not a legal move here`);let i=Jz(e);if(rB(i,r),tB(i,e.turn))throw Error(`${Vz(t.from)}-${Vz(t.to)} leaves the king in check`);rB(e,r)}function sB(e){return aB(e).length>0?`ongoing`:tB(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var cB=1e5;function lB(e,t,n){if(!Number.isInteger(n.depth)||n.depth<1)throw RangeError(`depth must be a positive integer`);let r=n.maxNodes??cB;if(!Number.isInteger(r)||r<1)throw RangeError(`maxNodes must be a positive integer`);let i=e.currentPlayer(t),a=0,o=0,s,c=(t,l,u,d)=>{if(n.signal?.aborted)return s=`cancelled`,0;if(++a>r)return s=`budget-exceeded`,0;let f=e.currentPlayer(t)===i;if(n.onNode?.(l,f),l===0||e.isTerminal(t))return e.evaluate(t,i);let p=e.moves(t);if(!p.length)return e.evaluate(t,i);let m=f?-1/0:1/0;for(let n of p){let r=c(e.apply(t,n),l-1,u,d);if(s)return r;if(f?(m=Math.max(m,r),u=Math.max(u,m)):(m=Math.min(m,r),d=Math.min(d,m)),d<=u){o++;break}}return m},l=e.moves(t),u=null,d=e.evaluate(t,i);if(!e.isTerminal(t)&&l.length){let r=e.currentPlayer(t)===i,a=r?-1/0:1/0,o=-1/0,f=1/0;for(let i of l){let l=c(e.apply(t,i),n.depth-1,o,f);if(s)break;(u===null||(r?l>a:l<a))&&(u=i,a=l),r?o=Math.max(o,a):f=Math.min(f,a)}u!==null&&(d=a)}return{move:s?null:u,score:d,depth:n.depth,nodes:a,cutoffs:o,status:s??`complete`,state:t}}var uB=1e5,dB={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function fB(e,t={}){return pB(e,t).move}function pB(e,t={}){let n=lB(mB,e,{depth:Math.max(1,Math.floor(t.depth??3)),maxNodes:t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes))});return{move:n.move,score:n.score,nodes:n.nodes}}var mB={currentPlayer:e=>e.turn===`white`?1:-1,moves:e=>_B(e,aB(e)),apply:(e,t)=>{let n=Jz(e);return oB(n,t),n},isTerminal:e=>sB(e)!==`ongoing`,evaluate:(e,t)=>sB(e)===`ongoing`?hB(e,t):gB(e,t)};function hB(e,t){let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*dB[t.kind]);return t===1?n:-n}function gB(e,t){let n=sB(e);return n===`stalemate`||!tB(e,e.turn)?0:(n===`white-wins`?1:-1)===t?uB:-1e5}function _B(e,t){return t.slice().sort((t,n)=>vB(e,n)-vB(e,t))}function vB(e,t){let n=e.board[t.to];return(t.promotion?dB[t.promotion]:0)*10+(n?dB[n.kind]:0)}var yB=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 bB(){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 xB(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=>CB(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>CB(e,t,!1)):[]}function SB(e,t){if(!xB(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||CB(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function CB(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 wB(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 TB(e,t,n){let r=kB(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 AB(e.size,r)){if(i[t]!==a||MB(i,e.size,t)!==0)continue;let n=jB(i,e.size,t);n.length===1&&(s=n[0]);for(let e of n)i[e]=null;o+=n.length}if(MB(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&MB(i,e.size,r)===1?s:null,e.board=i,e.turn=a,e.passes=0}function EB(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function DB(e){return e.passes>=2?`finished`:`ongoing`}function OB(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=jB(e.board,e.size,r),a=new Set;for(let t of i)for(let n of AB(e.size,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 kB(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 AB(e,t){let n=t%e,r=Math.floor(t/e),i=[];return n>0&&i.push(t-1),n<e-1&&i.push(t+1),r>0&&i.push(t-e),r<e-1&&i.push(t+e),i}function jB(e,t,n){let r=e[n],i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(!(o.has(n)||e[n]!==r)){o.add(n),i.push(n);for(let e of AB(t,n))a.push(e)}}return i}function MB(e,t,n){let r=jB(e,t,n),i=new Set;for(let n of r)for(let r of AB(t,n))e[r]===null&&i.add(r);return i.size}function NB(){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 PB(){let e=JB(2,6);return e[0]===e[1]?[...e,...e]:e}function FB(e,t){let n=e.turn===`white`?1:-1,r=n===1?[18,23]:[0,5],i=e=>n===1?24-e:e+1,a=!0,o=1/0;for(let t=0;t<24;t++)e.points[t]*n<=0||((t<r[0]||t>r[1])&&(a=!1),o=Math.min(o,i(t)));let s=(e,t)=>{if(!a)return!1;let n=i(e);return t===n||t>n&&n===o},c=[];for(let r of t){if(e.bar[e.turn]>0){let t=e.turn===`white`?r-1:24-r;LB(e,t,n)&&c.push({from:`bar`,to:t,die:r});continue}for(let t=0;t<24;t++)if(e.points[t]*n>0){let i=t+r*n;i<0||i>=24?s(t,r)&&c.push({from:t,to:`off`,die:r}):LB(e,i,n)&&c.push({from:t,to:i,die:r})}}return c}function IB(e,t){if(!FB(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 LB(e,t,n){return e.points[t]*n>=-1}function RB(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 zB(e){return ue(e)}function BB(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 VB(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 HB(e){let t=RB();return e===void 0?zB(t):re(e,()=>zB(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function UB(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 WB(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:!qB(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 GB(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 KB(e){return e.foundations.every(e=>e.length===13)}function qB(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 JB(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},()=>ae(1,t))}function YB(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return JB(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var XB=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=JB(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=ae(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 ZB(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 QB(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 $B(e,t,n){return lV(e,t,n)&&!cV(e,t,n)}function eV(e,t){if(!$B(e,t.x,t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t,maxActions:t.maxActions??t.actions}),e.turn||=t.owner}function tV(e,t){let n=sV(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=pV(e,n,fV(e,n)),i=[];for(let a=0;a<e.height;a++)for(let o=0;o<e.width;o++){if(o===n.x&&a===n.y||!e.cells[a*e.width+o].passable||cV(e,o,a))continue;let s=mV(e,n,o,a,n.actions,r);s!==null&&i.push({unit:t,x:o,y:a,cost:s})}return i}function nV(e,t){let n=tV(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=sV(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function rV(e,t){let n=sV(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 iV(e,t,n){let r=sV(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||dV(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 aV(e,t,n,r){let i=sV(e,t),a=sV(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(dV(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 oV(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=t.maxActions??t.actions,t.overwatch=!1)}function sV(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function cV(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function lV(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function uV(e,t,n){return e.shape===`hex`?sn(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function dV(e,t,n){return e.shape===`hex`?cn(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function fV(e,t){return new Set(e.units.filter(n=>n.owner!==t.owner&&uV(e,t.x,t.y).some(e=>e.x===n.x&&e.y===n.y)).map(e=>e.id))}function pV(e,t,n){let r=new Set;for(let i of e.units)if(!(i.owner===t.owner||n.has(i.id)))for(let t of uV(e,i.x,i.y))r.add(`${t.x},${t.y}`);return r}function mV(e,t,n,r,i,a){let o=[{x:t.x,y:t.y,distance:0}],s=0,c=new Set([`${t.x},${t.y}`]);for(;s<o.length;){let t=o[s++];if(t.x===n&&t.y===r)return t.distance;if(!(t.distance>=i||t.distance>0&&a.has(`${t.x},${t.y}`)))for(let i of uV(e,t.x,t.y)){let a=`${i.x},${i.y}`;lV(e,i.x,i.y)&&!c.has(a)&&e.cells[i.y*e.width+i.x].passable&&(!cV(e,i.x,i.y)||i.x===n&&i.y===r)&&(c.add(a),o.push({x:i.x,y:i.y,distance:t.distance+1}))}}return null}var hV=class{constructor(e,t){if(this.visible=new Map,this.explored=new Map,this.shared=new Map,e<1||t<1)throw Error(`fog needs positive dimensions`);this.width=e,this.height=t}share(e){let t=[...new Set(e)].filter(e=>!!e);if(t.length===0)return;let n=new Set(t);for(let e of t)for(let t of this.shared.get(e)??[])n.add(t);for(let e of n)this.shared.set(e,n)}sync(e,t,n){if(!e)throw Error(`fog needs a faction id`);let r=new Set;for(let e of t)for(let t of n(e))this.inside(t.x,t.y)&&r.add(this.index(t.x,t.y));this.visible.set(e,r);let i=this.explored.get(e)??new Set;for(let e of r)i.add(e);this.explored.set(e,i)}reveal(e,t){if(!e)throw Error(`fog needs a faction id`);let n=this.explored.get(e)??new Set;for(let e of t)this.inside(e.x,e.y)&&n.add(this.index(e.x,e.y));this.explored.set(e,n)}isVisible(e,t,n){return this.seenBy(this.visible,e,this.index(t,n))}sees(e){return(t,n)=>this.isVisible(e,t,n)}isExplored(e,t,n){return this.seenBy(this.explored,e,this.index(t,n))}visibleCells(e){return this.cellsSeenBy(this.visible,e)}exploredCells(e){return this.cellsSeenBy(this.explored,e)}seenBy(e,t,n){let r=this.shared.get(t);if(!r)return e.get(t)?.has(n)??!1;for(let t of r)if(e.get(t)?.has(n))return!0;return!1}cellsSeenBy(e,t){let n=this.shared.get(t);if(!n)return[...e.get(t)??[]];let r=new Set;for(let t of n)for(let n of e.get(t)??[])r.add(n);return[...r].sort((e,t)=>e-t)}inside(e,t){return e>=0&&t>=0&&e<this.width&&t<this.height}index(e,t){return this.inside(e,t)?t*this.width+e:-1}};function gV(e){return{currency:e,pool:[]}}function _V(e,t,n,r){return e.currency<r||!$B(t,n.x,n.y)?!1:(eV(t,n),e.currency-=r,!0)}function vV(e,t,n,r,i){let a=e.pool.findIndex(e=>e.id===n);return a===-1||!$B(t,r,i)?!1:(eV(t,{...e.pool[a],x:r,y:i}),e.pool.splice(a,1),!0)}function yV(e,t,n){let r=t.units.findIndex(e=>e.id===n);if(r===-1)return!1;let{x:i,y:a,...o}=t.units[r];return e.pool.push(o),t.units.splice(r,1),!0}function bV(e,t,n){return e.units.filter(e=>e.owner===t).length*(n.incomePerUnit-n.upkeepPerUnit)}function xV(e,t,n,r){return e.currency+=bV(t,n,r),e.currency}function SV(e,t,n,r){if(e<1||t<1)throw Error(`a skirmish map needs positive dimensions`);let i=r??Object.keys(n)[0];if(!i||!n[i])throw Error(`a skirmish map needs at least one terrain kind`);return{width:e,height:t,terrainTable:n,cells:Array.from({length:e*t},()=>({terrain:i})),units:[],turn:``,round:1}}function CV(e,t,n,r,i=!1){if(!NV(e,t,n))throw Error(`cell is outside the skirmish map`);if(!e.terrainTable[r])throw Error(`unknown skirmish terrain "${r}"`);e.cells[n*e.width+t]=i?{terrain:r,village:!0}:{terrain:r}}function wV(e,t,n){return NV(e,t,n)&&IV(e,t,n)<1/0&&!PV(e,t,n)}function TV(e,t){if(!wV(e,t.x,t.y))throw Error(`skirmish unit cannot be placed there`);e.units.push({...t,remainingMoves:t.moves}),e.turn||=t.owner}function EV(e,t){let n=MV(e,t),r=n.remainingMoves??n.moves;if(n.owner!==e.turn||r<=0)return[];let i=new Set(e.units.filter(e=>e.id!==n.id).map(e=>`${e.x},${e.y}`)),a=LV(e,n,r,i),o=[];for(let s=0;s<e.height;s++)for(let c=0;c<e.width;c++){if(c===n.x&&s===n.y||IV(e,c,s)===1/0||i.has(`${c},${s}`))continue;let l=a.get(`${c},${s}`);l!==void 0&&l<=r&&o.push({unit:t,x:c,y:s,cost:l})}return o}function DV(e,t){let n=EV(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal skirmish move`);let r=MV(e,t.unit);r.x=t.x,r.y=t.y,r.remainingMoves=(r.remainingMoves??r.moves)-n.cost;let i=e.cells[t.y*e.width+t.x];i.village&&(i.owner=r.owner)}function OV(e,t,n){let r=MV(e,t),i=MV(e,n);if(r.owner!==e.turn||r.owner===i.owner)throw Error(`invalid skirmish attack`);if(cn(r,i)!==1)throw Error(`skirmish combat is adjacency-only`);let a=[kV(e,r,i)];return i.hp>0&&a.push(kV(e,i,r)),e.units=e.units.filter(e=>e.hp>0),{strikes:a}}function kV(e,t,n){let r=FV(e,n.x,n.y).defense,i=se(Math.max(0,Math.min(1,t.hitChance*(1-r)))),a=i?Math.min(t.attack,n.hp):0;return n.hp-=a,{attacker:t.id,defender:n.id,hit:i,damage:a,killed:n.hp<=0}}function AV(e,t,n,r){return n+e.cells.filter(e=>e.village&&e.owner===t).length*r}function jV(e,t=0){let n=[...new Set(e.units.map(e=>e.owner))];if(n.length===0)return;let r=n.indexOf(e.turn)+1;r>=n.length&&e.round++,e.turn=n[r%n.length];for(let n of e.units){if(n.owner!==e.turn)continue;n.remainingMoves=n.moves;let r=e.cells[n.y*e.width+n.x];r.village&&r.owner===n.owner&&t>0&&(n.hp=Math.min(n.maxHp,n.hp+t))}}function MV(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown skirmish unit "${t}"`);return n}function NV(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function PV(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function FV(e,t,n){return e.terrainTable[e.cells[n*e.width+t].terrain]}function IV(e,t,n){return FV(e,t,n).moveCost}function LV(e,t,n,r){let i=[],a=(e,t)=>{[i[e],i[t]]=[i[t],i[e]]},o=e=>{i.push(e);let t=i.length-1;for(;t>0;){let e=t-1>>1;if(i[e].cost<=i[t].cost)break;a(t,e),t=e}},s=()=>{if(i.length===0)return;let e=i[0],t=i.pop();if(i.length>0){i[0]=t;let e=0;for(;;){let t=e*2+1,n=t+1,r=e;if(t<i.length&&i[t].cost<i[r].cost&&(r=t),n<i.length&&i[n].cost<i[r].cost&&(r=n),r===e)break;a(e,r),e=r}}return e},c=new Map([[`${t.x},${t.y}`,0]]);for(o({x:t.x,y:t.y,cost:0});;){let t=s();if(t===void 0)break;let i=`${t.x},${t.y}`;if(!(t.cost>(c.get(i)??1/0)))for(let i of sn(t.x,t.y)){if(!NV(e,i.x,i.y))continue;let a=IV(e,i.x,i.y);if(a===1/0||r.has(`${i.x},${i.y}`))continue;let s=t.cost+a;if(s>n)continue;let l=`${i.x},${i.y}`;s<(c.get(l)??1/0)&&(c.set(l,s),o({x:i.x,y:i.y,cost:s}))}}return c}var RV=l({BoardGrid:()=>yB,DiceCup:()=>XB,FactionFog:()=>hV,addSkirmishUnit:()=>TV,addTacticalUnit:()=>eV,applyBackgammonMove:()=>IB,applyCheckersMove:()=>SB,applyMove:()=>oB,applyUpkeep:()=>xV,armyIncome:()=>bV,backgammonMoves:()=>FB,bankUnit:()=>yV,canPlaceSkirmishUnit:()=>wV,canPlaceTacticalUnit:()=>$B,checkersMoves:()=>xB,chessGame:()=>mB,chooseMove:()=>fB,cloneChess:()=>Jz,createDeck:()=>RB,deal:()=>BB,dealSolitaire:()=>HB,drawSolitaire:()=>UB,endSkirmishTurn:()=>jV,endTacticalTurn:()=>oV,gameResult:()=>sB,goResult:()=>DB,goScore:()=>OB,inCheck:()=>tB,legalMoves:()=>aB,moveSkirmishUnit:()=>DV,moveSolitaireTableau:()=>WB,moveSolitaireToFoundation:()=>GB,moveTacticalUnit:()=>nV,parseFen:()=>Hz,passGo:()=>EB,playGo:()=>TB,recall:()=>vV,recruit:()=>_V,rollBackgammonDice:()=>PB,rollDice:()=>JB,rollExpression:()=>YB,scoreDice:()=>ZB,search:()=>pB,setSkirmishTerrain:()=>CV,setTacticalOverwatch:()=>rV,shuffleDeck:()=>zB,skirmishAttack:()=>OV,skirmishIncome:()=>AV,skirmishMoves:()=>EV,solitaireWon:()=>KB,sq:()=>Bz,squareName:()=>Vz,startingArmy:()=>gV,startingBackgammon:()=>NB,startingCheckers:()=>bB,startingChess:()=>qz,startingGo:()=>wB,startingSkirmish:()=>SV,startingTactics:()=>QB,tacticalAttack:()=>aV,tacticalMoves:()=>tV,trickWinner:()=>VB,triggerTacticalOverwatch:()=>iV});function zV(e){return new Audio(AA(e))}var BV=new p,VV=class{constructor(e,t={}){this.next=0;let n=Math.max(1,t.poolSize??4),r=t.create??zV;this.volume=t.volume??1,this.caption=t.caption,this.pool=Array.from({length:n},()=>r(e))}play(e=1){let t=this.pool[this.next];this.next=(this.next+1)%this.pool.length,t.volume=this.volume*e,t.currentTime=0,Promise.resolve(t.play()).catch(()=>{}),this.caption&&BV.dispatch({text:this.caption})}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}},HV=class{constructor(e={}){this.current=null,this.fades=[],this.trackQueue=null,this.playlistFade=1,this.volume=e.volume??1,this.create=e.create??zV}play(e,t=1){this.trackQueue=null,this.start(e,t,!0)}playTracks(e,t=1){if(e.length===0){this.stop(t);return}this.trackQueue=[...e],this.playlistFade=t,this.startNextTrack()}startNextTrack(){if(!this.trackQueue?.length)return;let e=this.trackQueue.shift();this.trackQueue.push(e),this.start(e,this.playlistFade,!1)}start(e,t,n){let r=this.create(e);r.loop=n,!n&&r.onended!==void 0&&(r.onended=()=>{this.current===r&&this.startNextTrack()});let i=this.current;if(this.current=r,t<=0){r.volume=this.volume,Promise.resolve(r.play()).catch(()=>{}),i?.pause();return}r.volume=0,Promise.resolve(r.play()).catch(()=>{}),this.fades.push({audio:r,elapsed:0,duration:t,from:0,to:this.volume,stopAtEnd:!1}),i&&this.fades.push({audio:i,elapsed:0,duration:t,from:i.volume,to:0,stopAtEnd:!0})}stop(e=1){this.trackQueue=null;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))}}},UV=class{constructor(e){this.states=new Map,this.cues=new Map,this.currentTrack=null,this.music=e}define(e,t){this.states.set(e,t)}enter(e){let t=this.states.get(e);if(!t)throw Error(`Orchestrator: no state defined for "${e}"`);t.track!==this.currentTrack&&(this.music.play(t.track,t.fadeDuration),this.currentTrack=t.track)}on(e,t){this.cues.set(e,t)}trigger(e){this.cues.get(e)?.play()}};function WV(e={}){let t=e.waveform??`square`,n=e.frequency??440,r=e.duration??.15,i=e.volume??.3,a=e.decay??8,o=e.sampleRate??22050,s=e.seed??1;if(!(r>0))throw Error(`tone duration must be positive`);if(t!==`noise`&&!(n>0))throw Error(`tone frequency must be positive`);if(!(o>0))throw Error(`tone sample rate must be positive`);let c=Math.max(1,Math.round(r*o)),l=new Float32Array(c);for(let e=0;e<c;e++){let r=e/o,u=a>0?Math.exp(-a*e/c):1,d=2*Math.PI*n*r;l[e]=i*u*KV(t,d,s,e)}return JV(l,o)}function GV(e={},t=e=>new Audio(e)){let n=t(WV(e));return Promise.resolve(n.play()).catch(()=>{}),n}function KV(e,t,n,r){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`triangle`:{let e=t/(2*Math.PI),n=e-Math.floor(e);return 4*Math.abs(n-.5)-1}case`noise`:return qV(n,r)}}function qV(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function JV(e,t){let n=e.length*2,r=new ArrayBuffer(44+n),i=new DataView(r);YV(i,0,`RIFF`),i.setUint32(4,36+n,!0),YV(i,8,`WAVE`),YV(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*2,!0),i.setUint16(32,2,!0),i.setUint16(34,16,!0),YV(i,36,`data`),i.setUint32(40,n,!0);let a=44;for(let t of e){let e=Math.max(-1,Math.min(1,t));i.setInt16(a,Math.round(e*(e<0?32768:32767)),!0),a+=2}let o=``,s=new Uint8Array(r);for(let e of s)o+=String.fromCharCode(e);return`data:audio/wav;base64,${btoa(o)}`}function YV(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}var XV=5e5;function ZV(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=e=>{let n=``;for(let i=0;i<e;i++)n+=String.fromCharCode(t[r+i]);return r+=e,n},a=()=>{let e=n.getUint32(r,!1);return r+=4,e},o=()=>{let e=n.getUint16(r,!1);return r+=2,e},s=()=>{let e=0;for(;;){let n=t[r++];if(e=e<<7|n&127,!(n&128))return e}};if(i(4)!==`MThd`||a()!==6)throw Error(`invalid MIDI header chunk`);let c=o(),l=o(),u=o();if(c!==0&&c!==1)throw Error(`unsupported MIDI format ${c}`);if(u&32768)throw Error(`SMPTE-based MIDI timing is not supported`);let d=u,f=[];for(let e=0;e<l;e++){let e=i(4),n=a();if(e!==`MTrk`){r+=n;continue}let o=r+n,c=0,l=0;for(;r<o;){c+=s();let e=t[r];if(e<128?e=l:(r++,e<240&&(l=e)),e===255){let e=t[r++],n=s();if(e===81&&n===3){let e=t[r]<<16|t[r+1]<<8|t[r+2];f.push({tick:c,type:`tempo`,microsecondsPerQuarter:e})}r+=n}else if(e===240||e===247)r+=s();else{let n=e&240,i=e&15;if(n===128||n===144){let e=t[r++],a=t[r++],o=n===144&&a>0;f.push({tick:c,type:o?`noteOn`:`noteOff`,note:e,velocity:a,channel:i})}else if(n===160||n===176||n===224)r+=2;else if(n===192||n===208)r+=1;else throw Error(`unsupported MIDI status byte 0x${e.toString(16)}`)}}}return f.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:d,events:f}}function QV(e){let t=[],n=new Map,r=XV,i=0,a=0;for(let o of e.events){if(a+=(o.tick-i)*r/e.ticksPerQuarter/1e6,i=o.tick,o.type===`tempo`){r=o.microsecondsPerQuarter;continue}let s=`${o.channel}:${o.note}`;if(o.type===`noteOn`)n.set(s,{time:a,velocity:o.velocity});else{let e=n.get(s);e&&(t.push({time:e.time,duration:Math.max(.01,a-e.time),note:o.note,velocity:e.velocity,channel:o.channel}),n.delete(s))}}for(let[e,r]of n){let[n,i]=e.split(`:`).map(Number);t.push({time:r.time,duration:.3,note:i,velocity:r.velocity,channel:n})}return t.sort((e,t)=>e.time-t.time)}function $V(e){return 440*2**((e-69)/12)}var eH=class{constructor(e,t={}){this.elapsed=0,this.index=0,this.playing=!1,this.notes=QV(e),this.playFn=t.play??GV,this.waveform=t.waveform??`square`,this.volume=t.volume??.2}play(){this.playing=this.index<this.notes.length}pause(){this.playing=!1}stop(){this.playing=!1,this.elapsed=0,this.index=0}update(e){if(this.playing){for(this.elapsed+=e;this.index<this.notes.length&&this.notes[this.index].time<=this.elapsed;){let e=this.notes[this.index];this.playFn({waveform:this.waveform,frequency:$V(e.note),duration:e.duration,volume:this.volume*(e.velocity/127)}),this.index++}this.index>=this.notes.length&&(this.playing=!1)}}get isPlaying(){return this.playing}get duration(){let e=this.notes.at(-1);return e?e.time+e.duration:0}};function tH(e,t={}){let n=t.refDistance??1,r=t.maxDistance??1/0,i=t.rolloff??1;if(!(e>n))return 1;if(!(e<r))return 0;let a=(n/e)**+i;return Math.max(0,Math.min(1,a))}function nH(e,t){let n=t.x-e.x,r=t.y-e.y,i=Math.hypot(n,r);if(i===0)return 0;let a=Math.sin(e.facing),o=Math.cos(e.facing),s=(n*a+r*o)/i;return Math.max(-1,Math.min(1,s))}var rH=class{constructor(e={}){this.x=e.x??0,this.y=e.y??0,this.facing=e.facing??0}moveTo(e,t){this.x=e,this.y=t}face(e){this.facing=e}},iH=class{constructor(e,t={}){this.sound=e,this.x=t.x??0,this.y=t.y??0,this.falloff={refDistance:t.refDistance,maxDistance:t.maxDistance,rolloff:t.rolloff}}moveTo(e,t){this.x=e,this.y=t}gainTo(e){return tH(Math.hypot(this.x-e.x,this.y-e.y),this.falloff)}panTo(e){return nH(e,this)}playFor(e){let t=this.gainTo(e);return t<=0?0:(this.sound.play(t),t)}},aH=l({AudioListener:()=>rH,MidiPlayer:()=>eH,Music:()=>HV,Orchestrator:()=>UV,Sound:()=>VV,SoundSource:()=>iH,audioGain:()=>tH,audioPan:()=>nH,createAudio:()=>zV,noteToFrequency:()=>$V,onCaption:()=>BV,parseMidi:()=>ZV,playTone:()=>GV,scheduleMidi:()=>QV,synthesizeTone:()=>WV});function oH(e,t){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`Turn budget must be a non-negative safe integer`);let n=0;for(;n<t;){if(e.finished())return{status:`finished`,steps:n};let t=e.scheduler.peek();if(t===null)return{status:`empty`,steps:n};if(e.needsInput(t))return{status:`input`,actor:t,steps:n};let r=e.act(t);if(r!==null){if(!Number.isFinite(r)||r<0)throw RangeError(`Action cost must be finite and non-negative, or null`);e.scheduler.spend(r)}n++}return{status:`limit`,steps:n}}function sH(e){let t=e.state,n=e.status??`ready`,r=[],i=0;for(let a of e.commands){if(n===`finished`)break;let o=e.step(t,a,e.random);t=o.state,n=o.status;for(let e of o.events)r.push(e);i++}return{state:t,events:r,status:n,processedCommands:i}}var cH=class e{constructor(e){if(this._reminders=[],this._results={},this.levels=new Map(e.levels.map(e=>[e.id,e])),this.levels.size!==e.levels.length)throw Error(`campaign level ids must be unique`);if(!this.levels.has(e.start))throw Error(`unknown campaign start level: ${e.start}`);this._currentLevel=e.start,this._state=structuredClone(e.state)}get currentLevel(){return this._currentLevel}get state(){return structuredClone(this._state)}get reminders(){return[...this._reminders]}get results(){return structuredClone(this._results)}playCurrent(){if(!this._currentLevel)throw Error(`campaign has no current level`);let e=this.levels.get(this._currentLevel);return this.completeCurrent(e.run(this.state,{levelId:e.id}))}completeCurrent(e){if(!this._currentLevel)throw Error(`campaign has no current level`);let t=this._currentLevel;if(this._state=structuredClone(e.state),e.result!==void 0&&(this._results[t]=structuredClone(e.result)),this._reminders=[...e.reminders??[]],e.outcome!==`completed`)this._currentLevel=null;else if(e.next===void 0)throw Error(`campaign level ${t} did not choose a next level`);else{if(e.next!==null&&!this.levels.has(e.next))throw Error(`unknown campaign transition: ${t} -> ${e.next}`);this._currentLevel=e.next}return{...e,state:this.state}}snapshot(){return{currentLevel:this._currentLevel,state:this.state,reminders:this.reminders,results:this.results}}static restore(t,n){let r=t.currentLevel??n.levels[0]?.id;if(!r)throw Error(`campaign restore requires at least one level`);let i=new e({levels:n.levels,start:r,state:t.state});return i._currentLevel=t.currentLevel,i._reminders=[...t.reminders],i._results=structuredClone(t.results),i}};function lH(e){let t=new w(e.seed);return{...sH({state:structuredClone(e.initialState),commands:e.commands,status:e.status,random:t,step:e.step}),seed:e.seed,random:t.getState()}}function uH(e,t,n){let r=dH.restore({...e,journal:[]},n),i=e=>({valid:!1,checked:e.index,state:r.state,journal:r.journal.toJSON(),mismatch:e});for(let e=0;e<t.length;e++){let n=t[e];if(n.sequence!==e)return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`sequence`});let a;try{a=r.dispatch(n.action)}catch(t){return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`execution`,error:t instanceof Error?t.message:String(t)})}if(Rn(a.events)!==Rn(n.events))return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:a.events,reason:`events`})}return n.expectedFinalState!==void 0&&Rn(r.state)!==Rn(n.expectedFinalState)?i({index:t.length,action:t.at(-1)?.action,expectedEvents:[],actualEvents:[],reason:`final-state`}):{valid:!0,checked:t.length,state:r.state,journal:r.journal.toJSON()}}var dH=class e{constructor(e){this._state=e.state,this._scheduler=e.scheduler,this.random=e.random,this.rule=e.rule,this.actorId=e.actorId,this.journal=e.journal??new Xt,this.actorOf=e.history?.actorOf??null,this.history=e.history?new On(e.history):null,this.history&&this.history.push(this.historySnapshot())}get scheduler(){return this._scheduler}get state(){return this._state}dispatch(e){let t=this.rule(this._state,e,{random:this.random,scheduler:this._scheduler});return this._state=t.state,t.cost!=null&&this._scheduler.spend(t.cost),this.journal.append(e,t.events),this.history&&this.history.push(this.historySnapshot()),t}get canUndo(){return this.history?.canUndo??!1}get canRedo(){return this.history?.canRedo??!1}undo(){if(!this.history||!this.actorOf)return null;let e=this.history.undo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}redo(){if(!this.history||!this.actorOf)return null;let e=this.history.redo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}snapshot(e=1){return{version:e,state:this._state,scheduler:this.scheduler.toJSON(this.actorId),random:this.random.getState(),journal:this.journal.toJSON()}}static restore(t,n){let r=new w;r.setState(t.random);let i=pL.restore(t.scheduler,n.actorOf);return new e({state:t.state,scheduler:i,random:r,journal:Xt.fromJSON(t.journal??[]),rule:n.rule,actorId:n.actorId})}historySnapshot(){return structuredClone(this.snapshot())}restoreCheckpoint(e){if(!this.actorOf)throw Error(`simulation history needs actorOf to restore a checkpoint`);this._state=structuredClone(e.state),this._scheduler=pL.restore(e.scheduler,this.actorOf),this.random.setState(e.random),this.journal.replace(e.journal??[])}},fH=class e{constructor(e){this.followUps=[],this.runtime=e.runtime,this.queue=new Pn({play:e.play}),this.followUpOf=e.followUp}get locked(){return this.queue.isBusy}submit(e){return this.locked?null:this.commit(e)}update(e){this.queue.update(e),this.drainFollowUps()}cancel(){this.queue.clear(),this.followUps=[]}snapshot(e=1){return this.runtime.snapshot(e)}static restore(t,n){let r=dH.restore(t,{rule:n.rule,actorOf:n.actorOf,actorId:n.actorId});return new e({runtime:r,play:n.play,followUp:n.followUp})}commit(e){let t=this.runtime.dispatch(e);return this.queue.enqueue(t.events),this.followUpOf&&this.followUps.push(...this.followUpOf(t)),this.drainFollowUps(),t}drainFollowUps(){for(;!this.queue.isBusy&&this.followUps.length>0;){let e=this.followUps.shift();this.commit(e)}}},pH=class{constructor(e){this.saves=new jt(e)}save(e,t,n){this.saves.save(e,{campaign:t.campaign.snapshot(),world:t.world,simulation:t.simulation?t.simulation.snapshot():null},n)}load(e){return this.saves.load(e)?.state??null}list(){return this.saves.list()}delete(e){this.saves.delete(e)}},mH=l({Campaign:()=>cH,CampaignSave:()=>pH,EventPresentation:()=>fH,Scheduler:()=>pL,SimulationRuntime:()=>dH,advanceToInput:()=>oH,runHeadlessScenario:()=>lH,runScenario:()=>sH,validateSimulationReplay:()=>uH}),hH=d(c(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.JSON5=r()})(e,(function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}var t=e(function(e){var t=e.exports=typeof window<`u`&&window.Math==Math?window:typeof self<`u`&&self.Math==Math?self:Function(`return this`)();typeof __g==`number`&&(__g=t)}),n=e(function(e){var t=e.exports={version:`2.6.5`};typeof __e==`number`&&(__e=t)});n.version;var r=function(e){return typeof e==`object`?e!==null:typeof e==`function`},i=function(e){if(!r(e))throw TypeError(e+` is not an object!`);return e},a=function(e){try{return!!e()}catch{return!0}},o=!a(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7}),s=t.document,c=r(s)&&r(s.createElement),l=function(e){return c?s.createElement(e):{}},u=!o&&!a(function(){return Object.defineProperty(l(`div`),"a",{get:function(){return 7}}).a!=7}),d=function(e,t){if(!r(e))return e;var n,i;if(t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e))||typeof(n=e.valueOf)==`function`&&!r(i=n.call(e))||!t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e)))return i;throw TypeError(`Can't convert object to primitive value`)},f=Object.defineProperty,p={f:o?Object.defineProperty:function(e,t,n){if(i(e),t=d(t,!0),i(n),u)try{return f(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported!`);return`value`in n&&(e[t]=n.value),e}},m=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}},h=o?function(e,t,n){return p.f(e,t,m(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},v=0,y=Math.random(),b=function(e){return`Symbol(${e===void 0?``:e})_${(++v+y).toString(36)}`},x=e(function(e){var r=`__core-js_shared__`,i=t[r]||(t[r]={});(e.exports=function(e,t){return i[e]||(i[e]=t===void 0?{}:t)})(`versions`,[]).push({version:n.version,mode:`global`,copyright:`© 2019 Denis Pushkarev (zloirock.ru)`})})(`native-function-to-string`,Function.toString),S=e(function(e){var r=b(`src`),i=`toString`,a=(``+x).split(i);n.inspectSource=function(e){return x.call(e)},(e.exports=function(e,n,i,o){var s=typeof i==`function`;s&&(_(i,`name`)||h(i,`name`,n)),e[n]!==i&&(s&&(_(i,r)||h(i,r,e[n]?``+e[n]:a.join(String(n)))),e===t?e[n]=i:o?e[n]?e[n]=i:h(e,n,i):(delete e[n],h(e,n,i)))})(Function.prototype,i,function(){return typeof this==`function`&&this[r]||x.call(this)})}),C=function(e){if(typeof e!=`function`)throw TypeError(e+` is not a function!`);return e},w=function(e,t,n){if(C(e),t===void 0)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},ee=`prototype`,T=function(e,r,i){var a=e&T.F,o=e&T.G,s=e&T.S,c=e&T.P,l=e&T.B,u=o?t:s?t[r]||(t[r]={}):(t[r]||{})[ee],d=o?n:n[r]||(n[r]={}),f=d[ee]||(d[ee]={}),p,m,g,_;for(p in o&&(i=r),i)m=!a&&u&&u[p]!==void 0,g=(m?u:i)[p],_=l&&m?w(g,t):c&&typeof g==`function`?w(Function.call,g):g,u&&S(u,p,g,e&T.U),d[p]!=g&&h(d,p,_),c&&f[p]!=g&&(f[p]=g)};t.core=n,T.F=1,T.G=2,T.S=4,T.P=8,T.B=16,T.W=32,T.U=64,T.R=128;var E=T,te=Math.ceil,ne=Math.floor,re=function(e){return isNaN(e=+e)?0:(e>0?ne:te)(e)},ie=function(e){if(e==null)throw TypeError(`Can't call method on `+e);return e},D=function(e){return function(t,n){var r=String(ie(t)),i=re(n),a=r.length,o,s;return i<0||i>=a?e?``:void 0:(o=r.charCodeAt(i),o<55296||o>56319||i+1===a||(s=r.charCodeAt(i+1))<56320||s>57343?e?r.charAt(i):o:e?r.slice(i,i+2):(o-55296<<10)+(s-56320)+65536)}}(!1);E(E.P,`String`,{codePointAt:function(e){return D(this,e)}}),n.String.codePointAt;var O=Math.max,ae=Math.min,oe=function(e,t){return e=re(e),e<0?O(e+t,0):ae(e,t)},se=String.fromCharCode,ce=String.fromCodePoint;E(E.S+E.F*(!!ce&&ce.length!=1),`String`,{fromCodePoint:function(e){for(var t=arguments,n=[],r=arguments.length,i=0,a;r>i;){if(a=+t[i++],oe(a,1114111)!==a)throw RangeError(a+` is not a valid code point`);n.push(a<65536?se(a):se(((a-=65536)>>10)+55296,a%1024+56320))}return n.join(``)}}),n.String.fromCodePoint;var le={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},k={isSpaceSeparator:function(e){return typeof e==`string`&&le.Space_Separator.test(e)},isIdStartChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`$`||e===`_`||le.ID_Start.test(e))},isIdContinueChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`$`||e===`_`||e===``||e===``||le.ID_Continue.test(e))},isDigit:function(e){return typeof e==`string`&&/[0-9]/.test(e)},isHexDigit:function(e){return typeof e==`string`&&/[0-9A-Fa-f]/.test(e)}},ue,de,fe,pe,me,he,ge,_e,ve,ye=function(e,t){ue=String(e),de=`start`,fe=[],pe=0,me=1,he=0,ge=void 0,_e=void 0,ve=void 0;do ge=Ce(),je[de]();while(ge.type!==`eof`);return typeof t==`function`?be({"":ve},``,t):ve};function be(e,t,n){var r=e[t];if(typeof r==`object`&&r){if(Array.isArray(r))for(var i=0;i<r.length;i++){var a=String(i),o=be(r,a,n);o===void 0?delete r[a]:Object.defineProperty(r,a,{value:o,writable:!0,enumerable:!0,configurable:!0})}else for(var s in r){var c=be(r,s,n);c===void 0?delete r[s]:Object.defineProperty(r,s,{value:c,writable:!0,enumerable:!0,configurable:!0})}}return n.call(e,t,r)}var A,j,xe,Se,M;function Ce(){for(A=`default`,j=``,xe=!1,Se=1;;){M=we();var e=Te[A]();if(e)return e}}function we(){if(ue[pe])return String.fromCodePoint(ue.codePointAt(pe))}function N(){var e=we();return e===`
|
|
1345
1345
|
`?(me++,he=0):e?he+=e.length:he++,e&&(pe+=e.length),e}var Te={default:function(){switch(M){case` `:case`\v`:case`\f`:case` `:case`\xA0`:case``:case`
|
|
1346
1346
|
`:case`\r`:case`\u2028`:case`\u2029`:N();return;case`/`:N(),A=`comment`;return;case void 0:return N(),Ee(`eof`)}if(k.isSpaceSeparator(M)){N();return}return Te[de]()},comment:function(){switch(M){case`*`:N(),A=`multiLineComment`;return;case`/`:N(),A=`singleLineComment`;return}throw Pe(N())},multiLineComment:function(){switch(M){case`*`:N(),A=`multiLineCommentAsterisk`;return;case void 0:throw Pe(N())}N()},multiLineCommentAsterisk:function(){switch(M){case`*`:N();return;case`/`:N(),A=`default`;return;case void 0:throw Pe(N())}N(),A=`multiLineComment`},singleLineComment:function(){switch(M){case`
|
|
1347
1347
|
`:case`\r`:case`\u2028`:case`\u2029`:N(),A=`default`;return;case void 0:return N(),Ee(`eof`)}N()},value:function(){switch(M){case`{`:case`[`:return Ee(`punctuator`,N());case`n`:return N(),De(`ull`),Ee(`null`,null);case`t`:return N(),De(`rue`),Ee(`boolean`,!0);case`f`:return N(),De(`alse`),Ee(`boolean`,!1);case`-`:case`+`:N()===`-`&&(Se=-1),A=`sign`;return;case`.`:j=N(),A=`decimalPointLeading`;return;case`0`:j=N(),A=`zero`;return;case`1`:case`2`:case`3`:case`4`:case`5`:case`6`:case`7`:case`8`:case`9`:j=N(),A=`decimalInteger`;return;case`I`:return N(),De(`nfinity`),Ee(`numeric`,1/0);case`N`:return N(),De(`aN`),Ee(`numeric`,NaN);case`"`:case`'`:xe=N()===`"`,j=``,A=`string`;return}throw Pe(N())},identifierNameStartEscape:function(){if(M!==`u`)throw Pe(N());N();var e=Ae();switch(e){case`$`:case`_`:break;default:if(!k.isIdStartChar(e))throw Ie()}j+=e,A=`identifierName`},identifierName:function(){switch(M){case`$`:case`_`:case``:case``:j+=N();return;case`\\`:N(),A=`identifierNameEscape`;return}if(k.isIdContinueChar(M)){j+=N();return}return Ee(`identifier`,j)},identifierNameEscape:function(){if(M!==`u`)throw Pe(N());N();var e=Ae();switch(e){case`$`:case`_`:case``:case``:break;default:if(!k.isIdContinueChar(e))throw Ie()}j+=e,A=`identifierName`},sign:function(){switch(M){case`.`:j=N(),A=`decimalPointLeading`;return;case`0`:j=N(),A=`zero`;return;case`1`:case`2`:case`3`:case`4`:case`5`:case`6`:case`7`:case`8`:case`9`:j=N(),A=`decimalInteger`;return;case`I`:return N(),De(`nfinity`),Ee(`numeric`,Se*(1/0));case`N`:return N(),De(`aN`),Ee(`numeric`,NaN)}throw Pe(N())},zero:function(){switch(M){case`.`:j+=N(),A=`decimalPoint`;return;case`e`:case`E`:j+=N(),A=`decimalExponent`;return;case`x`:case`X`:j+=N(),A=`hexadecimal`;return}return Ee(`numeric`,Se*0)},decimalInteger:function(){switch(M){case`.`:j+=N(),A=`decimalPoint`;return;case`e`:case`E`:j+=N(),A=`decimalExponent`;return}if(k.isDigit(M)){j+=N();return}return Ee(`numeric`,Se*Number(j))},decimalPointLeading:function(){if(k.isDigit(M)){j+=N(),A=`decimalFraction`;return}throw Pe(N())},decimalPoint:function(){switch(M){case`e`:case`E`:j+=N(),A=`decimalExponent`;return}if(k.isDigit(M)){j+=N(),A=`decimalFraction`;return}return Ee(`numeric`,Se*Number(j))},decimalFraction:function(){switch(M){case`e`:case`E`:j+=N(),A=`decimalExponent`;return}if(k.isDigit(M)){j+=N();return}return Ee(`numeric`,Se*Number(j))},decimalExponent:function(){switch(M){case`+`:case`-`:j+=N(),A=`decimalExponentSign`;return}if(k.isDigit(M)){j+=N(),A=`decimalExponentInteger`;return}throw Pe(N())},decimalExponentSign:function(){if(k.isDigit(M)){j+=N(),A=`decimalExponentInteger`;return}throw Pe(N())},decimalExponentInteger:function(){if(k.isDigit(M)){j+=N();return}return Ee(`numeric`,Se*Number(j))},hexadecimal:function(){if(k.isHexDigit(M)){j+=N(),A=`hexadecimalInteger`;return}throw Pe(N())},hexadecimalInteger:function(){if(k.isHexDigit(M)){j+=N();return}return Ee(`numeric`,Se*Number(j))},string:function(){switch(M){case`\\`:N(),j+=Oe();return;case`"`:if(xe)return N(),Ee(`string`,j);j+=N();return;case`'`:if(!xe)return N(),Ee(`string`,j);j+=N();return;case`
|
|
@@ -1354,11 +1354,11 @@ fn mainFragment(
|
|
|
1354
1354
|
`+t+`}`}}return r.pop(),i=t,m}function g(e){if(e.length===0)return m(e,!0);var t=String.fromCodePoint(e.codePointAt(0));if(!k.isIdStartChar(t))return m(e,!0);for(var n=t.length;n<e.length;n++)if(!k.isIdContinueChar(String.fromCodePoint(e.codePointAt(n))))return m(e,!0);return e}function _(e){if(r.indexOf(e)>=0)throw TypeError(`Converting circular structure to JSON5`);r.push(e);var t=i;i+=s;for(var n=[],a=0;a<e.length;a++){var o=p(String(a),e);n.push(o===void 0?`null`:o)}var c;if(n.length===0)c=`[]`;else if(s===``)c=`[`+n.join(`,`)+`]`;else{var l=`,
|
|
1355
1355
|
`+i,u=n.join(l);c=`[
|
|
1356
1356
|
`+i+u+`,
|
|
1357
|
-
`+t+`]`}return r.pop(),i=t,c}}}}))}))(),1),
|
|
1358
|
-
`)}),s=null;continue}if(i===`ifdef`||i===`ifndef`){let e=r.has(u);o.push(o.at(-1)===!0&&(i===`ifdef`?e:!e));continue}if(i===`else`){if(o.length<2)throw
|
|
1359
|
-
`),n,t))}function
|
|
1360
|
-
`)return r;r++}return r}function
|
|
1361
|
-
`,t):e.indexOf(`*/`,t+2);return n<0?e.length:r===`/`?n:n+2}return t}function
|
|
1362
|
-
`?(r++,i=1):i++;return{file:t,line:r,column:i}}function PH(e,t,n){let r=t.split(/\r?\n/),i=e,a=typeof i?.lineNumber==`number`?i.lineNumber:1,o=typeof i?.columnNumber==`number`?i.columnNumber:1,s=e instanceof Error?e.message:String(e);return s.includes(`'_'`)&&(s+=` (write translatable text as _("..."))`),new hH({code:`MWL_SYNTAX`,message:s,location:{file:n,line:Math.max(1,a),column:Math.max(1,o)},lineText:r[Math.max(1,a)-1]})}function FH(e,t,n=e){let r=e.trim(),i=/^_\(\s*([\s\S]*?)\s*\)$/.exec(r),a=i?i[1]:r;if(a.startsWith(`"`)||a.startsWith(`'`)){try{let e=mH.default.parse(a);if(typeof e==`string`)return e}catch{}throw new hH({code:`MWL_STRING`,message:`unterminated string value`,location:t,lineText:n})}if(i)throw new hH({code:`MWL_STRING`,message:`_("...") needs a quoted string`,location:t,lineText:n});return r}function IH(e){return/^_\(\s*["']/.test(e.trim())}function LH(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`&&(r=!r),/\s/.test(a)&&!r?(n&&t.push(n),n=``):n+=a}return n&&t.push(n),t}function RH(e){return e.startsWith(`"`)&&e.endsWith(`"`)?e.slice(1,-1):e}function zH(e,t,n,r,i){return new hH({code:e,message:t,location:{file:n??`<mwl>`,line:r+1,column:1},lineText:i})}function BH(e,t,n,r,i){let a=NH(n,r??`<mwl>`,i);return new hH({code:e,message:t,location:a,lineText:n.split(/\r?\n/)[a.line-1]})}function VH(e,t,n,r){if(!Number.isInteger(t.version)||t.version<1)throw Error(`MWL save version must be a positive integer`);let i={format:`mwl-save`,version:t.version,world:e,...n===void 0?{}:{hookState:KH(n)},...r===void 0?{}:{journal:qH(r)}};return JSON.stringify(i)}function HH(e,t){return UH(e,t).world}function UH(e,t){let n=JSON.parse(e),r=GH(n)?n:{format:`mwl-save`,version:1,world:n};if(r.version>t.version)throw Error(`MWL save version ${r.version} is newer than supported version ${t.version}`);let i=WH(r.world);for(let e=r.version;e<t.version;e++){let n=t.migrations?.[e+1];if(!n)throw Error(`missing MWL save migration to version ${e+1}`);i=WH(n(i))}return{format:`mwl-save`,version:t.version,world:i,...r.hookState===void 0?{}:{hookState:KH(r.hookState)},...r.journal===void 0?{}:{journal:qH(r.journal)}}}function WH(e){if(!e||typeof e!=`object`)throw Error(`invalid MWL saved world`);Dt(e);let t=e;if(!Number.isInteger(t.turn)||!t.variables||typeof t.variables!=`object`||!t.units||typeof t.units!=`object`)throw Error(`invalid MWL saved world: turn, variables, and units are required`);if(t.status!==void 0&&![`playing`,`won`,`lost`].includes(t.status))throw Error(`invalid MWL saved world status`);return structuredClone(t)}function GH(e){return!!e&&typeof e==`object`&&e.format===`mwl-save`&&typeof e.version==`number`&&`world`in e}function KH(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`invalid MWL hook state`);Dt(e);let t;try{t=JSON.stringify(e)}catch{throw Error(`MWL hook state must be JSON-serialisable`)}let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`invalid MWL hook state`);return n}function qH(e){try{let t=JSON.stringify(e),n=JSON.parse(t);if(!Array.isArray(n))throw Error();return Dt(n),n}catch{throw Error(`MWL journal must be JSON-serialisable`)}}function JH(e,t,n={}){let r=e.search(/\s+where\s+/),i=r<0?e:e.slice(0,r),a={...t};if(r>=0)for(let t of e.slice(r).replace(/^\s+where\s+/,``).split(`,`)){let e=/^\s*([A-Za-z_][A-Za-z0-9_.-]*)\s*=\s*(.+)\s*$/.exec(t);if(!e)throw Error(`invalid MWL where binding: ${t}`);let r=new YH(e[2],a,n.helpers??{});if(a[e[1]]=r.parseOr(),!r.atEnd())throw Error(`invalid MWL where binding: ${t}`)}let o=new YH(i,a,n.helpers??{}),s=o.parseOr();if(!o.atEnd())throw Error(`unexpected token in MWL condition: ${o.peek()}`);return ZH(s)}var YH=class{constructor(e,t,n){this.index=0,this.tokens=XH(e),this.context=t,this.helpers=n}parseOr(){let e=this.parseAnd();for(;this.take(`or`);)e=ZH(e)||ZH(this.parseAnd());return e}parseAnd(){let e=this.parseNot();for(;this.take(`and`);)e=ZH(e)&&ZH(this.parseNot());return e}parseNot(){return this.take(`not`)?!ZH(this.parseNot()):this.parseComparison()}parseComparison(){let e=this.parseAdditive(),t=this.peek();if(![`==`,`~=`,`<`,`<=`,`>`,`>=`].includes(t))return e;this.index++;let n=this.parseAdditive();if(t===`==`)return e===n;if(t===`~=`)return e!==n;if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);return t===`<`?e<n:t===`<=`?e<=n:t===`>`?e>n:e>=n}parseAdditive(){let e=this.parseMultiplicative();for(;this.peek()===`+`||this.peek()===`-`;){let t=this.tokens[this.index++],n=this.parseMultiplicative();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);e=t===`+`?e+n:e-n}return e}parseMultiplicative(){let e=this.parsePrimary();for(;this.peek()===`*`||this.peek()===`/`;){let t=this.tokens[this.index++],n=this.parsePrimary();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);if(t===`/`&&n===0)throw Error(`division by zero in MWL condition`);e=t===`*`?e*n:e/n}return e}parsePrimary(){if(this.take(`(`)){let e=this.parseOr();return this.expect(`)`),e}let e=this.tokens[this.index++];if(e===void 0)throw Error(`incomplete MWL condition`);if(/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return Number(e);if(e===`true`||e===`yes`)return!0;if(e===`false`||e===`no`)return!1;if(e.startsWith(`"`)||e.startsWith(`'`))return e.slice(1,-1);let t=this.helpers[e];if(t&&this.take(`(`)){let e=[];if(!this.take(`)`)){do e.push(this.parseOr());while(this.take(`,`));this.expect(`)`)}return t(...e)}let n=this.context[e];if(n===void 0)throw Error(`missing MWL condition variable "${e}"`);return n}take(e){return this.peek()===e&&(this.index++,!0)}expect(e){if(!this.take(e))throw Error(`expected "${e}" in MWL condition`)}peek(){return this.tokens[this.index]??`<end>`}atEnd(){return this.index>=this.tokens.length}};function XH(e){let t=[],n=/\s*(?:("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|([A-Za-z_][A-Za-z0-9_.-]*)|(-?(?:\d+(?:\.\d*)?|\.\d+))|(==|~=|<=|>=|[()+*/,<>-]))/y,r=0;for(;r<e.length;){n.lastIndex=r;let i=n.exec(e);if(!i)throw Error(`invalid MWL condition near "${e.slice(r)}"`);t.push(i[1]??i[2]??i[3]??i[4]),r=n.lastIndex}return t}function ZH(e){return e!==!1&&e!==0&&e!==``}function QH(e){let t=new eU(e),n=t.expression();if(t.skip(),!t.atEnd())throw Error(`invalid MWL expression near "${t.rest()}"`);return n}function $H(e,t){let n=typeof e==`string`?QH(e):e;if(n.kind===`number`)return n.value;if(n.kind===`variable`){let e=t[n.name];if(e===void 0||!Number.isFinite(e))throw Error(`missing MWL expression variable "${n.name}"`);return e}let r=$H(n.left,t),i=$H(n.right,t);if(n.op===`+`)return r+i;if(n.op===`-`)return r-i;if(n.op===`*`)return r*i;if(n.op===`/`){if(i===0)throw Error(`division by zero in MWL expression`);return r/i}return r**i}var eU=class{constructor(e){this.index=0,this.source=e}expression(){return this.additive()}additive(){let e=this.multiplicative();for(;;){this.skip();let t=this.peek(`+`)?`+`:this.peek(`-`)?`-`:null;if(!t)return e;this.index++,e={kind:`binary`,op:t,left:e,right:this.multiplicative()}}}multiplicative(){let e=this.power();for(;;){this.skip();let t=this.peek(`*`)?`*`:this.peek(`/`)?`/`:null;if(!t)return e;this.index++,e={kind:`binary`,op:t,left:e,right:this.power()}}}power(){let e=this.primary();return this.skip(),this.peek(`^`)&&(this.index++,e={kind:`binary`,op:`^`,left:e,right:this.power()}),e}primary(){if(this.skip(),this.peek(`(`)){this.index++;let e=this.expression();if(this.skip(),!this.peek(`)`))throw Error(`missing closing parenthesis in MWL expression`);return this.index++,e}let e=/^(?:\d+(?:\.\d*)?|\.\d+)/.exec(this.rest());if(e)return this.index+=e[0].length,{kind:`number`,value:Number(e[0])};let t=/^[A-Za-z_][A-Za-z0-9_.-]*/.exec(this.rest());if(t)return this.index+=t[0].length,{kind:`variable`,name:t[0]};throw Error(`expected number, variable, or parenthesis near "${this.rest()}"`)}peek(e){return this.source[this.index]===e}skip(){for(;/\s/.test(this.source[this.index]??``);)this.index++}atEnd(){return this.index>=this.source.length}rest(){return this.source.slice(this.index)}};function tU(e){let t=[],n=e=>{t.push(e),e.children.forEach(n)};return e.forEach(n),t}function nU(e,t){let n=e.attributes[t];if(!n)throw Error(`MWL ${e.tag} is missing ${t}`);return n}function rU(e,t){let n=e.attributes[t];if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function iU(e,t,n){let r=e.attributes[t];if(r===void 0)return n;let i=Number.parseInt(r,10);return Number.isFinite(i)?i:n}function aU(e,t){return oU(e.attributes[t])}function oU(e){return e===void 0?void 0:e===`true`||e===`yes`}function sU(e,t){return e!==void 0&&t.includes(e)?e:void 0}function cU(e,t,n){let r=n.carryoverPercentage??80,i=t?e.gold[t.id]??e.sides[t.id]?.gold??0:0;return{result:n.result,gold:Math.floor(i*r/100)+(n.bonus??0),add:n.carryoverAdd??!1,recall:t?Object.entries(e.units).filter(([,e])=>e.alive&&e.side===t.id).map(([e])=>e).sort():[],nextScenario:n.nextScenario??null}}function lU(e,t){return e.add?t+e.gold:Math.max(t,e.gold)}var uU=nU,dU=(e,t,n)=>iU(e,t,n)??n;function fU(){return{variables:{},units:{},sides:{},maps:{},gold:{},turn:1,status:`playing`,sideStatus:{},map:null,timeOfDay:``,scheduleIndex:0}}function pU(e){let t=e.split(/\r?\n/).filter(e=>e.trim()!==``).map(e=>e.split(`,`).map(e=>e.trim())),n=t.length,r=t.length?Math.max(...t.map(e=>e.length)):0,i=[],a={};for(let e=0;e<n;e++)for(let n=0;n<r;n++){let r=t[e]?.[n]??`_off^_usr`,o=/^([A-Za-z0-9_][\w.-]*)\s+(\S.*)$/.exec(r);o?(i.push(o[2]),(a[o[1]]??=[]).push({x:n,y:e})):i.push(r)}return{width:r,height:n,codes:i,starts:a}}var mU=/\$\(([^)]*)\)/g,hU=/\$([A-Za-z_][A-Za-z0-9_.]*)/g,gU=class e{constructor(e,t={}){this.journal=new Xt,this.unitTypes=new Map,this.schedule=[],this.pendingDialogue=null,this.dialogueCounter=0,this.traceBatch=null,this.game=e,this.world=t.world??fU(),this.onMessage=t.onMessage,this.resolveMap=t.resolveMap,this.hooks=t.hooks,this.onTrace=t.onTrace,this.persistence=t.persistence??{version:1},this.random=t.random??new w,!t.random&&this.world.random&&this.random.setState(this.world.random),this.loadUnitTypes(),this.loadSchedule(),this.loadInitialContent(),this.loadInitialUnits(),this.loadLeaders(),this.loadScenarioExtras()}run(e){this.recordAction({type:`run`,trigger:e},()=>this.runInternal(e))}runInternal(e){for(let t of this.nodes(`event`))(t.attributes.on??t.attributes.trigger)===e&&this.eventFiltersMatch(t)&&this.claimEvent(t)&&this.executeTracedEvent(t,e);this.checkObjectives()}fireEvent(e){return this.recordAction({type:`fire_event`,id:e},()=>this.fireEventInternal(e))}fireEventInternal(e){let t=this.nodes(`event`).find(t=>t.attributes.id===e);return!t||!this.eventFiltersMatch(t)||!this.claimEvent(t)?!1:(this.executeTracedEvent(t,`fireEvent`),this.checkObjectives(),!0)}fireMoveto(e){this.recordAction({type:`fire_moveto`,unit:e},()=>this.fireMovetoInternal(e))}fireMovetoInternal(e){let t=this.world.units[e];if(t&&t.alive){for(let n of this.nodes(`event`))(n.attributes.on??n.attributes.trigger)===`moveto`&&(n.attributes.x===void 0||LU(n.attributes.x,t.x))&&(n.attributes.y===void 0||LU(n.attributes.y,t.y))&&(n.attributes.unit===void 0||n.attributes.unit===e)&&(n.attributes.side===void 0||n.attributes.side===t.side)&&this.eventFiltersMatch(n)&&this.claimEvent(n)&&this.executeTracedEvent(n,`moveto`);this.checkObjectives()}}claimEvent(e){if(!(e.attributes.once===void 0?e.attributes.on===`moveto`:e.attributes.once!==`false`))return!0;let t=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`,n=this.world.firedEvents??=[];return!n.includes(t)&&(n.push(t),!0)}eventFiltersMatch(e){if(!this.conditionMatches(e)||!this.filterConditionMatches(e))return!1;let t=e.children.find(e=>e.tag===`filter`);return!t||this.filterMatches(t)}executeEvent(e){this.runBlock(this.commandChildren(e))}runBlock(e){for(let t=0;t<e.length;t++){let n=e[t];if(!this.isConsumedElse(e,t)){if(n.tag===`say`){this.showSay(n);continue}if(n.tag===`dialogue`){this.showDialogue(n);continue}this.executeNode(n)}}}isConsumedElse(e,t){let n=e[t-1];return e[t]?.tag===`else`&&n?.tag===`if`&&this.nodeConditionMatches(n)}executeTracedEvent(e,t){let n=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`;this.trace({type:`event`,phase:`claimed`,id:n,trigger:t});try{this.executeEvent(e),this.trace({type:`event`,phase:`completed`,id:n,trigger:t})}catch(e){throw this.trace({type:`error`,message:String(e),event:n}),e}}showDialogue(e){let t=null;for(let n of e.children)n.tag===`message`?(this.showMessage(n.attributes),t={text:n.attributes.text??n.attributes.value??``,...n.attributes.speaker===void 0?{}:{speaker:n.attributes.speaker},...n.attributes.portrait===void 0?{}:{portrait:n.attributes.portrait},...n.attributes.side===void 0||n.attributes.side===``?{}:{side:n.attributes.side}}):n.tag===`say`&&(this.showSay(n),t={text:n.attributes.text??``,speaker:n.attributes.speaker});let n=[];for(let t of e.children){if(t.tag!==`choice`||!t.attributes.text||t.attributes.variable!==void 0&&!kU(this.variableAt(t.attributes.variable),t.attributes.equals))continue;let e=t.children.filter(e=>e.tag===`branch`);if(e.length)for(let r of e)n.push({text:r.attributes.text??t.attributes.text,branch:r.children});else t.attributes.event&&n.push({text:t.attributes.text,event:t.attributes.event})}if(n.length===0)return;this.dialogueCounter+=1;let r=`dialogue-${this.dialogueCounter}`;this.pendingDialogue={id:r,choices:n},this.world.pendingDialogue={id:r,choices:n},this.onMessage?.({text:t?.text??``,...t?.speaker===void 0?{}:{speaker:t.speaker},choices:n,dialogueId:r})}showSay(e){this.onMessage&&this.onMessage({text:e.attributes.text??``,...e.attributes.speaker===void 0?{}:{speaker:e.attributes.speaker}})}answerDialogue(e,t){return this.recordAction({type:`answer_dialogue`,dialogueId:e,choiceIndex:t},()=>this.answerDialogueInternal(e,t))}answerDialogueInternal(e,t){let n=this.pendingDialogue;if(!n||n.id!==e)return!1;let r=n.choices[t];if(!r)return!1;if(this.pendingDialogue=null,delete this.world.pendingDialogue,r.event){let e=this.nodes(`event`).find(e=>e.attributes.id===r.event);if(!e)throw Error(`MWL dialogue choice points at unknown event: ${r.event}`);if(!this.claimEvent(e))return!0;this.executeEvent(e)}else this.runBlock(r.branch??[]);return this.checkObjectives(),!0}evaluate(){return this.checkObjectives(),this.world.status}save(){let e=this.hooks?.saveable,t=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.save()])):void 0;return VH(this.world,this.persistence,t,this.journal.toJSON())}snapshot(){return JSON.stringify(this.world)}restore(e){let t=UH(e,this.persistence),n=t.world;Object.assign(this.world.variables,n.variables),Object.assign(this.world.units,n.units),Object.assign(this.world.sides,n.sides??{}),Object.assign(this.world.maps,n.maps??{}),Object.assign(this.world.gold,n.gold??{}),this.world.turn=n.turn,this.world.status=n.status,this.world.sideStatus={...n.sideStatus??{}},this.world.map=n.map??null,this.world.timeOfDay=n.timeOfDay??this.schedule[0]??``,this.world.scheduleIndex=n.scheduleIndex??0,this.world.random=n.random,this.random.setState(n.random??new w().getState()),this.world.firedEvents=[...n.firedEvents??[]],this.world.villages=n.villages?structuredClone(n.villages):void 0,this.world.clearedShroud=n.clearedShroud?structuredClone(n.clearedShroud):void 0,this.world.roles=n.roles?structuredClone(n.roles):void 0,this.world.objects=n.objects?structuredClone(n.objects):void 0,this.world.story=n.story?structuredClone(n.story):void 0,this.world.pendingDialogue=n.pendingDialogue,this.pendingDialogue=n.pendingDialogue?{id:n.pendingDialogue.id,choices:[...n.pendingDialogue.choices]}:null;let r=n.pendingDialogue?.id.match(/^dialogue-(\d+)$/);r&&(this.dialogueCounter=Math.max(this.dialogueCounter,Number(r[1])));for(let[e,n]of Object.entries(t.hookState??{}))this.hooks?.saveable?.[e]?.restore(n);this.journal.replace(t.journal??[])}recordAction(e,t){let n=this.traceBatch===null;n&&(this.traceBatch=[]);try{let r=t();return n&&this.journal.append(e,this.traceBatch??[]),r}finally{n&&(this.traceBatch=null)}}trace(e){this.traceBatch?.push(e),this.onTrace?.(e)}loadUnitTypes(){for(let e of this.nodes(`unit_type`)){let t=e.attributes.id;t&&this.unitTypes.set(t,{hitpoints:dU(e,`hitpoints`,1),movement:dU(e,`movement`,0)})}}loadSchedule(){this.schedule=this.nodes(`schedule`).flatMap(e=>e.children.filter(e=>e.tag===`time`).map(e=>e.attributes.id).filter(e=>!!e)),this.world.scheduleIndex=0,this.world.timeOfDay=this.schedule[0]??``}loadInitialContent(){for(let e of this.nodes(`side`)){let t={gold:dU(e,`gold`,0),income:dU(e,`income`,0)};e.attributes.leader!==void 0&&(t.leader=e.attributes.leader),e.attributes.controller!==void 0&&(t.controller=e.attributes.controller),e.attributes.recruit!==void 0&&(t.recruit=e.attributes.recruit),e.attributes.team_name!==void 0&&(t.teamName=e.attributes.team_name),e.attributes.user_team_name!==void 0&&(t.userTeamName=e.attributes.user_team_name),e.attributes.share_vision!==void 0&&(t.shareVision=e.attributes.share_vision),e.attributes.flag!==void 0&&(t.flag=e.attributes.flag),e.attributes.village_gold!==void 0&&(t.villageGold=dU(e,`village_gold`,0));for(let n of[`heal`,`fog`,`shroud`,`hidden`]){let r=e.attributes[n];r!==void 0&&(t[n]=r===`yes`||r===`true`)}this.world.sides[uU(e,`id`)]=t}for(let e of this.nodes(`map`)){let t=e.attributes.id??e.attributes.name??`map`;this.world.maps[t]={terrain:e.attributes.terrain??``,file:e.attributes.file},this.world.map||(this.world.map=this.buildMap(t,e))}}topLevelNodes(e){return(this.game.roots.find(e=>e.tag===`game`)?.children??this.game.roots).filter(t=>t.tag===e)}loadScenarioExtras(){for(let e of this.topLevelNodes(`object`)){let t={x:dU(e,`x`,0),y:dU(e,`y`,0)};e.attributes.id!==void 0&&(t.id=e.attributes.id),e.attributes.name!==void 0&&(t.name=e.attributes.name),e.attributes.image!==void 0&&(t.image=e.attributes.image),e.attributes.side!==void 0&&(t.side=e.attributes.side),(this.world.objects??=[]).push(t)}for(let e of this.topLevelNodes(`story`)){let t=e.attributes.text??e.attributes.value;if(t===void 0)continue;let n={text:t};e.attributes.title!==void 0&&(n.title=e.attributes.title),e.attributes.image!==void 0&&(n.image=e.attributes.image),e.attributes.music!==void 0&&(n.music=e.attributes.music),(this.world.story??=[]).push(n)}for(let e of this.topLevelNodes(`role`)){let t=e.attributes.role??e.attributes.name;if(t===void 0)continue;let n=OU(e.attributes,`role`,`name`),r=Object.entries(this.world.units).filter(([e,t])=>t.alive&&DU(t,e,n));for(let[,e]of r)e.role=t;(this.world.roles??={})[t]=r.map(([e])=>e)}}buildMap(e,t){let n=t.attributes.terrain;if(!n&&t.attributes.file&&this.resolveMap&&(n=this.resolveMap(t.attributes.file)),!n)return null;let r=pU(n);for(let e of t.children){if(e.tag!==`start`)continue;let t=e.attributes.side,n=TU(e,`x`),i=TU(e,`y`);t!==void 0&&n!==void 0&&i!==void 0&&(r.starts[t]??=[]).push({x:n,y:i})}return{id:e,...r}}loadInitialUnits(){for(let e of this.nodes(`unit`)){let t=uU(e,`id`),n={hp:dU(e,`hp`,1),x:dU(e,`x`,0),y:dU(e,`y`,0),alive:!0};if(e.attributes.type!==void 0){n.type=e.attributes.type;let t=this.unitTypes.get(e.attributes.type);t&&(n.moves=t.movement)}e.attributes.side!==void 0&&(n.side=e.attributes.side),e.attributes.name!==void 0&&(n.name=e.attributes.name),e.attributes.role!==void 0&&(n.role=e.attributes.role);let r=aU(e,`can_recruit`);r!==void 0&&(n.can_recruit=r),this.world.units[t]=n}}loadLeaders(){for(let e of this.nodes(`side`)){let t=e.attributes.leader;if(!t)continue;let n=e.attributes.id;if(!n)continue;let r=this.world.map?.starts[n];if(!r?.length)continue;let i=this.unitTypes.get(t);for(let e of r){if(this.unitAt(e.x,e.y))continue;let r=`${t} ${n} (${e.x},${e.y})`;this.world.units[r]={hp:i?.hitpoints??1,x:e.x,y:e.y,alive:!0,type:t,side:n,moves:i?.movement??0,can_recruit:!0,leader:!0}}}}unitAt(e,t){return Object.values(this.world.units).find(n=>n.alive&&n.x===e&&n.y===t)}static{this.commandHandlers={message:(e,t)=>e.showMessage(t.attributes),spawn:(e,t)=>e.cmdSpawn(t),move:(e,t)=>e.cmdMove(t),kill:(e,t)=>e.cmdKill(t),fire_event:(e,t)=>e.cmdFireEvent(t),store_unit:(e,t)=>e.cmdStoreUnit(t),unstore_unit:(e,t)=>e.cmdUnstoreUnit(t),recall:(e,t)=>e.cmdRecall(t),modify_unit:(e,t)=>e.cmdModifyUnit(t),heal_unit:(e,t)=>e.cmdHealUnit(t),set_terrain:(e,t)=>e.setTerrain(dU(t,`x`,0),dU(t,`y`,0),uU(t,`terrain`)),capture_village:(e,t)=>e.cmdCaptureVillage(t),clear_shroud:(e,t)=>e.cmdClearShroud(t),role:(e,t)=>e.cmdRole(t),attack:(e,t)=>e.attack(t.attributes.defender??t.attributes.target??uU(t,`target`),dU(t,`amount`,0)),modify_gold:(e,t)=>e.addGold(t.attributes.side??uU(t,`target`),dU(t,`delta`,dU(t,`amount`,0))),gold:(e,t)=>e.addGold(uU(t,`side`),dU(t,`delta`,dU(t,`amount`,0))),set_variable:(e,t)=>e.cmdSetVariable(t),while:(e,t)=>e.cmdWhile(t),foreach:(e,t)=>e.cmdForeach(t),switch:(e,t)=>e.cmdSwitch(t),end_turn:e=>e.endTurn(),win:(e,t)=>e.cmdWin(t),lose:(e,t)=>e.cmdLose(t),endlevel:(e,t)=>e.cmdEndlevel(t),if:(e,t)=>e.cmdIf(t),else:(e,t)=>e.runBlock(e.commandChildren(t)),hook:(e,t)=>e.runHook(t)}}executeNode(t){let n=t.tag===`command`?t.attributes.name:t.tag;if(!n)throw Error(`MWL command is missing name`);let r=e.commandHandlers[n];if(!r)throw Error(`unknown MWL command: ${n}`);r(this,t)}cmdSpawn(e){this.spawnUnit(e.attributes.type??``,e.attributes.side,dU(e,`x`,0),dU(e,`y`,0),e.attributes.id??e.attributes.target,e.attributes.hp===void 0?void 0:dU(e,`hp`,1))}cmdMove(e){this.applyMove(e.attributes.unit??uU(e,`target`),dU(e,`x`,0),dU(e,`y`,0))}cmdKill(e){let t=e.attributes.unit??e.attributes.target;t===void 0?xU(this.world,e.attributes):this.killUnit(t)}cmdFireEvent(e){let t=e.attributes.id??e.attributes.name;if(!t)throw Error(`[fire_event] requires id`);this.fireEvent(t)}cmdStoreUnit(e){let t=e.attributes.variable??e.attributes.name??uU(e,`variable`);this.setVariableAt(t,this.matchingUnits(e,[`variable`,`name`]).map(([e,t])=>({id:e,...SU(t)})))}cmdUnstoreUnit(e){let t=uU(e,`variable`);for(let e of this.storedUnits(t))this.restoreUnit(e,{})}cmdRecall(e){let t=this.storedUnits(uU(e,`variable`)),n=e.attributes.id??e.attributes.unit,r=n===void 0?t[0]:t.find(e=>e.id===n);if(!r)throw Error(`[recall] found no stored unit${n===void 0?``:` named ${n}`}`);let i={};e.attributes.x!==void 0&&(i.x=dU(e,`x`,0)),e.attributes.y!==void 0&&(i.y=dU(e,`y`,0)),e.attributes.side!==void 0&&(i.side=e.attributes.side),this.restoreUnit(r,i)}cmdModifyUnit(e){let t=e.children.find(e=>e.tag===`set`)?.attributes??e.attributes;for(let[,n]of this.matchingUnits(e))CU(n,t)}cmdHealUnit(e){let t=TU(e,`amount`),n=TU(e,`hp`);if(t===void 0&&n===void 0)throw Error(`[heal_unit] requires amount or hp`);for(let[,r]of this.matchingUnits(e))r.hp=n??r.hp+(t??0)}cmdCaptureVillage(e){let t=dU(e,`x`,0),n=dU(e,`y`,0),r={x:t,y:n,side:uU(e,`side`)};e.attributes.name!==void 0&&(r.name=e.attributes.name),(this.world.villages??={})[`${t},${n}`]=r}cmdClearShroud(e){let t=uU(e,`side`),n=dU(e,`x`,0),r=dU(e,`y`,0),i=dU(e,`radius`,1),a=new Set(this.world.clearedShroud?.[t]??[]);for(let e=-i;e<=i;e++)for(let t=-i;t<=i;t++)a.add(`${n+t},${r+e}`);(this.world.clearedShroud??={})[t]=[...a]}cmdRole(e){let t=e.attributes.role??e.attributes.name;if(!t)throw Error(`[role] requires role`);let n=this.matchingUnits(e,[`role`,`name`]);for(let[,e]of n)e.role=t;(this.world.roles??={})[t]=n.map(([e])=>e)}cmdSetVariable(e){let t=e.attributes.path;this.setVariable(t===void 0?e.tag===`command`?uU(e,`target`):uU(e,`name`):this.expandPath(t),e.attributes.value??``,e.attributes.mode)}cmdWhile(e){let t=dU(e,`max_iterations`,1e3);if(t<1||t>1e5)throw Error(`MWL while max_iterations must be between 1 and 100000`);for(let n=0;n<t&&this.nodeConditionMatches(e);n++)this.runBlock(this.commandChildren(e))}cmdForeach(e){let t=this.variableAt(uU(e,`variable`)),n=Array.isArray(t)?t.map((e,t)=>[String(t),e]):typeof t==`string`?t.split(`,`).map((e,t)=>[String(t),e.trim()]).filter(([,e])=>e!==``):t&&typeof t==`object`?Object.entries(t):[],r=e.attributes.item??`item`,i=e.attributes.index??`index`;for(let t=0;t<n.length;t++)this.setVariableAt(r,n[t][1]),this.setVariableAt(i,t),this.runBlock(this.commandChildren(e))}cmdSwitch(e){let t=this.variableAt(uU(e,`variable`)),n=e.children.find(e=>e.tag===`case`&&e.attributes.equals!==void 0&&kU(t,e.attributes.equals)),r=e.children.find(e=>e.tag==="default");this.runBlock((n??r)?.children??[])}cmdWin(e){this.markSideResult(e.attributes.side,`won`),this.world.status=`won`}cmdLose(e){this.markSideResult(e.attributes.side,`lost`),this.world.status=`lost`}cmdEndlevel(e){let t=e.attributes.result===`defeat`?`defeat`:`victory`;this.world.status=t===`defeat`?`lost`:`won`,this.world.carryover=cU(this.world,vU(this.world,e.attributes.side),{result:t,bonus:iU(e,`bonus`),carryoverPercentage:rU(e,`carryover_percentage`),carryoverAdd:aU(e,`carryover_add`),nextScenario:e.attributes.next_scenario??null})}cmdIf(e){let t=e.children.find(e=>e.tag===`else`),n=this.nodeConditionMatches(e)?e:t;this.runBlock(n?this.commandChildren(n):[])}commandChildren(e){return e.children.filter(e=>e.tag!==`condition`&&e.tag!==`filter`&&e.tag!==`filter_condition`)}runHook(e){let t=e.attributes.name??``,n=this.hooks?.command?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{name:r,...i}=e.attributes;n(this.worldView(),this.emit(),i)}applyMove(e,t,n){let r=this.world.units[e];if(!r||!r.alive)throw Error(`MWL unit is not alive: ${e}`);let i=this.world.map??null;if(i){if(t<0||n<0||t>=i.width||n>=i.height)throw Error(`MWL move out of bounds: ${t},${n}`);let e=this.unitAt(t,n);if(e&&e!==r)throw Error(`MWL move onto an occupied cell: ${t},${n}`)}if(typeof r.moves==`number`){if(r.moves<=0)throw Error(`MWL unit has no moves left: ${e}`);--r.moves}r.x=t,r.y=n,this.fireMoveto(e)}showMessage(e){if(!this.onMessage)return;let t={text:this.interpolate(e.text??e.value??``),...e.speaker===void 0?{}:{speaker:e.speaker},...e.portrait===void 0?{}:{portrait:e.portrait},...e.side===void 0||e.side===``?{}:{side:e.side}};this.onMessage(t)}interpolate(e){let t=this.numericVariables();return e.replace(mU,(e,n)=>{try{return String($H(n,t))}catch{return``}}).replace(hU,(e,t)=>{let n=this.variableAt(t);return n===void 0||typeof n==`boolean`?``:String(n)})}expandPath(e){return e.replace(mU,(e,t)=>String($H(t,this.numericVariables()))).replace(hU,(e,t)=>{let n=this.variableAt(t);if(n===void 0)throw Error(`MWL variable path reference "$${t}" names no variable`);if(typeof n==`boolean`||typeof n==`object`)throw Error(`MWL variable path reference "$${t}" is not a name or number`);return String(n)})}setVariable(e,t,n){if(n===`literal`){this.setVariableAt(e,t);return}if(n===`number`){let n=Number(t);if(t.trim()===``||!Number.isFinite(n))throw Error(`MWL set_variable mode="number" needs a number, got "${t}"`);this.setVariableAt(e,n);return}if(n===`expression`){this.setVariableAt(e,$H(t,this.numericVariables()));return}if(n!==void 0)throw Error(`unknown MWL set_variable mode "${n}"`);let r=Number(t);if(t.trim()!==``&&Number.isFinite(r)){this.setVariableAt(e,r);return}let i=/^\$([A-Za-z_][A-Za-z0-9_.]*)$/.exec(t.trim());if(i){let t=this.variableAt(i[1]);this.setVariableAt(e,t===void 0?``:t);return}let a=this.numericVariables();if(/[+*/^()]|\s-\s/.test(t)||Object.prototype.hasOwnProperty.call(a,t.trim())){this.setVariableAt(e,$H(t,a));return}this.setVariableAt(e,t)}numericVariables(){return Object.fromEntries(Object.entries(this.world.variables).filter(e=>typeof e[1]==`number`))}variableAt(e){return FU(this.world.variables,e)}setVariableAt(e,t){let n=this.variableAt(e);PU(this.world.variables,e,t),this.trace({type:`variable`,name:e,...n===void 0?{}:{previous:n},value:t})}spawnUnit(e,t,n,r,i,a){let o=e?this.unitTypes.get(e):void 0,s=i??`${e||`unit`}#${t??``}@${n},${r}`;this.world.units[s]={hp:a??o?.hitpoints??1,x:n,y:r,alive:!0,...e?{type:e}:{},...t===void 0?{}:{side:t},...o?{moves:o.movement}:{}}}killUnit(e){let t=this.world.units[e];if(!t||!t.alive)throw Error(`MWL unit is not alive: ${e}`);t.alive=!1}matchingUnits(e,t=[]){let n=e.children.find(e=>e.tag===`filter`),r=n?n.attributes:OU(e.attributes,...t);return Object.entries(this.world.units).filter(([e,t])=>t.alive&&DU(t,e,r))}storedUnits(e){let t=this.variableAt(e);if(!Array.isArray(t))throw Error(`MWL variable ${e} is not a stored unit list; store one first`);return t.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e))}restoreUnit(e,t){let n=typeof e.id==`string`?e.id:void 0;if(!n)throw Error(`a stored unit snapshot is missing its id`);let r={hp:typeof e.hp==`number`?e.hp:1,x:t.x??(typeof e.x==`number`?e.x:0),y:t.y??(typeof e.y==`number`?e.y:0),alive:e.alive!==!1};typeof e.type==`string`&&(r.type=e.type);let i=t.side??(typeof e.side==`string`?e.side:void 0);i!==void 0&&(r.side=i),typeof e.moves==`number`&&(r.moves=e.moves),typeof e.name==`string`&&(r.name=e.name),typeof e.role==`string`&&(r.role=e.role),typeof e.can_recruit==`boolean`&&(r.can_recruit=e.can_recruit),typeof e.leader==`boolean`&&(r.leader=e.leader),this.world.units[n]=r}setTerrain(e,t,n){let r=this.world.map;if(!r)throw Error(`[set_terrain] needs a loaded map`);if(e<0||t<0||e>=r.width||t>=r.height)throw Error(`[set_terrain] is outside the map: ${e},${t}`);let i=[...r.codes];i[t*r.width+e]=n,this.world.map={...r,codes:i}}addGold(e,t){this.world.gold[e]=(this.world.gold[e]??0)+t}endTurn(){this.world.turn+=1,this.advanceSchedule(),this.resetMoves(),this.run(`turn`),this.checkTimeOver()}checkTimeOver(){let e=iU(this.game.roots[0],`turn_limit`);e===void 0||this.world.turn<=e||this.world.variables.time_over===`yes`||(this.world.variables.time_over=`yes`,this.run(`time_over`))}advanceSchedule(){if(!this.schedule.length)return;let e=((this.world.scheduleIndex??0)+1)%this.schedule.length;this.world.scheduleIndex=e,this.world.timeOfDay=this.schedule[e]}resetMoves(){for(let e of Object.values(this.world.units)){if(!e.alive)continue;let t=e.type?this.unitTypes.get(e.type):void 0;t&&(e.moves=t.movement)}}filterMatches(e){return Object.entries(this.world.units).some(([t,n])=>n.alive&&DU(n,t,e.attributes))}conditionMatches(e){return e.children.filter(e=>e.tag===`condition`).every(e=>{if(e.attributes.condition===`hook`){let t=e.attributes.hook,n=t?.startsWith(`predicate:`)?t.slice(10):void 0,r=n?this.hooks?.predicate?.[n]:void 0;if(!r)throw Error(`MWL predicate ${n??`<missing>`} is not implemented`);let{condition:i,hook:a,...o}=e.attributes;return!!r(this.worldView(),o)}return EU(this.variableAt(e.attributes.variable),e.attributes,IU(this.world.variables))})}nodeConditionMatches(e){return e.attributes.test===void 0?this.conditionMatches(e):JH(e.attributes.test,AU(this.world.variables))}filterConditionMatches(e){let t=e.children.find(e=>e.tag===`filter_condition`);return!t||t.children.every(e=>{if(e.tag===`variable`){let t=e.attributes.name;return t!==void 0&&EU(this.variableAt(t),e.attributes,IU(this.world.variables))}if(e.tag===`predicate`){let t=e.attributes.name,n=t?this.hooks?.predicate?.[t]:void 0;if(!n)throw Error(`MWL predicate ${t??`<missing>`} is not implemented`);let{name:r,...i}=e.attributes;return!!n(this.worldView(),i)}return e.tag!==`have_unit`||Object.entries(this.world.units).some(([t,n])=>n.alive&&(e.attributes.id===void 0||t===e.attributes.id)&&DU(n,t,e.attributes))})}conditionMet(e,t){let n=e.attributes.condition??``,r=e.attributes.side??t;switch(n){case`units_dead`:{let t=e.attributes.side_filter??r;return t!==void 0&&!Object.values(this.world.units).some(e=>e.alive&&e.side===t)}case`turns_elapsed`:{let t=TU(e,`turns`);return t!==void 0&&this.world.turn>=t}case`gold_at_least`:{let n=TU(e,`gold`),r=e.attributes.side??t;return n!==void 0&&r!==void 0&&(this.world.gold[r]??0)>=n}case`unit_at`:{let t=TU(e,`x`),n=TU(e,`y`),i=e.attributes.side_filter??r;return Object.values(this.world.units).some(r=>r.alive&&(i===void 0||r.side===i)&&(e.attributes.type===void 0||r.type===e.attributes.type)&&r.x===t&&r.y===n)}case`hook`:{let t=e.attributes.hook??``,n=this.hooks?.predicate?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{hook:r,condition:i,...a}=e.attributes;return!!n(this.worldView(),a)}default:return!1}}checkObjectives(){if(this.world.status!==`playing`)return;let e=new Set,t=this.nodes(`side`);for(let n of t)for(let t of n.children)(t.tag===`victory`||t.tag===`defeat`)&&e.add(t);if(this.nodes(`victory`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`won`;return}if(this.nodes(`defeat`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`lost`;return}let n=!1,r=!1;for(let e of t){let t=e.attributes.id;t&&(this.world.sideStatus?.[t]??`playing`)===`playing`&&(e.children.some(e=>e.tag===`victory`&&this.conditionMet(e,t))?(this.markSideResult(t,`won`),n=!0):e.children.some(e=>e.tag===`defeat`&&this.conditionMet(e,t))&&(this.markSideResult(t,`lost`),r=!0))}n?this.world.status=`won`:r&&(this.world.status=`lost`)}markSideResult(e,t){e!==void 0&&e!==``&&((this.world.sideStatus??={})[e]=t)}worldView(){return{variables:this.world.variables,variableAt:e=>this.variableAt(e),units:this.world.units,sides:this.world.sides,turn:this.world.turn,random:{float:()=>this.drawRandom(e=>e.float()),int:e=>this.drawRandom(t=>t.int(e))}}}drawRandom(e){let t=e(this.random);return this.world.random=this.random.getState(),t}emit(){return{move:(e,t,n)=>this.applyMove(e,t,n),attack:(e,t,n)=>{throw Error(`MWL hook attack is not available in the framework runtime; the engine adapter owns combat`)},spawn:(e,t,n,r)=>this.spawnUnit(e,t,n,r),kill:e=>this.killUnit(e),gold:(e,t)=>this.addGold(e,t),setVariable:(e,t)=>{PU(this.world.variables,e,t)},message:(e,t)=>this.onMessage?.({text:t,...e?{speaker:e}:{}}),endTurn:()=>this.endTurn(),win:e=>{this.markSideResult(e,`won`),this.world.status=`won`},lose:e=>{this.markSideResult(e,`lost`),this.world.status=`lost`}}}attack(e,t){let n=this.world.units[e];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${e}`);n.hp=Math.max(0,n.hp-t),n.hp===0&&(n.alive=!1)}nodes(e){let t=[],n=r=>{r.tag===e&&t.push(r),r.children.forEach(n)};return this.game.roots.forEach(n),t}};function _U(e,t){if(e.status===`playing`||t.name===`win`||t.name===`lose`)switch(t.name){case`set_variable`:PU(e.variables,t.target,t.value);break;case`modify_gold`:e.gold[t.target]=(e.gold[t.target]??0)+t.amount;break;case`move`:{let n=bU(e,t.target);n.x=t.x,n.y=t.y;break}case`spawn`:e.units[t.target]={hp:t.hp,x:t.x,y:t.y,alive:!0};break;case`kill`:t.target===void 0?xU(e,t.filter??{}):bU(e,t.target).alive=!1;break;case`end_turn`:e.turn++;break;case`win`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`won`),e.status=`won`;break;case`lose`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`lost`),e.status=`lost`;break;case`endlevel`:e.status=t.result===`defeat`?`lost`:`won`,e.carryover=cU(e,t.side??null,t)}}function vU(e,t){let n=t??Object.entries(e.sides).find(([,e])=>e.controller===`human`)?.[0];return!n||!(n in e.sides)?null:{id:n}}function yU(e){let t=new Map;for(let[n,r]of Object.entries(e.sides)){if(!r.teamName||r.shareVision===`none`)continue;let e=t.get(r.teamName);e?e.push(n):t.set(r.teamName,[n])}return[...t.values()].filter(e=>e.length>1)}function bU(e,t){let n=e.units[t];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${t}`);return n}function xU(e,t){let n=0;for(let[r,i]of Object.entries(e.units))i.alive&&DU(i,r,t)&&(i.alive=!1,n++);return n}function SU(e){let t={hp:e.hp,x:e.x,y:e.y,alive:e.alive};return e.type!==void 0&&(t.type=e.type),e.side!==void 0&&(t.side=e.side),e.moves!==void 0&&(t.moves=e.moves),e.name!==void 0&&(t.name=e.name),e.role!==void 0&&(t.role=e.role),e.can_recruit!==void 0&&(t.can_recruit=e.can_recruit),e.leader!==void 0&&(t.leader=e.leader),t}function CU(e,t){let n=wU(t.hp);n!==void 0&&(e.hp=n);let r=wU(t.moves);r!==void 0&&(e.moves=r),t.type!==void 0&&(e.type=t.type),t.side!==void 0&&(e.side=t.side);let i=oU(t.alive);i!==void 0&&(e.alive=i),t.name!==void 0&&(e.name=t.name),t.role!==void 0&&(e.role=t.role);let a=oU(t.can_recruit);a!==void 0&&(e.can_recruit=a)}function wU(e){if(e===void 0||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function TU(e,t){let n=e.attributes[t];if(n===void 0||n===``)return;let r=Number.parseInt(n,10);return Number.isFinite(r)?r:void 0}function EU(e,t,n){let r=e=>{if(!e.startsWith(`$`))return e;let t=n(e.slice(1));return typeof t==`string`||typeof t==`number`||typeof t==`boolean`?t:void 0};if(t.equals!==void 0)return kU(e,r(t.equals));if(t.not_equals!==void 0)return!kU(e,r(t.not_equals));if(t.in!==void 0)return t.in.split(`,`).map(e=>e.trim()).some(t=>kU(e,t));if(t.not_in!==void 0)return!t.not_in.split(`,`).map(e=>e.trim()).some(t=>kU(e,t));let i=typeof e==`number`?e:Number(e),a=e=>Number(t[e]);return t.less_than!==void 0||t.greater_than!==void 0||t.less_than_or_equal_to!==void 0||t.greater_than_or_equal_to!==void 0?!(typeof e==`boolean`||!Number.isFinite(i)||t.less_than!==void 0&&!(i<a(`less_than`))||t.greater_than!==void 0&&!(i>a(`greater_than`))||t.less_than_or_equal_to!==void 0&&!(i<=a(`less_than_or_equal_to`))||t.greater_than_or_equal_to!==void 0&&!(i>=a(`greater_than_or_equal_to`))):e!==void 0}function DU(e,t,n){let r=(n.not_type??``).split(`,`).map(e=>e.trim()).filter(Boolean),i=oU(n.can_recruit),a=oU(n.leader),o=n.unit??n.id;return(o===void 0||t===o)&&(n.side===void 0||e.side===n.side)&&(n.type===void 0||e.type===n.type)&&(r.length===0||!r.includes(e.type??``))&&(n.name===void 0||e.name===n.name)&&(n.role===void 0||e.role===n.role)&&(i===void 0||(e.can_recruit??!1)===i)&&(a===void 0||(e.leader??!1)===a)&&(n.x===void 0||LU(n.x,e.x))&&(n.y===void 0||LU(n.y,e.y))}function OU(e,...t){if(t.length===0)return{...e};let n={...e};for(let e of t)delete n[e];return n}function kU(e,t){if(e===void 0||t===void 0||typeof t!=`string`)return e===t;let n=Number(t);return typeof e==`number`&&t.trim()!==``&&Number.isFinite(n)?e===n:e===t}function AU(e){return Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`||typeof e[1]==`number`||typeof e[1]==`boolean`))}function jU(e){return e.split(`.`).flatMap(e=>{let t=/^([^[\]]*)((?:\[[^\]]*\])*)$/.exec(e);if(!t)return[e];let n=t[1]===``?[]:[t[1]];for(let e of t[2].matchAll(/\[([^\]]*)\]/g)){let t=Number(e[1]);n.push({index:/^\d+$/.test(e[1].trim())?t:void 0})}return n}).filter(e=>typeof e!=`string`||e!==``)}function MU(e){let t=jU(e);if(t.some(e=>typeof e!=`string`&&e.index===void 0))throw Error(`invalid variable path: ${e}`);return t}function NU(e){return typeof e!=`string`}function PU(e,t,n){let r=MU(t),i=e=>typeof e==`string`?e:e.index,a=e;for(let e=0;e<r.length-1;e++){let t=i(r[e]),n=a[t];(!n||typeof n!=`object`)&&(a[t]=NU(r[e+1])?[]:{}),a=a[t]}a[i(r[r.length-1])]=n}function FU(e,t){let n=e;for(let e of jU(t))if(typeof e==`string`){if(!n||typeof n!=`object`||Array.isArray(n))return;n=n[e]}else{if(!Array.isArray(n)||e.index===void 0)return;n=n[e.index]}return n}function IU(e){return t=>FU(e,t)}function LU(e,t){return e.split(`,`).some(e=>{let n=e.trim(),r=n.match(/^(-?\d+)\s*-\s*(-?\d+)$/);if(r){let e=Number(r[1]),n=Number(r[2]);return t>=Math.min(e,n)&&t<=Math.max(e,n)}return/^-?\d+$/.test(n)&&Number(n)===t})}var RU=/^\s*([A-Za-z_][\w]*)\s*=\s*(.*?)\s*$/;function zU(e){let t=e.split(/\r?\n/),n={},r=0;for(;r<t.length;r++){let e=t[r];if(e.trim()===``)continue;let i=RU.exec(e);if(!i)break;n[i[1]]=i[2]}return{header:n,...pU(t.slice(r).map(e=>e.replace(/[,\s]+$/,``)).join(`
|
|
1363
|
-
`))}}function BU(e){let t=[];for(let n of e.split(`|`)){let e=n.indexOf(`:`);if(e<=0||e===n.length-1)throw Error(`invalid table column "${n}"`);let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();if(!/^[A-Za-z_][\w.-]*$/.test(r))throw Error(`invalid table column name "${r}"`);if(![`string`,`number`,`boolean`,`list`,`map`].includes(i))throw Error(`invalid table column type "${i}"`);if(t.some(e=>e.name===r))throw Error(`duplicate table column "${r}"`);t.push({name:r,type:i})}if(t.length===0)throw Error(`table must declare at least one column`);return t}var VU={game:{attributes:{schema:`string`,title:`string`,data_root:`string`,start_scene:`id`,default_schedule:`id`,save_slot:`string`,turn_limit:`integer`},children:`campaign.terrain_type.movetype.unit_type.unit.side.map.schedule.event.objectives.trait.weapon_special.dialogue.save.item.inventory.monster.status.loot.turn_clock.battle_move.type_matchup.evolution.table.object.story.role`.split(`.`)},campaign:{attributes:{id:`id`,name:`string`,title:`string`,description:`string`,start_scene:`id`,first_scenario:`id`},openChildren:!0},table:{attributes:{id:`id`,columns:`string`,list_delimiter:`string`,map_delimiter:`string`},children:[`row`]},row:{openAttributes:`string`},terrain_type:{attributes:{id:`id`,string:`string`,aliasof:`string`,mvt_alias:`string`,default_base:`string`,heals:`integer`,gives_income:`boolean`,map_code:`string`,base_tile:`string`,overlay_tile:`string`,defense:`number`,healing:`number`}},movetype:{attributes:{id:`id`,name:`string`},children:[`movement_costs`,`defense`,`resistance`]},movement_costs:{openAttributes:`number`},defense:{openAttributes:`number`},resistance:{openAttributes:`number`},unit_type:{attributes:{id:`string`,name:`string`,description:`string`,image:`string`,image_icon:`string`,profile:`string`,sound:`string`,hitpoints:`integer`,movement:`integer`,movement_type:`id`,movetype:`id`,experience:`integer`,level:`integer`,alignment:`id`,cost:`integer`,advances_to:`string`,race:`id`,usage:`id`},children:[`attack`,`trait`,`ability`]},unit:{attributes:{id:`id`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,hp:`integer`,x:`integer`,y:`integer`}},attack:{attributes:{id:`id`,attacker:`string`,defender:`string`,target:`string`,amount:`integer`,weapon:`id`,name:`string`,sound:`string`,description:`string`,type:`id`,range:`id`,damage:`integer`,number:`integer`,strikes:`integer`,icon:`string`,specials:`string`}},side:{attributes:{id:`string`,controller:`id`,gold:`integer`,income:`integer`,income_base:`integer`,income_per_village:`integer`,leader:`id`,team:`integer`,recruit:`string`,color:`string`,team_name:`string`,user_team_name:`string`,share_vision:`string`,village_gold:`integer`,heal:`boolean`,fog:`boolean`,shroud:`boolean`,hidden:`boolean`,flag:`string`}},map:{attributes:{id:`id`,name:`string`,file:`string`,terrain:`string`},children:[`start`]},start:{attributes:{side:`string`,x:`integer`,y:`integer`}},schedule:{attributes:{id:`id`},children:[`time`]},time:{attributes:{id:`id`,name:`string`,lawful_bonus:`number`}},event:{attributes:{id:`id`,on:`id`,trigger:`id`,x:`coordinate`,y:`coordinate`,side:`string`,unit:`string`,once:`boolean`},children:`condition.filter.filter_condition.while.foreach.switch.command.say.dialogue.move.attack.spawn.kill.gold.endlevel.set_variable.if.else.message.teleport.end_turn.win.lose.hook.fire_event.store_unit.unstore_unit.recall.modify_unit.heal_unit.set_terrain.capture_village.clear_shroud.role`.split(`.`)},objectives:{attributes:{side:`string`,victory:`string`,defeat:`string`},children:[`victory`,`defeat`]},victory:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},defeat:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},condition:{attributes:{condition:`id`,hook:`string`,variable:`string`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},filter:{attributes:{side:`string`,type:`string`,not_type:`string`,unit:`string`,name:`string`,role:`string`,x:`coordinate`,y:`coordinate`,level:`integer`,alignment:`id`,can_recruit:`boolean`,leader:`boolean`}},filter_condition:{children:[`variable`,`have_unit`,`predicate`]},variable:{attributes:{name:`id`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},have_unit:{attributes:{id:`string`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,x:`coordinate`,y:`coordinate`}},predicate:{attributes:{name:`id`},openAttributes:`string`},command:{attributes:{name:`id`,target:`string`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`],amount:`integer`,x:`integer`,y:`integer`,hp:`integer`}},move:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},spawn:{attributes:{id:`string`,type:`string`,side:`string`,x:`integer`,y:`integer`,hp:`integer`}},kill:{attributes:{unit:`string`,target:`string`},openAttributes:`string`},gold:{attributes:{side:`string`,delta:`integer`,amount:`integer`}},endlevel:{attributes:{result:`id`,side:`string`,bonus:`integer`,carryover_percentage:`integer`,carryover_add:`boolean`,next_scenario:`id`}},set_variable:{attributes:{name:`id`,target:`id`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`]}},if:{attributes:{test:`string`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},else:{children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},while:{attributes:{test:`string`,max_iterations:`integer`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},foreach:{attributes:{variable:`id`,item:`id`,index:`id`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},switch:{attributes:{variable:`id`},children:[`case`,`default`]},case:{attributes:{equals:`string`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},default:{children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},message:{attributes:{speaker:`string`,text:`string`,value:`string`,portrait:`string`,side:`string`}},teleport:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},end_turn:{attributes:{}},win:{attributes:{side:`string`}},lose:{attributes:{side:`string`}},say:{attributes:{speaker:`id`,text:`string`}},dialogue:{attributes:{id:`id`,ref:`id`},children:[`say`,`choice`,`branch`,`message`]},choice:{attributes:{text:`string`,event:`id`,variable:`id`,equals:`string`},children:[`branch`]},branch:{attributes:{text:`string`},children:[`message`,`say`,`command`,`set_variable`,`move`,`attack`,`spawn`,`kill`,`gold`,`hook`]},trait:{attributes:{id:`id`,name:`string`},children:[`effect`]},ability:{attributes:{id:`id`,name:`string`},children:[`effect`]},weapon_special:{attributes:{id:`id`,name:`string`}},hook:{attributes:{name:`string`},openAttributes:`string`},fire_event:{attributes:{id:`id`,name:`string`}},store_unit:{attributes:{variable:`string`,name:`string`},children:[`filter`]},unstore_unit:{attributes:{variable:`string`,name:`string`}},recall:{attributes:{variable:`string`,id:`string`,unit:`string`,side:`string`,x:`integer`,y:`integer`}},modify_unit:{attributes:{hp:`integer`,moves:`integer`,type:`string`,side:`string`,alive:`boolean`},children:[`filter`,`set`]},set:{openAttributes:`string`},heal_unit:{attributes:{amount:`integer`,hp:`integer`,side:`string`,type:`string`,x:`integer`,y:`integer`},children:[`filter`]},set_terrain:{attributes:{terrain:`string`,x:`integer`,y:`integer`}},capture_village:{attributes:{side:`string`,x:`integer`,y:`integer`,name:`string`}},clear_shroud:{attributes:{side:`string`,x:`integer`,y:`integer`,radius:`integer`}},role:{attributes:{role:`string`,name:`string`,type:`string`,not_type:`string`,unit:`string`,side:`string`,can_recruit:`boolean`,x:`integer`,y:`integer`},children:[`filter`]},object:{attributes:{id:`id`,name:`string`,image:`string`,side:`string`,x:`integer`,y:`integer`},children:[`filter`]},story:{attributes:{text:`string`,value:`string`,title:`string`,image:`string`,music:`string`}},item:{attributes:{id:`id`,name:`string`,slot:`id`,stackable:`boolean`,weight:`number`,image:`string`,icon:`string`},children:[`effect`]},inventory:{attributes:{unit:`string`,side:`string`,items:`string`}},monster:{attributes:{id:`string`,name:`string`,hp:`integer`,types:`string`,attack:`number`,defense:`number`,speed:`number`,accuracy:`number`,evasion:`number`,damage_min:`integer`,damage_max:`integer`,armor_min:`integer`,armor_max:`integer`,experience:`integer`,max_level:`integer`,image:`string`},children:[`ability`,`loot`]},status:{attributes:{id:`id`,name:`string`,duration:`integer`,tick:`string`,modifiers:`string`}},loot:{attributes:{item:`id`,chance:`number`,quantity:`integer`,weight:`number`}},turn_clock:{attributes:{id:`id`,tick:`number`,hunger:`number`}},ai:{attributes:{id:`id`,strategy:`id`,target:`id`,difficulty:`number`,scope:`id`,provider:`id`,algorithm:`id`,depth:`integer`,max_nodes:`integer`,player:`string`,moves:`string`,apply:`string`,terminal:`string`,evaluate:`string`},children:[`behavior`]},behavior:{attributes:{id:`id`,when:`string`,action:`string`,hook:`string`}},battle_move:{attributes:{id:`id`,type:`id`,target:`id`,power:`number`,cost:`number`}},type_matchup:{attributes:{attacker:`id`,defender:`id`,multiplier:`number`}},evolution:{attributes:{from:`id`,into:`id`,level:`integer`}},effect:{attributes:{apply_to:`id`,range:`id`,increase:`string`,increase_total:`string`,increase_damage:`string`,add:`string`,sub:`string`,multiply:`string`,divide:`string`,set:`string`}},save:{attributes:{version:`integer`,fields:`string`,migration:`string`}}},HU={...VU,game:{...VU.game,required:[`schema`]},table:{...VU.table,required:[`id`,`columns`],cardinality:{row:{min:1}}},terrain_type:{...VU.terrain_type,required:[`id`]},movetype:{...VU.movetype,required:[`id`]},unit_type:{...VU.unit_type,required:[`id`]},unit:{...VU.unit,required:[`id`,`type`,`side`]}};function UU(e,t=VU){let n=[],r=new Map,i=e=>{let t=e.attributes.id;t&&r.set(t,[...r.get(t)??[],e]),e.children.forEach(i)};e.forEach(i);let a=[],o=(e,i=!1)=>{let s=t[e.tag];if(!s){if(i){e.children.forEach(e=>o(e,!0));return}n.push({code:`MWL_UNKNOWN_TAG`,message:`unknown tag ${e.tag}`,location:e.location});return}for(let t of Object.keys(e.attributes))s.openAttributes||(!s.attributes||!(t in s.attributes))&&n.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${t} on ${e.tag}`,location:e.attributeLocations?.[t]??e.location});for(let t of s.required??[])e.attributes[t]===void 0&&n.push({code:`MWL_REQUIRED_ATTRIBUTE`,message:`${t} is required on ${e.tag}`,location:e.location});for(let[t,i]of Object.entries(s.attributes??{})){let o=e.attributes[t];if(o!==void 0&&!qU(o,i)&&n.push({code:`MWL_VALUE`,message:`${t} must be ${JU(i)}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location}),o!==void 0&&i===`ref`){let i=(r.get(o)??[]).filter(e=>{let n=s.refTargets?.[t];return!n||n===`*`||e.tag===n});i.length===0?n.push({code:`MWL_REF_MISSING`,message:`${t} references missing target ${o}`,location:e.location}):i.length>1?n.push({code:`MWL_REF_DUPLICATE`,message:`${t} references ambiguous target ${o}`,location:e.location}):s.acyclicRefs?.includes(t)&&a.push({from:e,to:i[0],name:t})}}if(s.openAttributes)for(let[t,r]of Object.entries(e.attributes))qU(r,s.openAttributes)||n.push({code:`MWL_VALUE`,message:`${t} must be ${s.openAttributes}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location});for(let t of e.children)!s.openChildren&&s.children&&!s.children.includes(t.tag)&&n.push({code:`MWL_CHILD`,message:`${t.tag} is not allowed inside ${e.tag}`,location:t.location}),o(t,s.openChildren===!0);for(let[t,r]of Object.entries(s.cardinality??{})){let i=e.children.filter(e=>e.tag===t).length;r.min!==void 0&&i<r.min&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} needs at least ${r.min} ${t} child${r.min===1?``:`ren`}`,location:e.location}),r.max!==void 0&&i>r.max&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} allows at most ${r.max} ${t} child${r.max===1?``:`ren`}`,location:e.location})}};e.forEach(e=>o(e)),WU(e,n);let s=new Set,c=new Set,l=(e,t)=>{if(s.has(e)){let r=t.indexOf(e);n.push({code:`MWL_REF_CYCLE`,message:`reference cycle through ${t.slice(r).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.location});return}if(!c.has(e)){s.add(e);for(let n of a.filter(t=>t.from===e))l(n.to,[...t,e]);s.delete(e),c.add(e)}};for(let e of a)l(e.from,[]);return n.sort((e,t)=>e.location.line-t.location.line||e.location.column-t.location.column)}function WU(e,t){let n=e=>{if(e.tag===`table`){let n;try{n=BU(e.attributes.columns??``)}catch(r){t.push({code:`MWL_TABLE`,message:String(r).replace(/^Error: /,``),location:e.location}),n=[]}let r=new Map(n.map(e=>[e.name,e]));for(let i of e.children.filter(e=>e.tag===`row`)){for(let e of Object.keys(i.attributes))r.has(e)||t.push({code:`MWL_TABLE`,message:`unknown table column ${e}`,location:i.location});for(let r of n){let n=i.attributes[r.name];if(n===void 0){t.push({code:`MWL_TABLE`,message:`missing table column ${r.name}`,location:i.location});continue}try{GU(n,r.type,r.name,e.attributes.list_delimiter,e.attributes.map_delimiter)}catch(e){t.push({code:`MWL_TABLE`,message:String(e).replace(/^Error: /,``),location:i.location})}}}}e.children.forEach(n)};e.forEach(n)}function GU(e,t,n,r=`;`,i=`=`){return Hn(e,t,{column:n,listDelimiter:r,mapDelimiter:i,acceptYesNo:!0})}function KU(e){return/^[A-Za-z_][\w.[\]-]*$/.test(e)}function qU(e,t){return YU(t)?t.includes(e):t===`number`?Number.isFinite(Number(e)):t===`integer`?/^-?\d+$/.test(e):t===`boolean`?e===`true`||e===`false`||e===`yes`||e===`no`:t===`ref`?/^[A-Za-z_][\w.-]*$/.test(e):t===`coordinate`?/^-?\d+(?:\s*,\s*-?\d+|\s*-\s*-?\d+)*$/.test(e):t!==`id`||KU(e)}function JU(e){return YU(e)?`one of ${e.join(`, `)}`:e}function YU(e){return Array.isArray(e)}function XU(e,t={}){return QU(CH(_H(e,t),t.file),t)}function ZU(e,t={}){let n=[];for(let r of[...e].sort((e,t)=>e.file<t.file?-1:+(e.file>t.file))){let e=_H(r.source,{...t,file:r.file});n.push(...CH(e,r.file))}return QU(n,t)}function QU(e,t={}){let n=e.find(e=>e.tag===`game`)?.attributes.schema,r=UU(e,t.schemas??(n===`1.0`?HU:void 0));if(r.length){let e=r[0];throw Error(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`)}let i=new Set,a=new Set,o=e=>{for(let[t,n]of Object.entries(e.attributes))if($U(t))for(let e of tW(n).map(e=>e.trim()).filter(eW))i.add(nW(e));let t=e.gettext??[`name`,`text`,`title`];for(let n of t){let t=e.attributes[n];t!==void 0&&a.add(t)}let n={tag:e.tag,attributes:{...e.attributes},children:e.children.map(o),location:e.location};return Object.defineProperties(n,{attributeLocations:{value:e.attributeLocations,enumerable:!1},valueLocations:{value:e.valueLocations,enumerable:!1}}),e.gettext&&Object.assign(n,{gettext:[...e.gettext]}),n};return{schema:e.find(e=>e.tag===`game`)?.attributes.schema??`0.1`,roots:e.map(o),assets:[...i].sort(),messages:[...a].sort()}}function $U(e){return e===`file`||e===`image`||e===`image_icon`||e===`icon`||e===`profile`||e===`sound`||e.endsWith(`_sound`)||e.endsWith(`_image`)}function eW(e){return e.includes(`/`)||/\.(?:png|jpg|jpeg|gif|svg|webp|wav|ogg|mp3|flac|glb|gltf|vox|map|cfg)$/i.test(e)||e.startsWith(`data:`)}function tW(e){let t=[],n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)e[a]===`(`?r+=1:e[a]===`)`&&r>0?--r:e[a]===`[`?i+=1:e[a]===`]`&&i>0?--i:e[a]===`,`&&r===0&&i===0&&(t.push(e.slice(n,a)),n=a+1);return t.push(e.slice(n)),t}function nW(e){let t=e.match(/~[A-Za-z][A-Za-z0-9_-]*(?:\(|$)/);return t?e.slice(0,t.index).trim():e}function rW(e,t={}){let n={};for(let t of e.messages)n[t]=t;return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function iW(e,t=`gameData`){return`export const ${t} = ${JSON.stringify(e,null,` `)} as const;\n`}function aW(e,t={}){let n=[{name:`game-data.ts`,content:iW(e,t.variable??`gameData`)},{name:`i18n.json`,content:`${JSON.stringify(rW(e),null,` `)}\n`},{name:`assets.json`,content:`${JSON.stringify({assets:e.assets},null,` `)}\n`},...Object.entries(t.artifacts??{}).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>({name:e,content:t}))];for(let e of n)t.onEmit?.(e);return n}function oW(e,t={},n={}){let r=aW(ZU(e,t),n),i=aW(ZU(e,t),n);if(r.length!==i.length||r.some((e,t)=>e.name!==i[t]?.name||e.content!==i[t]?.content))throw Error(`MWL generated artifacts are not deterministic`);return r}var sW=/^[A-Za-z_][\w-]*$/,cW=[`predicate`,`modifier`,`generator`,`command`,`ai`,`migration`];function lW(e){let t=e.indexOf(`:`);if(t<=0)return null;let n=e.slice(0,t),r=e.slice(t+1).trim();return!sW.test(n)||!sW.test(r)?null:{type:n,name:r}}function uW(e,t=[`hook`,`migration`]){let n=new Map,r=new Set(t),i=e=>{for(let[t,n]of Object.entries(e.attributes))r.has(t)&&a(n,e.location),e.tag===`hook`&&t===`name`&&a(n,e.location);e.children.forEach(i)},a=(e,t)=>{let r=lW(e);if(!r)return;let i=`${r.type}:${r.name}`;n.has(i)||n.set(i,{...r,location:t})};return e.roots.forEach(i),[...n.values()].sort((e,t)=>e.type.localeCompare(t.type)||e.name.localeCompare(t.name))}function dW(e,t){if(t.attributes===void 0&&t.openAttributes===void 0)return[];let n=e.location??{file:`<hook>`,line:0,column:0},r=[];for(let[i,a]of Object.entries(e.attributes)){if(i===`name`)continue;let e=t.attributes?.[i]??t.openAttributes;if(e===void 0){r.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${i} on hook ${t.id}`,location:n});continue}qU(a,e)||r.push({code:`MWL_VALUE`,message:`${i} must be ${JU(e)} on hook ${t.id}`,location:n})}return r}function fW(e,t){let n=new Set(t),r=[];for(let t of e){let e=`${t.type}:${t.name}`;n.has(e)||r.push({code:`MWL_HOOK`,message:`hook ${e} is not implemented`,location:t.location??{file:`<hook>`,line:0,column:0}})}return r}function pW(e){let t=[];t.push(`// Generated by mwl - do not edit.`),t.push(`import type { AiHook, CommandHook, GeneratorHook, MigrationHook, ModifierHook, PredicateHook } from '@datamoc/mw_games/mwl';`),t.push(``),t.push(`export interface MwlHooks {`);for(let n of e){let e=cW.includes(n.type)?`${n.type[0].toUpperCase()}${n.type.slice(1)}Hook`:`MwlDomainHook`;t.push(`\t'${n.type}:${n.name}': ${e};`)}return t.push(`}`),t.push(``),t.join(`
|
|
1364
|
-
`)}function mW(e,t){let n=e.scenarios;if(n.length===0)throw Error(`campaign ${e.id} declares no scenarios`);let r=new Set(n.map(e=>e.id));if(r.size!==n.length)throw Error(`campaign ${e.id} declares a scenario twice`);let i=e.firstScenario||n[0].id;if(!r.has(i))throw Error(`campaign ${e.id} starts on an unknown scenario: ${i}`);return{start:i,levels:n.map(e=>({id:e.id,run:(n,r)=>{let i=t.run(e,n,r);return i.next===void 0?{...i,next:e.nextScenario??null}:i}}))}}var hW=nU,gW=rU,_W=iU,vW=aU,yW=sU;function bW(e){let t=tU(e.roots);return{campaigns:t.filter(e=>e.tag===`campaign`).map(e=>({id:hW(e,`id`),name:e.attributes.name,title:e.attributes.title,description:e.attributes.description,startScene:e.attributes.start_scene,firstScenario:e.attributes.first_scenario,scenarios:e.children.filter(e=>e.tag===`scenario`).map(e=>({id:hW(e,`id`),nextScenario:e.attributes.next_scenario||void 0}))})),items:t.filter(e=>e.tag===`item`).map(e=>({id:hW(e,`id`),name:hW(e,`name`),slot:e.attributes.slot,stackable:vW(e,`stackable`),weight:gW(e,`weight`),image:e.attributes.image,icon:e.attributes.icon,effects:e.children.filter(e=>e.tag===`effect`).map(SW)})),monsters:t.filter(e=>e.tag===`monster`).map(e=>({id:hW(e,`id`),name:e.attributes.name,hp:_W(e,`hp`,1),accuracy:gW(e,`accuracy`),evasion:gW(e,`evasion`),damage:CW(e,`damage_min`,`damage_max`),armor:CW(e,`armor_min`,`armor_max`),experience:_W(e,`experience`),maxLevel:_W(e,`max_level`),image:e.attributes.image,types:e.attributes.types?.split(`,`).map(e=>e.trim()).filter(Boolean),baseStats:[`attack`,`defense`,`speed`,`hp`].reduce((t,n)=>{let r=gW(e,n);return r!==void 0&&(t[n===`hp`?`maxHp`:n]=r),t},{})})),statuses:t.filter(e=>e.tag===`status`).map(e=>({id:hW(e,`id`),name:e.attributes.name,duration:_W(e,`duration`),tick:e.attributes.tick,modifiers:e.attributes.modifiers})),loot:t.filter(e=>e.tag===`loot`).map(e=>({item:hW(e,`item`),chance:gW(e,`chance`),quantity:_W(e,`quantity`),weight:gW(e,`weight`)})),turnClocks:t.filter(e=>e.tag===`turn_clock`).map(e=>({id:hW(e,`id`),tick:gW(e,`tick`),hunger:gW(e,`hunger`)})),ai:t.filter(e=>e.tag===`ai`).map(e=>({id:hW(e,`id`),strategy:e.attributes.strategy,target:e.attributes.target,difficulty:gW(e,`difficulty`),scope:yW(e.attributes.scope,[`actor`,`controller`]),provider:yW(e.attributes.provider,[`javascript`,`lua`]),algorithm:yW(e.attributes.algorithm,[`rules`,`alpha_beta`]),depth:_W(e,`depth`),maxNodes:_W(e,`max_nodes`),player:e.attributes.player,moves:e.attributes.moves,apply:e.attributes.apply,terminal:e.attributes.terminal,evaluate:e.attributes.evaluate,behaviors:e.children.filter(e=>e.tag===`behavior`).map(e=>({id:hW(e,`id`),when:e.attributes.when,action:e.attributes.action,hook:e.attributes.hook}))})),moves:t.filter(e=>e.tag===`battle_move`).map(e=>({id:hW(e,`id`),type:hW(e,`type`),target:hW(e,`target`),power:gW(e,`power`),cost:gW(e,`cost`)})),typeMatchups:t.filter(e=>e.tag===`type_matchup`).map(e=>({attacker:hW(e,`attacker`),defender:hW(e,`defender`),multiplier:gW(e,`multiplier`)??1})),evolutions:t.filter(e=>e.tag===`evolution`).map(e=>({from:hW(e,`from`),into:hW(e,`into`),level:_W(e,`level`,1)})),tables:t.filter(e=>e.tag===`table`).map(xW)}}function xW(e){let t=BU(hW(e,`columns`));return{id:hW(e,`id`),columns:t,rows:e.children.filter(e=>e.tag===`row`).map(n=>{let r={};for(let i of t){let t=n.attributes[i.name];t!==void 0&&(r[i.name]=GU(t,i.type,i.name,e.attributes.list_delimiter,e.attributes.map_delimiter))}return r})}}function SW(e){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].find(t=>e.attributes[t]!==void 0);return{applyTo:hW(e,`apply_to`),operation:t,value:t?e.attributes[t]:void 0,range:e.attributes.range}}function CW(e,t,n){let r=gW(e,t),i=gW(e,n);return r===void 0||i===void 0?void 0:[r,i]}function wW(e,t={}){return{id:e.id,stackable:e.stackable,weight:e.weight,slot:e.slot,modifiers:e.effects.map(e=>DW(e,t))}}function TW(e,t=1){return{id:e.id,quantity:t,stackable:e.stackable,weight:e.weight}}function EW(e,t,n={}){return ML(e,t.map(e=>DW(e,n)))}function DW(e,t={}){let n=e.operation;if(n!==`add`&&n!==`sub`&&n!==`multiply`&&n!==`divide`&&n!==`set`)throw Error(`MWL effect operation "${n??``}" is not a StatBlock modifier`);let r=e.value;if(r===void 0)throw Error(`MWL effect has no value`);let i=$H(r,t);return{stat:e.applyTo,op:n===`sub`?`add`:n===`divide`?`multiply`:n,value:n===`sub`?-i:n===`divide`?1/i:i}}function OW(e,t={}){let n=[],r=new Map,i=tU(e.roots);for(let e of i){let i=e.attributes.id;if(i){let a=`${t.rowIdScope===`file`?e.location?.file??`<mwl>`:``}\0${e.tag}:${i}`,o=r.get(a);o?n.push(AW(`MWL_DUPLICATE_ID`,`duplicate ${e.tag} id "${i}"`,e.location??o.location)):r.set(a,e)}if(e.tag===`item`&&t.slots&&e.attributes.slot&&!t.slots.includes(e.attributes.slot)&&n.push(AW(`MWL_UNKNOWN_SLOT`,`unknown equipment slot "${e.attributes.slot}"`,e.location)),e.tag===`effect`){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].filter(t=>e.attributes[t]!==void 0);(!e.attributes.apply_to||t.length!==1)&&n.push(AW(`MWL_INCOMPLETE_EFFECT`,`an effect needs apply_to and exactly one operation`,e.location))}MW(e,t.mapBounds,n)}kW(i,n);let a=uW(e,[`hook`,`migration`,...t.hookAttributes??[]]),o=new Map;for(let e of t.hooks??[])o.set(typeof e==`string`?e:e.id,typeof e==`string`?{id:e}:e);for(let e of i){let t=e.attributes.hook??(e.tag===`hook`?e.attributes.name:void 0);t!==void 0&&!lW(t)&&n.push(AW(`MWL_INVALID_HOOK`,`invalid hook reference "${t}"`,e.location));let r=e.tag===`hook`&&e.attributes.name?o.get(e.attributes.name):void 0;r&&n.push(...dW(e,r))}if(t.hooks)for(let e of a)o.has(`${e.type}:${e.name}`)||n.push(AW(`MWL_UNKNOWN_HOOK`,`hook ${e.type}:${e.name} is not declared by the game`,e.location));return n}function kW(e,t){let n=new Map;for(let t of e){let e=t.attributes.id;e&&n.set(`${t.tag}\0${e}`,t)}let r=new Set,i=new Set,a=new Set,o=(e,s)=>{if(r.has(e)){let n=s.indexOf(e),r=s.slice(n).map(e=>`${e.tag}:${e.attributes.id??`<anonymous>`}`).sort().join(`|`);if(a.has(r))return;a.add(r),t.push({code:`MWL_ALIAS_CYCLE`,message:`alias cycle through ${s.slice(n).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.valueLocations?.aliasof??e.attributeLocations?.aliasof??e.location??jW()});return}if(!i.has(e)){r.add(e);for(let t of(e.attributes.aliasof??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let r=n.get(`${e.tag}\0${t}`);r&&o(r,[...s,e])}r.delete(e),i.add(e)}};for(let t of e)t.attributes.aliasof!==void 0&&o(t,[])}function AW(e,t,n){return{code:e,message:t,location:n??jW()}}function jW(){return{file:`<mwl>`,line:1,column:1}}function MW(e,t,n){if(t)for(let r of[`x`,`y`]){let i=e.attributes[r];if(i===void 0)continue;let a=r===`x`?t.width:t.height;if(!Number.isInteger(a)||a<=0)continue;let o=i.split(`,`).flatMap(e=>{let t=e.trim(),n=/^(-?\d+)\s*-\s*(-?\d+)$/.exec(t);return n?[Number(n[1]),Number(n[2])]:/^-?\d+$/.test(t)?[Number(t)]:[]});o.length>0&&o.some(e=>e<0||e>=a)&&n.push({code:`MWL_COORDINATE`,message:`${r} coordinate is outside the ${a}-cell map bound`,location:e.valueLocations?.[r]??e.attributeLocations?.[r]??e.location??{file:`<mwl>`,line:1,column:1}})}}function NW(e,t={}){return OW({schema:`0.1`,roots:e,assets:[],messages:[]},t)}function PW(e,t={}){try{let n=ZU(e,t),r=FW(n),i=[];for(let e of r.opaqueTags)i.push({severity:`warning`,code:`opaque-tag`,message:`ignored opaque tag: ${e}`});for(let e of r.danglingReferences)i.push({severity:`error`,code:`dangling-reference`,message:`dangling content reference: ${e}`});return{game:n,resources:[...n.assets],dependencies:[...r.references],ignored:[...r.opaqueTags],diagnostics:i}}catch(e){return{resources:[],dependencies:[],ignored:[],diagnostics:[{severity:`error`,code:`compile`,message:String(e)}]}}}function FW(e){let t=tU(e.roots),n={},r=new Set;for(let e of t)n[e.tag]=(n[e.tag]??0)+1,e.attributes.id&&r.add(e.attributes.id);let i=new Set(Object.keys(VU)),a=t.filter(e=>!i.has(e.tag)).map(e=>e.tag).filter((e,t,n)=>n.indexOf(e)===t).sort(),o=new Set;for(let e of t)for(let[t,n]of Object.entries(e.attributes))if(/^(?:ability|item|terrain|unit|unit_type|weapon)(?:_id)?$/.test(t))for(let e of n.split(`,`).map(e=>e.trim()).filter(Boolean))o.add(e);return{tags:Object.fromEntries(Object.entries(n).sort(([e],[t])=>e.localeCompare(t))),opaqueTags:a,references:[...o].sort(),danglingReferences:[...o].filter(e=>!r.has(e)).sort()}}function IW(e,t){let n={},r=[];for(let[i,a]of Object.entries(t)){let t=a.source??i,o=e.attributes[t];if(o===void 0){a.required?r.push(KW(`MWL_REQUIRED_FIELD`,`missing required attribute "${t}"`,e)):a.default!==void 0&&(n[i]=a.default);continue}let s=GW(o,a.type);s===void 0?r.push(KW(`MWL_FIELD_TYPE`,`invalid ${a.type} attribute "${t}": "${o}"`,e)):n[i]=s}return{value:n,diagnostics:r}}function LW(e,t,n){let r=[],i=[];for(let a of e.children){if(a.tag!==t)continue;let e=n(a);r.push(e.value),i.push(...e.diagnostics)}return{value:r,diagnostics:i}}function RW(e,t){let n=new Map;for(let r of e){let e=BW(...VW(r,t.key));if(n.has(e)&&t.duplicate!==`last`)throw Error(`duplicate table key: ${e}`);n.set(e,t.value?t.value(r):r)}return n}function zW(e,t){let n=new Map;for(let r of e){let e=BW(...VW(r,t.key)),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function BW(...e){return JSON.stringify(e)}function VW(e,t){if(typeof t==`function`){let n=t(e);return HW(n)?[...n]:[n]}return UW(t)?t.map(t=>WW(e[t],String(t))):[WW(e[t],String(t))]}function HW(e){return Array.isArray(e)}function UW(e){return Array.isArray(e)}function WW(e,t){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;throw TypeError(`table key column "${t}" must be a string, number, boolean, or null`)}function GW(e,t){if(t===`string`)return e;if(t===`id`)return KU(e)?e:void 0;if(t===`number`)return Number.isFinite(Number(e))?Number(e):void 0;if(t===`integer`)return/^-?\d+$/.test(e)?Number(e):void 0;if(t===`boolean`)return e===`true`||e===`yes`?!0:e===`false`||e===`no`?!1:void 0;let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t===`id-list`?n.every(e=>KU(e))?n:void 0:n.every(e=>Number.isFinite(Number(e)))?n.map(Number):void 0}function KW(e,t,n){return{code:e,message:t,location:n.location??{file:`<mwl>`,line:1,column:1}}}function qW(){return{evaluate(e,t={}){let n={};for(let[e,r]of Object.entries(t)){if(typeof r!=`number`)throw Error(`MWL expression context value must be numeric: ${e}`);n[e]=r}return $H(e,n)},execute(){throw Error(`the expression ScriptHost cannot execute statements`)},call(){throw Error(`the expression ScriptHost cannot call functions`)},dispose(){}}}var JW=l({MWL_DEFAULT_CARRYOVER_PERCENTAGE:()=>80,MWL_SCHEMA_01:()=>`0.1`,MWL_SCHEMA_10:()=>`1.0`,MwlRuntime:()=>gU,MwlSyntaxError:()=>hH,attributeTypeDescription:()=>JU,campaignChain:()=>mW,carryoverIntoScenario:()=>lU,coerceTableValue:()=>GU,collectHookReferences:()=>uW,compile:()=>XU,compileAndEmitSources:()=>oW,compileNodes:()=>QU,compileSources:()=>ZU,composeEffects:()=>EW,contentCatalog:()=>bW,contentReport:()=>FW,createExpressionScriptHost:()=>qW,createWorld:()=>fU,decodeSave:()=>HH,decodeSaveEnvelope:()=>UH,effectToModifier:()=>DW,emitArtifacts:()=>aW,emitHooksDeclaration:()=>pW,emitModule:()=>iW,encodeSave:()=>VH,endLevelCarryover:()=>cU,evaluateCondition:()=>JH,evaluateExpression:()=>$H,execute:()=>_U,extractCatalog:()=>rW,hookTypes:()=>cW,inventoryItem:()=>TW,isGettext:()=>IH,isMwlId:()=>KU,itemDefinition:()=>wW,loadContent:()=>PW,parse:()=>CH,parseExpression:()=>QH,parseHookReference:()=>lW,parseMapFile:()=>zU,parseTableColumns:()=>BU,parseTerrain:()=>pU,parseValue:()=>FH,preprocess:()=>_H,readAttributes:()=>IW,readChildren:()=>LW,readTableIndex:()=>zW,readTableMap:()=>RW,schema01:()=>VU,schema10:()=>HU,sideVisionGroups:()=>yU,tableKey:()=>BW,validAttributeValue:()=>qU,validate:()=>UU,validateCatalog:()=>OW,validateCatalogNodes:()=>NW,validateHookAttributes:()=>dW,validateHookReferences:()=>fW,validateWorld:()=>WH});function YW(e,t){return e.filter(e=>(t.side===void 0||e.side===t.side)&&(t.type===void 0||e.type===t.type)&&(t.role===void 0||e.role===t.role)&&(t.can_recruit===void 0||(e.can_recruit??!1)===t.can_recruit)&&(t.name===void 0||e.name===t.name))}function XW(e,t,n,r){let i=0,a=0,o=1;for(let s of t)s.id!==e.id&&r(s.x,s.y)&&(o++,s.side===e.side?i+=n(s.id):a+=n(s.id));return{own:n(e.id),allies:i,enemies:a,seen:o}}function ZW(e,t,n,r){let i=0,a=0,o=0;for(let s of t)r(s.x,s.y)&&(o++,s.side===e?i+=n(s.id):a+=n(s.id));return{own:0,allies:i,enemies:a,seen:o}}function QW(e,t){return e.own*t.own+e.allies*t.allies+e.enemies*t.enemies}var $W=class e{constructor(e={}){this.values={};for(let[t,n]of Object.entries(e))n!==void 0&&(this.values[t]=n)}has(e){return this.values[e]!==void 0}get(e){return this.values[e]}set(e,t){this.values[e]=t}number(e,t=0){let n=this.values[e];return typeof n==`number`&&Number.isFinite(n)?n:typeof n==`boolean`?+!!n:t}flag(e,t=!1){let n=this.values[e];return typeof n==`boolean`?n:t}list(e){let t=this.values[e];return Array.isArray(t)?t:typeof t==`string`?[t]:[]}names(){return Object.keys(this.values)}with(t){let n=new e(this.values);for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);return n}toJSON(){return{...this.values}}static fromJSON(t){return new e(t)}},eG=class{constructor(e=[],t={}){this.levels=new Map,this.base=new $W(t);for(let t of e){if(this.levels.has(t.id))throw Error(`duplicate difficulty level: ${t.id}`);this.levels.set(t.id,t)}}get ids(){return[...this.levels.keys()]}get(e){return this.levels.get(e)}aspectsFor(e){let t=this.levels.get(e);if(!t)throw Error(`unknown difficulty level: ${e}`);return this.base.with(t.aspects??{})}},tG=class{constructor(){this.byUnit=new Map}set(e){this.byUnit.set(e.unit,{...e})}clear(e){this.byUnit.delete(e)}get(e){return this.byUnit.get(e)}all(){return[...this.byUnit.values()]}get isEmpty(){return this.byUnit.size===0}},nG=class{constructor(e,t=null){this.order=e,this.fallback=t}get length(){return this.order.length}at(e){if(this.order.length===0)return this.fallback;let t=(e%this.order.length+this.order.length)%this.order.length;return this.order[t]}next(e){if(this.order.length===0)return this.fallback;if(e===null)return this.order[0];let t=this.order.indexOf(e);return this.at(t<0?0:t+1)}},rG=class{constructor(e){this.stages=e.stages}decide(e,t){if(e.length===0)return null;for(let n of this.stages){if(n.when&&!n.when(t))continue;let r=n.weigh??iG,i=null;for(let a of e){let e=r(a,t);(!i||e>i.score)&&(i={candidate:a,stage:n.id,score:e})}return i}return null}};function iG(e,t){let n=0;for(let[r,i]of Object.entries(e.factors??{}))r!==`distance`&&(n+=i*t.aspects.number(r,1));let r=e.factors?.distance;return r!==void 0&&(n+=aG(r,t.aspects.number(`keep_away`,0))),n}function aG(e,t){return!(t>0)||e>=t?0:-(t-e)}function oG(e){return e?Math.max(0,e.priority??1):0}var sG=l({AIBudgetExceededError:()=>fG,AICancelledError:()=>dG,Aspects:()=>$W,Difficulty:()=>eG,Goals:()=>tG,HeuristicAI:()=>rG,JavaScriptAI:()=>uG,RecruitmentPattern:()=>nG,alphaBetaSearch:()=>cB,defaultWeigh:()=>iG,goalScore:()=>oG,keepAwayScore:()=>aG,personalScoreView:()=>XW,scoreWith:()=>QW,sideScoreView:()=>ZW,subjectsWhere:()=>YW}),cG=1e4,lG=16,uG=class{constructor(e={}){this.agents=new Map,this.states=new Map,this.options=e,_G(e.maxSteps??cG,`maxSteps`),vG(e.maxMilliseconds??lG,`maxMilliseconds`)}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid AI agent id: ${e.id}`);if(this.agents.has(e.id))throw Error(`AI agent already registered: ${e.id}`);if(!e.behaviors.length)throw Error(`AI agent has no behaviours: ${e.id}`);let t=new Set;for(let n of e.behaviors){if(!n.id||t.has(n.id))throw Error(`duplicate AI behaviour: ${n.id}`);t.add(n.id)}this.agents.set(e.id,e),this.states.set(e.id,{})}decide(e,t){let n=this.agents.get(e);if(!n)throw Error(`unknown AI agent: ${e}`);let r=mG(t.state??this.states.get(e)??{}),i=t.maxSteps??this.options.maxSteps??cG,a=t.maxMilliseconds??this.options.maxMilliseconds??lG;_G(i,`maxSteps`),vG(a,`maxMilliseconds`);let o=0,s=yG(),c=[],l=gG(t.seed??this.options.seed??7173991),u=()=>{if(o++,t.signal?.aborted)throw new dG;if(o>i||yG()-s>a)throw new fG},d={perception:hG(t.perception),state:r,random:()=>(u(),l()),checkpoint:u,emit(e,t){if(!e)throw Error(`AI event name must not be empty`);u(),c.push(t===void 0?{name:e}:{name:e,payload:hG(t)})}},f=null,p,m=`idle`;try{for(let e of n.behaviors)if(u(),!e.when||e.when(d)){p=e.id,f=pG(e.decide(d)),m=f?`action`:`idle`;break}}catch(e){if(e instanceof dG)m=`cancelled`;else if(e instanceof fG)m=`budget-exceeded`;else throw e}let h={agent:e,action:f,state:mG(r),behavior:p,status:m,steps:o,events:c};return this.states.set(e,mG(r)),this.options.onDecision?.(h),h}search(e,t,n){return cB(e,t,n)}exportState(){return{version:1,agents:Object.fromEntries([...this.states].map(([e,t])=>[e,mG(t)]))}}importState(e){if(e.version!==1)throw Error(`unsupported AI state version: ${e.version}`);for(let[t,n]of Object.entries(e.agents)){if(!this.agents.has(t))throw Error(`AI state names unknown agent: ${t}`);this.states.set(t,mG(n))}}dispose(){this.agents.clear(),this.states.clear()}},dG=class extends Error{constructor(){super(`AI decision cancelled`),this.name=`AICancelledError`}},fG=class extends Error{constructor(){super(`AI decision budget exceeded`),this.name=`AIBudgetExceededError`}};function pG(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e)||typeof e.type!=`string`||!e.type)throw Error(`AI action must be an object with a non-empty string type`);return hG(e)}function mG(e){return hG(e)}function hG(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(hG):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,hG(t)]))}function gG(e){if(!Number.isInteger(e))throw TypeError(`AI seed must be an integer`);let t=e>>>0;return()=>(t=Math.imul(t,1664525)+1013904223>>>0,t/4294967296)}function _G(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function vG(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be a non-negative number`)}function yG(){return typeof performance>`u`?Date.now():performance.now()}return wi(),q(),Xa(),Object.defineProperty(e,"AI",{enumerable:!0,get:function(){return sG}}),e.Achievements=Qt,e.ActionJournal=Xt,e.ActorAnimator=xj,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return kR}}),e.AnimatedSprite=xA,e.Animation=yA,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return iH}}),e.BLOB_SHAPES=Cj,e.Bar=CF,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return Rz}}),e.BitmapLabel=tN,e.Blob=Tn,Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return LV}}),e.Button=SF,e.COLOR_BLINDNESS_MATRICES=QA,e.Camera=KA,e.CanonicalState=Mt,e.Checkbox=eF,e.Collection=Gt,e.ColorTransformBatcher=jk,e.Container2D=J,e.DataTable=aF,e.DialogueStage=GF,e.Dropdown=rF,e.EMPTY=rj,e.Easing=En,e.EntityRegistry=Nn,e.FLOATING_TEXT_STACK_GAP=kF,e.FeedbackClient=tn,e.FloatingText=OF,e.FloatingTextStack=NF,e.Game=xk,e.Generator=w,e.Gradient=Xj,e.Grid=pF,e.HALO_ANIMATION=mj,e.Halo=hj,e.HelpScreen=IF,e.HookRegistry=x,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return _P}}),e.IconGrid=dN,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return ye}}),e.Label=_M,e.LayeredSprite=uj,e.LightningArc=fj,e.ListView=uN,e.LoadQueue=Mn,e.LoadingScreen=RF,e.LockstepClient=Lt,e.Logger=y,e.MarkupText=YM,e.MersenneTwister=ge,e.MessageBox=qP,e.Minimap=nj,Object.defineProperty(e,"Mwl",{enumerable:!0,get:function(){return JW}}),e.NO_COLOR_ADD=Vk,e.NewsClient=Ht,e.NewsSeenTracker=Wt,e.NinePatch=rN,e.Node2D=Wj,e.ParticleEmitter=yj,e.Player=qt,e.PlayerInput=_t,e.PlayerStats=Bt,e.PresentationQueue=Pn,e.Projectile=dj,e.RENDERING_DECISIONS=Qj,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return S}}),e.RandomStreams=ve,e.ReactionTable=$t,e.RebindScreen=xF,e.Recorder=Kt,e.Rectangle2D=W,e.Registry=g,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return UA}}),e.RichLabel=AM,Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return jL}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return yz}}),e.RpgmAutotileAtlas=Lj,e.RunHistory=zt,e.SaveSyncClient=Ft,e.SaveSystem=jt,e.Scene=m,e.Scene2D=Sk,e.SceneComponentHost=_,e.SceneStack=h,e.ScreenEffects=bj,e.ScreenReader=aN,e.ScrollBox=uF,e.Session=en,e.Shape2D=Kj,e.Signal=p,Object.defineProperty(e,"Simulation",{enumerable:!0,get:function(){return pH}}),e.Skins=yF,e.Slider=$P,e.Spawner=nn,e.Spinner=nF,e.Sprite2D=Jj,e.SpriteAttachment=pj,e.SpriteSheet=GA,e.StageScript=KF,e.StateRegistry=Nt,e.StatsScreen=LF,e.StatusVisuals=Sj,e.StoryScreen=nI,e.StorySequence=tI,e.SyncGuard=zn,e.TabbedList=fN,e.TelemetryClient=Vt,e.TerrainGraphicsLayer=Zj,e.Text2D=qj,e.TextModel=iF,e.Texture2D=K,e.TileMap=lj,e.TiledSprite=Yj,e.TintedSprite=Hk,e.Toast=PF,e.Tooltip=FF,e.TreeView=cF,e.Tweener=Dn,e.UndoHistory=On,e.VerticalLabel=XP,e.Viewport=XA,e.Window=sN,e.WindowStack=cN,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return LR}}),e.advanceReveal=mM,e.anchorAlign=dF,e.applyAllImageModifiers=cA,e.applyImageModifiers=sA,e.applyTextureModifiers=pA,e.autotileFrames=Oj,e.bitmapLabelStyle=nN,e.blendMatrix=nA,e.blendPixels=gA,e.blobIndex=Dj,e.channelScaleMatrix=tA,e.channelSwapMatrix=rA,e.checkNoControlCharacters=wt,e.checkSize=Ct,e.clamp=Wn,e.colorShiftMatrix=eA,e.completeReveal=hM,e.contrastRatio=HF,e.createCamera=YA,e.createColorBlindnessFilter=$A,e.createLayers=Gj,e.croppedTexture=lA,e.defaultTheme=oM,e.deserializeReplay=Yt,e.detectWebGpu=eM,e.escapeHtml=HM,e.floatingTextAgeAtLeast=DF,e.floatingTextAlpha=TF,e.floatingTextRise=EF,e.floatingTextStackLifePenalty=AF,e.floatingTextStackLift=jF,e.floatingTextStackMoves=MF,e.hexDistance=cn,e.hexLine=un,e.hexNeighbors=sn,e.hexRange=dn,e.hexRotate=zj,e.hexToPixel=fn,e.highContrastTheme=sM,e.imageModifier=Qk,e.importTwee=JF,e.inspectGraphicsCapabilities=$j,e.layoutMarkupLines=zM,e.layoutVertical=YP,e.loadTiledMap=aM,e.markupAccessibilityText=RM,e.markupToHtml=LM,e.maskPixels=hA,e.matchTerrainRule=Vj,e.meetsContrast=UF,e.messageBoxPresenter=zF,e.minimapCellCenter=tj,e.motionDuration=Cn,e.newlyRevealed=ej,e.packColorAdd=Rk,e.packTintAdd=zk,e.paletteRangeMapping=qk,e.parseCSV=Bn,e.parseColorPairs=dA,e.parseImagePath=Zk,e.parseMarkdown=DM,e.parseMarkup=FM,e.parsePaletteLists=fA,e.parseRotateMode=$k,e.pixelToHex=pn,e.positionMarkupLines=VM,e.prefersReducedMotion=yn,e.recolorTexture=Xk,e.rectOf=WA,e.reducedMotion=bn,e.registerColorTransform=Lk,e.relativeLuminance=VF,e.remapPixels=Jk,e.resolveAnchor=fF,e.resolveTerrainGraphics=Hj,e.revealComplete=gM,e.rotatePixels=_A,e.rpgmAutotileFrame=Ij,e.sanitizeInboundText=Tt,e.scramble=vt,e.screenReader=oN,e.scrollOffset=lF,e.serializeReplay=Jt,e.setReducedMotion=xn,e.setTheme=uM,e.sliceSpans=kM,e.sliderFraction=ZP,e.sliderValueAt=QP,e.snapZoom=JA,e.spinValue=tF,e.splitScreenHalves=ZA,e.spriteColorMatrix=iA,e.squareRotate=Rj,e.startReveal=pM,e.stateChecksum=Rn,e.stripMarkdown=OM,e.stripMarkup=IM,e.theme=$,e.themeChanged=lM,e.tileFrame=oj,e.tileFrameIndex=cj,e.tileFrameSheet=sj,e.unscramble=yt,e.validateSchema=Ot,e.version=f,e.watchReducedMotion=Sn,e.weightedFlood=kn,e.withTextureCanvas=Yk,e})({});
|
|
1357
|
+
`+t+`]`}return r.pop(),i=t,c}}}}))}))(),1),gH=class extends Error{constructor(e){super(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`),this.name=`MwlSyntaxError`,this.diagnostic=e}},_H=new Set([`define`,`enddef`,`arg`,`ifdef`,`ifndef`,`else`,`endif`,`include`]);function vH(e,t={}){let n=new Map,r=new Set(t.defines??[]),i=e.split(/\r?\n/),a=[],o=[!0],s=null;for(let e=0;e<i.length;e++){let c=i[e],l=/^\s*#([A-Za-z_][\w-]*)(?:\s+(.*))?$/.exec(c);if(l&&_H.has(l[1])){let i=l[1],u=l[2]?.trim()??``;if(i===`define`){if(!o.at(-1)||s)continue;let n=RH(u);if(n.length===0)throw BH(`MWL_DEFINE`,`macro name is required`,t.file,e,c);s={name:n[0],parameters:n.slice(1),body:[]},r.add(n[0]);continue}if(i===`arg`){s&&u&&s.parameters.push(u.split(/\s+/)[0]);continue}if(i===`enddef`){if(!s)throw BH(`MWL_ENDDEF`,`unexpected #enddef`,t.file,e,c);n.set(s.name,{name:s.name,parameters:s.parameters,body:s.body.join(`
|
|
1358
|
+
`)}),s=null;continue}if(i===`ifdef`||i===`ifndef`){let e=r.has(u);o.push(o.at(-1)===!0&&(i===`ifdef`?e:!e));continue}if(i===`else`){if(o.length<2)throw BH(`MWL_ELSE`,`unexpected #else`,t.file,e,c);o[o.length-1]=o[o.length-2]&&!o.at(-1);continue}if(i===`endif`){if(o.length<2)throw BH(`MWL_ENDIF`,`unexpected #endif`,t.file,e,c);o.pop();continue}if(i===`include`){if(o.at(-1)){let n=t.includes?.[zH(u)];if(n===void 0)throw BH(`MWL_INCLUDE`,`include not supplied: ${u}`,t.file,e,c);a.push(vH(n,t))}continue}}if(s){o.at(-1)&&s.body.push(c);continue}o.at(-1)&&!/^\s*#/.test(c)&&a.push(c)}if(s)throw BH(`MWL_ENDDEF`,`macro ${s.name} is missing #enddef`,t.file,i.length-1,i.at(-1)??``);if(o.length!==1)throw BH(`MWL_ENDIF`,`conditional is missing #endif`,t.file,i.length-1,i.at(-1)??``);return xH(yH(a.join(`
|
|
1359
|
+
`),n,t))}function yH(e,t,n){let r=``,i=0;for(;i<e.length;){let a=CH(e,i);if(a!==i){r+=e.slice(i,a),i=a;continue}let o=e[i];if(o!==`{`){r+=o,i++;continue}let s=e.indexOf(`}`,i+1);if(s<0){r+=o,i++;continue}let c=e.slice(i,s+1),l=RH(e.slice(i+1,s)),u=t.get(l[0]);if(u){let e=u.body;for(let t=0;t<u.parameters.length;t++){let n=u.parameters[t],r=l.find(e=>e.startsWith(`${n}=`)),i=r?r.slice(n.length+1):l[t+1]??``;e=e.replaceAll(`{${n}}`,i)}r+=yH(e,t,n)}else if(n.macroPolicy!==`ignore`&&bH(l[0]))throw VH(`MWL_MACRO`,`unknown macro "${l[0]}"`,e,n.file,i);else r+=c;i=s+1}return r}function bH(e){return e!==void 0&&jH.test(e)}function xH(e){let t=/^_\(\s*("(?:[^"\\]|\\[\s\S])*"|'(?:[^'\\]|\\[\s\S])*')\s*\)/,n=``,r=0;for(;r<e.length;){let i=CH(e,r);if(i!==r){n+=e.slice(r,i),r=i;continue}let a=e[r];if(a===`_`){let i=t.exec(e.slice(r));if(i){n+=`{"$gettext": ${i[1]}}`,r+=i[0].length;continue}}n+=a,r++}return n}function SH(e,t){let n=e[t],r=t+1;for(;r<e.length;){let t=e[r];if(t===`\\`){r+=2;continue}if(t===n)return r+1;if(t===`
|
|
1360
|
+
`)return r;r++}return r}function CH(e,t){let n=e[t];if(n===`"`||n===`'`)return SH(e,t);let r=e[t+1];if(n===`/`&&(r===`/`||r===`*`)){let n=r===`/`?e.indexOf(`
|
|
1361
|
+
`,t):e.indexOf(`*/`,t+2);return n<0?e.length:r===`/`?n:n+2}return t}function wH(e,t=`<mwl>`){let n=xH(e);if(n.trim()===``)return[];let r;try{r=hH.default.parse(n)}catch(e){throw FH(e,n,t)}if(r===void 0)return[];if(!Array.isArray(r))throw new gH({code:`MWL_DOCUMENT`,message:`MWL document must be a top-level array of nodes`,location:{file:t,line:1,column:1},lineText:n.split(/\r?\n/)[0]??``});let i={file:t,sites:MH(n,t),cursor:{index:0},parent:void 0};return TH(r).map(e=>kH(e,i))}function TH(e){let t=[];for(let n of e){let e=EH(n);Array.isArray(e)?t.push(...e):t.push(e)}return t}function EH(e){if(Array.isArray(e))return e.flatMap(e=>EH(e));if(typeof e!=`object`||!e)return e;let t=e;if(typeof t.tag!=`string`){let n=Object.keys(t);if(n.length!==1||!jH.test(n[0]))return e;let r=n[0],i=t[r];return Array.isArray(i)?i.map(e=>DH(r,e)):DH(r,i)}let n={...t},r=[];Array.isArray(t.children)&&r.push(...t.children.flatMap(e=>EH(e)));for(let[e,i]of Object.entries(t)){if(e===`tag`||e===`children`||!jH.test(e)||!OH(i))continue;let t=Array.isArray(i)?i:[i];r.push(...t.map(t=>DH(e,t))),delete n[e]}return r.length&&(n.children=r),n}function DH(e,t){return typeof t!=`object`||!t||Array.isArray(t)?{tag:e,value:t}:EH({tag:e,...t})}function OH(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!(`$gettext`in e)||Array.isArray(e)&&e.every(e=>typeof e==`object`&&!!e&&!Array.isArray(e))}function kH(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw new gH({code:`MWL_TAG`,message:`MWL node must be an object with a tag`,location:t.parent??{file:t.file,line:1,column:1}});let n=e;if(typeof n.tag!=`string`||!jH.test(n.tag))throw new gH({code:`MWL_TAG`,message:`MWL node needs a tag name`,location:t.parent??{file:t.file,line:1,column:1}});let r=n.tag,i=NH(t,r),a=i.location,o=n.children??[];if(!Array.isArray(o))throw new gH({code:`MWL_TAG`,message:`children of [${r}] must be an array`,location:a});let s={},c={},l={},u=[];for(let[e,t]of Object.entries(n)){if(e===`tag`||e===`children`)continue;s[e]=AH(r,e,t,a,u);let n=i.properties?.get(e);n&&(c[e]=n.location,l[e]=n.valueLocation)}let d={...t,parent:a},f={tag:r,attributes:s,children:o.map(e=>kH(e,d)),location:a,gettext:u};return Object.defineProperties(f,{attributeLocations:{value:c,enumerable:!1},valueLocations:{value:l,enumerable:!1}}),f}function AH(e,t,n,r,i){if(!jH.test(t)||t.startsWith(`$`)||t.startsWith(`_`))throw new gH({code:`MWL_ATTRIBUTE`,message:`unknown attribute "${t}" on [${e}]`,location:r});if(typeof n==`string`)return n;if(typeof n==`number`&&Number.isFinite(n))return String(n);if(typeof n==`boolean`)return n?`true`:`false`;if(typeof n==`object`&&n&&!Array.isArray(n)){let e=Object.keys(n),r=n.$gettext;if(e.length===1&&e[0]===`$gettext`&&typeof r==`string`)return i.push(t),r}throw new gH({code:`MWL_ATTRIBUTE`,message:`attribute "${t}" on [${e}] must be a string, number, boolean, or _("...")`,location:r})}var jH=/^[A-Za-z_][\w-]*$/;function MH(e,t){let n=[],r=[];for(let i=0;i<e.length;){let a=CH(e,i);if(a!==i){i=a;continue}let o=e[i];if(o===`{`){let e={start:i,properties:new Map};r.push(e),i++;continue}if(o===`}`){r.pop(),i++;continue}let s=/[A-Za-z_$][\w$-]*/y;s.lastIndex=i;let c=s.exec(e);if(!c){i++;continue}let l=c.index+c[0].length;for(;/\s/.test(e[l]??``);)l++;if(e[l]!==`:`){i=c.index+c[0].length;continue}let u=l+1;for(;/\s/.test(e[u]??``);)u++;let d=r.at(-1);if(d&&(d.properties.set(c[0],{location:PH(e,t,c.index),valueLocation:PH(e,t,u)}),c[0]===`tag`&&(e[u]===`"`||e[u]===`'`))){let r=SH(e,u),i=e.slice(u,r),a;try{a=hH.default.parse(i)}catch{a=void 0}typeof a==`string`&&n.push({tag:a,location:PH(e,t,c.index),properties:d.properties})}i=c.index+c[0].length}return n}function NH(e,t){for(let n=e.cursor.index;n<e.sites.length;n++)if(e.sites[n].tag===t)return e.cursor.index=n+1,e.sites[n];return{tag:t,location:e.parent??{file:e.file,line:1,column:1}}}function PH(e,t,n){let r=1,i=1;for(let t=0;t<n;t++)e[t]===`
|
|
1362
|
+
`?(r++,i=1):i++;return{file:t,line:r,column:i}}function FH(e,t,n){let r=t.split(/\r?\n/),i=e,a=typeof i?.lineNumber==`number`?i.lineNumber:1,o=typeof i?.columnNumber==`number`?i.columnNumber:1,s=e instanceof Error?e.message:String(e);return s.includes(`'_'`)&&(s+=` (write translatable text as _("..."))`),new gH({code:`MWL_SYNTAX`,message:s,location:{file:n,line:Math.max(1,a),column:Math.max(1,o)},lineText:r[Math.max(1,a)-1]})}function IH(e,t,n=e){let r=e.trim(),i=/^_\(\s*([\s\S]*?)\s*\)$/.exec(r),a=i?i[1]:r;if(a.startsWith(`"`)||a.startsWith(`'`)){try{let e=hH.default.parse(a);if(typeof e==`string`)return e}catch{}throw new gH({code:`MWL_STRING`,message:`unterminated string value`,location:t,lineText:n})}if(i)throw new gH({code:`MWL_STRING`,message:`_("...") needs a quoted string`,location:t,lineText:n});return r}function LH(e){return/^_\(\s*["']/.test(e.trim())}function RH(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`&&(r=!r),/\s/.test(a)&&!r?(n&&t.push(n),n=``):n+=a}return n&&t.push(n),t}function zH(e){return e.startsWith(`"`)&&e.endsWith(`"`)?e.slice(1,-1):e}function BH(e,t,n,r,i){return new gH({code:e,message:t,location:{file:n??`<mwl>`,line:r+1,column:1},lineText:i})}function VH(e,t,n,r,i){let a=PH(n,r??`<mwl>`,i);return new gH({code:e,message:t,location:a,lineText:n.split(/\r?\n/)[a.line-1]})}function HH(e,t,n,r){if(!Number.isInteger(t.version)||t.version<1)throw Error(`MWL save version must be a positive integer`);let i={format:`mwl-save`,version:t.version,world:e,...n===void 0?{}:{hookState:qH(n)},...r===void 0?{}:{journal:JH(r)}};return JSON.stringify(i)}function UH(e,t){return WH(e,t).world}function WH(e,t){let n=JSON.parse(e),r=KH(n)?n:{format:`mwl-save`,version:1,world:n};if(r.version>t.version)throw Error(`MWL save version ${r.version} is newer than supported version ${t.version}`);let i=GH(r.world);for(let e=r.version;e<t.version;e++){let n=t.migrations?.[e+1];if(!n)throw Error(`missing MWL save migration to version ${e+1}`);i=GH(n(i))}return{format:`mwl-save`,version:t.version,world:i,...r.hookState===void 0?{}:{hookState:qH(r.hookState)},...r.journal===void 0?{}:{journal:JH(r.journal)}}}function GH(e){if(!e||typeof e!=`object`)throw Error(`invalid MWL saved world`);Dt(e);let t=e;if(!Number.isInteger(t.turn)||!t.variables||typeof t.variables!=`object`||!t.units||typeof t.units!=`object`)throw Error(`invalid MWL saved world: turn, variables, and units are required`);if(t.status!==void 0&&![`playing`,`won`,`lost`].includes(t.status))throw Error(`invalid MWL saved world status`);return structuredClone(t)}function KH(e){return!!e&&typeof e==`object`&&e.format===`mwl-save`&&typeof e.version==`number`&&`world`in e}function qH(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`invalid MWL hook state`);Dt(e);let t;try{t=JSON.stringify(e)}catch{throw Error(`MWL hook state must be JSON-serialisable`)}let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`invalid MWL hook state`);return n}function JH(e){try{let t=JSON.stringify(e),n=JSON.parse(t);if(!Array.isArray(n))throw Error();return Dt(n),n}catch{throw Error(`MWL journal must be JSON-serialisable`)}}function YH(e,t,n={}){let r=e.search(/\s+where\s+/),i=r<0?e:e.slice(0,r),a={...t};if(r>=0)for(let t of e.slice(r).replace(/^\s+where\s+/,``).split(`,`)){let e=/^\s*([A-Za-z_][A-Za-z0-9_.-]*)\s*=\s*(.+)\s*$/.exec(t);if(!e)throw Error(`invalid MWL where binding: ${t}`);let r=new XH(e[2],a,n.helpers??{});if(a[e[1]]=r.parseOr(),!r.atEnd())throw Error(`invalid MWL where binding: ${t}`)}let o=new XH(i,a,n.helpers??{}),s=o.parseOr();if(!o.atEnd())throw Error(`unexpected token in MWL condition: ${o.peek()}`);return QH(s)}var XH=class{constructor(e,t,n){this.index=0,this.tokens=ZH(e),this.context=t,this.helpers=n}parseOr(){let e=this.parseAnd();for(;this.take(`or`);)e=QH(e)||QH(this.parseAnd());return e}parseAnd(){let e=this.parseNot();for(;this.take(`and`);)e=QH(e)&&QH(this.parseNot());return e}parseNot(){return this.take(`not`)?!QH(this.parseNot()):this.parseComparison()}parseComparison(){let e=this.parseAdditive(),t=this.peek();if(![`==`,`~=`,`<`,`<=`,`>`,`>=`].includes(t))return e;this.index++;let n=this.parseAdditive();if(t===`==`)return e===n;if(t===`~=`)return e!==n;if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);return t===`<`?e<n:t===`<=`?e<=n:t===`>`?e>n:e>=n}parseAdditive(){let e=this.parseMultiplicative();for(;this.peek()===`+`||this.peek()===`-`;){let t=this.tokens[this.index++],n=this.parseMultiplicative();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);e=t===`+`?e+n:e-n}return e}parseMultiplicative(){let e=this.parsePrimary();for(;this.peek()===`*`||this.peek()===`/`;){let t=this.tokens[this.index++],n=this.parsePrimary();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);if(t===`/`&&n===0)throw Error(`division by zero in MWL condition`);e=t===`*`?e*n:e/n}return e}parsePrimary(){if(this.take(`(`)){let e=this.parseOr();return this.expect(`)`),e}let e=this.tokens[this.index++];if(e===void 0)throw Error(`incomplete MWL condition`);if(/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return Number(e);if(e===`true`||e===`yes`)return!0;if(e===`false`||e===`no`)return!1;if(e.startsWith(`"`)||e.startsWith(`'`))return e.slice(1,-1);let t=this.helpers[e];if(t&&this.take(`(`)){let e=[];if(!this.take(`)`)){do e.push(this.parseOr());while(this.take(`,`));this.expect(`)`)}return t(...e)}let n=this.context[e];if(n===void 0)throw Error(`missing MWL condition variable "${e}"`);return n}take(e){return this.peek()===e&&(this.index++,!0)}expect(e){if(!this.take(e))throw Error(`expected "${e}" in MWL condition`)}peek(){return this.tokens[this.index]??`<end>`}atEnd(){return this.index>=this.tokens.length}};function ZH(e){let t=[],n=/\s*(?:("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|([A-Za-z_][A-Za-z0-9_.-]*)|(-?(?:\d+(?:\.\d*)?|\.\d+))|(==|~=|<=|>=|[()+*/,<>-]))/y,r=0;for(;r<e.length;){n.lastIndex=r;let i=n.exec(e);if(!i)throw Error(`invalid MWL condition near "${e.slice(r)}"`);t.push(i[1]??i[2]??i[3]??i[4]),r=n.lastIndex}return t}function QH(e){return e!==!1&&e!==0&&e!==``}function $H(e){let t=new tU(e),n=t.expression();if(t.skip(),!t.atEnd())throw Error(`invalid MWL expression near "${t.rest()}"`);return n}function eU(e,t){let n=typeof e==`string`?$H(e):e;if(n.kind===`number`)return n.value;if(n.kind===`variable`){let e=t[n.name];if(e===void 0||!Number.isFinite(e))throw Error(`missing MWL expression variable "${n.name}"`);return e}let r=eU(n.left,t),i=eU(n.right,t);if(n.op===`+`)return r+i;if(n.op===`-`)return r-i;if(n.op===`*`)return r*i;if(n.op===`/`){if(i===0)throw Error(`division by zero in MWL expression`);return r/i}return r**i}var tU=class{constructor(e){this.index=0,this.source=e}expression(){return this.additive()}additive(){let e=this.multiplicative();for(;;){this.skip();let t=this.peek(`+`)?`+`:this.peek(`-`)?`-`:null;if(!t)return e;this.index++,e={kind:`binary`,op:t,left:e,right:this.multiplicative()}}}multiplicative(){let e=this.power();for(;;){this.skip();let t=this.peek(`*`)?`*`:this.peek(`/`)?`/`:null;if(!t)return e;this.index++,e={kind:`binary`,op:t,left:e,right:this.power()}}}power(){let e=this.primary();return this.skip(),this.peek(`^`)&&(this.index++,e={kind:`binary`,op:`^`,left:e,right:this.power()}),e}primary(){if(this.skip(),this.peek(`(`)){this.index++;let e=this.expression();if(this.skip(),!this.peek(`)`))throw Error(`missing closing parenthesis in MWL expression`);return this.index++,e}let e=/^(?:\d+(?:\.\d*)?|\.\d+)/.exec(this.rest());if(e)return this.index+=e[0].length,{kind:`number`,value:Number(e[0])};let t=/^[A-Za-z_][A-Za-z0-9_.-]*/.exec(this.rest());if(t)return this.index+=t[0].length,{kind:`variable`,name:t[0]};throw Error(`expected number, variable, or parenthesis near "${this.rest()}"`)}peek(e){return this.source[this.index]===e}skip(){for(;/\s/.test(this.source[this.index]??``);)this.index++}atEnd(){return this.index>=this.source.length}rest(){return this.source.slice(this.index)}};function nU(e){let t=[],n=e=>{t.push(e),e.children.forEach(n)};return e.forEach(n),t}function rU(e,t){let n=e.attributes[t];if(!n)throw Error(`MWL ${e.tag} is missing ${t}`);return n}function iU(e,t){let n=e.attributes[t];if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function aU(e,t,n){let r=e.attributes[t];if(r===void 0)return n;let i=Number.parseInt(r,10);return Number.isFinite(i)?i:n}function oU(e,t){return sU(e.attributes[t])}function sU(e){return e===void 0?void 0:e===`true`||e===`yes`}function cU(e,t){return e!==void 0&&t.includes(e)?e:void 0}function lU(e,t,n){let r=n.carryoverPercentage??80,i=t?e.gold[t.id]??e.sides[t.id]?.gold??0:0;return{result:n.result,gold:Math.floor(i*r/100)+(n.bonus??0),add:n.carryoverAdd??!1,recall:t?Object.entries(e.units).filter(([,e])=>e.alive&&e.side===t.id).map(([e])=>e).sort():[],nextScenario:n.nextScenario??null}}function uU(e,t){return e.add?t+e.gold:Math.max(t,e.gold)}var dU=rU,fU=(e,t,n)=>aU(e,t,n)??n;function pU(){return{variables:{},units:{},sides:{},maps:{},gold:{},turn:1,status:`playing`,sideStatus:{},map:null,timeOfDay:``,scheduleIndex:0}}function mU(e){let t=e.split(/\r?\n/).filter(e=>e.trim()!==``).map(e=>e.split(`,`).map(e=>e.trim())),n=t.length,r=t.length?Math.max(...t.map(e=>e.length)):0,i=[],a={};for(let e=0;e<n;e++)for(let n=0;n<r;n++){let r=t[e]?.[n]??`_off^_usr`,o=/^([A-Za-z0-9_][\w.-]*)\s+(\S.*)$/.exec(r);o?(i.push(o[2]),(a[o[1]]??=[]).push({x:n,y:e})):i.push(r)}return{width:r,height:n,codes:i,starts:a}}var hU=/\$\(([^)]*)\)/g,gU=/\$([A-Za-z_][A-Za-z0-9_.]*)/g,_U=class e{constructor(e,t={}){this.journal=new Xt,this.unitTypes=new Map,this.schedule=[],this.pendingDialogue=null,this.dialogueCounter=0,this.traceBatch=null,this.game=e,this.world=t.world??pU(),this.onMessage=t.onMessage,this.resolveMap=t.resolveMap,this.hooks=t.hooks,this.onTrace=t.onTrace,this.persistence=t.persistence??{version:1},this.random=t.random??new w,!t.random&&this.world.random&&this.random.setState(this.world.random),this.loadUnitTypes(),this.loadSchedule(),this.loadInitialContent(),this.loadInitialUnits(),this.loadLeaders(),this.loadScenarioExtras()}run(e){this.recordAction({type:`run`,trigger:e},()=>this.runInternal(e))}runInternal(e){for(let t of this.nodes(`event`))(t.attributes.on??t.attributes.trigger)===e&&this.eventFiltersMatch(t)&&this.claimEvent(t)&&this.executeTracedEvent(t,e);this.checkObjectives()}fireEvent(e){return this.recordAction({type:`fire_event`,id:e},()=>this.fireEventInternal(e))}fireEventInternal(e){let t=this.nodes(`event`).find(t=>t.attributes.id===e);return!t||!this.eventFiltersMatch(t)||!this.claimEvent(t)?!1:(this.executeTracedEvent(t,`fireEvent`),this.checkObjectives(),!0)}fireMoveto(e){this.recordAction({type:`fire_moveto`,unit:e},()=>this.fireMovetoInternal(e))}fireMovetoInternal(e){let t=this.world.units[e];if(t&&t.alive){for(let n of this.nodes(`event`))(n.attributes.on??n.attributes.trigger)===`moveto`&&(n.attributes.x===void 0||RU(n.attributes.x,t.x))&&(n.attributes.y===void 0||RU(n.attributes.y,t.y))&&(n.attributes.unit===void 0||n.attributes.unit===e)&&(n.attributes.side===void 0||n.attributes.side===t.side)&&this.eventFiltersMatch(n)&&this.claimEvent(n)&&this.executeTracedEvent(n,`moveto`);this.checkObjectives()}}claimEvent(e){if(!(e.attributes.once===void 0?e.attributes.on===`moveto`:e.attributes.once!==`false`))return!0;let t=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`,n=this.world.firedEvents??=[];return!n.includes(t)&&(n.push(t),!0)}eventFiltersMatch(e){if(!this.conditionMatches(e)||!this.filterConditionMatches(e))return!1;let t=e.children.find(e=>e.tag===`filter`);return!t||this.filterMatches(t)}executeEvent(e){this.runBlock(this.commandChildren(e))}runBlock(e){for(let t=0;t<e.length;t++){let n=e[t];if(!this.isConsumedElse(e,t)){if(n.tag===`say`){this.showSay(n);continue}if(n.tag===`dialogue`){this.showDialogue(n);continue}this.executeNode(n)}}}isConsumedElse(e,t){let n=e[t-1];return e[t]?.tag===`else`&&n?.tag===`if`&&this.nodeConditionMatches(n)}executeTracedEvent(e,t){let n=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`;this.trace({type:`event`,phase:`claimed`,id:n,trigger:t});try{this.executeEvent(e),this.trace({type:`event`,phase:`completed`,id:n,trigger:t})}catch(e){throw this.trace({type:`error`,message:String(e),event:n}),e}}showDialogue(e){let t=null;for(let n of e.children)n.tag===`message`?(this.showMessage(n.attributes),t={text:n.attributes.text??n.attributes.value??``,...n.attributes.speaker===void 0?{}:{speaker:n.attributes.speaker},...n.attributes.portrait===void 0?{}:{portrait:n.attributes.portrait},...n.attributes.side===void 0||n.attributes.side===``?{}:{side:n.attributes.side}}):n.tag===`say`&&(this.showSay(n),t={text:n.attributes.text??``,speaker:n.attributes.speaker});let n=[];for(let t of e.children){if(t.tag!==`choice`||!t.attributes.text||t.attributes.variable!==void 0&&!AU(this.variableAt(t.attributes.variable),t.attributes.equals))continue;let e=t.children.filter(e=>e.tag===`branch`);if(e.length)for(let r of e)n.push({text:r.attributes.text??t.attributes.text,branch:r.children});else t.attributes.event&&n.push({text:t.attributes.text,event:t.attributes.event})}if(n.length===0)return;this.dialogueCounter+=1;let r=`dialogue-${this.dialogueCounter}`;this.pendingDialogue={id:r,choices:n},this.world.pendingDialogue={id:r,choices:n},this.onMessage?.({text:t?.text??``,...t?.speaker===void 0?{}:{speaker:t.speaker},choices:n,dialogueId:r})}showSay(e){this.onMessage&&this.onMessage({text:e.attributes.text??``,...e.attributes.speaker===void 0?{}:{speaker:e.attributes.speaker}})}answerDialogue(e,t){return this.recordAction({type:`answer_dialogue`,dialogueId:e,choiceIndex:t},()=>this.answerDialogueInternal(e,t))}answerDialogueInternal(e,t){let n=this.pendingDialogue;if(!n||n.id!==e)return!1;let r=n.choices[t];if(!r)return!1;if(this.pendingDialogue=null,delete this.world.pendingDialogue,r.event){let e=this.nodes(`event`).find(e=>e.attributes.id===r.event);if(!e)throw Error(`MWL dialogue choice points at unknown event: ${r.event}`);if(!this.claimEvent(e))return!0;this.executeEvent(e)}else this.runBlock(r.branch??[]);return this.checkObjectives(),!0}evaluate(){return this.checkObjectives(),this.world.status}save(){let e=this.hooks?.saveable,t=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.save()])):void 0;return HH(this.world,this.persistence,t,this.journal.toJSON())}snapshot(){return JSON.stringify(this.world)}restore(e){let t=WH(e,this.persistence),n=t.world;Object.assign(this.world.variables,n.variables),Object.assign(this.world.units,n.units),Object.assign(this.world.sides,n.sides??{}),Object.assign(this.world.maps,n.maps??{}),Object.assign(this.world.gold,n.gold??{}),this.world.turn=n.turn,this.world.status=n.status,this.world.sideStatus={...n.sideStatus??{}},this.world.map=n.map??null,this.world.timeOfDay=n.timeOfDay??this.schedule[0]??``,this.world.scheduleIndex=n.scheduleIndex??0,this.world.random=n.random,this.random.setState(n.random??new w().getState()),this.world.firedEvents=[...n.firedEvents??[]],this.world.villages=n.villages?structuredClone(n.villages):void 0,this.world.clearedShroud=n.clearedShroud?structuredClone(n.clearedShroud):void 0,this.world.roles=n.roles?structuredClone(n.roles):void 0,this.world.objects=n.objects?structuredClone(n.objects):void 0,this.world.story=n.story?structuredClone(n.story):void 0,this.world.pendingDialogue=n.pendingDialogue,this.pendingDialogue=n.pendingDialogue?{id:n.pendingDialogue.id,choices:[...n.pendingDialogue.choices]}:null;let r=n.pendingDialogue?.id.match(/^dialogue-(\d+)$/);r&&(this.dialogueCounter=Math.max(this.dialogueCounter,Number(r[1])));for(let[e,n]of Object.entries(t.hookState??{}))this.hooks?.saveable?.[e]?.restore(n);this.journal.replace(t.journal??[])}recordAction(e,t){let n=this.traceBatch===null;n&&(this.traceBatch=[]);try{let r=t();return n&&this.journal.append(e,this.traceBatch??[]),r}finally{n&&(this.traceBatch=null)}}trace(e){this.traceBatch?.push(e),this.onTrace?.(e)}loadUnitTypes(){for(let e of this.nodes(`unit_type`)){let t=e.attributes.id;t&&this.unitTypes.set(t,{hitpoints:fU(e,`hitpoints`,1),movement:fU(e,`movement`,0)})}}loadSchedule(){this.schedule=this.nodes(`schedule`).flatMap(e=>e.children.filter(e=>e.tag===`time`).map(e=>e.attributes.id).filter(e=>!!e)),this.world.scheduleIndex=0,this.world.timeOfDay=this.schedule[0]??``}loadInitialContent(){for(let e of this.nodes(`side`)){let t={gold:fU(e,`gold`,0),income:fU(e,`income`,0)};e.attributes.leader!==void 0&&(t.leader=e.attributes.leader),e.attributes.controller!==void 0&&(t.controller=e.attributes.controller),e.attributes.recruit!==void 0&&(t.recruit=e.attributes.recruit),e.attributes.team_name!==void 0&&(t.teamName=e.attributes.team_name),e.attributes.user_team_name!==void 0&&(t.userTeamName=e.attributes.user_team_name),e.attributes.share_vision!==void 0&&(t.shareVision=e.attributes.share_vision),e.attributes.flag!==void 0&&(t.flag=e.attributes.flag),e.attributes.village_gold!==void 0&&(t.villageGold=fU(e,`village_gold`,0));for(let n of[`heal`,`fog`,`shroud`,`hidden`]){let r=e.attributes[n];r!==void 0&&(t[n]=r===`yes`||r===`true`)}this.world.sides[dU(e,`id`)]=t}for(let e of this.nodes(`map`)){let t=e.attributes.id??e.attributes.name??`map`;this.world.maps[t]={terrain:e.attributes.terrain??``,file:e.attributes.file},this.world.map||(this.world.map=this.buildMap(t,e))}}topLevelNodes(e){return(this.game.roots.find(e=>e.tag===`game`)?.children??this.game.roots).filter(t=>t.tag===e)}loadScenarioExtras(){for(let e of this.topLevelNodes(`object`)){let t={x:fU(e,`x`,0),y:fU(e,`y`,0)};e.attributes.id!==void 0&&(t.id=e.attributes.id),e.attributes.name!==void 0&&(t.name=e.attributes.name),e.attributes.image!==void 0&&(t.image=e.attributes.image),e.attributes.side!==void 0&&(t.side=e.attributes.side),(this.world.objects??=[]).push(t)}for(let e of this.topLevelNodes(`story`)){let t=e.attributes.text??e.attributes.value;if(t===void 0)continue;let n={text:t};e.attributes.title!==void 0&&(n.title=e.attributes.title),e.attributes.image!==void 0&&(n.image=e.attributes.image),e.attributes.music!==void 0&&(n.music=e.attributes.music),(this.world.story??=[]).push(n)}for(let e of this.topLevelNodes(`role`)){let t=e.attributes.role??e.attributes.name;if(t===void 0)continue;let n=kU(e.attributes,`role`,`name`),r=Object.entries(this.world.units).filter(([e,t])=>t.alive&&OU(t,e,n));for(let[,e]of r)e.role=t;(this.world.roles??={})[t]=r.map(([e])=>e)}}buildMap(e,t){let n=t.attributes.terrain;if(!n&&t.attributes.file&&this.resolveMap&&(n=this.resolveMap(t.attributes.file)),!n)return null;let r=mU(n);for(let e of t.children){if(e.tag!==`start`)continue;let t=e.attributes.side,n=EU(e,`x`),i=EU(e,`y`);t!==void 0&&n!==void 0&&i!==void 0&&(r.starts[t]??=[]).push({x:n,y:i})}return{id:e,...r}}loadInitialUnits(){for(let e of this.nodes(`unit`)){let t=dU(e,`id`),n={hp:fU(e,`hp`,1),x:fU(e,`x`,0),y:fU(e,`y`,0),alive:!0};if(e.attributes.type!==void 0){n.type=e.attributes.type;let t=this.unitTypes.get(e.attributes.type);t&&(n.moves=t.movement)}e.attributes.side!==void 0&&(n.side=e.attributes.side),e.attributes.name!==void 0&&(n.name=e.attributes.name),e.attributes.role!==void 0&&(n.role=e.attributes.role);let r=oU(e,`can_recruit`);r!==void 0&&(n.can_recruit=r),this.world.units[t]=n}}loadLeaders(){for(let e of this.nodes(`side`)){let t=e.attributes.leader;if(!t)continue;let n=e.attributes.id;if(!n)continue;let r=this.world.map?.starts[n];if(!r?.length)continue;let i=this.unitTypes.get(t);for(let e of r){if(this.unitAt(e.x,e.y))continue;let r=`${t} ${n} (${e.x},${e.y})`;this.world.units[r]={hp:i?.hitpoints??1,x:e.x,y:e.y,alive:!0,type:t,side:n,moves:i?.movement??0,can_recruit:!0,leader:!0}}}}unitAt(e,t){return Object.values(this.world.units).find(n=>n.alive&&n.x===e&&n.y===t)}static{this.commandHandlers={message:(e,t)=>e.showMessage(t.attributes),spawn:(e,t)=>e.cmdSpawn(t),move:(e,t)=>e.cmdMove(t),kill:(e,t)=>e.cmdKill(t),fire_event:(e,t)=>e.cmdFireEvent(t),store_unit:(e,t)=>e.cmdStoreUnit(t),unstore_unit:(e,t)=>e.cmdUnstoreUnit(t),recall:(e,t)=>e.cmdRecall(t),modify_unit:(e,t)=>e.cmdModifyUnit(t),heal_unit:(e,t)=>e.cmdHealUnit(t),set_terrain:(e,t)=>e.setTerrain(fU(t,`x`,0),fU(t,`y`,0),dU(t,`terrain`)),capture_village:(e,t)=>e.cmdCaptureVillage(t),clear_shroud:(e,t)=>e.cmdClearShroud(t),role:(e,t)=>e.cmdRole(t),attack:(e,t)=>e.attack(t.attributes.defender??t.attributes.target??dU(t,`target`),fU(t,`amount`,0)),modify_gold:(e,t)=>e.addGold(t.attributes.side??dU(t,`target`),fU(t,`delta`,fU(t,`amount`,0))),gold:(e,t)=>e.addGold(dU(t,`side`),fU(t,`delta`,fU(t,`amount`,0))),set_variable:(e,t)=>e.cmdSetVariable(t),while:(e,t)=>e.cmdWhile(t),foreach:(e,t)=>e.cmdForeach(t),switch:(e,t)=>e.cmdSwitch(t),end_turn:e=>e.endTurn(),win:(e,t)=>e.cmdWin(t),lose:(e,t)=>e.cmdLose(t),endlevel:(e,t)=>e.cmdEndlevel(t),if:(e,t)=>e.cmdIf(t),else:(e,t)=>e.runBlock(e.commandChildren(t)),hook:(e,t)=>e.runHook(t)}}executeNode(t){let n=t.tag===`command`?t.attributes.name:t.tag;if(!n)throw Error(`MWL command is missing name`);let r=e.commandHandlers[n];if(!r)throw Error(`unknown MWL command: ${n}`);r(this,t)}cmdSpawn(e){this.spawnUnit(e.attributes.type??``,e.attributes.side,fU(e,`x`,0),fU(e,`y`,0),e.attributes.id??e.attributes.target,e.attributes.hp===void 0?void 0:fU(e,`hp`,1))}cmdMove(e){this.applyMove(e.attributes.unit??dU(e,`target`),fU(e,`x`,0),fU(e,`y`,0))}cmdKill(e){let t=e.attributes.unit??e.attributes.target;t===void 0?SU(this.world,e.attributes):this.killUnit(t)}cmdFireEvent(e){let t=e.attributes.id??e.attributes.name;if(!t)throw Error(`[fire_event] requires id`);this.fireEvent(t)}cmdStoreUnit(e){let t=e.attributes.variable??e.attributes.name??dU(e,`variable`);this.setVariableAt(t,this.matchingUnits(e,[`variable`,`name`]).map(([e,t])=>({id:e,...CU(t)})))}cmdUnstoreUnit(e){let t=dU(e,`variable`);for(let e of this.storedUnits(t))this.restoreUnit(e,{})}cmdRecall(e){let t=this.storedUnits(dU(e,`variable`)),n=e.attributes.id??e.attributes.unit,r=n===void 0?t[0]:t.find(e=>e.id===n);if(!r)throw Error(`[recall] found no stored unit${n===void 0?``:` named ${n}`}`);let i={};e.attributes.x!==void 0&&(i.x=fU(e,`x`,0)),e.attributes.y!==void 0&&(i.y=fU(e,`y`,0)),e.attributes.side!==void 0&&(i.side=e.attributes.side),this.restoreUnit(r,i)}cmdModifyUnit(e){let t=e.children.find(e=>e.tag===`set`)?.attributes??e.attributes;for(let[,n]of this.matchingUnits(e))wU(n,t)}cmdHealUnit(e){let t=EU(e,`amount`),n=EU(e,`hp`);if(t===void 0&&n===void 0)throw Error(`[heal_unit] requires amount or hp`);for(let[,r]of this.matchingUnits(e))r.hp=n??r.hp+(t??0)}cmdCaptureVillage(e){let t=fU(e,`x`,0),n=fU(e,`y`,0),r={x:t,y:n,side:dU(e,`side`)};e.attributes.name!==void 0&&(r.name=e.attributes.name),(this.world.villages??={})[`${t},${n}`]=r}cmdClearShroud(e){let t=dU(e,`side`),n=fU(e,`x`,0),r=fU(e,`y`,0),i=fU(e,`radius`,1),a=new Set(this.world.clearedShroud?.[t]??[]);for(let e=-i;e<=i;e++)for(let t=-i;t<=i;t++)a.add(`${n+t},${r+e}`);(this.world.clearedShroud??={})[t]=[...a]}cmdRole(e){let t=e.attributes.role??e.attributes.name;if(!t)throw Error(`[role] requires role`);let n=this.matchingUnits(e,[`role`,`name`]);for(let[,e]of n)e.role=t;(this.world.roles??={})[t]=n.map(([e])=>e)}cmdSetVariable(e){let t=e.attributes.path;this.setVariable(t===void 0?e.tag===`command`?dU(e,`target`):dU(e,`name`):this.expandPath(t),e.attributes.value??``,e.attributes.mode)}cmdWhile(e){let t=fU(e,`max_iterations`,1e3);if(t<1||t>1e5)throw Error(`MWL while max_iterations must be between 1 and 100000`);for(let n=0;n<t&&this.nodeConditionMatches(e);n++)this.runBlock(this.commandChildren(e))}cmdForeach(e){let t=this.variableAt(dU(e,`variable`)),n=Array.isArray(t)?t.map((e,t)=>[String(t),e]):typeof t==`string`?t.split(`,`).map((e,t)=>[String(t),e.trim()]).filter(([,e])=>e!==``):t&&typeof t==`object`?Object.entries(t):[],r=e.attributes.item??`item`,i=e.attributes.index??`index`;for(let t=0;t<n.length;t++)this.setVariableAt(r,n[t][1]),this.setVariableAt(i,t),this.runBlock(this.commandChildren(e))}cmdSwitch(e){let t=this.variableAt(dU(e,`variable`)),n=e.children.find(e=>e.tag===`case`&&e.attributes.equals!==void 0&&AU(t,e.attributes.equals)),r=e.children.find(e=>e.tag==="default");this.runBlock((n??r)?.children??[])}cmdWin(e){this.markSideResult(e.attributes.side,`won`),this.world.status=`won`}cmdLose(e){this.markSideResult(e.attributes.side,`lost`),this.world.status=`lost`}cmdEndlevel(e){let t=e.attributes.result===`defeat`?`defeat`:`victory`;this.world.status=t===`defeat`?`lost`:`won`,this.world.carryover=lU(this.world,yU(this.world,e.attributes.side),{result:t,bonus:aU(e,`bonus`),carryoverPercentage:iU(e,`carryover_percentage`),carryoverAdd:oU(e,`carryover_add`),nextScenario:e.attributes.next_scenario??null})}cmdIf(e){let t=e.children.find(e=>e.tag===`else`),n=this.nodeConditionMatches(e)?e:t;this.runBlock(n?this.commandChildren(n):[])}commandChildren(e){return e.children.filter(e=>e.tag!==`condition`&&e.tag!==`filter`&&e.tag!==`filter_condition`)}runHook(e){let t=e.attributes.name??``,n=this.hooks?.command?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{name:r,...i}=e.attributes;n(this.worldView(),this.emit(),i)}applyMove(e,t,n){let r=this.world.units[e];if(!r||!r.alive)throw Error(`MWL unit is not alive: ${e}`);let i=this.world.map??null;if(i){if(t<0||n<0||t>=i.width||n>=i.height)throw Error(`MWL move out of bounds: ${t},${n}`);let e=this.unitAt(t,n);if(e&&e!==r)throw Error(`MWL move onto an occupied cell: ${t},${n}`)}if(typeof r.moves==`number`){if(r.moves<=0)throw Error(`MWL unit has no moves left: ${e}`);--r.moves}r.x=t,r.y=n,this.fireMoveto(e)}showMessage(e){if(!this.onMessage)return;let t={text:this.interpolate(e.text??e.value??``),...e.speaker===void 0?{}:{speaker:e.speaker},...e.portrait===void 0?{}:{portrait:e.portrait},...e.side===void 0||e.side===``?{}:{side:e.side}};this.onMessage(t)}interpolate(e){let t=this.numericVariables();return e.replace(hU,(e,n)=>{try{return String(eU(n,t))}catch{return``}}).replace(gU,(e,t)=>{let n=this.variableAt(t);return n===void 0||typeof n==`boolean`?``:String(n)})}expandPath(e){return e.replace(hU,(e,t)=>String(eU(t,this.numericVariables()))).replace(gU,(e,t)=>{let n=this.variableAt(t);if(n===void 0)throw Error(`MWL variable path reference "$${t}" names no variable`);if(typeof n==`boolean`||typeof n==`object`)throw Error(`MWL variable path reference "$${t}" is not a name or number`);return String(n)})}setVariable(e,t,n){if(n===`literal`){this.setVariableAt(e,t);return}if(n===`number`){let n=Number(t);if(t.trim()===``||!Number.isFinite(n))throw Error(`MWL set_variable mode="number" needs a number, got "${t}"`);this.setVariableAt(e,n);return}if(n===`expression`){this.setVariableAt(e,eU(t,this.numericVariables()));return}if(n!==void 0)throw Error(`unknown MWL set_variable mode "${n}"`);let r=Number(t);if(t.trim()!==``&&Number.isFinite(r)){this.setVariableAt(e,r);return}let i=/^\$([A-Za-z_][A-Za-z0-9_.]*)$/.exec(t.trim());if(i){let t=this.variableAt(i[1]);this.setVariableAt(e,t===void 0?``:t);return}let a=this.numericVariables();if(/[+*/^()]|\s-\s/.test(t)||Object.prototype.hasOwnProperty.call(a,t.trim())){this.setVariableAt(e,eU(t,a));return}this.setVariableAt(e,t)}numericVariables(){return Object.fromEntries(Object.entries(this.world.variables).filter(e=>typeof e[1]==`number`))}variableAt(e){return IU(this.world.variables,e)}setVariableAt(e,t){let n=this.variableAt(e);FU(this.world.variables,e,t),this.trace({type:`variable`,name:e,...n===void 0?{}:{previous:n},value:t})}spawnUnit(e,t,n,r,i,a){let o=e?this.unitTypes.get(e):void 0,s=i??`${e||`unit`}#${t??``}@${n},${r}`;this.world.units[s]={hp:a??o?.hitpoints??1,x:n,y:r,alive:!0,...e?{type:e}:{},...t===void 0?{}:{side:t},...o?{moves:o.movement}:{}}}killUnit(e){let t=this.world.units[e];if(!t||!t.alive)throw Error(`MWL unit is not alive: ${e}`);t.alive=!1}matchingUnits(e,t=[]){let n=e.children.find(e=>e.tag===`filter`),r=n?n.attributes:kU(e.attributes,...t);return Object.entries(this.world.units).filter(([e,t])=>t.alive&&OU(t,e,r))}storedUnits(e){let t=this.variableAt(e);if(!Array.isArray(t))throw Error(`MWL variable ${e} is not a stored unit list; store one first`);return t.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e))}restoreUnit(e,t){let n=typeof e.id==`string`?e.id:void 0;if(!n)throw Error(`a stored unit snapshot is missing its id`);let r={hp:typeof e.hp==`number`?e.hp:1,x:t.x??(typeof e.x==`number`?e.x:0),y:t.y??(typeof e.y==`number`?e.y:0),alive:e.alive!==!1};typeof e.type==`string`&&(r.type=e.type);let i=t.side??(typeof e.side==`string`?e.side:void 0);i!==void 0&&(r.side=i),typeof e.moves==`number`&&(r.moves=e.moves),typeof e.name==`string`&&(r.name=e.name),typeof e.role==`string`&&(r.role=e.role),typeof e.can_recruit==`boolean`&&(r.can_recruit=e.can_recruit),typeof e.leader==`boolean`&&(r.leader=e.leader),this.world.units[n]=r}setTerrain(e,t,n){let r=this.world.map;if(!r)throw Error(`[set_terrain] needs a loaded map`);if(e<0||t<0||e>=r.width||t>=r.height)throw Error(`[set_terrain] is outside the map: ${e},${t}`);let i=[...r.codes];i[t*r.width+e]=n,this.world.map={...r,codes:i}}addGold(e,t){this.world.gold[e]=(this.world.gold[e]??0)+t}endTurn(){this.world.turn+=1,this.advanceSchedule(),this.resetMoves(),this.run(`turn`),this.checkTimeOver()}checkTimeOver(){let e=aU(this.game.roots[0],`turn_limit`);e===void 0||this.world.turn<=e||this.world.variables.time_over===`yes`||(this.world.variables.time_over=`yes`,this.run(`time_over`))}advanceSchedule(){if(!this.schedule.length)return;let e=((this.world.scheduleIndex??0)+1)%this.schedule.length;this.world.scheduleIndex=e,this.world.timeOfDay=this.schedule[e]}resetMoves(){for(let e of Object.values(this.world.units)){if(!e.alive)continue;let t=e.type?this.unitTypes.get(e.type):void 0;t&&(e.moves=t.movement)}}filterMatches(e){return Object.entries(this.world.units).some(([t,n])=>n.alive&&OU(n,t,e.attributes))}conditionMatches(e){return e.children.filter(e=>e.tag===`condition`).every(e=>{if(e.attributes.condition===`hook`){let t=e.attributes.hook,n=t?.startsWith(`predicate:`)?t.slice(10):void 0,r=n?this.hooks?.predicate?.[n]:void 0;if(!r)throw Error(`MWL predicate ${n??`<missing>`} is not implemented`);let{condition:i,hook:a,...o}=e.attributes;return!!r(this.worldView(),o)}return DU(this.variableAt(e.attributes.variable),e.attributes,LU(this.world.variables))})}nodeConditionMatches(e){return e.attributes.test===void 0?this.conditionMatches(e):YH(e.attributes.test,jU(this.world.variables))}filterConditionMatches(e){let t=e.children.find(e=>e.tag===`filter_condition`);return!t||t.children.every(e=>{if(e.tag===`variable`){let t=e.attributes.name;return t!==void 0&&DU(this.variableAt(t),e.attributes,LU(this.world.variables))}if(e.tag===`predicate`){let t=e.attributes.name,n=t?this.hooks?.predicate?.[t]:void 0;if(!n)throw Error(`MWL predicate ${t??`<missing>`} is not implemented`);let{name:r,...i}=e.attributes;return!!n(this.worldView(),i)}return e.tag!==`have_unit`||Object.entries(this.world.units).some(([t,n])=>n.alive&&(e.attributes.id===void 0||t===e.attributes.id)&&OU(n,t,e.attributes))})}conditionMet(e,t){let n=e.attributes.condition??``,r=e.attributes.side??t;switch(n){case`units_dead`:{let t=e.attributes.side_filter??r;return t!==void 0&&!Object.values(this.world.units).some(e=>e.alive&&e.side===t)}case`turns_elapsed`:{let t=EU(e,`turns`);return t!==void 0&&this.world.turn>=t}case`gold_at_least`:{let n=EU(e,`gold`),r=e.attributes.side??t;return n!==void 0&&r!==void 0&&(this.world.gold[r]??0)>=n}case`unit_at`:{let t=EU(e,`x`),n=EU(e,`y`),i=e.attributes.side_filter??r;return Object.values(this.world.units).some(r=>r.alive&&(i===void 0||r.side===i)&&(e.attributes.type===void 0||r.type===e.attributes.type)&&r.x===t&&r.y===n)}case`hook`:{let t=e.attributes.hook??``,n=this.hooks?.predicate?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{hook:r,condition:i,...a}=e.attributes;return!!n(this.worldView(),a)}default:return!1}}checkObjectives(){if(this.world.status!==`playing`)return;let e=new Set,t=this.nodes(`side`);for(let n of t)for(let t of n.children)(t.tag===`victory`||t.tag===`defeat`)&&e.add(t);if(this.nodes(`victory`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`won`;return}if(this.nodes(`defeat`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`lost`;return}let n=!1,r=!1;for(let e of t){let t=e.attributes.id;t&&(this.world.sideStatus?.[t]??`playing`)===`playing`&&(e.children.some(e=>e.tag===`victory`&&this.conditionMet(e,t))?(this.markSideResult(t,`won`),n=!0):e.children.some(e=>e.tag===`defeat`&&this.conditionMet(e,t))&&(this.markSideResult(t,`lost`),r=!0))}n?this.world.status=`won`:r&&(this.world.status=`lost`)}markSideResult(e,t){e!==void 0&&e!==``&&((this.world.sideStatus??={})[e]=t)}worldView(){return{variables:this.world.variables,variableAt:e=>this.variableAt(e),units:this.world.units,sides:this.world.sides,turn:this.world.turn,random:{float:()=>this.drawRandom(e=>e.float()),int:e=>this.drawRandom(t=>t.int(e))}}}drawRandom(e){let t=e(this.random);return this.world.random=this.random.getState(),t}emit(){return{move:(e,t,n)=>this.applyMove(e,t,n),attack:(e,t,n)=>{throw Error(`MWL hook attack is not available in the framework runtime; the engine adapter owns combat`)},spawn:(e,t,n,r)=>this.spawnUnit(e,t,n,r),kill:e=>this.killUnit(e),gold:(e,t)=>this.addGold(e,t),setVariable:(e,t)=>{FU(this.world.variables,e,t)},message:(e,t)=>this.onMessage?.({text:t,...e?{speaker:e}:{}}),endTurn:()=>this.endTurn(),win:e=>{this.markSideResult(e,`won`),this.world.status=`won`},lose:e=>{this.markSideResult(e,`lost`),this.world.status=`lost`}}}attack(e,t){let n=this.world.units[e];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${e}`);n.hp=Math.max(0,n.hp-t),n.hp===0&&(n.alive=!1)}nodes(e){let t=[],n=r=>{r.tag===e&&t.push(r),r.children.forEach(n)};return this.game.roots.forEach(n),t}};function vU(e,t){if(e.status===`playing`||t.name===`win`||t.name===`lose`)switch(t.name){case`set_variable`:FU(e.variables,t.target,t.value);break;case`modify_gold`:e.gold[t.target]=(e.gold[t.target]??0)+t.amount;break;case`move`:{let n=xU(e,t.target);n.x=t.x,n.y=t.y;break}case`spawn`:e.units[t.target]={hp:t.hp,x:t.x,y:t.y,alive:!0};break;case`kill`:t.target===void 0?SU(e,t.filter??{}):xU(e,t.target).alive=!1;break;case`end_turn`:e.turn++;break;case`win`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`won`),e.status=`won`;break;case`lose`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`lost`),e.status=`lost`;break;case`endlevel`:e.status=t.result===`defeat`?`lost`:`won`,e.carryover=lU(e,t.side??null,t)}}function yU(e,t){let n=t??Object.entries(e.sides).find(([,e])=>e.controller===`human`)?.[0];return!n||!(n in e.sides)?null:{id:n}}function bU(e){let t=new Map;for(let[n,r]of Object.entries(e.sides)){if(!r.teamName||r.shareVision===`none`)continue;let e=t.get(r.teamName);e?e.push(n):t.set(r.teamName,[n])}return[...t.values()].filter(e=>e.length>1)}function xU(e,t){let n=e.units[t];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${t}`);return n}function SU(e,t){let n=0;for(let[r,i]of Object.entries(e.units))i.alive&&OU(i,r,t)&&(i.alive=!1,n++);return n}function CU(e){let t={hp:e.hp,x:e.x,y:e.y,alive:e.alive};return e.type!==void 0&&(t.type=e.type),e.side!==void 0&&(t.side=e.side),e.moves!==void 0&&(t.moves=e.moves),e.name!==void 0&&(t.name=e.name),e.role!==void 0&&(t.role=e.role),e.can_recruit!==void 0&&(t.can_recruit=e.can_recruit),e.leader!==void 0&&(t.leader=e.leader),t}function wU(e,t){let n=TU(t.hp);n!==void 0&&(e.hp=n);let r=TU(t.moves);r!==void 0&&(e.moves=r),t.type!==void 0&&(e.type=t.type),t.side!==void 0&&(e.side=t.side);let i=sU(t.alive);i!==void 0&&(e.alive=i),t.name!==void 0&&(e.name=t.name),t.role!==void 0&&(e.role=t.role);let a=sU(t.can_recruit);a!==void 0&&(e.can_recruit=a)}function TU(e){if(e===void 0||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function EU(e,t){let n=e.attributes[t];if(n===void 0||n===``)return;let r=Number.parseInt(n,10);return Number.isFinite(r)?r:void 0}function DU(e,t,n){let r=e=>{if(!e.startsWith(`$`))return e;let t=n(e.slice(1));return typeof t==`string`||typeof t==`number`||typeof t==`boolean`?t:void 0};if(t.equals!==void 0)return AU(e,r(t.equals));if(t.not_equals!==void 0)return!AU(e,r(t.not_equals));if(t.in!==void 0)return t.in.split(`,`).map(e=>e.trim()).some(t=>AU(e,t));if(t.not_in!==void 0)return!t.not_in.split(`,`).map(e=>e.trim()).some(t=>AU(e,t));let i=typeof e==`number`?e:Number(e),a=e=>Number(t[e]);return t.less_than!==void 0||t.greater_than!==void 0||t.less_than_or_equal_to!==void 0||t.greater_than_or_equal_to!==void 0?!(typeof e==`boolean`||!Number.isFinite(i)||t.less_than!==void 0&&!(i<a(`less_than`))||t.greater_than!==void 0&&!(i>a(`greater_than`))||t.less_than_or_equal_to!==void 0&&!(i<=a(`less_than_or_equal_to`))||t.greater_than_or_equal_to!==void 0&&!(i>=a(`greater_than_or_equal_to`))):e!==void 0}function OU(e,t,n){let r=(n.not_type??``).split(`,`).map(e=>e.trim()).filter(Boolean),i=sU(n.can_recruit),a=sU(n.leader),o=n.unit??n.id;return(o===void 0||t===o)&&(n.side===void 0||e.side===n.side)&&(n.type===void 0||e.type===n.type)&&(r.length===0||!r.includes(e.type??``))&&(n.name===void 0||e.name===n.name)&&(n.role===void 0||e.role===n.role)&&(i===void 0||(e.can_recruit??!1)===i)&&(a===void 0||(e.leader??!1)===a)&&(n.x===void 0||RU(n.x,e.x))&&(n.y===void 0||RU(n.y,e.y))}function kU(e,...t){if(t.length===0)return{...e};let n={...e};for(let e of t)delete n[e];return n}function AU(e,t){if(e===void 0||t===void 0||typeof t!=`string`)return e===t;let n=Number(t);return typeof e==`number`&&t.trim()!==``&&Number.isFinite(n)?e===n:e===t}function jU(e){return Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`||typeof e[1]==`number`||typeof e[1]==`boolean`))}function MU(e){return e.split(`.`).flatMap(e=>{let t=/^([^[\]]*)((?:\[[^\]]*\])*)$/.exec(e);if(!t)return[e];let n=t[1]===``?[]:[t[1]];for(let e of t[2].matchAll(/\[([^\]]*)\]/g)){let t=Number(e[1]);n.push({index:/^\d+$/.test(e[1].trim())?t:void 0})}return n}).filter(e=>typeof e!=`string`||e!==``)}function NU(e){let t=MU(e);if(t.some(e=>typeof e!=`string`&&e.index===void 0))throw Error(`invalid variable path: ${e}`);return t}function PU(e){return typeof e!=`string`}function FU(e,t,n){let r=NU(t),i=e=>typeof e==`string`?e:e.index,a=e;for(let e=0;e<r.length-1;e++){let t=i(r[e]),n=a[t];(!n||typeof n!=`object`)&&(a[t]=PU(r[e+1])?[]:{}),a=a[t]}a[i(r[r.length-1])]=n}function IU(e,t){let n=e;for(let e of MU(t))if(typeof e==`string`){if(!n||typeof n!=`object`||Array.isArray(n))return;n=n[e]}else{if(!Array.isArray(n)||e.index===void 0)return;n=n[e.index]}return n}function LU(e){return t=>IU(e,t)}function RU(e,t){return e.split(`,`).some(e=>{let n=e.trim(),r=n.match(/^(-?\d+)\s*-\s*(-?\d+)$/);if(r){let e=Number(r[1]),n=Number(r[2]);return t>=Math.min(e,n)&&t<=Math.max(e,n)}return/^-?\d+$/.test(n)&&Number(n)===t})}var zU=/^\s*([A-Za-z_][\w]*)\s*=\s*(.*?)\s*$/;function BU(e){let t=e.split(/\r?\n/),n={},r=0;for(;r<t.length;r++){let e=t[r];if(e.trim()===``)continue;let i=zU.exec(e);if(!i)break;n[i[1]]=i[2]}return{header:n,...mU(t.slice(r).map(e=>e.replace(/[,\s]+$/,``)).join(`
|
|
1363
|
+
`))}}function VU(e){let t=[];for(let n of e.split(`|`)){let e=n.indexOf(`:`);if(e<=0||e===n.length-1)throw Error(`invalid table column "${n}"`);let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();if(!/^[A-Za-z_][\w.-]*$/.test(r))throw Error(`invalid table column name "${r}"`);if(![`string`,`number`,`boolean`,`list`,`map`].includes(i))throw Error(`invalid table column type "${i}"`);if(t.some(e=>e.name===r))throw Error(`duplicate table column "${r}"`);t.push({name:r,type:i})}if(t.length===0)throw Error(`table must declare at least one column`);return t}var HU={game:{attributes:{schema:`string`,title:`string`,data_root:`string`,start_scene:`id`,default_schedule:`id`,save_slot:`string`,turn_limit:`integer`},children:`campaign.terrain_type.movetype.unit_type.unit.side.map.schedule.event.objectives.trait.weapon_special.dialogue.save.item.inventory.monster.status.loot.turn_clock.battle_move.type_matchup.evolution.table.object.story.role`.split(`.`)},campaign:{attributes:{id:`id`,name:`string`,title:`string`,description:`string`,start_scene:`id`,first_scenario:`id`},openChildren:!0},table:{attributes:{id:`id`,columns:`string`,list_delimiter:`string`,map_delimiter:`string`},children:[`row`]},row:{openAttributes:`string`},terrain_type:{attributes:{id:`id`,string:`string`,aliasof:`string`,mvt_alias:`string`,default_base:`string`,heals:`integer`,gives_income:`boolean`,map_code:`string`,base_tile:`string`,overlay_tile:`string`,defense:`number`,healing:`number`}},movetype:{attributes:{id:`id`,name:`string`},children:[`movement_costs`,`defense`,`resistance`]},movement_costs:{openAttributes:`number`},defense:{openAttributes:`number`},resistance:{openAttributes:`number`},unit_type:{attributes:{id:`string`,name:`string`,description:`string`,image:`string`,image_icon:`string`,profile:`string`,sound:`string`,hitpoints:`integer`,movement:`integer`,movement_type:`id`,movetype:`id`,experience:`integer`,level:`integer`,alignment:`id`,cost:`integer`,advances_to:`string`,race:`id`,usage:`id`},children:[`attack`,`trait`,`ability`]},unit:{attributes:{id:`id`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,hp:`integer`,x:`integer`,y:`integer`}},attack:{attributes:{id:`id`,attacker:`string`,defender:`string`,target:`string`,amount:`integer`,weapon:`id`,name:`string`,sound:`string`,description:`string`,type:`id`,range:`id`,damage:`integer`,number:`integer`,strikes:`integer`,icon:`string`,specials:`string`}},side:{attributes:{id:`string`,controller:`id`,gold:`integer`,income:`integer`,income_base:`integer`,income_per_village:`integer`,leader:`id`,team:`integer`,recruit:`string`,color:`string`,team_name:`string`,user_team_name:`string`,share_vision:`string`,village_gold:`integer`,heal:`boolean`,fog:`boolean`,shroud:`boolean`,hidden:`boolean`,flag:`string`}},map:{attributes:{id:`id`,name:`string`,file:`string`,terrain:`string`},children:[`start`]},start:{attributes:{side:`string`,x:`integer`,y:`integer`}},schedule:{attributes:{id:`id`},children:[`time`]},time:{attributes:{id:`id`,name:`string`,lawful_bonus:`number`}},event:{attributes:{id:`id`,on:`id`,trigger:`id`,x:`coordinate`,y:`coordinate`,side:`string`,unit:`string`,once:`boolean`},children:`condition.filter.filter_condition.while.foreach.switch.command.say.dialogue.move.attack.spawn.kill.gold.endlevel.set_variable.if.else.message.teleport.end_turn.win.lose.hook.fire_event.store_unit.unstore_unit.recall.modify_unit.heal_unit.set_terrain.capture_village.clear_shroud.role`.split(`.`)},objectives:{attributes:{side:`string`,victory:`string`,defeat:`string`},children:[`victory`,`defeat`]},victory:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},defeat:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},condition:{attributes:{condition:`id`,hook:`string`,variable:`string`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},filter:{attributes:{side:`string`,type:`string`,not_type:`string`,unit:`string`,name:`string`,role:`string`,x:`coordinate`,y:`coordinate`,level:`integer`,alignment:`id`,can_recruit:`boolean`,leader:`boolean`}},filter_condition:{children:[`variable`,`have_unit`,`predicate`]},variable:{attributes:{name:`id`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},have_unit:{attributes:{id:`string`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,x:`coordinate`,y:`coordinate`}},predicate:{attributes:{name:`id`},openAttributes:`string`},command:{attributes:{name:`id`,target:`string`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`],amount:`integer`,x:`integer`,y:`integer`,hp:`integer`}},move:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},spawn:{attributes:{id:`string`,type:`string`,side:`string`,x:`integer`,y:`integer`,hp:`integer`}},kill:{attributes:{unit:`string`,target:`string`},openAttributes:`string`},gold:{attributes:{side:`string`,delta:`integer`,amount:`integer`}},endlevel:{attributes:{result:`id`,side:`string`,bonus:`integer`,carryover_percentage:`integer`,carryover_add:`boolean`,next_scenario:`id`}},set_variable:{attributes:{name:`id`,target:`id`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`]}},if:{attributes:{test:`string`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},else:{children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},while:{attributes:{test:`string`,max_iterations:`integer`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},foreach:{attributes:{variable:`id`,item:`id`,index:`id`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},switch:{attributes:{variable:`id`},children:[`case`,`default`]},case:{attributes:{equals:`string`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},default:{children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},message:{attributes:{speaker:`string`,text:`string`,value:`string`,portrait:`string`,side:`string`}},teleport:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},end_turn:{attributes:{}},win:{attributes:{side:`string`}},lose:{attributes:{side:`string`}},say:{attributes:{speaker:`id`,text:`string`}},dialogue:{attributes:{id:`id`,ref:`id`},children:[`say`,`choice`,`branch`,`message`]},choice:{attributes:{text:`string`,event:`id`,variable:`id`,equals:`string`},children:[`branch`]},branch:{attributes:{text:`string`},children:[`message`,`say`,`command`,`set_variable`,`move`,`attack`,`spawn`,`kill`,`gold`,`hook`]},trait:{attributes:{id:`id`,name:`string`},children:[`effect`]},ability:{attributes:{id:`id`,name:`string`},children:[`effect`]},weapon_special:{attributes:{id:`id`,name:`string`}},hook:{attributes:{name:`string`},openAttributes:`string`},fire_event:{attributes:{id:`id`,name:`string`}},store_unit:{attributes:{variable:`string`,name:`string`},children:[`filter`]},unstore_unit:{attributes:{variable:`string`,name:`string`}},recall:{attributes:{variable:`string`,id:`string`,unit:`string`,side:`string`,x:`integer`,y:`integer`}},modify_unit:{attributes:{hp:`integer`,moves:`integer`,type:`string`,side:`string`,alive:`boolean`},children:[`filter`,`set`]},set:{openAttributes:`string`},heal_unit:{attributes:{amount:`integer`,hp:`integer`,side:`string`,type:`string`,x:`integer`,y:`integer`},children:[`filter`]},set_terrain:{attributes:{terrain:`string`,x:`integer`,y:`integer`}},capture_village:{attributes:{side:`string`,x:`integer`,y:`integer`,name:`string`}},clear_shroud:{attributes:{side:`string`,x:`integer`,y:`integer`,radius:`integer`}},role:{attributes:{role:`string`,name:`string`,type:`string`,not_type:`string`,unit:`string`,side:`string`,can_recruit:`boolean`,x:`integer`,y:`integer`},children:[`filter`]},object:{attributes:{id:`id`,name:`string`,image:`string`,side:`string`,x:`integer`,y:`integer`},children:[`filter`]},story:{attributes:{text:`string`,value:`string`,title:`string`,image:`string`,music:`string`}},item:{attributes:{id:`id`,name:`string`,slot:`id`,stackable:`boolean`,weight:`number`,image:`string`,icon:`string`},children:[`effect`]},inventory:{attributes:{unit:`string`,side:`string`,items:`string`}},monster:{attributes:{id:`string`,name:`string`,hp:`integer`,types:`string`,attack:`number`,defense:`number`,speed:`number`,accuracy:`number`,evasion:`number`,damage_min:`integer`,damage_max:`integer`,armor_min:`integer`,armor_max:`integer`,experience:`integer`,max_level:`integer`,image:`string`},children:[`ability`,`loot`]},status:{attributes:{id:`id`,name:`string`,duration:`integer`,tick:`string`,modifiers:`string`}},loot:{attributes:{item:`id`,chance:`number`,quantity:`integer`,weight:`number`}},turn_clock:{attributes:{id:`id`,tick:`number`,hunger:`number`}},ai:{attributes:{id:`id`,strategy:`id`,target:`id`,difficulty:`number`,scope:`id`,provider:`id`,algorithm:`id`,depth:`integer`,max_nodes:`integer`,player:`string`,moves:`string`,apply:`string`,terminal:`string`,evaluate:`string`},children:[`behavior`]},behavior:{attributes:{id:`id`,when:`string`,action:`string`,hook:`string`}},battle_move:{attributes:{id:`id`,type:`id`,target:`id`,power:`number`,cost:`number`}},type_matchup:{attributes:{attacker:`id`,defender:`id`,multiplier:`number`}},evolution:{attributes:{from:`id`,into:`id`,level:`integer`}},effect:{attributes:{apply_to:`id`,range:`id`,increase:`string`,increase_total:`string`,increase_damage:`string`,add:`string`,sub:`string`,multiply:`string`,divide:`string`,set:`string`}},save:{attributes:{version:`integer`,fields:`string`,migration:`string`}}},UU={...HU,game:{...HU.game,required:[`schema`]},table:{...HU.table,required:[`id`,`columns`],cardinality:{row:{min:1}}},terrain_type:{...HU.terrain_type,required:[`id`]},movetype:{...HU.movetype,required:[`id`]},unit_type:{...HU.unit_type,required:[`id`]},unit:{...HU.unit,required:[`id`,`type`,`side`]}};function WU(e,t=HU){let n=[],r=new Map,i=e=>{let t=e.attributes.id;t&&r.set(t,[...r.get(t)??[],e]),e.children.forEach(i)};e.forEach(i);let a=[],o=(e,i=!1)=>{let s=t[e.tag];if(!s){if(i){e.children.forEach(e=>o(e,!0));return}n.push({code:`MWL_UNKNOWN_TAG`,message:`unknown tag ${e.tag}`,location:e.location});return}for(let t of Object.keys(e.attributes))s.openAttributes||(!s.attributes||!(t in s.attributes))&&n.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${t} on ${e.tag}`,location:e.attributeLocations?.[t]??e.location});for(let t of s.required??[])e.attributes[t]===void 0&&n.push({code:`MWL_REQUIRED_ATTRIBUTE`,message:`${t} is required on ${e.tag}`,location:e.location});for(let[t,i]of Object.entries(s.attributes??{})){let o=e.attributes[t];if(o!==void 0&&!JU(o,i)&&n.push({code:`MWL_VALUE`,message:`${t} must be ${YU(i)}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location}),o!==void 0&&i===`ref`){let i=(r.get(o)??[]).filter(e=>{let n=s.refTargets?.[t];return!n||n===`*`||e.tag===n});i.length===0?n.push({code:`MWL_REF_MISSING`,message:`${t} references missing target ${o}`,location:e.location}):i.length>1?n.push({code:`MWL_REF_DUPLICATE`,message:`${t} references ambiguous target ${o}`,location:e.location}):s.acyclicRefs?.includes(t)&&a.push({from:e,to:i[0],name:t})}}if(s.openAttributes)for(let[t,r]of Object.entries(e.attributes))JU(r,s.openAttributes)||n.push({code:`MWL_VALUE`,message:`${t} must be ${s.openAttributes}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location});for(let t of e.children)!s.openChildren&&s.children&&!s.children.includes(t.tag)&&n.push({code:`MWL_CHILD`,message:`${t.tag} is not allowed inside ${e.tag}`,location:t.location}),o(t,s.openChildren===!0);for(let[t,r]of Object.entries(s.cardinality??{})){let i=e.children.filter(e=>e.tag===t).length;r.min!==void 0&&i<r.min&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} needs at least ${r.min} ${t} child${r.min===1?``:`ren`}`,location:e.location}),r.max!==void 0&&i>r.max&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} allows at most ${r.max} ${t} child${r.max===1?``:`ren`}`,location:e.location})}};e.forEach(e=>o(e)),GU(e,n);let s=new Set,c=new Set,l=(e,t)=>{if(s.has(e)){let r=t.indexOf(e);n.push({code:`MWL_REF_CYCLE`,message:`reference cycle through ${t.slice(r).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.location});return}if(!c.has(e)){s.add(e);for(let n of a.filter(t=>t.from===e))l(n.to,[...t,e]);s.delete(e),c.add(e)}};for(let e of a)l(e.from,[]);return n.sort((e,t)=>e.location.line-t.location.line||e.location.column-t.location.column)}function GU(e,t){let n=e=>{if(e.tag===`table`){let n;try{n=VU(e.attributes.columns??``)}catch(r){t.push({code:`MWL_TABLE`,message:String(r).replace(/^Error: /,``),location:e.location}),n=[]}let r=new Map(n.map(e=>[e.name,e]));for(let i of e.children.filter(e=>e.tag===`row`)){for(let e of Object.keys(i.attributes))r.has(e)||t.push({code:`MWL_TABLE`,message:`unknown table column ${e}`,location:i.location});for(let r of n){let n=i.attributes[r.name];if(n===void 0){t.push({code:`MWL_TABLE`,message:`missing table column ${r.name}`,location:i.location});continue}try{KU(n,r.type,r.name,e.attributes.list_delimiter,e.attributes.map_delimiter)}catch(e){t.push({code:`MWL_TABLE`,message:String(e).replace(/^Error: /,``),location:i.location})}}}}e.children.forEach(n)};e.forEach(n)}function KU(e,t,n,r=`;`,i=`=`){return Hn(e,t,{column:n,listDelimiter:r,mapDelimiter:i,acceptYesNo:!0})}function qU(e){return/^[A-Za-z_][\w.[\]-]*$/.test(e)}function JU(e,t){return XU(t)?t.includes(e):t===`number`?Number.isFinite(Number(e)):t===`integer`?/^-?\d+$/.test(e):t===`boolean`?e===`true`||e===`false`||e===`yes`||e===`no`:t===`ref`?/^[A-Za-z_][\w.-]*$/.test(e):t===`coordinate`?/^-?\d+(?:\s*,\s*-?\d+|\s*-\s*-?\d+)*$/.test(e):t!==`id`||qU(e)}function YU(e){return XU(e)?`one of ${e.join(`, `)}`:e}function XU(e){return Array.isArray(e)}function ZU(e,t={}){return $U(wH(vH(e,t),t.file),t)}function QU(e,t={}){let n=[];for(let r of[...e].sort((e,t)=>e.file<t.file?-1:+(e.file>t.file))){let e=vH(r.source,{...t,file:r.file});n.push(...wH(e,r.file))}return $U(n,t)}function $U(e,t={}){let n=e.find(e=>e.tag===`game`)?.attributes.schema,r=WU(e,t.schemas??(n===`1.0`?UU:void 0));if(r.length){let e=r[0];throw Error(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`)}let i=new Set,a=new Set,o=e=>{for(let[t,n]of Object.entries(e.attributes))if(eW(t))for(let e of nW(n).map(e=>e.trim()).filter(tW))i.add(rW(e));let t=e.gettext??[`name`,`text`,`title`];for(let n of t){let t=e.attributes[n];t!==void 0&&a.add(t)}let n={tag:e.tag,attributes:{...e.attributes},children:e.children.map(o),location:e.location};return Object.defineProperties(n,{attributeLocations:{value:e.attributeLocations,enumerable:!1},valueLocations:{value:e.valueLocations,enumerable:!1}}),e.gettext&&Object.assign(n,{gettext:[...e.gettext]}),n};return{schema:e.find(e=>e.tag===`game`)?.attributes.schema??`0.1`,roots:e.map(o),assets:[...i].sort(),messages:[...a].sort()}}function eW(e){return e===`file`||e===`image`||e===`image_icon`||e===`icon`||e===`profile`||e===`sound`||e.endsWith(`_sound`)||e.endsWith(`_image`)}function tW(e){return e.includes(`/`)||/\.(?:png|jpg|jpeg|gif|svg|webp|wav|ogg|mp3|flac|glb|gltf|vox|map|cfg)$/i.test(e)||e.startsWith(`data:`)}function nW(e){let t=[],n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)e[a]===`(`?r+=1:e[a]===`)`&&r>0?--r:e[a]===`[`?i+=1:e[a]===`]`&&i>0?--i:e[a]===`,`&&r===0&&i===0&&(t.push(e.slice(n,a)),n=a+1);return t.push(e.slice(n)),t}function rW(e){let t=e.match(/~[A-Za-z][A-Za-z0-9_-]*(?:\(|$)/);return t?e.slice(0,t.index).trim():e}function iW(e,t={}){let n={};for(let t of e.messages)n[t]=t;return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function aW(e,t=`gameData`){return`export const ${t} = ${JSON.stringify(e,null,` `)} as const;\n`}function oW(e,t={}){let n=[{name:`game-data.ts`,content:aW(e,t.variable??`gameData`)},{name:`i18n.json`,content:`${JSON.stringify(iW(e),null,` `)}\n`},{name:`assets.json`,content:`${JSON.stringify({assets:e.assets},null,` `)}\n`},...Object.entries(t.artifacts??{}).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>({name:e,content:t}))];for(let e of n)t.onEmit?.(e);return n}function sW(e,t={},n={}){let r=oW(QU(e,t),n),i=oW(QU(e,t),n);if(r.length!==i.length||r.some((e,t)=>e.name!==i[t]?.name||e.content!==i[t]?.content))throw Error(`MWL generated artifacts are not deterministic`);return r}var cW=/^[A-Za-z_][\w-]*$/,lW=[`predicate`,`modifier`,`generator`,`command`,`ai`,`migration`];function uW(e){let t=e.indexOf(`:`);if(t<=0)return null;let n=e.slice(0,t),r=e.slice(t+1).trim();return!cW.test(n)||!cW.test(r)?null:{type:n,name:r}}function dW(e,t=[`hook`,`migration`]){let n=new Map,r=new Set(t),i=e=>{for(let[t,n]of Object.entries(e.attributes))r.has(t)&&a(n,e.location),e.tag===`hook`&&t===`name`&&a(n,e.location);e.children.forEach(i)},a=(e,t)=>{let r=uW(e);if(!r)return;let i=`${r.type}:${r.name}`;n.has(i)||n.set(i,{...r,location:t})};return e.roots.forEach(i),[...n.values()].sort((e,t)=>e.type.localeCompare(t.type)||e.name.localeCompare(t.name))}function fW(e,t){if(t.attributes===void 0&&t.openAttributes===void 0)return[];let n=e.location??{file:`<hook>`,line:0,column:0},r=[];for(let[i,a]of Object.entries(e.attributes)){if(i===`name`)continue;let e=t.attributes?.[i]??t.openAttributes;if(e===void 0){r.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${i} on hook ${t.id}`,location:n});continue}JU(a,e)||r.push({code:`MWL_VALUE`,message:`${i} must be ${YU(e)} on hook ${t.id}`,location:n})}return r}function pW(e,t){let n=new Set(t),r=[];for(let t of e){let e=`${t.type}:${t.name}`;n.has(e)||r.push({code:`MWL_HOOK`,message:`hook ${e} is not implemented`,location:t.location??{file:`<hook>`,line:0,column:0}})}return r}function mW(e){let t=[];t.push(`// Generated by mwl - do not edit.`),t.push(`import type { AiHook, CommandHook, GeneratorHook, MigrationHook, ModifierHook, PredicateHook } from '@datamoc/mw_games/mwl';`),t.push(``),t.push(`export interface MwlHooks {`);for(let n of e){let e=lW.includes(n.type)?`${n.type[0].toUpperCase()}${n.type.slice(1)}Hook`:`MwlDomainHook`;t.push(`\t'${n.type}:${n.name}': ${e};`)}return t.push(`}`),t.push(``),t.join(`
|
|
1364
|
+
`)}function hW(e,t){let n=e.scenarios;if(n.length===0)throw Error(`campaign ${e.id} declares no scenarios`);let r=new Set(n.map(e=>e.id));if(r.size!==n.length)throw Error(`campaign ${e.id} declares a scenario twice`);let i=e.firstScenario||n[0].id;if(!r.has(i))throw Error(`campaign ${e.id} starts on an unknown scenario: ${i}`);return{start:i,levels:n.map(e=>({id:e.id,run:(n,r)=>{let i=t.run(e,n,r);return i.next===void 0?{...i,next:e.nextScenario??null}:i}}))}}var gW=rU,_W=iU,vW=aU,yW=oU,bW=cU;function xW(e){let t=nU(e.roots);return{campaigns:t.filter(e=>e.tag===`campaign`).map(e=>({id:gW(e,`id`),name:e.attributes.name,title:e.attributes.title,description:e.attributes.description,startScene:e.attributes.start_scene,firstScenario:e.attributes.first_scenario,scenarios:e.children.filter(e=>e.tag===`scenario`).map(e=>({id:gW(e,`id`),nextScenario:e.attributes.next_scenario||void 0}))})),items:t.filter(e=>e.tag===`item`).map(e=>({id:gW(e,`id`),name:gW(e,`name`),slot:e.attributes.slot,stackable:yW(e,`stackable`),weight:_W(e,`weight`),image:e.attributes.image,icon:e.attributes.icon,effects:e.children.filter(e=>e.tag===`effect`).map(CW)})),monsters:t.filter(e=>e.tag===`monster`).map(e=>({id:gW(e,`id`),name:e.attributes.name,hp:vW(e,`hp`,1),accuracy:_W(e,`accuracy`),evasion:_W(e,`evasion`),damage:wW(e,`damage_min`,`damage_max`),armor:wW(e,`armor_min`,`armor_max`),experience:vW(e,`experience`),maxLevel:vW(e,`max_level`),image:e.attributes.image,types:e.attributes.types?.split(`,`).map(e=>e.trim()).filter(Boolean),baseStats:[`attack`,`defense`,`speed`,`hp`].reduce((t,n)=>{let r=_W(e,n);return r!==void 0&&(t[n===`hp`?`maxHp`:n]=r),t},{})})),statuses:t.filter(e=>e.tag===`status`).map(e=>({id:gW(e,`id`),name:e.attributes.name,duration:vW(e,`duration`),tick:e.attributes.tick,modifiers:e.attributes.modifiers})),loot:t.filter(e=>e.tag===`loot`).map(e=>({item:gW(e,`item`),chance:_W(e,`chance`),quantity:vW(e,`quantity`),weight:_W(e,`weight`)})),turnClocks:t.filter(e=>e.tag===`turn_clock`).map(e=>({id:gW(e,`id`),tick:_W(e,`tick`),hunger:_W(e,`hunger`)})),ai:t.filter(e=>e.tag===`ai`).map(e=>({id:gW(e,`id`),strategy:e.attributes.strategy,target:e.attributes.target,difficulty:_W(e,`difficulty`),scope:bW(e.attributes.scope,[`actor`,`controller`]),provider:bW(e.attributes.provider,[`javascript`,`lua`]),algorithm:bW(e.attributes.algorithm,[`rules`,`alpha_beta`]),depth:vW(e,`depth`),maxNodes:vW(e,`max_nodes`),player:e.attributes.player,moves:e.attributes.moves,apply:e.attributes.apply,terminal:e.attributes.terminal,evaluate:e.attributes.evaluate,behaviors:e.children.filter(e=>e.tag===`behavior`).map(e=>({id:gW(e,`id`),when:e.attributes.when,action:e.attributes.action,hook:e.attributes.hook}))})),moves:t.filter(e=>e.tag===`battle_move`).map(e=>({id:gW(e,`id`),type:gW(e,`type`),target:gW(e,`target`),power:_W(e,`power`),cost:_W(e,`cost`)})),typeMatchups:t.filter(e=>e.tag===`type_matchup`).map(e=>({attacker:gW(e,`attacker`),defender:gW(e,`defender`),multiplier:_W(e,`multiplier`)??1})),evolutions:t.filter(e=>e.tag===`evolution`).map(e=>({from:gW(e,`from`),into:gW(e,`into`),level:vW(e,`level`,1)})),tables:t.filter(e=>e.tag===`table`).map(SW)}}function SW(e){let t=VU(gW(e,`columns`));return{id:gW(e,`id`),columns:t,rows:e.children.filter(e=>e.tag===`row`).map(n=>{let r={};for(let i of t){let t=n.attributes[i.name];t!==void 0&&(r[i.name]=KU(t,i.type,i.name,e.attributes.list_delimiter,e.attributes.map_delimiter))}return r})}}function CW(e){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].find(t=>e.attributes[t]!==void 0);return{applyTo:gW(e,`apply_to`),operation:t,value:t?e.attributes[t]:void 0,range:e.attributes.range}}function wW(e,t,n){let r=_W(e,t),i=_W(e,n);return r===void 0||i===void 0?void 0:[r,i]}function TW(e,t={}){return{id:e.id,stackable:e.stackable,weight:e.weight,slot:e.slot,modifiers:e.effects.map(e=>OW(e,t))}}function EW(e,t=1){return{id:e.id,quantity:t,stackable:e.stackable,weight:e.weight}}function DW(e,t,n={}){return NL(e,t.map(e=>OW(e,n)))}function OW(e,t={}){let n=e.operation;if(n!==`add`&&n!==`sub`&&n!==`multiply`&&n!==`divide`&&n!==`set`)throw Error(`MWL effect operation "${n??``}" is not a StatBlock modifier`);let r=e.value;if(r===void 0)throw Error(`MWL effect has no value`);let i=eU(r,t);return{stat:e.applyTo,op:n===`sub`?`add`:n===`divide`?`multiply`:n,value:n===`sub`?-i:n===`divide`?1/i:i}}function kW(e,t={}){let n=[],r=new Map,i=nU(e.roots);for(let e of i){let i=e.attributes.id;if(i){let a=`${t.rowIdScope===`file`?e.location?.file??`<mwl>`:``}\0${e.tag}:${i}`,o=r.get(a);o?n.push(jW(`MWL_DUPLICATE_ID`,`duplicate ${e.tag} id "${i}"`,e.location??o.location)):r.set(a,e)}if(e.tag===`item`&&t.slots&&e.attributes.slot&&!t.slots.includes(e.attributes.slot)&&n.push(jW(`MWL_UNKNOWN_SLOT`,`unknown equipment slot "${e.attributes.slot}"`,e.location)),e.tag===`effect`){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].filter(t=>e.attributes[t]!==void 0);(!e.attributes.apply_to||t.length!==1)&&n.push(jW(`MWL_INCOMPLETE_EFFECT`,`an effect needs apply_to and exactly one operation`,e.location))}NW(e,t.mapBounds,n)}AW(i,n);let a=dW(e,[`hook`,`migration`,...t.hookAttributes??[]]),o=new Map;for(let e of t.hooks??[])o.set(typeof e==`string`?e:e.id,typeof e==`string`?{id:e}:e);for(let e of i){let t=e.attributes.hook??(e.tag===`hook`?e.attributes.name:void 0);t!==void 0&&!uW(t)&&n.push(jW(`MWL_INVALID_HOOK`,`invalid hook reference "${t}"`,e.location));let r=e.tag===`hook`&&e.attributes.name?o.get(e.attributes.name):void 0;r&&n.push(...fW(e,r))}if(t.hooks)for(let e of a)o.has(`${e.type}:${e.name}`)||n.push(jW(`MWL_UNKNOWN_HOOK`,`hook ${e.type}:${e.name} is not declared by the game`,e.location));return n}function AW(e,t){let n=new Map;for(let t of e){let e=t.attributes.id;e&&n.set(`${t.tag}\0${e}`,t)}let r=new Set,i=new Set,a=new Set,o=(e,s)=>{if(r.has(e)){let n=s.indexOf(e),r=s.slice(n).map(e=>`${e.tag}:${e.attributes.id??`<anonymous>`}`).sort().join(`|`);if(a.has(r))return;a.add(r),t.push({code:`MWL_ALIAS_CYCLE`,message:`alias cycle through ${s.slice(n).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.valueLocations?.aliasof??e.attributeLocations?.aliasof??e.location??MW()});return}if(!i.has(e)){r.add(e);for(let t of(e.attributes.aliasof??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let r=n.get(`${e.tag}\0${t}`);r&&o(r,[...s,e])}r.delete(e),i.add(e)}};for(let t of e)t.attributes.aliasof!==void 0&&o(t,[])}function jW(e,t,n){return{code:e,message:t,location:n??MW()}}function MW(){return{file:`<mwl>`,line:1,column:1}}function NW(e,t,n){if(t)for(let r of[`x`,`y`]){let i=e.attributes[r];if(i===void 0)continue;let a=r===`x`?t.width:t.height;if(!Number.isInteger(a)||a<=0)continue;let o=i.split(`,`).flatMap(e=>{let t=e.trim(),n=/^(-?\d+)\s*-\s*(-?\d+)$/.exec(t);return n?[Number(n[1]),Number(n[2])]:/^-?\d+$/.test(t)?[Number(t)]:[]});o.length>0&&o.some(e=>e<0||e>=a)&&n.push({code:`MWL_COORDINATE`,message:`${r} coordinate is outside the ${a}-cell map bound`,location:e.valueLocations?.[r]??e.attributeLocations?.[r]??e.location??{file:`<mwl>`,line:1,column:1}})}}function PW(e,t={}){return kW({schema:`0.1`,roots:e,assets:[],messages:[]},t)}function FW(e,t={}){try{let n=QU(e,t),r=IW(n),i=[];for(let e of r.opaqueTags)i.push({severity:`warning`,code:`opaque-tag`,message:`ignored opaque tag: ${e}`});for(let e of r.danglingReferences)i.push({severity:`error`,code:`dangling-reference`,message:`dangling content reference: ${e}`});return{game:n,resources:[...n.assets],dependencies:[...r.references],ignored:[...r.opaqueTags],diagnostics:i}}catch(e){return{resources:[],dependencies:[],ignored:[],diagnostics:[{severity:`error`,code:`compile`,message:String(e)}]}}}function IW(e){let t=nU(e.roots),n={},r=new Set;for(let e of t)n[e.tag]=(n[e.tag]??0)+1,e.attributes.id&&r.add(e.attributes.id);let i=new Set(Object.keys(HU)),a=t.filter(e=>!i.has(e.tag)).map(e=>e.tag).filter((e,t,n)=>n.indexOf(e)===t).sort(),o=new Set;for(let e of t)for(let[t,n]of Object.entries(e.attributes))if(/^(?:ability|item|terrain|unit|unit_type|weapon)(?:_id)?$/.test(t))for(let e of n.split(`,`).map(e=>e.trim()).filter(Boolean))o.add(e);return{tags:Object.fromEntries(Object.entries(n).sort(([e],[t])=>e.localeCompare(t))),opaqueTags:a,references:[...o].sort(),danglingReferences:[...o].filter(e=>!r.has(e)).sort()}}function LW(e,t){let n={},r=[];for(let[i,a]of Object.entries(t)){let t=a.source??i,o=e.attributes[t];if(o===void 0){a.required?r.push(qW(`MWL_REQUIRED_FIELD`,`missing required attribute "${t}"`,e)):a.default!==void 0&&(n[i]=a.default);continue}let s=KW(o,a.type);s===void 0?r.push(qW(`MWL_FIELD_TYPE`,`invalid ${a.type} attribute "${t}": "${o}"`,e)):n[i]=s}return{value:n,diagnostics:r}}function RW(e,t,n){let r=[],i=[];for(let a of e.children){if(a.tag!==t)continue;let e=n(a);r.push(e.value),i.push(...e.diagnostics)}return{value:r,diagnostics:i}}function zW(e,t){let n=new Map;for(let r of e){let e=VW(...HW(r,t.key));if(n.has(e)&&t.duplicate!==`last`)throw Error(`duplicate table key: ${e}`);n.set(e,t.value?t.value(r):r)}return n}function BW(e,t){let n=new Map;for(let r of e){let e=VW(...HW(r,t.key)),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function VW(...e){return JSON.stringify(e)}function HW(e,t){if(typeof t==`function`){let n=t(e);return UW(n)?[...n]:[n]}return WW(t)?t.map(t=>GW(e[t],String(t))):[GW(e[t],String(t))]}function UW(e){return Array.isArray(e)}function WW(e){return Array.isArray(e)}function GW(e,t){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;throw TypeError(`table key column "${t}" must be a string, number, boolean, or null`)}function KW(e,t){if(t===`string`)return e;if(t===`id`)return qU(e)?e:void 0;if(t===`number`)return Number.isFinite(Number(e))?Number(e):void 0;if(t===`integer`)return/^-?\d+$/.test(e)?Number(e):void 0;if(t===`boolean`)return e===`true`||e===`yes`?!0:e===`false`||e===`no`?!1:void 0;let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t===`id-list`?n.every(e=>qU(e))?n:void 0:n.every(e=>Number.isFinite(Number(e)))?n.map(Number):void 0}function qW(e,t,n){return{code:e,message:t,location:n.location??{file:`<mwl>`,line:1,column:1}}}function JW(){return{evaluate(e,t={}){let n={};for(let[e,r]of Object.entries(t)){if(typeof r!=`number`)throw Error(`MWL expression context value must be numeric: ${e}`);n[e]=r}return eU(e,n)},execute(){throw Error(`the expression ScriptHost cannot execute statements`)},call(){throw Error(`the expression ScriptHost cannot call functions`)},dispose(){}}}var YW=l({MWL_DEFAULT_CARRYOVER_PERCENTAGE:()=>80,MWL_SCHEMA_01:()=>`0.1`,MWL_SCHEMA_10:()=>`1.0`,MwlRuntime:()=>_U,MwlSyntaxError:()=>gH,attributeTypeDescription:()=>YU,campaignChain:()=>hW,carryoverIntoScenario:()=>uU,coerceTableValue:()=>KU,collectHookReferences:()=>dW,compile:()=>ZU,compileAndEmitSources:()=>sW,compileNodes:()=>$U,compileSources:()=>QU,composeEffects:()=>DW,contentCatalog:()=>xW,contentReport:()=>IW,createExpressionScriptHost:()=>JW,createWorld:()=>pU,decodeSave:()=>UH,decodeSaveEnvelope:()=>WH,effectToModifier:()=>OW,emitArtifacts:()=>oW,emitHooksDeclaration:()=>mW,emitModule:()=>aW,encodeSave:()=>HH,endLevelCarryover:()=>lU,evaluateCondition:()=>YH,evaluateExpression:()=>eU,execute:()=>vU,extractCatalog:()=>iW,hookTypes:()=>lW,inventoryItem:()=>EW,isGettext:()=>LH,isMwlId:()=>qU,itemDefinition:()=>TW,loadContent:()=>FW,parse:()=>wH,parseExpression:()=>$H,parseHookReference:()=>uW,parseMapFile:()=>BU,parseTableColumns:()=>VU,parseTerrain:()=>mU,parseValue:()=>IH,preprocess:()=>vH,readAttributes:()=>LW,readChildren:()=>RW,readTableIndex:()=>BW,readTableMap:()=>zW,schema01:()=>HU,schema10:()=>UU,sideVisionGroups:()=>bU,tableKey:()=>VW,validAttributeValue:()=>JU,validate:()=>WU,validateCatalog:()=>kW,validateCatalogNodes:()=>PW,validateHookAttributes:()=>fW,validateHookReferences:()=>pW,validateWorld:()=>GH});function XW(e,t){return e.filter(e=>(t.side===void 0||e.side===t.side)&&(t.type===void 0||e.type===t.type)&&(t.role===void 0||e.role===t.role)&&(t.can_recruit===void 0||(e.can_recruit??!1)===t.can_recruit)&&(t.name===void 0||e.name===t.name))}function ZW(e,t,n,r){let i=0,a=0,o=1;for(let s of t)s.id!==e.id&&r(s.x,s.y)&&(o++,s.side===e.side?i+=n(s.id):a+=n(s.id));return{own:n(e.id),allies:i,enemies:a,seen:o}}function QW(e,t,n,r){let i=0,a=0,o=0;for(let s of t)r(s.x,s.y)&&(o++,s.side===e?i+=n(s.id):a+=n(s.id));return{own:0,allies:i,enemies:a,seen:o}}function $W(e,t){return e.own*t.own+e.allies*t.allies+e.enemies*t.enemies}var eG=class e{constructor(e={}){this.values={};for(let[t,n]of Object.entries(e))n!==void 0&&(this.values[t]=n)}has(e){return this.values[e]!==void 0}get(e){return this.values[e]}set(e,t){this.values[e]=t}number(e,t=0){let n=this.values[e];return typeof n==`number`&&Number.isFinite(n)?n:typeof n==`boolean`?+!!n:t}flag(e,t=!1){let n=this.values[e];return typeof n==`boolean`?n:t}list(e){let t=this.values[e];return Array.isArray(t)?t:typeof t==`string`?[t]:[]}names(){return Object.keys(this.values)}with(t){let n=new e(this.values);for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);return n}toJSON(){return{...this.values}}static fromJSON(t){return new e(t)}},tG=class{constructor(e=[],t={}){this.levels=new Map,this.base=new eG(t);for(let t of e){if(this.levels.has(t.id))throw Error(`duplicate difficulty level: ${t.id}`);this.levels.set(t.id,t)}}get ids(){return[...this.levels.keys()]}get(e){return this.levels.get(e)}aspectsFor(e){let t=this.levels.get(e);if(!t)throw Error(`unknown difficulty level: ${e}`);return this.base.with(t.aspects??{})}},nG=class{constructor(){this.byUnit=new Map}set(e){this.byUnit.set(e.unit,{...e})}clear(e){this.byUnit.delete(e)}get(e){return this.byUnit.get(e)}all(){return[...this.byUnit.values()]}get isEmpty(){return this.byUnit.size===0}},rG=class{constructor(e,t=null){this.order=e,this.fallback=t}get length(){return this.order.length}at(e){if(this.order.length===0)return this.fallback;let t=(e%this.order.length+this.order.length)%this.order.length;return this.order[t]}next(e){if(this.order.length===0)return this.fallback;if(e===null)return this.order[0];let t=this.order.indexOf(e);return this.at(t<0?0:t+1)}},iG=class{constructor(e){this.stages=e.stages}decide(e,t){if(e.length===0)return null;for(let n of this.stages){if(n.when&&!n.when(t))continue;let r=n.weigh??aG,i=null;for(let a of e){let e=r(a,t);(!i||e>i.score)&&(i={candidate:a,stage:n.id,score:e})}return i}return null}};function aG(e,t){let n=0;for(let[r,i]of Object.entries(e.factors??{}))r!==`distance`&&(n+=i*t.aspects.number(r,1));let r=e.factors?.distance;return r!==void 0&&(n+=oG(r,t.aspects.number(`keep_away`,0))),n}function oG(e,t){return!(t>0)||e>=t?0:-(t-e)}function sG(e){return e?Math.max(0,e.priority??1):0}var cG=l({AIBudgetExceededError:()=>pG,AICancelledError:()=>fG,Aspects:()=>eG,Difficulty:()=>tG,Goals:()=>nG,HeuristicAI:()=>iG,JavaScriptAI:()=>dG,RecruitmentPattern:()=>rG,alphaBetaSearch:()=>lB,defaultWeigh:()=>aG,goalScore:()=>sG,keepAwayScore:()=>oG,personalScoreView:()=>ZW,scoreWith:()=>$W,sideScoreView:()=>QW,subjectsWhere:()=>XW}),lG=1e4,uG=16,dG=class{constructor(e={}){this.agents=new Map,this.states=new Map,this.options=e,vG(e.maxSteps??lG,`maxSteps`),yG(e.maxMilliseconds??uG,`maxMilliseconds`)}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid AI agent id: ${e.id}`);if(this.agents.has(e.id))throw Error(`AI agent already registered: ${e.id}`);if(!e.behaviors.length)throw Error(`AI agent has no behaviours: ${e.id}`);let t=new Set;for(let n of e.behaviors){if(!n.id||t.has(n.id))throw Error(`duplicate AI behaviour: ${n.id}`);t.add(n.id)}this.agents.set(e.id,e),this.states.set(e.id,{})}decide(e,t){let n=this.agents.get(e);if(!n)throw Error(`unknown AI agent: ${e}`);let r=hG(t.state??this.states.get(e)??{}),i=t.maxSteps??this.options.maxSteps??lG,a=t.maxMilliseconds??this.options.maxMilliseconds??uG;vG(i,`maxSteps`),yG(a,`maxMilliseconds`);let o=0,s=bG(),c=[],l=_G(t.seed??this.options.seed??7173991),u=()=>{if(o++,t.signal?.aborted)throw new fG;if(o>i||bG()-s>a)throw new pG},d={perception:gG(t.perception),state:r,random:()=>(u(),l()),checkpoint:u,emit(e,t){if(!e)throw Error(`AI event name must not be empty`);u(),c.push(t===void 0?{name:e}:{name:e,payload:gG(t)})}},f=null,p,m=`idle`;try{for(let e of n.behaviors)if(u(),!e.when||e.when(d)){p=e.id,f=mG(e.decide(d)),m=f?`action`:`idle`;break}}catch(e){if(e instanceof fG)m=`cancelled`;else if(e instanceof pG)m=`budget-exceeded`;else throw e}let h={agent:e,action:f,state:hG(r),behavior:p,status:m,steps:o,events:c};return this.states.set(e,hG(r)),this.options.onDecision?.(h),h}search(e,t,n){return lB(e,t,n)}exportState(){return{version:1,agents:Object.fromEntries([...this.states].map(([e,t])=>[e,hG(t)]))}}importState(e){if(e.version!==1)throw Error(`unsupported AI state version: ${e.version}`);for(let[t,n]of Object.entries(e.agents)){if(!this.agents.has(t))throw Error(`AI state names unknown agent: ${t}`);this.states.set(t,hG(n))}}dispose(){this.agents.clear(),this.states.clear()}},fG=class extends Error{constructor(){super(`AI decision cancelled`),this.name=`AICancelledError`}},pG=class extends Error{constructor(){super(`AI decision budget exceeded`),this.name=`AIBudgetExceededError`}};function mG(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e)||typeof e.type!=`string`||!e.type)throw Error(`AI action must be an object with a non-empty string type`);return gG(e)}function hG(e){return gG(e)}function gG(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(gG):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,gG(t)]))}function _G(e){if(!Number.isInteger(e))throw TypeError(`AI seed must be an integer`);let t=e>>>0;return()=>(t=Math.imul(t,1664525)+1013904223>>>0,t/4294967296)}function vG(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function yG(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be a non-negative number`)}function bG(){return typeof performance>`u`?Date.now():performance.now()}return wi(),q(),Xa(),Object.defineProperty(e,"AI",{enumerable:!0,get:function(){return cG}}),e.Achievements=Qt,e.ActionJournal=Xt,e.ActorAnimator=Sj,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return AR}}),e.AnimatedSprite=xA,e.Animation=yA,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return aH}}),e.BLOB_SHAPES=wj,e.Bar=wF,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return zz}}),e.BitmapLabel=nN,e.Blob=Tn,Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return RV}}),e.Button=CF,e.COLOR_BLINDNESS_MATRICES=$A,e.Camera=qA,e.CanonicalState=Mt,e.Checkbox=tF,e.Collection=Gt,e.ColorTransformBatcher=jk,e.Container2D=J,e.DataTable=oF,e.DialogueStage=KF,e.Dropdown=iF,e.EMPTY=ij,e.Easing=En,e.EntityRegistry=Nn,e.FLOATING_TEXT_STACK_GAP=AF,e.FeedbackClient=tn,e.FloatingText=kF,e.FloatingTextStack=PF,e.Game=xk,e.Generator=w,e.Gradient=Zj,e.Grid=mF,e.HALO_ANIMATION=hj,e.Halo=gj,e.HelpScreen=LF,e.HookRegistry=x,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return vP}}),e.IconGrid=fN,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return ye}}),e.Label=vM,e.LayeredSprite=dj,e.LightningArc=pj,e.ListView=dN,e.LoadQueue=Mn,e.LoadingScreen=zF,e.LockstepClient=Lt,e.Logger=y,e.MarkupText=XM,e.MersenneTwister=ge,e.MessageBox=JP,e.Minimap=rj,Object.defineProperty(e,"Mwl",{enumerable:!0,get:function(){return YW}}),e.NO_COLOR_ADD=Vk,e.NewsClient=Ht,e.NewsSeenTracker=Wt,e.NinePatch=iN,e.Node2D=Gj,e.ParticleEmitter=bj,e.Player=qt,e.PlayerInput=_t,e.PlayerStats=Bt,e.PresentationQueue=Pn,e.Projectile=fj,e.RENDERING_DECISIONS=$j,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return S}}),e.RandomStreams=ve,e.ReactionTable=$t,e.RebindScreen=SF,e.Recorder=Kt,e.Rectangle2D=W,e.Registry=g,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return WA}}),e.RichLabel=jM,Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return ML}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return bz}}),e.RpgmAutotileAtlas=Rj,e.RunHistory=zt,e.SaveSyncClient=Ft,e.SaveSystem=jt,e.Scene=m,e.Scene2D=Sk,e.SceneComponentHost=_,e.SceneStack=h,e.ScreenEffects=xj,e.ScreenReader=oN,e.ScrollBox=dF,e.Session=en,e.Shape2D=qj,e.Signal=p,Object.defineProperty(e,"Simulation",{enumerable:!0,get:function(){return mH}}),e.Skins=bF,e.Slider=eF,e.Spawner=nn,e.Spinner=rF,e.Sprite2D=Yj,e.SpriteAttachment=mj,e.SpriteSheet=KA,e.StageScript=qF,e.StateRegistry=Nt,e.StatsScreen=RF,e.StatusVisuals=Cj,e.StoryScreen=rI,e.StorySequence=nI,e.SyncGuard=zn,e.TabbedList=pN,e.TelemetryClient=Vt,e.TerrainGraphicsLayer=Qj,e.Text2D=Jj,e.TextModel=aF,e.Texture2D=K,e.TileMap=uj,e.TiledSprite=Xj,e.TintedSprite=Hk,e.Toast=FF,e.Tooltip=IF,e.TreeView=lF,e.Tweener=Dn,e.UndoHistory=On,e.VerticalLabel=ZP,e.Viewport=ZA,e.Window=cN,e.WindowStack=lN,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return RR}}),e.advanceReveal=hM,e.anchorAlign=fF,e.applyAllImageModifiers=cA,e.applyImageModifiers=sA,e.applyTextureModifiers=pA,e.autotileFrames=kj,e.bitmapLabelStyle=rN,e.blendMatrix=nA,e.blendPixels=gA,e.blobIndex=Oj,e.channelScaleMatrix=tA,e.channelSwapMatrix=rA,e.checkNoControlCharacters=wt,e.checkSize=Ct,e.clamp=Wn,e.colorShiftMatrix=eA,e.completeReveal=gM,e.contrastRatio=UF,e.createCamera=XA,e.createColorBlindnessFilter=ej,e.createLayers=Kj,e.croppedTexture=lA,e.defaultTheme=sM,e.deserializeReplay=Yt,e.detectWebGpu=tM,e.escapeHtml=UM,e.floatingTextAgeAtLeast=OF,e.floatingTextAlpha=EF,e.floatingTextRise=DF,e.floatingTextStackLifePenalty=jF,e.floatingTextStackLift=MF,e.floatingTextStackMoves=NF,e.hexDistance=cn,e.hexLine=un,e.hexNeighbors=sn,e.hexRange=dn,e.hexRotate=Bj,e.hexToPixel=fn,e.highContrastTheme=cM,e.imageModifier=Qk,e.importTwee=YF,e.inspectGraphicsCapabilities=eM,e.layoutMarkupLines=BM,e.layoutVertical=XP,e.loadTiledMap=oM,e.markupAccessibilityText=zM,e.markupToHtml=RM,e.maskPixels=hA,e.matchTerrainRule=Hj,e.meetsContrast=WF,e.messageBoxPresenter=BF,e.minimapCellCenter=nj,e.motionDuration=Cn,e.newlyRevealed=tj,e.packColorAdd=Rk,e.packTintAdd=zk,e.paletteRangeMapping=qk,e.parseCSV=Bn,e.parseColorPairs=dA,e.parseImagePath=Zk,e.parseMarkdown=OM,e.parseMarkup=IM,e.parsePaletteLists=fA,e.parseRotateMode=$k,e.pixelToHex=pn,e.positionMarkupLines=HM,e.prefersReducedMotion=yn,e.recolorTexture=Xk,e.rectOf=GA,e.reducedMotion=bn,e.registerColorTransform=Lk,e.relativeLuminance=HF,e.remapPixels=Jk,e.resolveAnchor=pF,e.resolveTerrainGraphics=Uj,e.revealComplete=_M,e.rotatePixels=_A,e.rpgmAutotileFrame=Lj,e.sanitizeInboundText=Tt,e.scramble=vt,e.screenReader=sN,e.scrollOffset=uF,e.serializeReplay=Jt,e.setReducedMotion=xn,e.setTheme=dM,e.sliceSpans=AM,e.sliderFraction=QP,e.sliderValueAt=$P,e.snapZoom=YA,e.spinValue=nF,e.splitScreenHalves=QA,e.spriteColorMatrix=iA,e.squareRotate=zj,e.startReveal=mM,e.stateChecksum=Rn,e.stripMarkdown=kM,e.stripMarkup=LM,e.theme=$,e.themeChanged=uM,e.tileFrame=sj,e.tileFrameIndex=lj,e.tileFrameSheet=cj,e.unscramble=yt,e.validateSchema=Ot,e.version=f,e.watchReducedMotion=Sn,e.weightedFlood=kn,e.withTextureCanvas=Yk,e})({});
|