narraleaf-react 0.44.0 → 0.45.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1,88 +1,88 @@
1
- var me={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",applyLoop:"displayable:applyLoop",stopLoop:"displayable:stopLoop",init:"displayable:init",bringToFront:"displayable:bringToFront"},Qt={say:"character:say",action:"character:action",setName:"character:setName"},W={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",callTo:"scene:callTo",preSuspend:"scene:preSuspend",resume:"scene:resume",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var ft={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},Zs={action:"condition:action"},ea={action:"script:action"},ta={action:"menu:action"},Ft={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute",seek:"sound:seek"},re={action:"control:action",do:"control:do",doAsync:"control:doAsync",any:"control:any",all:"control:all",allAsync:"control:allAsync",repeat:"control:repeat",while:"control:while",break:"control:break",sleep:"control:sleep",waitForClick:"control:waitForClick",label:"control:label",jump:"control:jump"},Wi={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},Zn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},Tn={action:"layer:action",setZIndex:"layer:setZIndex"},kt={action:"video:action",preload:"video:preload",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"},Jt={action:"vfx:action",preload:"vfx:preload",show:"vfx:show",hide:"vfx:hide",pause:"vfx:pause",resume:"vfx:resume",setRate:"vfx:setRate"},et={action:"puppet:action",setMotion:"puppet:setMotion",setExpression:"puppet:setExpression",setSkin:"puppet:setSkin",setParam:"puppet:setParam",setSlot:"puppet:setSlot",command:"puppet:command"};var na=(p=>(p[p.string=0]="string",p[p.number=1]="number",p[p.boolean=2]="boolean",p[p.object=3]="object",p[p.array=4]="array",p[p.function=5]="function",p[p.symbol=6]="symbol",p[p.undefined=7]="undefined",p[p.null=8]="null",p[p.date=9]="date",p[p.regexp=10]="regexp",p[p.other=11]="other",p))(na||{}),ar=(function(o){return typeof o=="string"?0:typeof o=="number"?1:typeof o=="boolean"?2:typeof o=="object"?Array.isArray(o)?4:o===null?8:o instanceof Date?9:o instanceof RegExp?10:3:typeof o=="function"?5:typeof o=="symbol"?6:typeof o>"u"?7:11});ar.DataTypes=na;function j(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,l)=>ar(a)===3&&ar(l)===3?a.constructor!==Object||l.constructor!==Object?l||a:j(a,l):Array.isArray(a)&&Array.isArray(l)?l&&l.length>0?[...l]:[...a]:a===void 0&&Array.isArray(l)?[...l]:l===void 0?Array.isArray(a)?[...a]:a:Array.isArray(l)?[...l]:l;for(let s in o)n(o,s)&&(i[s]=r(s,o[s],e[s]));for(let s in e)n(e,s)&&!n(i,s)&&(typeof e[s]=="object"&&e[s]!==null?e[s].constructor===Object?i[s]=j({},e[s]):Array.isArray(e[s])?i[s]=[...e[s]]:i[s]=e[s]:i[s]=e[s]);if(t.length){let[s,...a]=t;return j(i,s,...a)}return i}var qe=class qe{constructor(e=(n=>n),t){this.solved=!1;this.aborted=!1;this.failed=!1;this.error=null;this.listeners=[];this.failListeners=[];this.settledListeners=[];this.onRegisterSkipController=[];this.skipControllerAbortToken=null;this.settledNotified=!1;this.receiver=e,this.skipController=t,this.__stack=lr()}static isAwaitable(e){return e instanceof qe}static fromPromise(e){let t=new qe;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new qe;return t.resolve(e),t}static delay(e){let t=new qe;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new qe;return e(t),t}static wait(e){let t=new qe;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new qe;return e.length===0?(t.resolve(void 0),t):(e.forEach(n=>{n.then(i=>{e.forEach(r=>{r!==n&&r.skipController?.abort()}),t.resolve(i)}),n.onFailed(i=>t.fail(i))}),t.registerSkipController(new V(()=>{e.forEach(n=>n.skipController?.abort())})),t)}static forward(e,t,n){let i=new qe().registerSkipController(n||new V(()=>t));e.then(()=>i.resolve(t)),e.onFailed(a=>i.fail(a));let r=e.skipController?.onAbort(()=>{i.skipController?.abort(),r?.cancel(),s?.cancel()}),s=i.skipController?.onAbort(()=>{e.skipController?.abort(),r?.cancel(),s?.cancel()});return i}static toPromise(e){return new Promise((t,n)=>{e.then(t),e.onFailed(n)})}static toPromiseForce(e){return new Promise(t=>{e.onSettled(t)})}static any(...e){let t=new qe;return e.length===0?(t.resolve(),t):(e.forEach(n=>{n.onSettled(()=>t.resolve()),n.onFailed(i=>{t.fail(i),e.forEach(r=>{r!==n&&r.abort()})})}),t.registerSkipController(new V(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new qe;if(e.length===0)return t.resolve(),t;let n=0;return e.forEach(i=>{i.onSettled(()=>{n++,n===e.length&&t.resolve()}),i.onFailed(r=>{e.forEach(s=>{s!==i&&s.abort()}),t.fail(r)})}),t.registerSkipController(new V(()=>{e.forEach(i=>i.abort())})),t}registerSkipController(e){this.skipControllerAbortToken?.cancel(),this.skipController=e,this.skipControllerAbortToken=e.onAbort(()=>{this.aborted=!0,this.notifySettled()});for(let t of this.onRegisterSkipController)t(e);return this}resolve(e){if(!this.isSettled()){this.result=this.receiver(e),this.solved=!0,this.skipController&&this.skipController.cancel();for(let t of this.listeners)t(this.result);this.notifySettled()}}fail(e){if(!this.isSettled()){this.error=e,this.failed=!0,this.skipController&&this.skipController.cancel();for(let t of this.failListeners)t(e);this.notifySettled()}}then(e,t){return this.solved?e(this.result):this.failed?t?.(this.error):(this.pushListener(e),t&&this.pushFailListener(t)),this}onSettled(e){if(this.isSettled())e();else return this.settledListeners.push(e),{cancel:()=>{this.offSettledListener(e)}};return{cancel:()=>{}}}onFailed(e){if(this.failed)e(this.error);else if(!this.isSettled())return this.pushFailListener(e),{cancel:()=>{this.offFailListener(e)}};return{cancel:()=>{}}}onSkipControllerRegister(e){return this.skipController?e(this.skipController):this.onRegisterSkipController.push(e),{cancel:()=>{this.offSkipControllerRegister(e)}}}offSkipControllerRegister(e){let t=this.onRegisterSkipController.indexOf(e);return t!==-1&&this.onRegisterSkipController.splice(t,1),this}abort(){return this.isSettled()?this.result:(this.aborted=!0,this.skipController?this.skipController.abort():this.notifySettled(),this.result)}isSolved(){return this.solved&&!this.aborted&&!this.failed}isAborted(){return this.aborted}isFailed(){return this.failed}isSettled(){return this.solved||this.aborted||this.failed}pushListener(e){return this.listeners.length>=qe.maxListeners&&console.warn("NarraLeaf-React: Awaitable has too many listeners, this may cause performance issues."),this.listeners.push(e),this}pushFailListener(e){return this.failListeners.length>=qe.maxListeners&&console.warn("NarraLeaf-React: Awaitable has too many failure listeners, this may cause performance issues."),this.failListeners.push(e),this}offListener(e){let t=this.listeners.indexOf(e);return t!==-1&&this.listeners.splice(t,1),this}offFailListener(e){let t=this.failListeners.indexOf(e);return t!==-1&&this.failListeners.splice(t,1),this}offSettledListener(e){let t=this.settledListeners.indexOf(e);return t!==-1&&this.settledListeners.splice(t,1),this}notifySettled(){if(!this.settledNotified){this.settledNotified=!0;for(let e of this.settledListeners)e()}}};qe.nothing=e=>e,qe.maxListeners=8;var S=qe;function ia(o){let e=new WeakSet;function t(n){if(n===null||typeof n!="object")return n;if(e.has(n))return;if(e.add(n),Array.isArray(n)){let r=[];for(let s of n)r.push(t(s));return r}let i={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(i[r]=t(n[r]));return i}return t(o)}function Nn(o){return typeof o=="string"?o:`#${(o.r||0).toString(16).padStart(2,"0")}${(o.g||0).toString(16).padStart(2,"0")}${(o.b||0).toString(16).padStart(2,"0")}${o.a===void 0?"":o.a.toString(16).padStart(2,"0")}`}var J=class{constructor(){this.events={};this.maxListeners=10}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),this.events[e].length>this.maxListeners&&console.warn(`NarraLeaf-React: Event ${e} has more than ${this.maxListeners} listeners (total: ${this.events[e].length}), this may cause performance issues.`),this.emit("event:EventDispatcher.register",e,t),{type:e,listener:t,cancel:()=>{this.off(e,t)}}}depends(e){return{cancel:()=>{e.forEach(t=>t.cancel())}}}off(e,t){this.events[e]&&(this.events[e]=this.events[e].filter(n=>n!==t))}emit(e,...t){if(!this.events[e])return 0;let n=this.events[e].length;return this.events[e].forEach(i=>{i(...t)}),n}once(e,t){let n=(...i)=>{t(...i),this.off(e,n)};return this.on(e,n)}async any(e,...t){if(this.events[e]||(this.events[e]=[]),this.events[e].length>0){await Promise.all(this.events[e].map(n=>n(...t)));return}return new Promise(n=>{let i="event:EventDispatcher.register",r=this.on(i,(s,a)=>{if(s===e){this.off(i,r);let l=a?.(...t);l!==null&&typeof l=="object"&&l.then?l.then(n):n(l)}}).listener})}setMaxListeners(e){return this.maxListeners=e,this}hasListeners(e){return this.events[e]?.length>0}clear(){this.events={}}};function lr(o=1){let e=new Error().stack;return e?e.split(`
1
+ var me={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",applyLoop:"displayable:applyLoop",stopLoop:"displayable:stopLoop",init:"displayable:init",bringToFront:"displayable:bringToFront"},Jt={say:"character:say",action:"character:action",setName:"character:setName"},W={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",callTo:"scene:callTo",preSuspend:"scene:preSuspend",resume:"scene:resume",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var mt={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},na={action:"condition:action"},ia={action:"script:action"},oa={action:"menu:action"},Ot={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute",seek:"sound:seek"},se={action:"control:action",do:"control:do",doAsync:"control:doAsync",any:"control:any",all:"control:all",allAsync:"control:allAsync",repeat:"control:repeat",while:"control:while",break:"control:break",sleep:"control:sleep",waitForClick:"control:waitForClick",label:"control:label",jump:"control:jump"},Bi={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},Zn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},bn={action:"layer:action",setZIndex:"layer:setZIndex"},Pt={action:"video:action",preload:"video:preload",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"},Zt={action:"vfx:action",preload:"vfx:preload",show:"vfx:show",hide:"vfx:hide",pause:"vfx:pause",resume:"vfx:resume",setRate:"vfx:setRate"},et={action:"puppet:action",setMotion:"puppet:setMotion",setExpression:"puppet:setExpression",setSkin:"puppet:setSkin",setParam:"puppet:setParam",setSlot:"puppet:setSlot",command:"puppet:command"};var ra=(d=>(d[d.string=0]="string",d[d.number=1]="number",d[d.boolean=2]="boolean",d[d.object=3]="object",d[d.array=4]="array",d[d.function=5]="function",d[d.symbol=6]="symbol",d[d.undefined=7]="undefined",d[d.null=8]="null",d[d.date=9]="date",d[d.regexp=10]="regexp",d[d.other=11]="other",d))(ra||{}),ur=(function(o){return typeof o=="string"?0:typeof o=="number"?1:typeof o=="boolean"?2:typeof o=="object"?Array.isArray(o)?4:o===null?8:o instanceof Date?9:o instanceof RegExp?10:3:typeof o=="function"?5:typeof o=="symbol"?6:typeof o>"u"?7:11});ur.DataTypes=ra;function j(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,l)=>ur(a)===3&&ur(l)===3?a.constructor!==Object||l.constructor!==Object?l||a:j(a,l):Array.isArray(a)&&Array.isArray(l)?l&&l.length>0?[...l]:[...a]:a===void 0&&Array.isArray(l)?[...l]:l===void 0?Array.isArray(a)?[...a]:a:Array.isArray(l)?[...l]:l;for(let s in o)n(o,s)&&(i[s]=r(s,o[s],e[s]));for(let s in e)n(e,s)&&!n(i,s)&&(typeof e[s]=="object"&&e[s]!==null?e[s].constructor===Object?i[s]=j({},e[s]):Array.isArray(e[s])?i[s]=[...e[s]]:i[s]=e[s]:i[s]=e[s]);if(t.length){let[s,...a]=t;return j(i,s,...a)}return i}var qe=class qe{constructor(e=(n=>n),t){this.solved=!1;this.aborted=!1;this.failed=!1;this.error=null;this.listeners=[];this.failListeners=[];this.settledListeners=[];this.onRegisterSkipController=[];this.skipControllerAbortToken=null;this.settledNotified=!1;this.receiver=e,this.skipController=t,this.__stack=pr()}static isAwaitable(e){return e instanceof qe}static fromPromise(e){let t=new qe;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new qe;return t.resolve(e),t}static delay(e){let t=new qe;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new qe;return e(t),t}static wait(e){let t=new qe;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new qe;return e.length===0?(t.resolve(void 0),t):(e.forEach(n=>{n.then(i=>{e.forEach(r=>{r!==n&&r.skipController?.abort()}),t.resolve(i)}),n.onFailed(i=>t.fail(i))}),t.registerSkipController(new U(()=>{e.forEach(n=>n.skipController?.abort())})),t)}static forward(e,t,n){let i=new qe().registerSkipController(n||new U(()=>t));e.then(()=>i.resolve(t)),e.onFailed(a=>i.fail(a));let r=e.skipController?.onAbort(()=>{i.skipController?.abort(),r?.cancel(),s?.cancel()}),s=i.skipController?.onAbort(()=>{e.skipController?.abort(),r?.cancel(),s?.cancel()});return i}static toPromise(e){return new Promise((t,n)=>{e.then(t),e.onFailed(n)})}static toPromiseForce(e){return new Promise(t=>{e.onSettled(t)})}static any(...e){let t=new qe;return e.length===0?(t.resolve(),t):(e.forEach(n=>{n.onSettled(()=>t.resolve()),n.onFailed(i=>{t.fail(i),e.forEach(r=>{r!==n&&r.abort()})})}),t.registerSkipController(new U(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new qe;if(e.length===0)return t.resolve(),t;let n=0;return e.forEach(i=>{i.onSettled(()=>{n++,n===e.length&&t.resolve()}),i.onFailed(r=>{e.forEach(s=>{s!==i&&s.abort()}),t.fail(r)})}),t.registerSkipController(new U(()=>{e.forEach(i=>i.abort())})),t}registerSkipController(e){this.skipControllerAbortToken?.cancel(),this.skipController=e,this.skipControllerAbortToken=e.onAbort(()=>{this.aborted=!0,this.notifySettled()});for(let t of this.onRegisterSkipController)t(e);return this}resolve(e){if(!this.isSettled()){this.result=this.receiver(e),this.solved=!0,this.skipController&&this.skipController.cancel();for(let t of this.listeners)t(this.result);this.notifySettled()}}fail(e){if(!this.isSettled()){this.error=e,this.failed=!0,this.skipController&&this.skipController.cancel();for(let t of this.failListeners)t(e);this.notifySettled()}}then(e,t){return this.solved?e(this.result):this.failed?t?.(this.error):(this.pushListener(e),t&&this.pushFailListener(t)),this}onSettled(e){if(this.isSettled())e();else return this.settledListeners.push(e),{cancel:()=>{this.offSettledListener(e)}};return{cancel:()=>{}}}onFailed(e){if(this.failed)e(this.error);else if(!this.isSettled())return this.pushFailListener(e),{cancel:()=>{this.offFailListener(e)}};return{cancel:()=>{}}}onSkipControllerRegister(e){return this.skipController?e(this.skipController):this.onRegisterSkipController.push(e),{cancel:()=>{this.offSkipControllerRegister(e)}}}offSkipControllerRegister(e){let t=this.onRegisterSkipController.indexOf(e);return t!==-1&&this.onRegisterSkipController.splice(t,1),this}abort(){return this.isSettled()?this.result:(this.aborted=!0,this.skipController?this.skipController.abort():this.notifySettled(),this.result)}isSolved(){return this.solved&&!this.aborted&&!this.failed}isAborted(){return this.aborted}isFailed(){return this.failed}isSettled(){return this.solved||this.aborted||this.failed}pushListener(e){return this.listeners.length>=qe.maxListeners&&console.warn("NarraLeaf-React: Awaitable has too many listeners, this may cause performance issues."),this.listeners.push(e),this}pushFailListener(e){return this.failListeners.length>=qe.maxListeners&&console.warn("NarraLeaf-React: Awaitable has too many failure listeners, this may cause performance issues."),this.failListeners.push(e),this}offListener(e){let t=this.listeners.indexOf(e);return t!==-1&&this.listeners.splice(t,1),this}offFailListener(e){let t=this.failListeners.indexOf(e);return t!==-1&&this.failListeners.splice(t,1),this}offSettledListener(e){let t=this.settledListeners.indexOf(e);return t!==-1&&this.settledListeners.splice(t,1),this}notifySettled(){if(!this.settledNotified){this.settledNotified=!0;for(let e of this.settledListeners)e()}}};qe.nothing=e=>e,qe.maxListeners=8;var S=qe;function sa(o){let e=new WeakSet;function t(n){if(n===null||typeof n!="object")return n;if(e.has(n))return;if(e.add(n),Array.isArray(n)){let r=[];for(let s of n)r.push(t(s));return r}let i={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(i[r]=t(n[r]));return i}return t(o)}function Nn(o){return typeof o=="string"?o:`#${(o.r||0).toString(16).padStart(2,"0")}${(o.g||0).toString(16).padStart(2,"0")}${(o.b||0).toString(16).padStart(2,"0")}${o.a===void 0?"":o.a.toString(16).padStart(2,"0")}`}var Q=class{constructor(){this.events={};this.maxListeners=10}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),this.events[e].length>this.maxListeners&&console.warn(`NarraLeaf-React: Event ${e} has more than ${this.maxListeners} listeners (total: ${this.events[e].length}), this may cause performance issues.`),this.emit("event:EventDispatcher.register",e,t),{type:e,listener:t,cancel:()=>{this.off(e,t)}}}depends(e){return{cancel:()=>{e.forEach(t=>t.cancel())}}}off(e,t){this.events[e]&&(this.events[e]=this.events[e].filter(n=>n!==t))}emit(e,...t){if(!this.events[e])return 0;let n=this.events[e].length;return this.events[e].forEach(i=>{i(...t)}),n}once(e,t){let n=(...i)=>{t(...i),this.off(e,n)};return this.on(e,n)}async any(e,...t){if(this.events[e]||(this.events[e]=[]),this.events[e].length>0){await Promise.all(this.events[e].map(n=>n(...t)));return}return new Promise(n=>{let i="event:EventDispatcher.register",r=this.on(i,(s,a)=>{if(s===e){this.off(i,r);let l=a?.(...t);l!==null&&typeof l=="object"&&l.then?l.then(n):n(l)}}).listener})}setMaxListeners(e){return this.maxListeners=e,this}hasListeners(e){return this.events[e]?.length>0}clear(){this.events={}}};function pr(o=1){let e=new Error().stack;return e?e.split(`
2
2
  `).slice(o+1).join(`
3
- `).trim():""}function _i(o){return new Promise(e=>setTimeout(e,o))}var qi=class qi{constructor(e){this.abortHandler=e;this.events=new J;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(qi.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};qi.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=qi;var ei=class{constructor(){this.locked=!1;this.listeners=[];this.unlockListeners=[]}lock(){return this.locked=!0,this}unlock(){this.locked=!1;for(let e of this.listeners)e();for(let e of this.unlockListeners)e();return this.listeners=[],this}onUnlock(e){return this.unlockListeners.push(e),e}offUnlock(e){this.unlockListeners=this.unlockListeners.filter(t=>t!==e)}async nextUnlock(){if(this.locked)return new Promise(e=>{this.listeners.push(e)})}isLocked(){return this.locked}},Mn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new ei;return this.locks.push(t),t}off(e){this.locks=this.locks.filter(t=>t!==e)}async nextUnlock(){let e=this.locks.map(t=>t.nextUnlock());return Promise.all(e)}isLocked(){return this.locks.some(e=>e.isLocked())}};function Gn(o,e,t={}){return o?e:t}function oa(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var Bi=class{constructor(){this.taskToken=null}scheduleTask(e,t){this.taskToken&&this.taskToken.cancel();let n=!1,i=setTimeout(()=>{n||e()},t);return this.taskToken={cancel:()=>{clearTimeout(i),n=!0},isCancelled:()=>n},this.taskToken}cancelTask(){return this.taskToken&&(this.taskToken.cancel(),this.taskToken=null),this}};function ra(o,e){let t=[];for(let n=0;n<Math.max(o.length,e.length);n++)n<o.length&&t.push(o[n]),n<e.length&&t.push(e[n]);return t}async function sa(o,e){let n=await(await fetch(o,e)).blob();return URL.createObjectURL(n)}var bn=class{constructor(e,t){this.concurrency=e;this.delay=t;this.tasks=[]}addTask(e){this.tasks.push(e)}get size(){return this.tasks.length}async start(){let e=async()=>{if(this.tasks.length===0)return;let t=this.tasks.splice(0,this.concurrency);await Promise.all(t.map(n=>n())),this.tasks.length!==0&&(await _i(this.delay),await e())};await e()}};function st(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function aa(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var _e=class o{constructor(e={},t={}){this.serializer=e;this.deserializer=t}serialize(e){let t={};for(let n of Object.keys(e))n in this.serializer&&e[n]!==void 0?t[n]=this.serializer[n]?.(e[n]):t[n]=e[n];return t}deserialize(e){let t={};for(let n of Object.keys(e))typeof this.deserializer[n]=="function"&&e[n]!==void 0?t[n]=this.deserializer[n](e[n]):t[n]=e[n];return t}extend(e,t){let n={...this.serializer,...e},i={...this.deserializer,...t};return new o(n,i)}};function la(o){return["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"].includes(o)}function ca(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ti(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function cr(o,e=new WeakSet){if(o===null||typeof o!="object"||Array.isArray(o)||o instanceof Date||o instanceof RegExp||Object.getPrototypeOf(o)!==Object.prototype||e.has(o))return!1;e.add(o);for(let t in o)if(Object.prototype.hasOwnProperty.call(o,t)){let n=o[t];if(n!==null&&typeof n=="object"&&!cr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var zi=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Yi(o=16){let e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=t.length;for(let i=0;i<o;i++)e+=t.charAt(Math.floor(Math.random()*n));return e}function ua(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Ki=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},$i=class{constructor(){this.hooks={}}hook(e,t){return this.hooks[e]=this.hooks[e]||[],this.hooks[e].push(t),{cancel:()=>this.unhook(e,t)}}unhook(e,t){this.hooks[e]=this.hooks[e]?.filter(n=>n!==t)||[]}trigger(e,t){let n=this.hooks[e];if(!n)return()=>{};let i=n.map(r=>r(...t));return()=>{i.forEach(r=>r&&r())}}rawTrigger(e,t){let n=this.hooks[e];if(!n)return()=>{};let i=n.map(r=>r(...t()));return()=>{i.forEach(r=>r&&r())}}};var ji=class{constructor(e){this.items=[];this.pushValidator=[];e&&(this.items=[...e])}addPushValidator(e){return this.pushValidator.push(e),this}removePushValidator(e){this.pushValidator=this.pushValidator.filter(t=>t!==e)}push(...e){for(let t of e)this.pushValidator.some(n=>!n(t))||this.items.push(t)}pop(){return this.items.pop()}peek(){return this.items[this.items.length-1]}isEmpty(){return this.items.length===0}size(){return this.items.length}clear(){this.items=[]}toArray(){return[...this.items]}forEach(e){this.items.forEach(e)}forEachReverse(e){for(let t=this.items.length-1;t>=0;t--)e(this.items[t])}map(e){return this.items.map(e)}get(e){return this.items[e]}};function pa(o,e){let t={},n=[];for(let i in o)Object.prototype.hasOwnProperty.call(o,i)&&(e.includes(i)?n.push(i):t[i]=o[i]);return[t,n]}function da(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,l=16777216,c=r*a>>>0,u=r*l+s*a>>>0,d=s*l+(u>>>0)>>>0;e=c,t=d}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var ni=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=lr(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}abandon(e){}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};ni.ActionTypes={action:"action"};var Y=class extends ni{constructor(e,t,n){super(e,t,n),this.callee=e.getSelf(),this.contentNode.action=this}unknownTypeError(){throw new Error("Unknown action type: "+this.type)}resolveAwaitable(e,t){let n=t||new S(i=>i);return(async()=>await e(n.resolve.bind(n),n))(),n}is(e,t){return this instanceof e&&this.type===t}stringify(e,t,n){return this.stringifyWithName("Action")}stringifyWithName(e){return`${e}#${this._id}(${this.type})`}stringifyWithContent(e,t){return`${e}#${this._id}(${this.type}){${t}}`}};var ve=class ve extends Y{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await ve.initBackgroundMusic(e,r,n),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t,n){n?.isSceneSuspended(e)||e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new Z("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);if(t.addElement(r),t.setSceneSuspended(n,e.element.suspended===!0),n.local.getNamespace(t.getStorable()).load(e.local),e.state){let[,s]=t.getLiveGame().constructMaps();n.fromData(e.state,s)}e.background&&n.background.fromData(e.background)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new V(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),l=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{r.isSettled()||r.abort(),a.abort()}),r}static unloadScene(e,t){t.settlePendingLines(e),t.getStorable().removeNamespace(e.local.getNamespaceName()),t.offSrcManager(e.srcManager).removeScene(e),e.state.backgroundImage.reset()}static unwindCallStack(e){let t=e.getSuspendedScenes(),n=t.map(i=>[i,ve.createSceneSnapshot(i,e)]);return t.forEach(i=>{i.events.emit("event:scene.preUnmount"),ve.unloadScene(i,e)}),n}static rewindCallStack(e,t){e.forEach(([n,i])=>{let r=new S(s=>s);t.timelines.attachTimeline(r),ve.handleSceneInit(n,{type:W.callTo,node:null},t,r),ve.restoreSceneSnapshot(i,t),t.setSceneSuspended(n,!0)})}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}abandon(e){if(this.type!==W.resume)return;let t=this.contentNode.getContent()[0],n=this.callee,i=n.state.backgroundMusic;e.isSceneActive(t)&&(t.events.emit("event:scene.preUnmount"),ve.unloadScene(t,e)),e.setSceneSuspended(n,!1),i&&e.audioManager.isManaged(i)&&e.audioManager.resume(i,n.config.backgroundMusicFade)}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new S(c=>c),l=null;return a.registerSkipController(new V(()=>(l&&(clearTimeout(l),l=null),s))),l=e.setTimeout(()=>{l=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===W.action)return super.executeAction(e,t);if(this.is(ve,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{ve.unloadScene(this.callee,e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return ve.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===W.exit){let n=ve.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),ve.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),ve.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===W.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize(),s=ve.unwindCallStack(e);e.actionHistory.push({action:this,stackModel:t.stackModel},(l,c)=>{ve.rewindCallStack(c,e);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(l,u)},[r,s]);let a=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:a}),null}else if(this.type===W.preSuspend){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));if(e.isSceneActive(i))throw new Z(`Cannot call scene ${this.getSceneName(n)}: it is already on stage.
4
- A returnable jump suspends the scene it leaves rather than unloading it, so a scene cannot be called from itself or from anything it has called.`,this);if(e.isSceneSuspended(this.callee))throw this._callerAlreadyParkedError(n);let r=e.getSuspendedScenes().length,s=e.game.config.maxSceneCallDepth;if(r>=s)throw new Z(`Scene call depth limit reached (${s}).
5
- Each returnable jump keeps the scene it left mounted, so a chain of them holds every scene in the chain on the stage at once. Raise maxSceneCallDepth if the story really needs to go this deep.`,this);let a=this.callee.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{a&&e.audioManager.isManaged(a)&&e.audioManager.resume(a,0)},[]),a&&e.audioManager.isManaged(a)&&e.audioManager.pause(a,this.callee.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===W.callTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=this.contentNode.getChild();if(!r?.action)throw new xe("A scene call has no return address. `scene:callTo` is only ever built with a `scene:resume` chained behind it (see Scene._callScene).");let s=this.callee;if(e.isSceneSuspended(s))throw this._callerAlreadyParkedError(n);let a=e.getLiveGame().getStackModelForce().serialize();e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{e.setSceneSuspended(s,!1);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(c,u)},[a]),e.setSceneSuspended(s,!0);let l=i.getSceneRoot().contentNode;return[{type:this.type,node:r},{type:this.type,node:l}]}else if(this.type===W.resume){let n=this.contentNode.getContent()[0],i=this.callee,r=i.state.backgroundMusic,s=ve.createSceneSnapshot(n,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let l=new S(c=>c);e.timelines.attachTimeline(l),ve.handleSceneInit(n,{type:this.type,node:this.contentNode.getChild()},e,l),ve.restoreSceneSnapshot(a,e),e.setSceneSuspended(i,!0),r&&e.audioManager.isManaged(r)&&e.audioManager.pause(r,0)},[s]),n.events.emit("event:scene.preUnmount"),ve.unloadScene(n,e),e.setSceneSuspended(i,!1),r&&e.audioManager.isManaged(r)&&e.audioManager.resume(r,i.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===W.setBackgroundMusic){let[n,i]=this.contentNode.getContent(),r=this.callee,s=e.getExposedStateForce(r),a=r.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{s.setBackgroundMusic(l,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===W.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===W.transitionToScene){let[n,i]=this.contentNode.getContent();return this.applyStageTransition(e,n,i,t)}else if(this.type===W.nvlBlock){let[n,i]=this.contentNode.getContent(),r=e.createNvlSnapshot();return e.enterNvlMode(i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{e.restoreNvlSnapshot(s)},[r]),n.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]}else if(this.type===W.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=S.isAwaitable(r)?e.timelines.attachTimeline(r):void 0;return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:s},a=>{e.setNvlVisibility(a)},[i]),r}else if(this.type===W.nvlHide){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!1,n,t),s=S.isAwaitable(r)?e.timelines.attachTimeline(r):void 0;return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:s},a=>{e.setNvlVisibility(a)},[i]),r}else if(this.type===W.nvlEnd){let[n]=this.contentNode.getContent(),i=e.createNvlSnapshot();return e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{e.restoreNvlSnapshot(r)},[i]),e.exitNvlMode(n||null),{type:this.type,node:null}}}throw new Error("Unknown scene action type: "+this.type)}getFutureActions(e,t={}){if(this.type===W.callTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=r.getSceneRoot()?.contentNode,a=this.contentNode.getChild()?.action;return[...s?.action?[s.action]:[],...a?[a]:[]]}if(this.type===W.jumpTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=e.getScene(i,!0).getSceneRoot()?.contentNode;return s?.action?[s.action]:[]}if(this.type===W.nvlBlock){let[i]=this.contentNode.getContent(),r=super.getFutureActions(e,t);return[...i??[],...r]}let n=this.contentNode.getChild()?.action;return n?[n]:[]}_sceneNotFoundError(e){return new Z(`Scene with name ${e} not found
6
- Make sure you have registered the scene using story.register`,this)}_callerAlreadyParkedError(e){let t=this.getSceneName(this.callee);return new Z(`Cannot call scene ${this.getSceneName(e)} from ${t}: ${t} is already parked behind another call.
7
- A returnable jump suspends the scene it is taken from, and a scene has one place on the stage, so two calls cannot be open from the same scene at the same time. Take the calls one after the other in a single branch rather than one per branch of a concurrent group.`,this)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===W.callTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`callTo {${i.stringify(e,t,n)}}`)}if(this.type===W.jumpTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`jumpTo {${i.stringify(e,t,n)}}`)}return super.stringifyWithName("SceneAction")}};ve.ActionTypes=W;var te=ve;var ur=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},x=class o extends ur{static create(e){return new o().setContent(e)}static forEachParent(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getParent()}static forEachChild(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getChild()}constructor(e,t,n){super("ContentNode"),this.child=n||null,this.parent=t||null,this.action=e||null}setParent(e){if(e===this)throw new Error("Cannot set parent to itself");return this.parent&&this.parent.setChild(null),this.parent=e,this}setChild(e){if(e===this)throw new Error("Cannot set child to itself");return this.child&&(this.child.parent=null),this.child=e,e&&e.parent!==this&&(e.remove(),e.parent=this),this}getChild(){return this.child||null}getParent(){return this.parent||null}addChild(e){return this.setChild(e),this}removeChild(e){return e&&this.child===e?(this.child=null,e.setParent(null)):e||(this.child=null),this}remove(){return this.parent&&this.parent.removeChild(this),this.child&&this.child.setParent(null),this}hasChild(){return!!this.child}};var Xi={center:"center",left:"left",right:"right"};import{animate as fa}from"motion/react";var Fn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(Fn||{}),ma={left:"33.33%",center:"50%",right:"66.66%"},ht=class ht{static isUnknown(e){return e===ht.Unknown}static D2PositionToCSS(e,t=!1,n=!1,i){let r=this.calc(e.y,e.yoffset,i?.height),s=this.calc(e.x,e.xoffset,i?.width),a=n?{bottom:r}:{top:r},l=t?{right:s}:{left:s};return this.wrap({...a,...l})}static calc(e,t,n){if(e==null||e===""||ht.isUnknown(e))return"auto";let i=!(t===void 0||ht.isUnknown(t));if(typeof n=="number"&&n>0){let s=ht.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}let r=typeof e=="number"?`${e}px`:e;return i?`calc(${r} + ${t}px)`:`calc(${r} + 0px)`}static toPercent(e,t){if(typeof e=="number")return t>0?e/t*100:null;let n=/^(-?\d+(?:\.\d+)?)%$/.exec(e.trim());return n?parseFloat(n[1]):null}static toCoord2D(e){if(at.isCommonPositionType(e))return gt.fromCommonPosition(e);if(gt.isCoord2DPosition(e))return e;if(An.isAlignPosition(e))return gt.fromAlignPosition(e);if(typeof e=="object"&&e!==null&&["x","y","xalign","yalign","xoffset","yoffset"].some(t=>t in e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static orUnknown(e){return ht.isUnknown(e)||e===void 0?ht.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return gt.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:ht.isUnknown(t.x)?0:t.x,y:ht.isUnknown(t.y)?0:t.y,xoffset:ht.isUnknown(t.xoffset)?0:t.xoffset,yoffset:ht.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(Fn).includes(e)}static isRawCoord2DPosition(e){return typeof e=="object"&&("x"in e||"y"in e||"xoffset"in e||"yoffset"in e)}static isRawAlignPosition(e){return typeof e=="object"&&e!==null&&("xalign"in e||"yalign"in e)}static isRawPosition(e){return this.isRawCommonPositionType(e)||this.isRawCoord2DPosition(e)||this.isRawAlignPosition(e)}static isPosition(e){return e instanceof at||e instanceof gt||e instanceof An}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return gt.fromCommonPosition(new at(e));if(this.isRawAlignPosition(e))return gt.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new gt(e);throw new Error("Invalid position type")}static tryParsePosition(e){if(this.isPosition(e))return e;if(this.isRawPosition(e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static wrap(e){return{left:"auto",top:"auto",right:"auto",bottom:"auto",...e}}};ht.Unknown=Symbol("Unknown");var H=ht,Qi=class Qi{static isCommonPositionType(e){return e instanceof Qi}constructor(e){this.position=e}toCSS(){return{x:ma[this.position],y:"50%",xoffset:0,yoffset:0}}};Qi.Positions=Fn;var at=Qi,gt=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:ma[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>typeof n!="number"||!Number.isFinite(n)?H.Unknown:`${n*100}%`;return new o({x:t(e.xalign),y:t(e.yalign),xoffset:e.xoffset,yoffset:e.yoffset})}static merge(e,t){return new o({x:H.isUnknown(t.x)?e.x:t.x,y:H.isUnknown(t.y)?e.y:t.y,xoffset:H.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:H.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=H.orUnknown(e.x),this.y=H.orUnknown(e.y),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.x=H.orUnknown(e),this.y=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){let e=t=>/^-?\d+(\.\d+)?%$/.test(t);if(typeof this.x=="string"&&!e(this.x))throw new Error(`Invalid x position: ${this.x}`);if(typeof this.y=="string"&&!e(this.y))throw new Error(`Invalid y position: ${this.y}`)}toCSS(){return{x:this.x,y:this.y,xoffset:this.xoffset,yoffset:this.yoffset}}},An=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=H.orUnknown(e.xalign),this.yalign=H.orUnknown(e.yalign),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.xalign=H.orUnknown(e),this.yalign=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){if(typeof this.xalign=="number"&&isNaN(this.xalign))throw new Error("Invalid xalign position: "+this.xalign);if(typeof this.yalign=="number"&&isNaN(this.yalign))throw new Error("Invalid yalign position: "+this.yalign)}toCSS(){return{x:H.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:H.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var K=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new pr(this.mergeWithDefaultConfig(e))}copy(){return new o(j({},this.defaultConfig),this.handlers)}keys(){return Object.keys(this.defaultConfig)}getDefaultConfig(){return this.defaultConfig}mergeWithDefaultConfig(e){return Object.fromEntries(Object.entries(this.defaultConfig).map(([t,n])=>[t,this.mergeValue(t,n,e[t])]))}mergeValue(e,t,n){return this.isPlainObject(n)?j({},n):Array.isArray(t)?Array.isArray(n)&&n.length>0?[...n]:[...t]:n!==void 0?this.applyHandler(e,n):t}isPlainObject(e){return typeof e=="object"&&!Array.isArray(e)&&e!==null&&Object.getPrototypeOf(e)===Object.prototype}applyHandler(e,t){return typeof this.handlers[e]=="function"?this.handlers[e](t):t}},pr=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(j({},this.config))}join(e){let t=aa(this.config,Object.keys(e));return new o(Object.assign(t,e instanceof o?e.get():e))}extract(e){let t={},n={};for(let i of e)t[i]=this.config[i];for(let i in this.config)e.includes(i)||(n[i]=this.config[i]);return[new o(t),new o(n)]}assign(e){return new o(Object.assign({},this.config,e))}};var jc={[Xi.left]:"25.33%",[Xi.center]:"50%",[Xi.right]:"75.66%"},Pt=class Pt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new Pt(Pt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){if("position"in e&&"position"in t){let n=this.mergePosition(e.position,t.position);return{...Object.assign({},e,t),position:n}}return{...Object.assign({},e,t)}}get(){return this.state}freeze(){return this.frozen=!0,this}assign(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Pt.mergeState(this.state,t),this}lock(){if(this.locked)throw new Error("Transform state is already locked.");return this.locked=Symbol(),this.locked}isLocked(){return!!this.locked}canWrite(e){return this.locked===null||this.locked===e}unlock(e){return this.locked===e&&(this.locked=null),this}toFramesDefinition(e,t){return ti(ee.constructStyle(e,this.state,t))}toStyle(e,t){return ti(ee.constructStyle(e,this.state,t))}serialize(){return Pt.TransformStateSerializer.serialize(this.state)}clone(){return new Pt(Pt.mergeState({},this.state))}overwrite(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Pt.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}resetTo(e){return this.state=e,this.locked=null,this.frozen=!1,this}};Pt.DefaultTransformState=new K({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new at("center"),opacity:0,alt:"",maskImage:void 0,maskSize:void 0,maskPosition:void 0,maskRepeat:void 0,maskMode:void 0,clipPath:void 0,filter:void 0,backdropFilter:void 0,mixBlendMode:void 0}),Pt.TransformStateSerializer=new _e({position:e=>H.serializePosition(H.tryParsePosition(e))},{position:e=>H.toCoord2D(e)});var ne=Pt,Re=class Re{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Re.defaultConfig,t||{});else{let[n,i]=[e,t||Re.defaultOptions];this.sequences.push({props:n,options:i||Re.defaultOptions}),this.config=Object.assign({},Re.defaultConfig)}}static isPosition(e){return at.isCommonPositionType(e)||gt.isCoord2DPosition(e)||An.isAlignPosition(e)}static immediate(e){return new Re(e,{duration:0,ease:"linear"})}static left(e,t){return new Re({position:at.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Re({position:at.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Re({position:at.Positions.Center},{duration:e,ease:t})}static create(e){return new Re([],e)}static positionToCSS(e,t,n,i){return e?H.isRawPosition(e)?H.D2PositionToCSS(H.rawPositionToCoord2D(e),n,t,i):H.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...j(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,l=function(p,h,g){return typeof p>"u"?typeof g<"u"?h(g):"":h(p)},c=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${c}, ${u})`,l(t.rotation,p=>`rotate(${p}deg)`,0),l(t.scaleX,p=>`scaleX(${p*a})`,1),l(t.scaleY,p=>`scaleY(${p*a})`,1)].filter(Boolean).join(" ")}static constructStyle(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{overwrite:s}=n||{},a=e.game?.config,l=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...Re.positionToCSS(t.position,i,r,l),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?Nn(t.fontColor):void 0,transform:Re.propToCSSTransform(e,t),...Re.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i,companionRefs:r}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:s,sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(m=>!!m.ref.current).map(({ref:m,project:y})=>({el:m.current,project:y}))});if(a.length||t.logger.warn("Transform","No sequences to animate."),l.repeat!==void 0&&!Number.isFinite(l.repeat))throw new Z("A transform applied with `transform()` (or `show`, `hide`, `pos`, ...) has to end, but this one repeats forever.\nUse `element.loop(transform)` for a motion that runs until it is stopped - the line does not wait for it, and `element.stopLoop()` ends it.");let c=!1,u=e.lock(),d=fa(a,l),p=()=>{e.overwrite(u,s.get()).unlock(u),d.complete(),c=!0},h=new S().registerSkipController(new V(p)),g=()=>{c||e.overwrite(u,s.get()).unlock(u),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),h.resolve()};return d.then(g,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{g()}catch{h.resolve()}})),d.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:s,sequences:a,options:l},this),h}startLoop(e,{gameState:t,ref:n,overwrites:i,companionRefs:r},s){if(!n.current)throw new Error("No ref found when looping.");this.commit();let{sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(d=>!!d.ref.current).map(({ref:d,project:p})=>({el:d.current,project:p}))});a.length||t.logger.warn("Transform","No sequences to loop.");let c=[n.current,ti(e.toFramesDefinition(t,i)),{duration:0}],u=fa([c,...a],{...l,repeat:1/0,repeatType:s?.repeatType??l.repeatType??"loop",repeatDelay:s?.repeatDelay!==void 0?this.toSeconds(s.repeatDelay,void 0):l.repeatDelay});return u.play(),t.logger.debug("Transform","Loop started.",{sequences:a,options:l},this),{stop:()=>{u.stop()}}}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...Re.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i,companions:r}){let s=t.clone(),a=s.lock(),l=this.sequences.flatMap(({props:c,options:u})=>{let d=s.assign(a,c),p=d.toFramesDefinition(e,n),h=this.getOptions(u),g=[i,p,h];if(!r||!r.length)return[g];let m=d.get();return[g,...r.map(({el:y,project:T})=>[y,ti(T(m)),{...h,at:"<"}])]});return{finalState:s.unlock(a).freeze(),sequences:l,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t,repeatType:n}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0),repeatType:n}}copy(){return new Re(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}lens(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new Z("Invalid at definition. At definition must be a number or a string in the format of `+n` or `-n`.");let[i,r,s]=n,a=Number(s);if(isNaN(a))throw new Z("Invalid number in at definition.");let l=a/1e3;return r==="+"?`+${l}`:`-${l}`}};Re.defaultConfig={sync:!0},Re.defaultOptions={duration:0,ease:"linear"},Re.CommonImagePositionMap=jc;var ee=Re;var Ji=class{constructor(){this.id="";this._staticId=null;this._dirty=!1}setId(e){this.id=e}getId(){return this.id}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}markDirty(){return this._dirty=!0,this}isDirty(){return this._dirty}reset(){this._dirty=!1}fromData(e){return this}construct(e){for(let t=0;t<e.length;t++){let n=e[t];t!==0&&e[t-1]?.contentNode.setChild(n.contentNode)}return e}};var ha=Symbol("_Chained"),ga;ga=ha;var dr=class dr{constructor(e){this[ga]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[ha]}static toActions(e){return e.flat(2).map(t=>dr.isChained(t)?t.fromChained(t):t).flat(3)}push(...e){this.__actions.push(...e)}getActions(){return this.__actions}getSelf(){return this.__self}newChain(){return this.getSelf().chain()}},ze=dr,On=class extends Ji{chain(e){let t=ze.isChained(this)?this:this.proxy(this,new ze(this));if(!e)return t;let n=Array.isArray(e)?e:[e];return t.push(...n),t}proxy(e,t){let n=new Proxy(e,{get:function(i,r){if(r in t)return t[r];let s=i[r];return typeof s=="function"?s.bind(n):s},set:function(i,r,s){return i[r]=s,!0}});return n}combineActions(e,t){let n=t(this.chain().newChain()),i=e.do([n]).getActions()[0];return this.chain(i)}};var pe=class extends On{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var Ot=class extends Y{executeAction(e,t){let n=this.callee.evaluate(this.contentNode.getContent(),{gameState:e});return n?.length?[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]:super.executeAction(e,t)}getFutureActions(e,t){return[...this.callee._getFutureActions(),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=s=>{let a=s.condition?n?s.condition.toString():"Lambda(unknown)":"null",l=s.action?s.action.map(c=>c.stringify(e,t,n)).join(";"):"null";return`(${a}) {${l}}`};return super.stringifyWithContent("Condition",`if ${r(i.If)} ${i.ElseIf.length>0?`else if ${i.ElseIf.map(r).join(";")} `:""}${i.Else?`else {${r(i.Else)}}`:""}`)}};Ot.ActionTypes=Zs;var ii=64;function va(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function mr(o){return o.length?o.map(e=>typeof e=="number"?`[${e}]`:`.${e}`).join(""):"the value itself"}function Zi(o,e=0,t=new Set){if(e>ii)return!1;if(typeof o=="number"||typeof o=="string"||typeof o=="boolean"||o==null||o instanceof Date)return!0;if(typeof o!="object"||t.has(o))return!1;t.add(o);try{return Array.isArray(o)?o.every(n=>Zi(n,e+1,t)):va(o)?Object.values(o).every(n=>Zi(n,e+1,t)):!1}finally{t.delete(o)}}function Sa(o,e){let t=[],n=[];return{data:fr(o,[],0,new Set,t,n,e),dates:t,undefineds:n}}function fr(o,e,t,n,i,r,s){if(t>ii)throw new E(`A stored value nests deeper than ${ii} levels and cannot be saved
8
- at ${s}, ${mr(e)}
3
+ `).trim():""}function _i(o){return new Promise(e=>setTimeout(e,o))}var qi=class qi{constructor(e){this.abortHandler=e;this.events=new Q;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(qi.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};qi.EventTypes={"event:skipController.abort":"event:skipController.abort"};var U=qi;var ei=class{constructor(){this.locked=!1;this.listeners=[];this.unlockListeners=[]}lock(){return this.locked=!0,this}unlock(){this.locked=!1;for(let e of this.listeners)e();for(let e of this.unlockListeners)e();return this.listeners=[],this}onUnlock(e){return this.unlockListeners.push(e),e}offUnlock(e){this.unlockListeners=this.unlockListeners.filter(t=>t!==e)}async nextUnlock(){if(this.locked)return new Promise(e=>{this.listeners.push(e)})}isLocked(){return this.locked}},Mn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new ei;return this.locks.push(t),t}off(e){this.locks=this.locks.filter(t=>t!==e)}async nextUnlock(){let e=this.locks.map(t=>t.nextUnlock());return Promise.all(e)}isLocked(){return this.locks.some(e=>e.isLocked())}};function Gn(o,e,t={}){return o?e:t}function aa(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var Wi=class{constructor(){this.taskToken=null}scheduleTask(e,t){this.taskToken&&this.taskToken.cancel();let n=!1,i=setTimeout(()=>{n||e()},t);return this.taskToken={cancel:()=>{clearTimeout(i),n=!0},isCancelled:()=>n},this.taskToken}cancelTask(){return this.taskToken&&(this.taskToken.cancel(),this.taskToken=null),this}};function la(o,e){let t=[];for(let n=0;n<Math.max(o.length,e.length);n++)n<o.length&&t.push(o[n]),n<e.length&&t.push(e[n]);return t}async function ca(o,e){let n=await(await fetch(o,e)).blob();return{url:URL.createObjectURL(n),bytes:n.size}}var Tn=class{constructor(e,t){this.concurrency=e;this.delay=t;this.tasks=[]}addTask(e){this.tasks.push(e)}get size(){return this.tasks.length}async start(){let e=async()=>{if(this.tasks.length===0)return;let t=this.tasks.splice(0,this.concurrency);await Promise.all(t.map(n=>n())),this.tasks.length!==0&&(await _i(this.delay),await e())};await e()}};function st(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function ua(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var _e=class o{constructor(e={},t={}){this.serializer=e;this.deserializer=t}serialize(e){let t={};for(let n of Object.keys(e))n in this.serializer&&e[n]!==void 0?t[n]=this.serializer[n]?.(e[n]):t[n]=e[n];return t}deserialize(e){let t={};for(let n of Object.keys(e))typeof this.deserializer[n]=="function"&&e[n]!==void 0?t[n]=this.deserializer[n](e[n]):t[n]=e[n];return t}extend(e,t){let n={...this.serializer,...e},i={...this.deserializer,...t};return new o(n,i)}};function pa(o){return["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"].includes(o)}function da(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ti(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function dr(o,e=new WeakSet){if(o===null||typeof o!="object"||Array.isArray(o)||o instanceof Date||o instanceof RegExp||Object.getPrototypeOf(o)!==Object.prototype||e.has(o))return!1;e.add(o);for(let t in o)if(Object.prototype.hasOwnProperty.call(o,t)){let n=o[t];if(n!==null&&typeof n=="object"&&!dr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var zi=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Yi(o=16){let e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=t.length;for(let i=0;i<o;i++)e+=t.charAt(Math.floor(Math.random()*n));return e}function ma(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Ki=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},$i=class{constructor(){this.hooks={}}hook(e,t){return this.hooks[e]=this.hooks[e]||[],this.hooks[e].push(t),{cancel:()=>this.unhook(e,t)}}unhook(e,t){this.hooks[e]=this.hooks[e]?.filter(n=>n!==t)||[]}trigger(e,t){let n=this.hooks[e];if(!n)return()=>{};let i=n.map(r=>r(...t));return()=>{i.forEach(r=>r&&r())}}rawTrigger(e,t){let n=this.hooks[e];if(!n)return()=>{};let i=n.map(r=>r(...t()));return()=>{i.forEach(r=>r&&r())}}};var ji=class{constructor(e){this.items=[];this.pushValidator=[];e&&(this.items=[...e])}addPushValidator(e){return this.pushValidator.push(e),this}removePushValidator(e){this.pushValidator=this.pushValidator.filter(t=>t!==e)}push(...e){for(let t of e)this.pushValidator.some(n=>!n(t))||this.items.push(t)}pop(){return this.items.pop()}peek(){return this.items[this.items.length-1]}isEmpty(){return this.items.length===0}size(){return this.items.length}clear(){this.items=[]}toArray(){return[...this.items]}forEach(e){this.items.forEach(e)}forEachReverse(e){for(let t=this.items.length-1;t>=0;t--)e(this.items[t])}map(e){return this.items.map(e)}get(e){return this.items[e]}};function fa(o,e){let t={},n=[];for(let i in o)Object.prototype.hasOwnProperty.call(o,i)&&(e.includes(i)?n.push(i):t[i]=o[i]);return[t,n]}function ha(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,l=16777216,c=r*a>>>0,u=r*l+s*a>>>0,p=s*l+(u>>>0)>>>0;e=c,t=p}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var ni=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=pr(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}abandon(e){}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};ni.ActionTypes={action:"action"};var _=class extends ni{constructor(e,t,n){super(e,t,n),this.callee=e.getSelf(),this.contentNode.action=this}unknownTypeError(){throw new Error("Unknown action type: "+this.type)}resolveAwaitable(e,t){let n=t||new S(i=>i);return(async()=>await e(n.resolve.bind(n),n))(),n}is(e,t){return this instanceof e&&this.type===t}stringify(e,t,n){return this.stringifyWithName("Action")}stringifyWithName(e){return`${e}#${this._id}(${this.type})`}stringifyWithContent(e,t){return`${e}#${this._id}(${this.type}){${t}}`}};var ve=class ve extends _{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await ve.initBackgroundMusic(e,r,n),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t,n){n?.isSceneSuspended(e)||e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new J("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);if(t.addElement(r),t.setSceneSuspended(n,e.element.suspended===!0),n.local.getNamespace(t.getStorable()).load(e.local),e.state){let[,s]=t.getLiveGame().constructMaps();n.fromData(e.state,s)}e.background&&n.background.fromData(e.background)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new U(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),l=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{r.isSettled()||r.abort(),a.abort()}),r}static unloadScene(e,t){t.settlePendingLines(e),t.getStorable().removeNamespace(e.local.getNamespaceName()),t.offSrcManager(e.srcManager).removeScene(e),e.state.backgroundImage.reset()}static unwindCallStack(e){let t=e.getSuspendedScenes(),n=t.map(i=>[i,ve.createSceneSnapshot(i,e)]);return t.forEach(i=>{i.events.emit("event:scene.preUnmount"),ve.unloadScene(i,e)}),n}static rewindCallStack(e,t){e.forEach(([n,i])=>{let r=new S(s=>s);t.timelines.attachTimeline(r),ve.handleSceneInit(n,{type:W.callTo,node:null},t,r),ve.restoreSceneSnapshot(i,t),t.setSceneSuspended(n,!0)})}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}abandon(e){if(this.type!==W.resume)return;let t=this.contentNode.getContent()[0],n=this.callee,i=n.state.backgroundMusic;e.isSceneActive(t)&&(t.events.emit("event:scene.preUnmount"),ve.unloadScene(t,e)),e.setSceneSuspended(n,!1),i&&e.audioManager.isManaged(i)&&e.audioManager.resume(i,n.config.backgroundMusicFade)}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new S(c=>c),l=null;return a.registerSkipController(new U(()=>(l&&(clearTimeout(l),l=null),s))),l=e.setTimeout(()=>{l=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===W.action)return super.executeAction(e,t);if(this.is(ve,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{ve.unloadScene(this.callee,e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return ve.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===W.exit){let n=ve.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),ve.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),ve.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===W.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize(),s=ve.unwindCallStack(e);e.actionHistory.push({action:this,stackModel:t.stackModel},(l,c)=>{ve.rewindCallStack(c,e);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(l,u)},[r,s]);let a=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:a}),null}else if(this.type===W.preSuspend){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));if(e.isSceneActive(i))throw new J(`Cannot call scene ${this.getSceneName(n)}: it is already on stage.
4
+ A returnable jump suspends the scene it leaves rather than unloading it, so a scene cannot be called from itself or from anything it has called.`,this);if(e.isSceneSuspended(this.callee))throw this._callerAlreadyParkedError(n);let r=e.getSuspendedScenes().length,s=e.game.config.maxSceneCallDepth;if(r>=s)throw new J(`Scene call depth limit reached (${s}).
5
+ Each returnable jump keeps the scene it left mounted, so a chain of them holds every scene in the chain on the stage at once. Raise maxSceneCallDepth if the story really needs to go this deep.`,this);let a=this.callee.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{a&&e.audioManager.isManaged(a)&&e.audioManager.resume(a,0)},[]),a&&e.audioManager.isManaged(a)&&e.audioManager.pause(a,this.callee.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===W.callTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=this.contentNode.getChild();if(!r?.action)throw new Ce("A scene call has no return address. `scene:callTo` is only ever built with a `scene:resume` chained behind it (see Scene._callScene).");let s=this.callee;if(e.isSceneSuspended(s))throw this._callerAlreadyParkedError(n);let a=e.getLiveGame().getStackModelForce().serialize();e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{e.setSceneSuspended(s,!1);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(c,u)},[a]),e.setSceneSuspended(s,!0);let l=i.getSceneRoot().contentNode;return[{type:this.type,node:r},{type:this.type,node:l}]}else if(this.type===W.resume){let n=this.contentNode.getContent()[0],i=this.callee,r=i.state.backgroundMusic,s=ve.createSceneSnapshot(n,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let l=new S(c=>c);e.timelines.attachTimeline(l),ve.handleSceneInit(n,{type:this.type,node:this.contentNode.getChild()},e,l),ve.restoreSceneSnapshot(a,e),e.setSceneSuspended(i,!0),r&&e.audioManager.isManaged(r)&&e.audioManager.pause(r,0)},[s]),n.events.emit("event:scene.preUnmount"),ve.unloadScene(n,e),e.setSceneSuspended(i,!1),r&&e.audioManager.isManaged(r)&&e.audioManager.resume(r,i.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===W.setBackgroundMusic){let[n,i]=this.contentNode.getContent(),r=this.callee,s=e.getExposedStateForce(r),a=r.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{s.setBackgroundMusic(l,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===W.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===W.transitionToScene){let[n,i]=this.contentNode.getContent();return this.applyStageTransition(e,n,i,t)}else if(this.type===W.nvlBlock){let[n,i]=this.contentNode.getContent(),r=e.createNvlSnapshot();return e.enterNvlMode(i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{e.restoreNvlSnapshot(s)},[r]),n.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]}else if(this.type===W.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=S.isAwaitable(r)?e.timelines.attachTimeline(r):void 0;return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:s},a=>{e.setNvlVisibility(a)},[i]),r}else if(this.type===W.nvlHide){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!1,n,t),s=S.isAwaitable(r)?e.timelines.attachTimeline(r):void 0;return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:s},a=>{e.setNvlVisibility(a)},[i]),r}else if(this.type===W.nvlEnd){let[n]=this.contentNode.getContent(),i=e.createNvlSnapshot();return e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{e.restoreNvlSnapshot(r)},[i]),e.exitNvlMode(n||null),{type:this.type,node:null}}}throw new Error("Unknown scene action type: "+this.type)}getFutureActions(e,t={}){if(this.type===W.callTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=r.getSceneRoot()?.contentNode,a=this.contentNode.getChild()?.action;return[...s?.action?[s.action]:[],...a?[a]:[]]}if(this.type===W.jumpTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=e.getScene(i,!0).getSceneRoot()?.contentNode;return s?.action?[s.action]:[]}if(this.type===W.nvlBlock){let[i]=this.contentNode.getContent(),r=super.getFutureActions(e,t);return[...i??[],...r]}let n=this.contentNode.getChild()?.action;return n?[n]:[]}_sceneNotFoundError(e){return new J(`Scene with name ${e} not found
6
+ Make sure you have registered the scene using story.register`,this)}_callerAlreadyParkedError(e){let t=this.getSceneName(this.callee);return new J(`Cannot call scene ${this.getSceneName(e)} from ${t}: ${t} is already parked behind another call.
7
+ A returnable jump suspends the scene it is taken from, and a scene has one place on the stage, so two calls cannot be open from the same scene at the same time. Take the calls one after the other in a single branch rather than one per branch of a concurrent group.`,this)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===W.callTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`callTo {${i.stringify(e,t,n)}}`)}if(this.type===W.jumpTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`jumpTo {${i.stringify(e,t,n)}}`)}return super.stringifyWithName("SceneAction")}};ve.ActionTypes=W;var ne=ve;var mr=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},C=class o extends mr{static create(e){return new o().setContent(e)}static forEachParent(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getParent()}static forEachChild(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getChild()}constructor(e,t,n){super("ContentNode"),this.child=n||null,this.parent=t||null,this.action=e||null}setParent(e){if(e===this)throw new Error("Cannot set parent to itself");return this.parent&&this.parent.setChild(null),this.parent=e,this}setChild(e){if(e===this)throw new Error("Cannot set child to itself");return this.child&&(this.child.parent=null),this.child=e,e&&e.parent!==this&&(e.remove(),e.parent=this),this}getChild(){return this.child||null}getParent(){return this.parent||null}addChild(e){return this.setChild(e),this}removeChild(e){return e&&this.child===e?(this.child=null,e.setParent(null)):e||(this.child=null),this}remove(){return this.parent&&this.parent.removeChild(this),this.child&&this.child.setParent(null),this}hasChild(){return!!this.child}};var Xi={center:"center",left:"left",right:"right"};import{animate as ya}from"motion/react";var Fn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(Fn||{}),ga={left:"33.33%",center:"50%",right:"66.66%"},ft=class ft{static isUnknown(e){return e===ft.Unknown}static D2PositionToCSS(e,t=!1,n=!1,i){let r=this.calc(e.y,e.yoffset,i?.height),s=this.calc(e.x,e.xoffset,i?.width),a=n?{bottom:r}:{top:r},l=t?{right:s}:{left:s};return this.wrap({...a,...l})}static calc(e,t,n){if(e==null||e===""||ft.isUnknown(e))return"auto";let i=!(t===void 0||ft.isUnknown(t));if(typeof n=="number"&&n>0){let s=ft.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}let r=typeof e=="number"?`${e}px`:e;return i?`calc(${r} + ${t}px)`:`calc(${r} + 0px)`}static toPercent(e,t){if(typeof e=="number")return t>0?e/t*100:null;let n=/^(-?\d+(?:\.\d+)?)%$/.exec(e.trim());return n?parseFloat(n[1]):null}static toCoord2D(e){if(at.isCommonPositionType(e))return ht.fromCommonPosition(e);if(ht.isCoord2DPosition(e))return e;if(An.isAlignPosition(e))return ht.fromAlignPosition(e);if(typeof e=="object"&&e!==null&&["x","y","xalign","yalign","xoffset","yoffset"].some(t=>t in e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static orUnknown(e){return ft.isUnknown(e)||e===void 0?ft.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return ht.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:ft.isUnknown(t.x)?0:t.x,y:ft.isUnknown(t.y)?0:t.y,xoffset:ft.isUnknown(t.xoffset)?0:t.xoffset,yoffset:ft.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(Fn).includes(e)}static isRawCoord2DPosition(e){return typeof e=="object"&&("x"in e||"y"in e||"xoffset"in e||"yoffset"in e)}static isRawAlignPosition(e){return typeof e=="object"&&e!==null&&("xalign"in e||"yalign"in e)}static isRawPosition(e){return this.isRawCommonPositionType(e)||this.isRawCoord2DPosition(e)||this.isRawAlignPosition(e)}static isPosition(e){return e instanceof at||e instanceof ht||e instanceof An}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return ht.fromCommonPosition(new at(e));if(this.isRawAlignPosition(e))return ht.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new ht(e);throw new Error("Invalid position type")}static tryParsePosition(e){if(this.isPosition(e))return e;if(this.isRawPosition(e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static wrap(e){return{left:"auto",top:"auto",right:"auto",bottom:"auto",...e}}};ft.Unknown=Symbol("Unknown");var H=ft,Qi=class Qi{static isCommonPositionType(e){return e instanceof Qi}constructor(e){this.position=e}toCSS(){return{x:ga[this.position],y:"50%",xoffset:0,yoffset:0}}};Qi.Positions=Fn;var at=Qi,ht=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:ga[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>typeof n!="number"||!Number.isFinite(n)?H.Unknown:`${n*100}%`;return new o({x:t(e.xalign),y:t(e.yalign),xoffset:e.xoffset,yoffset:e.yoffset})}static merge(e,t){return new o({x:H.isUnknown(t.x)?e.x:t.x,y:H.isUnknown(t.y)?e.y:t.y,xoffset:H.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:H.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=H.orUnknown(e.x),this.y=H.orUnknown(e.y),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.x=H.orUnknown(e),this.y=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){let e=t=>/^-?\d+(\.\d+)?%$/.test(t);if(typeof this.x=="string"&&!e(this.x))throw new Error(`Invalid x position: ${this.x}`);if(typeof this.y=="string"&&!e(this.y))throw new Error(`Invalid y position: ${this.y}`)}toCSS(){return{x:this.x,y:this.y,xoffset:this.xoffset,yoffset:this.yoffset}}},An=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=H.orUnknown(e.xalign),this.yalign=H.orUnknown(e.yalign),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.xalign=H.orUnknown(e),this.yalign=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){if(typeof this.xalign=="number"&&isNaN(this.xalign))throw new Error("Invalid xalign position: "+this.xalign);if(typeof this.yalign=="number"&&isNaN(this.yalign))throw new Error("Invalid yalign position: "+this.yalign)}toCSS(){return{x:H.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:H.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var K=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new fr(this.mergeWithDefaultConfig(e))}copy(){return new o(j({},this.defaultConfig),this.handlers)}keys(){return Object.keys(this.defaultConfig)}getDefaultConfig(){return this.defaultConfig}mergeWithDefaultConfig(e){return Object.fromEntries(Object.entries(this.defaultConfig).map(([t,n])=>[t,this.mergeValue(t,n,e[t])]))}mergeValue(e,t,n){return this.isPlainObject(n)?j({},n):Array.isArray(t)?Array.isArray(n)&&n.length>0?[...n]:[...t]:n!==void 0?this.applyHandler(e,n):t}isPlainObject(e){return typeof e=="object"&&!Array.isArray(e)&&e!==null&&Object.getPrototypeOf(e)===Object.prototype}applyHandler(e,t){return typeof this.handlers[e]=="function"?this.handlers[e](t):t}},fr=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(j({},this.config))}join(e){let t=ua(this.config,Object.keys(e));return new o(Object.assign(t,e instanceof o?e.get():e))}extract(e){let t={},n={};for(let i of e)t[i]=this.config[i];for(let i in this.config)e.includes(i)||(n[i]=this.config[i]);return[new o(t),new o(n)]}assign(e){return new o(Object.assign({},this.config,e))}};var Jc={[Xi.left]:"25.33%",[Xi.center]:"50%",[Xi.right]:"75.66%"},Et=class Et{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new Et(Et.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){if("position"in e&&"position"in t){let n=this.mergePosition(e.position,t.position);return{...Object.assign({},e,t),position:n}}return{...Object.assign({},e,t)}}get(){return this.state}freeze(){return this.frozen=!0,this}assign(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Et.mergeState(this.state,t),this}lock(){if(this.locked)throw new Error("Transform state is already locked.");return this.locked=Symbol(),this.locked}isLocked(){return!!this.locked}canWrite(e){return this.locked===null||this.locked===e}unlock(e){return this.locked===e&&(this.locked=null),this}toFramesDefinition(e,t){return ti(Z.constructStyle(e,this.state,t))}toStyle(e,t){return ti(Z.constructStyle(e,this.state,t))}serialize(){return Et.TransformStateSerializer.serialize(this.state)}clone(){return new Et(Et.mergeState({},this.state))}overwrite(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Et.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}resetTo(e){return this.state=e,this.locked=null,this.frozen=!1,this}};Et.DefaultTransformState=new K({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new at("center"),opacity:0,alt:"",maskImage:void 0,maskSize:void 0,maskPosition:void 0,maskRepeat:void 0,maskMode:void 0,clipPath:void 0,filter:void 0,backdropFilter:void 0,mixBlendMode:void 0}),Et.TransformStateSerializer=new _e({position:e=>H.serializePosition(H.tryParsePosition(e))},{position:e=>H.toCoord2D(e)});var ie=Et,Le=class Le{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Le.defaultConfig,t||{});else{let[n,i]=[e,t||Le.defaultOptions];this.sequences.push({props:n,options:i||Le.defaultOptions}),this.config=Object.assign({},Le.defaultConfig)}}static isPosition(e){return at.isCommonPositionType(e)||ht.isCoord2DPosition(e)||An.isAlignPosition(e)}static immediate(e){return new Le(e,{duration:0,ease:"linear"})}static left(e,t){return new Le({position:at.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Le({position:at.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Le({position:at.Positions.Center},{duration:e,ease:t})}static create(e){return new Le([],e)}static positionToCSS(e,t,n,i){return e?H.isRawPosition(e)?H.D2PositionToCSS(H.rawPositionToCoord2D(e),n,t,i):H.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...j(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,l=function(d,g,f){return typeof d>"u"?typeof f<"u"?g(f):"":g(d)},c=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${c}, ${u})`,l(t.rotation,d=>`rotate(${d}deg)`,0),l(t.scaleX,d=>`scaleX(${d*a})`,1),l(t.scaleY,d=>`scaleY(${d*a})`,1)].filter(Boolean).join(" ")}static constructStyle(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{overwrite:s}=n||{},a=e.game?.config,l=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...Le.positionToCSS(t.position,i,r,l),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?Nn(t.fontColor):void 0,transform:Le.propToCSSTransform(e,t),...Le.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i,companionRefs:r}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:s,sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(m=>!!m.ref.current).map(({ref:m,project:y})=>({el:m.current,project:y}))});if(a.length||t.logger.warn("Transform","No sequences to animate."),l.repeat!==void 0&&!Number.isFinite(l.repeat))throw new J("A transform applied with `transform()` (or `show`, `hide`, `pos`, ...) has to end, but this one repeats forever.\nUse `element.loop(transform)` for a motion that runs until it is stopped - the line does not wait for it, and `element.stopLoop()` ends it.");let c=!1,u=e.lock(),p=ya(a,l),d=()=>{e.overwrite(u,s.get()).unlock(u),p.complete(),c=!0},g=new S().registerSkipController(new U(d)),f=()=>{c||e.overwrite(u,s.get()).unlock(u),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),g.resolve()};return p.then(f,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{f()}catch{g.resolve()}})),p.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:s,sequences:a,options:l},this),g}startLoop(e,{gameState:t,ref:n,overwrites:i,companionRefs:r},s){if(!n.current)throw new Error("No ref found when looping.");this.commit();let{sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(p=>!!p.ref.current).map(({ref:p,project:d})=>({el:p.current,project:d}))});a.length||t.logger.warn("Transform","No sequences to loop.");let c=[n.current,ti(e.toFramesDefinition(t,i)),{duration:0}],u=ya([c,...a],{...l,repeat:1/0,repeatType:s?.repeatType??l.repeatType??"loop",repeatDelay:s?.repeatDelay!==void 0?this.toSeconds(s.repeatDelay,void 0):l.repeatDelay});return u.play(),t.logger.debug("Transform","Loop started.",{sequences:a,options:l},this),{stop:()=>{u.stop()}}}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...Le.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i,companions:r}){let s=t.clone(),a=s.lock(),l=this.sequences.flatMap(({props:c,options:u})=>{let p=s.assign(a,c),d=p.toFramesDefinition(e,n),g=this.getOptions(u),f=[i,d,g];if(!r||!r.length)return[f];let m=p.get();return[f,...r.map(({el:y,project:T})=>[y,ti(T(m)),{...g,at:"<"}])]});return{finalState:s.unlock(a).freeze(),sequences:l,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t,repeatType:n}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0),repeatType:n}}copy(){return new Le(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}lens(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new J("Invalid at definition. At definition must be a number or a string in the format of `+n` or `-n`.");let[i,r,s]=n,a=Number(s);if(isNaN(a))throw new J("Invalid number in at definition.");let l=a/1e3;return r==="+"?`+${l}`:`-${l}`}};Le.defaultConfig={sync:!0},Le.defaultOptions={duration:0,ease:"linear"},Le.CommonImagePositionMap=Jc;var Z=Le;var Ji=class{constructor(){this.id="";this._staticId=null;this._dirty=!1}setId(e){this.id=e}getId(){return this.id}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}markDirty(){return this._dirty=!0,this}isDirty(){return this._dirty}reset(){this._dirty=!1}fromData(e){return this}construct(e){for(let t=0;t<e.length;t++){let n=e[t];t!==0&&e[t-1]?.contentNode.setChild(n.contentNode)}return e}};var va=Symbol("_Chained"),Sa;Sa=va;var hr=class hr{constructor(e){this[Sa]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[va]}static toActions(e){return e.flat(2).map(t=>hr.isChained(t)?t.fromChained(t):t).flat(3)}push(...e){this.__actions.push(...e)}getActions(){return this.__actions}getSelf(){return this.__self}newChain(){return this.getSelf().chain()}},ze=hr,On=class extends Ji{chain(e){let t=ze.isChained(this)?this:this.proxy(this,new ze(this));if(!e)return t;let n=Array.isArray(e)?e:[e];return t.push(...n),t}proxy(e,t){let n=new Proxy(e,{get:function(i,r){if(r in t)return t[r];let s=i[r];return typeof s=="function"?s.bind(n):s},set:function(i,r,s){return i[r]=s,!0}});return n}combineActions(e,t){let n=t(this.chain().newChain()),i=e.do([n]).getActions()[0];return this.chain(i)}};var pe=class extends On{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var Ht=class extends _{executeAction(e,t){let n=this.callee.evaluate(this.contentNode.getContent(),{gameState:e});return n?.length?[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]:super.executeAction(e,t)}getFutureActions(e,t){return[...this.callee._getFutureActions(),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=s=>{let a=s.condition?n?s.condition.toString():"Lambda(unknown)":"null",l=s.action?s.action.map(c=>c.stringify(e,t,n)).join(";"):"null";return`(${a}) {${l}}`};return super.stringifyWithContent("Condition",`if ${r(i.If)} ${i.ElseIf.length>0?`else if ${i.ElseIf.map(r).join(";")} `:""}${i.Else?`else {${r(i.Else)}}`:""}`)}};Ht.ActionTypes=na;var ii=64;function Ta(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function gr(o){return o.length?o.map(e=>typeof e=="number"?`[${e}]`:`.${e}`).join(""):"the value itself"}function Zi(o,e=0,t=new Set){if(e>ii)return!1;if(typeof o=="number"||typeof o=="string"||typeof o=="boolean"||o==null||o instanceof Date)return!0;if(typeof o!="object"||t.has(o))return!1;t.add(o);try{return Array.isArray(o)?o.every(n=>Zi(n,e+1,t)):Ta(o)?Object.values(o).every(n=>Zi(n,e+1,t)):!1}finally{t.delete(o)}}function Aa(o,e){let t=[],n=[];return{data:yr(o,[],0,new Set,t,n,e),dates:t,undefineds:n}}function yr(o,e,t,n,i,r,s){if(t>ii)throw new E(`A stored value nests deeper than ${ii} levels and cannot be saved
8
+ at ${s}, ${gr(e)}
9
9
  A saved game this deep is almost always a data-structure bug. Flatten the value,
10
10
  or keep the deep part outside the store and save an id for it.`);if(o===void 0)return r.push([...e]),null;if(o===null)return null;if(o instanceof Date)return i.push([...e]),o.toISOString();if(typeof o=="number"||typeof o=="string"||typeof o=="boolean")return o;if(typeof o=="object"){if(n.has(o))throw new E(`A stored value refers back to itself and cannot be saved
11
- at ${s}, ${mr(e)}
11
+ at ${s}, ${gr(e)}
12
12
  A saved game is a tree. Cutting the back-edge would save a different object graph
13
13
  than the one you built, so this is refused rather than guessed at \u2014 break the
14
- reference, or store an id in place of the object.`);if(Array.isArray(o)||va(o)){n.add(o);try{if(Array.isArray(o))return o.map((l,c)=>fr(l,[...e,c],t+1,n,i,r,s));let a={};return Object.entries(o).forEach(([l,c])=>{a[l]=fr(c,[...e,l],t+1,n,i,r,s)}),a}finally{n.delete(o)}}}return console.warn(`Value of type "${qc(o)}" cannot be saved and was stored as null
15
- at ${s}, ${mr(e)}`),null}function qc(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function Ta(o,e,t){let n=ya(o,e,hr);return n=ya(n,t,()=>{}),n}function ya(o,e,t){if(!Array.isArray(e)||!e.length)return o;let n=o;for(let i of e){if(!Array.isArray(i))continue;if(!i.length){n=t(n);continue}let r=n;for(let a=0;a<i.length-1&&r!==null&&typeof r=="object";a++)r=r[i[a]];if(r===null||typeof r!="object")continue;let s=i[i.length-1];r[s]=t(r[s])}return n}function hr(o){return o instanceof Date?o:typeof o=="string"||typeof o=="number"?new Date(o):new Date(NaN)}function ba(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function gr(o,e,t=0){if(Object.is(o,e))return!0;if(t>ii)return!1;if(o instanceof Date||e instanceof Date)return o instanceof Date&&e instanceof Date&&o.getTime()===e.getTime();if(Array.isArray(o)||Array.isArray(e))return Array.isArray(o)&&Array.isArray(e)&&o.length===e.length&&o.every((n,i)=>gr(n,e[i],t+1));if(ba(o)&&ba(e)){let n=Object.keys(o);return n.length===Object.keys(e).length&&n.every(i=>Object.prototype.hasOwnProperty.call(e,i)&&gr(o[i],e[i],t+1))}return!1}var Ht=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=j({},t),this.defaultContent=t}static isSerializable(e){return Zi(e)}set(e,t){let n=this.content[e];return o.isSerializable(t)?(this.content[e]=t,this.reportChange(e,n,t),this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
16
- at namespace "${this.name}"`),this.content[e]=t,this.reportChange(e,n,t),this)}get(e){return this.content[e]}equals(e,t){return this.content[e]===t}assign(e){return Object.entries(e).forEach(([t,n])=>{this.set(t,n)}),this}has(e){return this.content[e]!==void 0}keys(){return Object.keys(this.content)}values(){return Object.values(this.content)}entries(){return Object.entries(this.content)}reset(){let e=this.content;return this.content=j({},this.defaultContent),new Set([...Object.keys(e),...Object.keys(this.content)]).forEach(n=>{this.reportChange(n,e[n],this.content[n])}),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n,t)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)}),this.owner?.reportRestore(this.key)}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e,t){let n=`namespace "${this.name}"`+(t===void 0?"":`, key "${t}"`),i={any:s=>{let a=Sa(s,n),l={type:"any",data:a.data};return a.dates.length&&(l.dates=a.dates),a.undefineds.length&&(l.undefineds=a.undefineds),l},date:s=>({type:"date",data:s.toISOString()})},r=this.toTypeName(e);return i[r](e)}unwrap(e){let n={any:i=>Ta(i.data,i.dates,i.undefineds),date:i=>hr(i.data)}[e?.type];return n?n(e):(console.warn(`Unknown stored value type "${e?.type}", reading it as-is
17
- at namespace "${this.name}"`),e?.data)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||gr(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},cn=class cn{constructor(){this.events=new J;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new Ht(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,e.attach(this),this}getNamespace(e){if(!this.namespaces[e])throw new E(`Namespace ${e} is not initialized, did you forget to register it?
18
- Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(cn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(cn.EventTypes["event:storable.restore"],e)}toData(){return this.entries().reduce((e,[t,n])=>(e[t]=n.toData(),e),{})}load(e){if(!e){console.warn("No data to load");return}let t=this.restoreBatch=new Set;try{Object.entries(e).forEach(([n,i])=>{this.namespaces[n]||this.addNamespace(new Ht(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(cn.EventTypes["event:storable.restore"],{namespaces:Array.from(t)})}clear(){return this.values().forEach(e=>e.detach(this)),this.namespaces={},this}reportChange(e){this.events.emit(cn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(cn.EventTypes["event:storable.restore"],{namespaces:[e]})}};cn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var oi=cn;var Of={};var Hn=class extends On{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let l=a.getFutureActions(e,i).filter(c=>!r.has(c));s.push(...l)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var tt=class extends Y{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ft.play){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.play(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.stop){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.stop(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=S.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,l=>{l&&this.callee.fromData(l)},[s]),a}else if(this.type===Ft.setRate){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.setRate(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.pause){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.pause(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.resume){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.resume(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.seek){let[i]=this.contentNode.getContent(),r=e.audioManager.getPosition(this.callee),s=S.forward(e.audioManager.seek(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{e.audioManager.seek(this.callee,a)},[r]),s}else if(this.type===Ft.mute){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.mute(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("SoundAction")}};tt.ActionTypes=Ft;var nt={bgm:"bgm",sound:"sound",voice:"voice"},eo=8,un=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Vn(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var si=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=l=>{t.set(l.id,{id:l.id,parentId:l.parentId??null,volume:Vn(l.volume)})};Object.values(nt).forEach(l=>n({id:l}));let i=new Set;e.forEach(l=>{let c=l?.id;if(typeof c!="string"||c.trim().length===0)throw new un(`Audio bus id must be a non-empty string, got ${JSON.stringify(c)}.`);if(i.has(c))throw new un(`Audio bus "${c}" is declared more than once.`);i.add(c),n(l)}),o.assertResolvable(t);let r=[],s=new Map,a=l=>{let c=s.get(l);if(c)return c;let u=t.get(l),d=u.parentId===null?null:a(u.parentId),p={id:u.id,parentId:u.parentId,volume:u.volume,depth:d?d.depth+1:1};return s.set(l,p),r.push(p),p};return t.forEach(l=>a(l.id)),new o(r,s)}static isSeeded(e){return Object.values(nt).includes(e)}static assertResolvable(e){e.forEach(t=>{let n=[t.id],i=new Set([t.id]),r=t;for(;r.parentId!==null;){let s=e.get(r.parentId);if(!s)throw new un(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new un(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>eo)throw new un(`Audio bus "${t.id}" nests deeper than ${eo}: ${n.join(" -> ")}.`);r=s}})}getNodes(){return this.nodes}get(e){return this.index.get(e)??null}has(e){return this.index.has(e)}isUnder(e,t){let n=this.index.get(e),i=0;for(;n&&i<=eo;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},yr=si.resolve();function _c(o){yr=o}function vr(){return yr}function to(o,e){let t=yr;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var Aa={[nt.bgm]:"bgmVolume",[nt.sound]:"soundVolume",[nt.voice]:"voiceVolume"};function Ca(o){let e={};return Object.entries(Aa).forEach(([t,n])=>{e[t]={get:()=>Vn(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var ri=class ri{constructor(e,t={}){this.declarations=e;this.events=new J;this.overrides=new Map;this.aliasTokens=[];this.tree=null;this.events.setMaxListeners(64),this.aliases=t,Object.entries(t).forEach(([n,i])=>{this.aliasTokens.push(i.subscribe(r=>{this.announce(n,Vn(r))}))})}dispose(){this.aliasTokens.forEach(e=>e.cancel()),this.aliasTokens.length=0}announce(e,t){let n=t;try{n=this.getEffectiveVolume(e)}catch{}this.events.emit(ri.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=si.resolve(this.declarations()??[]),_c(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Vn(t),i=this.aliases[e];return i?(i.set(n),this):(this.overrides.set(e,n),this.announce(e,n),this)}setVolumes(e){return Object.entries(e).forEach(([t,n])=>this.setVolume(t,n)),this}getVolume(e){let t=this.aliases[e];return t?Vn(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Vn(this.getDeclaredVolume(e)*this.getVolume(e))}list(){return this.getTree().getNodes().map(e=>({id:e.id,parentId:e.parentId,volume:this.getVolume(e.id),declaredVolume:e.volume,effectiveVolume:this.getEffectiveVolume(e.id)}))}getVolumes(){let e={};return this.list().forEach(t=>{e[t.id]=t.volume}),e}onVolumeChange(e){return this.events.on(ri.EventTypes["event:audioBus.volumeChange"],e)}};ri.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var ai=ri;var xa=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(xa||{}),we=class we extends pe{static toSound(e){return e==null?null:typeof e=="string"?new we({src:e}):e}static isSound(e){return e instanceof we}static voice(e){let t=typeof e=="string"?{src:e}:e;return new we({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new we({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new we({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=we.DefaultUserConfig.create(t),[i]=n.extract(we.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e,t){return vr().isUnder(this.config.type,nt.bgm)&&console.warn(`NarraLeaf-React [Sound] Playing a bgm-typed sound (src: ${this.config.src}) with \`play()\`. It will play on the music bus but is not the scene's background music, so leaving the scene will not stop it and it will not cross-fade. Use \`scene.setBackgroundMusic()\` if that is what you wanted.`),this.pushAction(tt.ActionTypes.play,[{end:this.state.volume,duration:e||0,waitForEnd:t?.waitForEnd===!0}])}stop(e){return this.pushAction(tt.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(tt.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(tt.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(tt.ActionTypes.setRate,[e])}pause(e){return this.pushAction(tt.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(tt.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(tt.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:we.StateSerializer.serialize(this.state)}}fromData(e){return this.state=we.StateSerializer.deserialize(e.state),this}copy(){return new we(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return we.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new tt(this.chain(),e,new x().setContent(t)))}};we.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",we.DefaultUserConfig=new K({src:we.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),we.DefaultConfig=new K({src:we.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),we.DefaultState=new K({volume:1,rate:1,paused:!1,muted:!1}),we.StateSerializer=new _e;var ge=we;var Cn=class Cn{constructor(){this.src=[];this.future=[]}static catSrc(e){let t=new Set,n=new Set,i=new Set;return e.forEach(({type:r,src:s})=>{r===Cn.SrcTypes.image?t.add(s):r===Cn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof F?F.getSrcURL(e):e.type==="image"?F.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(te,W.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(P.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof Se){let n=t;if(t.is(Se,ft.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===ft.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===ft.setAppearance){let i=t.contentNode.getContent()[0];if(F.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(F.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:F.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof F||P.isStaticImageData(e)){if(e instanceof F){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(F.getSrcURL(e)))return this}else if(this.isSrcRegistered(P.srcToURL(e.src)))return this;this.src.push({type:"image",src:P.isStaticImageData(e)?P.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Cn.SrcTypes.audio?t===n.src.getSrc():n.type===Cn.SrcTypes.image?t===F.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Cn.SrcTypes={image:"image",video:"video",audio:"audio"};var Ie=Cn;import*as Ua from"howler";var Ke=class o{static from(e){return o.isPauseConstructor(e)?new o:e}static wait(e){return new o({duration:e})}static isPause(e){return this.isPauseConstructor(e)||e instanceof o}static isPauseConstructor(e){return e===o}constructor(e={}){this.config=e}};var lt=class o{static isTextEvent(e){return e instanceof o}static expression(e,t,n={}){return new o({expression:{image:e,appearance:t},sound:n.sound})}static sound(e){return new o({sound:e})}constructor(e){this.config=e}};function wa(o,e){let{render:t,data:n,...i}=e,r=j(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var Te=class Te{static isWord(e){return e instanceof Te}static color(e,t){return Te.isWord(e)?e.copy().assign({color:t}):new Te(e,{color:t})}static bold(e){return Te.isWord(e)?e.copy().assign({bold:!0}):new Te(e,{bold:!0})}static italic(e){return Te.isWord(e)?e.copy().assign({italic:!0}):new Te(e,{italic:!0})}static emphasis(e,t={}){return Te.isWord(e)?e.copy().assign({emphasis:t}):new Te(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return Te.isWord(e)?e.copy().assign(i):new Te(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=wa(Te.defaultConfig,t)}evaluate(e){if(Ke.isPause(this.text))return[this];if(lt.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Te.isWord(n)?n.inherit(this.config).evaluate(e):new Te(n,this.config)).flat():Te.isWord(t)?t.inherit(this.config).evaluate(e):[new Te(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=wa(this.config,e),this}copy(){return new Te(this.text,this.config)}isPause(){return Ke.isPause(this.text)}isTextEvent(){return lt.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Te.defaultConfig={},Te.defaultColor="#000";var ie=Te;var ct=class ct{static isSentence(e){return e instanceof ct}static toSentence(e){return ct.isSentence(e)?e:new ct(e)}static format(e){let t=[];if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(this.formatWord(e[n]));else t.push(this.formatWord(e));return t}static formatWord(e){return ie.isWord(e)?e:new ie(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[ie.isWord(e)?e:new ie(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(ct.isSingleWord):ct.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||ie.isWord(e)||Ke.isPause(e)||lt.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=ct.format(e),this.config=j(ct.defaultConfig,{...t,voice:typeof t.voice=="string"?ge.voice(t.voice):ge.toSound(t.voice)}),this.state=ia(ct.defaultState)}toData(){return null}fromData(e){return this.state=j(this.state,e),this}toString(){return this.text.map(e=>e.text).join("")}setCharacter(e){return this.config.character=e,this}evaluate(e){let t=[];for(let n=0;n<this.text.length;n++){let i=this.text[n].evaluate(e);t.push(...ct.formatStaticWord(i))}return t}copy(){return new ct([...this.text],this.config)}};ct.defaultConfig={voice:null,character:null,voiceId:null},ct.defaultState={};var he=ct;var no=class{constructor(e,t){this.game=e,this.prefix=t}log(e,...t){this.isEnabled("log")&&console.log(...this.colorLog("gray",e,...t))}info(e,...t){this.isEnabled("info")&&console.info(...this._log(e,...t))}warn(e,...t){this.isEnabled("warn")&&console.warn(...this._log(e,...t))}error(e,...t){this.isEnabled("error")&&console.error(...this._log(e,...t))}debug(e,...t){this.isEnabled("debug")&&console.debug(...this.colorLog("gray",e,...t))}trace(e,...t){this.isEnabled("trace")&&console.trace(this._log(e,...t))}weakWarn(e,...t){this.isEnabled("warn")&&console.log(...this.colorLog("yellow",e,...t))}weakError(e,...t){this.isEnabled("error")&&console.log(...this.colorLog("red",e,...t))}verbose(e,...t){this.isEnabled("verbose")&&console.log(...this.colorLog("gray",e,...t))}group(e,t=!1){let n=this._log(e).join(" ");return this.isEnabled("info")&&(t?console.groupCollapsed(n):console.group(n)),{end:()=>{this.isEnabled("info")&&console.groupEnd()}}}isEnabled(e){return typeof this.game.config.app.logger=="boolean"?this.game.config.app.logger:this.game.config.app.logger[e]}_log(e,...t){return t.length===0?[this.prefix||"",e]:[`${this.prefix||""} [${e}]`,...t]}colorLog(e,t,...n){if(n.length===0)return[`%c${this.prefix||""} ${t}`,`color: ${e}`];let i=[],r=[],s=[];return this.prefix?(i.push(`%c${this.prefix} [${t}]`),r.push(`color: ${e}`)):(i.push(`%c[${t}]`),r.push(`color: ${e}`)),n.forEach(a=>{typeof a=="string"?(i.push(`%c${a}`),r.push(`color: ${e}`)):(i.push("%O"),s.push(a),r.push(""))}),[i.join(" ")].concat(r,s)}};var pn=class extends Y{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};pn.ActionTypes=ea;var ke=class o extends pe{static getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}static execute(e){return new o(e)}constructor(e){super(),this.handler=e;let t=this.chain(),n=new pn(t,pn.ActionTypes.action,new x().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new pn(this.chain(),pn.ActionTypes.action,new x().setContent(e))]}};var Yc={volume:1,limit:1/0},Xc=class Pa{constructor(e,t,n,i){this.subChannels=new Map,this.tokens=new Set,this.tokenQueue=[],this.muted=!1,this.removed=!1,this.name=e,this.audioProvider=t,this.parentChannel=i??null,this.options={...Yc,...n},this.volume=this.options.volume;let r=this.audioProvider.getAudioContext();this.gainNode=r.createGain(),this.gainNode.gain.value=this.muted?0:this.volume,this.connectToParent()}connectToParent(){this.parentChannel?this.gainNode.connect(this.parentChannel.getGainNode()):this.gainNode.connect(this.audioProvider.getAudioContext().destination)}getGainNode(){return this.gainNode}ensureNotRemoved(){if(this.removed)throw new Error(`Channel "${this.name}" has been removed and cannot be used.`)}getName(){return this.name}async play(e,t){if(this.ensureNotRemoved(),this.tokens.size>=this.options.limit){let r=this.tokenQueue.shift();r&&r.stop()}let n=await this.audioProvider.createToken(e,t,this.gainNode);this.tokens.add(n),this.tokenQueue.push(n);let i=()=>{this.tokens.delete(n);let r=this.tokenQueue.indexOf(n);r!==-1&&this.tokenQueue.splice(r,1)};return n.once("ended",i),n.once("stop",i),n}createChannel(e,t){if(this.ensureNotRemoved(),this.subChannels.has(e))throw new Error(`Channel "${e}" already exists under "${this.name}".`);this.audioProvider.checkChannelLimit();let n=new Pa(e,this.audioProvider,t,this);return this.subChannels.set(e,n),this.audioProvider.registerChannel(n),n}getChannel(e){return this.ensureNotRemoved(),this.subChannels.get(e)??null}getChannels(){return this.ensureNotRemoved(),Array.from(this.subChannels.values())}setVolume(e){return this.ensureNotRemoved(),this.volume=Math.max(0,Math.min(1,e)),this.muted||(this.gainNode.gain.value=this.volume),this}getVolume(){return this.volume}mute(e){return this.ensureNotRemoved(),this.muted=e!==void 0?e:!0,this.gainNode.gain.value=this.muted?0:this.volume,this}unmute(){return this.mute(!1)}isMuted(){return this.muted}remove(){if(this.removed)return this;this.removed=!0;for(let t of this.tokens)t.stop();this.tokens.clear();let e=Array.from(this.subChannels.values());this.subChannels.clear();for(let t of e)t.remove();try{this.gainNode.disconnect()}catch(t){console.warn("Failed to disconnect Channel gain node during remove().",t)}return this.audioProvider.unregisterChannel(this),this.parentChannel&&this.parentChannel.removeSubChannel(this.name),this}removeSubChannel(e){this.subChannels.delete(e)}getTokens(){this.ensureNotRemoved();let e=[...this.tokenQueue];for(let t of this.subChannels.values())e.push(...t.getTokens());return e}isRemoved(){return this.removed}getParent(){return this.parentChannel}getOptions(){return{...this.options}}},Ea=!1;function Qc(o){Ea=o}function dn(o,e){Ea||(e!==void 0?console.warn(o,e):console.warn(o))}var Jc=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){dn("Failed to disconnect AudioBufferSourceNode in disconnectSource().",o)}else this.currentSource instanceof HTMLAudioElement&&(this.currentSource.pause(),this.currentSource.src="",this.currentSource.load());if(this.mediaElementSource){try{this.mediaElementSource.disconnect()}catch(o){dn("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=o=>{this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){dn("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){this.currentSource instanceof AudioBufferSourceNode?this.currentSource.start(o,e):this.currentSource instanceof HTMLAudioElement&&this.currentSource.play()}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},ka=class{constructor(o,e){this.token=o,this.endVolume=e,this.cancelled=!1,this.finishedInternal=!1,this._finished=new Promise(t=>{this.resolveFinished=t})}get finished(){return this._finished}cancel(){this.cancelled||this.finishedInternal||(this.cancelled=!0,this.resolveFinished())}finish(){this.finishedInternal||(this.finishedInternal=!0,this.token.setVolume(this.endVolume),this.resolveFinished())}isCancelled(){return this.cancelled}isFinished(){return this.finishedInternal}getTargetVolume(){return this.endVolume}},Zc=class{constructor(o,e,t={},n){this._isPlaying=!1,this._isPaused=!1,this._isMuted=!1,this.volume=1,this.rate=1,this.contextStartTime=0,this.startOffset=0,this.pauseOffset=0,this.duration=0,this.currentFade=null,this.audioContext=o,this.volume=t.volume??1,this.rate=t.rate??1,this.startOffset=t.startOffset??0,this.duration=t.duration??0,this.outputNode=n??o.destination,this.gainNode=o.createGain(),this.gainNode.gain.value=this.volume,this.gainNode.connect(this.outputNode),this.sourceController=new Jc(o,this.gainNode),this.sourceController.setSource(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1;try{this.gainNode.disconnect()}catch(e){dn("Failed to disconnect gain node on natural end.",e)}}}setVolume(o){return this.currentFade&&(this.currentFade.cancel(),this.currentFade=null),o=Math.max(0,Math.min(1,o)),this.volume=o,this._isMuted||(this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=o),this}getVolume(){return this.volume}mute(o){let e=o!==void 0?o:!0;if(this._isMuted=e,this.currentFade&&!this.currentFade.isFinished()&&!this.currentFade.isCancelled()){let t=this.currentFade.getTargetVolume();this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.volume=t,this.gainNode.gain.value=e?0:t,this.currentFade.finish(),this.currentFade=null}else this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=e?0:this.volume;return this}unmute(){return this.mute(!1)}isMuted(){return this._isMuted}pause(){if(!this._isPlaying||this._isPaused)return this;let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?(o.pause(),this.pauseOffset=o.currentTime):o instanceof AudioBufferSourceNode&&(this.pauseOffset=this.getCurrentTime(),this.sourceController.stop()),this._isPlaying=!1,this._isPaused=!0,this.emit("pause"),this}resume(){if(!this._isPaused)return this;let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement){let e=o.play();e&&typeof e.catch=="function"&&e.catch(()=>{this._isPlaying=!1,this._isPaused=!0})}else if(o instanceof AudioBufferSourceNode){let e=this.audioContext.createBufferSource();e.buffer=o.buffer,e.playbackRate.value=this.rate,e.loop=o.loop,e.loopStart=o.loopStart,e.loopEnd=o.loopEnd,this.sourceController.refreshSource(e),this.startOffset=this.pauseOffset,this.contextStartTime=this.audioContext.currentTime,this.sourceController.start(0,this.pauseOffset)}return this._isPlaying=!0,this._isPaused=!1,this.emit("resume"),this}isPlaying(){return this._isPlaying}isPaused(){return this._isPaused}stop(o={}){let{fadeDuration:e=0}=o;return e>0?this.fade(this.getVolume(),0,e).finished.then(()=>{this.doStop()}):this.doStop(),this}doStop(){this.sourceController.stop(),this._isPlaying=!1,this._isPaused=!1,this.emit("stop"),this.sourceController.destroy();try{this.gainNode.disconnect()}catch(o){dn("Failed to disconnect gain node on stop().",o)}}setRate(o){o=Math.max(.001,o),this.rate=o;let e=this.sourceController.getSource();return e instanceof HTMLAudioElement?e.playbackRate=o:e instanceof AudioBufferSourceNode&&(e.playbackRate.value=o),this}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new ka(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new ka(this,e);this.currentFade=n;let i=this.audioContext.currentTime;return this.gainNode.gain.setValueAtTime(o,i),this.gainNode.gain.linearRampToValueAtTime(e,i+t/1e3),setTimeout(()=>{!n.isCancelled()&&!n.isFinished()&&(this.volume=e,n.finish(),this.currentFade=null)},t),n}on(o,e){return this.sourceController.on(o,e),this}off(o,e){return this.sourceController.off(o,e),this}once(o,e){return this.sourceController.once(o,e),this}},eu=class{constructor(o){this.alive=!0,this.refCount=0,this.audioBuffer=o}addRef(){this.refCount++}releaseRef(){this.refCount>0&&this.refCount--}getRefCount(){return this.refCount}async unload(){this.refCount>0||(this.alive=!1)}async forceUnload(){this.alive=!1,this.refCount=0}isAlive(){return this.alive}raw(){if(!this.alive)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}},tu=10*1024*1024,nu=class{constructor(o){this.cache=new Map,this.loadingPromises=new Map,this.audioContext=o}async load(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.doLoad(o);this.loadingPromises.set(o,n);try{let i=await n;return this.cache.set(o,i),i}finally{this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new eu(t)}clear(){for(let o of this.cache.values())o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){return{cached:this.cache.size,loading:this.loadingPromises.size}}},iu={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},Da=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...iu,...o},Qc(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new nu(this.audioContext),this.masterChannel=new Xc("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(o=>{let e=()=>{if(this.destroyed){this.clearUnlockHandler(),o();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,o())}).catch(t=>{dn("Failed to resume AudioContext while unlocking.",t)})};this.unlockHandler=e,document.addEventListener("click",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",e)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let o=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",o),document.removeEventListener("touchstart",o),document.removeEventListener("keydown",o)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(o,e,t){this.ensureNotDestroyed(),this.ensureReady();let{volume:n=1,rate:i=1,startTime:r=0,endTime:s,load:a="auto",loop:l=!1}=e??{},c,u=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")c=this.createStreamSource(o);else{u=await this.audioCache.load(o),u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=u.raw(),c=p}else{u=o,u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=o.raw(),c=p}let d=new Zc(this.audioContext,c,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(c instanceof AudioBufferSourceNode?(c.loop=l,l&&s!==void 0&&(c.loopStart=r,c.loopEnd=s)):c instanceof HTMLAudioElement&&(c.loop=l),u){let p=!1,h=()=>{p||(p=!0,u.releaseRef?.())};d.once("ended",h),d.once("stop",h)}return d}async resolveLoadMode(o,e){if(e==="stream"||e==="full")return e;try{let t=await fetch(o,{method:"HEAD"});if(!t.ok)return"stream";let n=t.headers.get("Content-Length");if(!n)return"stream";let i=parseInt(n,10);return isNaN(i)?"stream":i<tu?"full":"stream"}catch(t){return dn("Failed to resolve load mode via HEAD request, falling back to 'stream'.",t),"stream"}}createStreamSource(o){let e=new Audio(o);return e.crossOrigin="anonymous",e}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(o){this.registeredChannels.add(o)}unregisterChannel(o){this.registeredChannels.delete(o)}setVolume(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(o),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(o){return this.ensureNotDestroyed(),this.ensureReady(),o===void 0?this.masterChannel.mute():this.masterChannel.mute(o),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(o,e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(o,e)}getChannel(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(o)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(o){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(o)}async play(o,e){this.ensureNotDestroyed(),this.ensureReady();let t=this.masterChannel.getTokens();for(let n of t)try{n.stop()}catch{}return this.masterChannel.play(o,e)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(o=>{dn("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var fe=class fe{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new Da({maxChannels:fe.MaxChannels});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=fe.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,fe.BusRampTimeConstant),r.setValueAtTime(s,a+fe.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${nt.sound}" instead.`)),this.channels.get(nt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=fe.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channelFor(e),r=await this.sound.load(e.config.src),s=fe.clipRegionOf(e),a=await i.play(r,{volume:0,...fe.playRegionOf(s,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&fe.applyLoopRegion(a,s);let l=e.state.muted??!1;a.mute(l),e.state.muted=l,this.state.set(e,{token:a,cachedAudio:r,originalVolume:t.end}),t.duration>0?await a.fade(0,t.end,t.duration).finished:a.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,!e.config.loop&&t.waitForEnd!==!1&&await new Promise(c=>{a.once("ended",()=>c())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t=fe.defaultFade(e)){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await this.sound.load(e.config.src),r=fe.clipRegionOf(e),s=await n.play(i,{volume:0,...fe.playRegionOf(r,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&fe.applyLoopRegion(s,r);let a=e.state.muted??!1;return s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:i,originalVolume:t.end}),t.duration>0?s.fade(0,t.end,t.duration):s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,s}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return this.arm(e,i),t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new S;if(!this.state.has(e))return i.resolve(),i;let r=this.state.get(e);return r.originalVolume=t,n===0?(r.token.setVolume(t),e.state.volume=t,i.resolve()):r.token.fade(r.token.getVolume(),t,n).finished.then(()=>{e.state.volume=t,i.resolve()}),i}mute(e,t=!0){let n=new S;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}arm(e,t){let n=(t.transport??0)+1;return t.transport=n,()=>this.state.get(e)===t&&t.transport===n}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{if(!r()){n.resolve();return}i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,i.token.fade(0,i.originalVolume,t).finished.then(()=>{if(!r()){n.resolve();return}e.state.paused=!1,n.resolve()})),n}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=fe.clampToRegion(t,fe.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}static playRegionOf(e,t){return t||e.endTime===void 0?{startTime:e.startTime}:{startTime:e.startTime,endTime:e.endTime}}static applyLoopRegion(e,t){let{startTime:n,endTime:i}=t;if(i===void 0||!Number.isFinite(i)||i<=n||typeof AudioBufferSourceNode>"u")return;let r=e.sourceController;if(typeof r?.getSource!="function")return;let s=r.getSource();if(!(s instanceof AudioBufferSourceNode))return;let a=t.loopStart,l=a!==void 0&&Number.isFinite(a)?Math.min(Math.max(a,n),i):n;s.loop=!0,s.loopStart=l<i?l:n,s.loopEnd=i}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime(),...e.state.paused?{paused:!0}:{}}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=await this.sound.load(e.config.src),r=fe.clipRegionOf(e),s=r.endTime!==void 0&&e.config.loop,a=await n.play(i,{volume:e.state.volume,...fe.playRegionOf(r,e.config.loop),startTime:s?r.startTime:t.position,loop:e.config.loop,rate:e.state.rate});e.config.loop&&fe.applyLoopRegion(a,r),s&&Math.abs(t.position-r.startTime)>.01&&a.seek(fe.clampToRegion(t.position,r)),this.state.set(e,{token:a,cachedAudio:i,originalVolume:e.state.volume});let l=e.state.muted??!1;a.mute(l),e.state.muted=l;let c=t.paused??e.state.paused??!1;e.state.paused=c,c?a.pause():t.isPlaying||a.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}preload(e){return this.ready.then(()=>this.sound.load(e.config.src)).then(()=>{}).catch(t=>{this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${e.config.src}")`,t)})}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};fe.MaxChannels=1024,fe.BusRampTimeConstant=.02,fe.BusRampSettle=fe.BusRampTimeConstant*5;var io=fe;var oo=class{constructor(e){this.config=e;this.watching=null;this.warnings=[]}observe(e){return this.watching=e,this}warn(e,t){return this.warnings.push([e,t]),this.watching?.logger.warn(t),t}getWarnings(){return[...this.warnings]}};import*as cu from"html-to-image";var Pe=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),st(()=>{this.preventAttach()})}static proxy(e){let t=new S,n=new S,i=new o(n);return i.onTimelineRegistered(()=>{n.resolve()}).onSettled(()=>{let[r,s]=i.catSettled();e(r,s)}),t.onSkipControllerRegister(r=>{r.onAbort(()=>{i.abort()})}),[t,i]}static any(e){if(e.length===0)throw new E("Cannot create an 'any' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=!1;for(let s of e)i.attachChild(s),s.then(a=>{r||(r=!0,t.resolve(a))});return t.onSkipControllerRegister(s=>{s.onAbort(()=>{i.abort()})}),[t,i]}static all(e){if(e.length===0)throw new E("Cannot create an 'all' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let l=e[a];i.attachChild(l),l.then(c=>{r[a]=c,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(l=>{a=l.onAbort(()=>{r.abort()})}),i.then(l=>{a?.cancel(),n=l,i=e(l),i?st(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?st(()=>s()):st(()=>r.resolve(n)),r}get status(){return this._status}isSettled(){return this._status!=="pending"}isResolved(){return this._status==="resolved"}isCancelled(){return this._status==="cancelled"}isFailed(){return this._status==="failed"}onResolved(e){this._onResolved.push(e)}onCancelled(e){this._onCancelled.push(e)}onFailed(e){this._onFailed.push(e)}onSettled(e){this.isSettled()?st(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
14
+ reference, or store an id in place of the object.`);if(Array.isArray(o)||Ta(o)){n.add(o);try{if(Array.isArray(o))return o.map((l,c)=>yr(l,[...e,c],t+1,n,i,r,s));let a={};return Object.entries(o).forEach(([l,c])=>{a[l]=yr(c,[...e,l],t+1,n,i,r,s)}),a}finally{n.delete(o)}}}return console.warn(`Value of type "${Zc(o)}" cannot be saved and was stored as null
15
+ at ${s}, ${gr(e)}`),null}function Zc(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function Ca(o,e,t){let n=ba(o,e,vr);return n=ba(n,t,()=>{}),n}function ba(o,e,t){if(!Array.isArray(e)||!e.length)return o;let n=o;for(let i of e){if(!Array.isArray(i))continue;if(!i.length){n=t(n);continue}let r=n;for(let a=0;a<i.length-1&&r!==null&&typeof r=="object";a++)r=r[i[a]];if(r===null||typeof r!="object")continue;let s=i[i.length-1];r[s]=t(r[s])}return n}function vr(o){return o instanceof Date?o:typeof o=="string"||typeof o=="number"?new Date(o):new Date(NaN)}function xa(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function Sr(o,e,t=0){if(Object.is(o,e))return!0;if(t>ii)return!1;if(o instanceof Date||e instanceof Date)return o instanceof Date&&e instanceof Date&&o.getTime()===e.getTime();if(Array.isArray(o)||Array.isArray(e))return Array.isArray(o)&&Array.isArray(e)&&o.length===e.length&&o.every((n,i)=>Sr(n,e[i],t+1));if(xa(o)&&xa(e)){let n=Object.keys(o);return n.length===Object.keys(e).length&&n.every(i=>Object.prototype.hasOwnProperty.call(e,i)&&Sr(o[i],e[i],t+1))}return!1}var Vt=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=j({},t),this.defaultContent=t}static isSerializable(e){return Zi(e)}set(e,t){let n=this.content[e];return o.isSerializable(t)?(this.content[e]=t,this.reportChange(e,n,t),this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
16
+ at namespace "${this.name}"`),this.content[e]=t,this.reportChange(e,n,t),this)}get(e){return this.content[e]}equals(e,t){return this.content[e]===t}assign(e){return Object.entries(e).forEach(([t,n])=>{this.set(t,n)}),this}has(e){return this.content[e]!==void 0}keys(){return Object.keys(this.content)}values(){return Object.values(this.content)}entries(){return Object.entries(this.content)}reset(){let e=this.content;return this.content=j({},this.defaultContent),new Set([...Object.keys(e),...Object.keys(this.content)]).forEach(n=>{this.reportChange(n,e[n],this.content[n])}),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n,t)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)}),this.owner?.reportRestore(this.key)}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e,t){let n=`namespace "${this.name}"`+(t===void 0?"":`, key "${t}"`),i={any:s=>{let a=Aa(s,n),l={type:"any",data:a.data};return a.dates.length&&(l.dates=a.dates),a.undefineds.length&&(l.undefineds=a.undefineds),l},date:s=>({type:"date",data:s.toISOString()})},r=this.toTypeName(e);return i[r](e)}unwrap(e){let n={any:i=>Ca(i.data,i.dates,i.undefineds),date:i=>vr(i.data)}[e?.type];return n?n(e):(console.warn(`Unknown stored value type "${e?.type}", reading it as-is
17
+ at namespace "${this.name}"`),e?.data)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||Sr(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},un=class un{constructor(){this.events=new Q;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new Vt(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,e.attach(this),this}getNamespace(e){if(!this.namespaces[e])throw new E(`Namespace ${e} is not initialized, did you forget to register it?
18
+ Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(un.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(un.EventTypes["event:storable.restore"],e)}toData(){return this.entries().reduce((e,[t,n])=>(e[t]=n.toData(),e),{})}load(e){if(!e){console.warn("No data to load");return}let t=this.restoreBatch=new Set;try{Object.entries(e).forEach(([n,i])=>{this.namespaces[n]||this.addNamespace(new Vt(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(un.EventTypes["event:storable.restore"],{namespaces:Array.from(t)})}clear(){return this.values().forEach(e=>e.detach(this)),this.namespaces={},this}reportChange(e){this.events.emit(un.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(un.EventTypes["event:storable.restore"],{namespaces:[e]})}};un.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var oi=un;var Kf={};var Hn=class extends On{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let l=a.getFutureActions(e,i).filter(c=>!r.has(c));s.push(...l)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var tt=class extends _{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ot.play){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.play(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ot.stop){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.stop(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ot.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=S.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,l=>{l&&this.callee.fromData(l)},[s]),a}else if(this.type===Ot.setRate){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.setRate(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ot.pause){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.pause(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ot.resume){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.resume(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ot.seek){let[i]=this.contentNode.getContent(),r=e.audioManager.getPosition(this.callee),s=S.forward(e.audioManager.seek(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{e.audioManager.seek(this.callee,a)},[r]),s}else if(this.type===Ot.mute){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.mute(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("SoundAction")}};tt.ActionTypes=Ot;var nt={bgm:"bgm",sound:"sound",voice:"voice"},eo=8,pn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Vn(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var si=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=l=>{t.set(l.id,{id:l.id,parentId:l.parentId??null,volume:Vn(l.volume)})};Object.values(nt).forEach(l=>n({id:l}));let i=new Set;e.forEach(l=>{let c=l?.id;if(typeof c!="string"||c.trim().length===0)throw new pn(`Audio bus id must be a non-empty string, got ${JSON.stringify(c)}.`);if(i.has(c))throw new pn(`Audio bus "${c}" is declared more than once.`);i.add(c),n(l)}),o.assertResolvable(t);let r=[],s=new Map,a=l=>{let c=s.get(l);if(c)return c;let u=t.get(l),p=u.parentId===null?null:a(u.parentId),d={id:u.id,parentId:u.parentId,volume:u.volume,depth:p?p.depth+1:1};return s.set(l,d),r.push(d),d};return t.forEach(l=>a(l.id)),new o(r,s)}static isSeeded(e){return Object.values(nt).includes(e)}static assertResolvable(e){e.forEach(t=>{let n=[t.id],i=new Set([t.id]),r=t;for(;r.parentId!==null;){let s=e.get(r.parentId);if(!s)throw new pn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new pn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>eo)throw new pn(`Audio bus "${t.id}" nests deeper than ${eo}: ${n.join(" -> ")}.`);r=s}})}getNodes(){return this.nodes}get(e){return this.index.get(e)??null}has(e){return this.index.has(e)}isUnder(e,t){let n=this.index.get(e),i=0;for(;n&&i<=eo;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},br=si.resolve();function eu(o){br=o}function Tr(){return br}function to(o,e){let t=br;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var wa={[nt.bgm]:"bgmVolume",[nt.sound]:"soundVolume",[nt.voice]:"voiceVolume"};function ka(o){let e={};return Object.entries(wa).forEach(([t,n])=>{e[t]={get:()=>Vn(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var ri=class ri{constructor(e,t={}){this.declarations=e;this.events=new Q;this.overrides=new Map;this.aliasTokens=[];this.tree=null;this.events.setMaxListeners(64),this.aliases=t,Object.entries(t).forEach(([n,i])=>{this.aliasTokens.push(i.subscribe(r=>{this.announce(n,Vn(r))}))})}dispose(){this.aliasTokens.forEach(e=>e.cancel()),this.aliasTokens.length=0}announce(e,t){let n=t;try{n=this.getEffectiveVolume(e)}catch{}this.events.emit(ri.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=si.resolve(this.declarations()??[]),eu(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Vn(t),i=this.aliases[e];return i?(i.set(n),this):(this.overrides.set(e,n),this.announce(e,n),this)}setVolumes(e){return Object.entries(e).forEach(([t,n])=>this.setVolume(t,n)),this}getVolume(e){let t=this.aliases[e];return t?Vn(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Vn(this.getDeclaredVolume(e)*this.getVolume(e))}list(){return this.getTree().getNodes().map(e=>({id:e.id,parentId:e.parentId,volume:this.getVolume(e.id),declaredVolume:e.volume,effectiveVolume:this.getEffectiveVolume(e.id)}))}getVolumes(){let e={};return this.list().forEach(t=>{e[t.id]=t.volume}),e}onVolumeChange(e){return this.events.on(ri.EventTypes["event:audioBus.volumeChange"],e)}};ri.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var ai=ri;var Pa=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(Pa||{}),xe=class xe extends pe{static toSound(e){return e==null?null:typeof e=="string"?new xe({src:e}):e}static isSound(e){return e instanceof xe}static voice(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=xe.DefaultUserConfig.create(t),[i]=n.extract(xe.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e,t){return Tr().isUnder(this.config.type,nt.bgm)&&console.warn(`NarraLeaf-React [Sound] Playing a bgm-typed sound (src: ${this.config.src}) with \`play()\`. It will play on the music bus but is not the scene's background music, so leaving the scene will not stop it and it will not cross-fade. Use \`scene.setBackgroundMusic()\` if that is what you wanted.`),this.pushAction(tt.ActionTypes.play,[{end:this.state.volume,duration:e||0,waitForEnd:t?.waitForEnd===!0}])}stop(e){return this.pushAction(tt.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(tt.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(tt.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(tt.ActionTypes.setRate,[e])}pause(e){return this.pushAction(tt.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(tt.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(tt.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:xe.StateSerializer.serialize(this.state)}}fromData(e){return this.state=xe.StateSerializer.deserialize(e.state),this}copy(){return new xe(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return xe.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new tt(this.chain(),e,new C().setContent(t)))}};xe.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",xe.DefaultUserConfig=new K({src:xe.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultConfig=new K({src:xe.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultState=new K({volume:1,rate:1,paused:!1,muted:!1}),xe.StateSerializer=new _e;var ge=xe;var Cn=class Cn{constructor(){this.src=[];this.future=[]}static catSrc(e){let t=new Set,n=new Set,i=new Set;return e.forEach(({type:r,src:s})=>{r===Cn.SrcTypes.image?t.add(s):r===Cn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof O?O.getSrcURL(e):e.type==="image"?O.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ne,W.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(P.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof Se){let n=t;if(t.is(Se,mt.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===mt.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===mt.setAppearance){let i=t.contentNode.getContent()[0];if(O.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(O.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:O.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof O||P.isStaticImageData(e)){if(e instanceof O){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(O.getSrcURL(e)))return this}else if(this.isSrcRegistered(P.srcToURL(e.src)))return this;this.src.push({type:"image",src:P.isStaticImageData(e)?P.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Cn.SrcTypes.audio?t===n.src.getSrc():n.type===Cn.SrcTypes.image?t===O.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Cn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Cn;import*as Ka from"howler";var Ke=class o{static from(e){return o.isPauseConstructor(e)?new o:e}static wait(e){return new o({duration:e})}static isPause(e){return this.isPauseConstructor(e)||e instanceof o}static isPauseConstructor(e){return e===o}constructor(e={}){this.config=e}};var lt=class o{static isTextEvent(e){return e instanceof o}static expression(e,t,n={}){return new o({expression:{image:e,appearance:t},sound:n.sound})}static sound(e){return new o({sound:e})}constructor(e){this.config=e}};function Ea(o,e){let{render:t,data:n,...i}=e,r=j(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var be=class be{static isWord(e){return e instanceof be}static color(e,t){return be.isWord(e)?e.copy().assign({color:t}):new be(e,{color:t})}static bold(e){return be.isWord(e)?e.copy().assign({bold:!0}):new be(e,{bold:!0})}static italic(e){return be.isWord(e)?e.copy().assign({italic:!0}):new be(e,{italic:!0})}static emphasis(e,t={}){return be.isWord(e)?e.copy().assign({emphasis:t}):new be(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return be.isWord(e)?e.copy().assign(i):new be(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=Ea(be.defaultConfig,t)}evaluate(e){if(Ke.isPause(this.text))return[this];if(lt.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>be.isWord(n)?n.inherit(this.config).evaluate(e):new be(n,this.config)).flat():be.isWord(t)?t.inherit(this.config).evaluate(e):[new be(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=Ea(this.config,e),this}copy(){return new be(this.text,this.config)}isPause(){return Ke.isPause(this.text)}isTextEvent(){return lt.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};be.defaultConfig={},be.defaultColor="#000";var oe=be;var ct=class ct{static isSentence(e){return e instanceof ct}static toSentence(e){return ct.isSentence(e)?e:new ct(e)}static format(e){let t=[];if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(this.formatWord(e[n]));else t.push(this.formatWord(e));return t}static formatWord(e){return oe.isWord(e)?e:new oe(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[oe.isWord(e)?e:new oe(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(ct.isSingleWord):ct.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||oe.isWord(e)||Ke.isPause(e)||lt.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=ct.format(e),this.config=j(ct.defaultConfig,{...t,voice:typeof t.voice=="string"?ge.voice(t.voice):ge.toSound(t.voice)}),this.state=sa(ct.defaultState)}toData(){return null}fromData(e){return this.state=j(this.state,e),this}toString(){return this.text.map(e=>e.text).join("")}setCharacter(e){return this.config.character=e,this}evaluate(e){let t=[];for(let n=0;n<this.text.length;n++){let i=this.text[n].evaluate(e);t.push(...ct.formatStaticWord(i))}return t}copy(){return new ct([...this.text],this.config)}};ct.defaultConfig={voice:null,character:null,voiceId:null},ct.defaultState={};var fe=ct;var no=class{constructor(e,t){this.game=e,this.prefix=t}log(e,...t){this.isEnabled("log")&&console.log(...this.colorLog("gray",e,...t))}info(e,...t){this.isEnabled("info")&&console.info(...this._log(e,...t))}warn(e,...t){this.isEnabled("warn")&&console.warn(...this._log(e,...t))}error(e,...t){this.isEnabled("error")&&console.error(...this._log(e,...t))}debug(e,...t){this.isEnabled("debug")&&console.debug(...this.colorLog("gray",e,...t))}trace(e,...t){this.isEnabled("trace")&&console.trace(this._log(e,...t))}weakWarn(e,...t){this.isEnabled("warn")&&console.log(...this.colorLog("yellow",e,...t))}weakError(e,...t){this.isEnabled("error")&&console.log(...this.colorLog("red",e,...t))}verbose(e,...t){this.isEnabled("verbose")&&console.log(...this.colorLog("gray",e,...t))}group(e,t=!1){let n=this._log(e).join(" ");return this.isEnabled("info")&&(t?console.groupCollapsed(n):console.group(n)),{end:()=>{this.isEnabled("info")&&console.groupEnd()}}}isEnabled(e){return typeof this.game.config.app.logger=="boolean"?this.game.config.app.logger:this.game.config.app.logger[e]}_log(e,...t){return t.length===0?[this.prefix||"",e]:[`${this.prefix||""} [${e}]`,...t]}colorLog(e,t,...n){if(n.length===0)return[`%c${this.prefix||""} ${t}`,`color: ${e}`];let i=[],r=[],s=[];return this.prefix?(i.push(`%c${this.prefix} [${t}]`),r.push(`color: ${e}`)):(i.push(`%c[${t}]`),r.push(`color: ${e}`)),n.forEach(a=>{typeof a=="string"?(i.push(`%c${a}`),r.push(`color: ${e}`)):(i.push("%O"),s.push(a),r.push(""))}),[i.join(" ")].concat(r,s)}};var dn=class extends _{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};dn.ActionTypes=ia;var we=class o extends pe{static getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}static execute(e){return new o(e)}constructor(e){super(),this.handler=e;let t=this.chain(),n=new dn(t,dn.ActionTypes.action,new C().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new dn(this.chain(),dn.ActionTypes.action,new C().setContent(e))]}};var tu={volume:1,limit:1/0},nu=class La{constructor(e,t,n,i){this.subChannels=new Map,this.tokens=new Set,this.tokenQueue=[],this.muted=!1,this.removed=!1,this.name=e,this.audioProvider=t,this.parentChannel=i??null,this.options={...tu,...n},this.volume=this.options.volume;let r=this.audioProvider.getAudioContext();this.gainNode=r.createGain(),this.gainNode.gain.value=this.muted?0:this.volume,this.connectToParent()}connectToParent(){this.parentChannel?this.gainNode.connect(this.parentChannel.getGainNode()):this.gainNode.connect(this.audioProvider.getAudioContext().destination)}getGainNode(){return this.gainNode}ensureNotRemoved(){if(this.removed)throw new Error(`Channel "${this.name}" has been removed and cannot be used.`)}getName(){return this.name}async play(e,t){if(this.ensureNotRemoved(),this.tokens.size>=this.options.limit){let r=this.tokenQueue.shift();r&&r.stop()}let n=await this.audioProvider.createToken(e,t,this.gainNode);this.tokens.add(n),this.tokenQueue.push(n);let i=()=>{this.tokens.delete(n);let r=this.tokenQueue.indexOf(n);r!==-1&&this.tokenQueue.splice(r,1)};return n.once("ended",i),n.once("stop",i),n}createChannel(e,t){if(this.ensureNotRemoved(),this.subChannels.has(e))throw new Error(`Channel "${e}" already exists under "${this.name}".`);this.audioProvider.checkChannelLimit();let n=new La(e,this.audioProvider,t,this);return this.subChannels.set(e,n),this.audioProvider.registerChannel(n),n}getChannel(e){return this.ensureNotRemoved(),this.subChannels.get(e)??null}getChannels(){return this.ensureNotRemoved(),Array.from(this.subChannels.values())}setVolume(e){return this.ensureNotRemoved(),this.volume=Math.max(0,Math.min(1,e)),this.muted||(this.gainNode.gain.value=this.volume),this}getVolume(){return this.volume}mute(e){return this.ensureNotRemoved(),this.muted=e!==void 0?e:!0,this.gainNode.gain.value=this.muted?0:this.volume,this}unmute(){return this.mute(!1)}isMuted(){return this.muted}remove(){if(this.removed)return this;this.removed=!0;for(let t of this.tokens)t.stop();this.tokens.clear();let e=Array.from(this.subChannels.values());this.subChannels.clear();for(let t of e)t.remove();try{this.gainNode.disconnect()}catch(t){console.warn("Failed to disconnect Channel gain node during remove().",t)}return this.audioProvider.unregisterChannel(this),this.parentChannel&&this.parentChannel.removeSubChannel(this.name),this}removeSubChannel(e){this.subChannels.delete(e)}getTokens(){this.ensureNotRemoved();let e=[...this.tokenQueue];for(let t of this.subChannels.values())e.push(...t.getTokens());return e}isRemoved(){return this.removed}getParent(){return this.parentChannel}getOptions(){return{...this.options}}},Ra=!1;function iu(o){Ra=o}function en(o,e){Ra||(e!==void 0?console.warn(o,e):console.warn(o))}var ou=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.onSourceEnded=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){en("Failed to disconnect AudioBufferSourceNode in disconnectSource().",o)}else this.currentSource instanceof HTMLAudioElement&&(this.currentSource.pause(),this.currentSource.src="",this.currentSource.load());if(this.mediaElementSource){try{this.mediaElementSource.disconnect()}catch(o){en("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=()=>{this.onSourceEnded?this.onSourceEnded():this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}setSourceEndedHandler(o){this.onSourceEnded=o}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){en("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){if(this.currentSource instanceof AudioBufferSourceNode)this.currentSource.start(o,e);else if(this.currentSource instanceof HTMLAudioElement){e>0&&(this.currentSource.currentTime=e);let t=this.currentSource.play();t&&typeof t.catch=="function"&&t.catch(n=>{en("Failed to start HTMLAudioElement playback.",n)})}}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},Da=class{constructor(o,e){this.token=o,this.endVolume=e,this.cancelled=!1,this.finishedInternal=!1,this._finished=new Promise(t=>{this.resolveFinished=t})}get finished(){return this._finished}cancel(){this.cancelled||this.finishedInternal||(this.cancelled=!0,this.resolveFinished())}finish(){this.finishedInternal||(this.finishedInternal=!0,this.token.setVolume(this.endVolume),this.resolveFinished())}isCancelled(){return this.cancelled}isFinished(){return this.finishedInternal}getTargetVolume(){return this.endVolume}},ru=class{constructor(o,e,t={},n){this._isPlaying=!1,this._isPaused=!1,this._isMuted=!1,this.volume=1,this.rate=1,this.contextStartTime=0,this.startOffset=0,this.pauseOffset=0,this.duration=0,this.currentFade=null,this.audioContext=o,this.volume=t.volume??1,this.rate=t.rate??1,this.startOffset=t.startOffset??0,this.duration=t.duration??0,this.outputNode=n??o.destination,this.gainNode=o.createGain(),this.gainNode.gain.value=this.volume,this.gainNode.connect(this.outputNode),this.sourceController=new ou(o,this.gainNode),this.sourceController.setSourceEndedHandler(()=>this.emit("ended")),this.sourceController.setSource(e),this.applyRate(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1,this._isPaused=!1;try{this.gainNode.disconnect()}catch(e){en("Failed to disconnect gain node on natural end.",e)}}}setVolume(o){return this.currentFade&&(this.currentFade.cancel(),this.currentFade=null),o=Math.max(0,Math.min(1,o)),this.volume=o,this._isMuted||(this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=o),this}getVolume(){return this.volume}mute(o){let e=o!==void 0?o:!0;if(this._isMuted=e,this.currentFade&&!this.currentFade.isFinished()&&!this.currentFade.isCancelled()){let t=this.currentFade.getTargetVolume();this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.volume=t,this.gainNode.gain.value=e?0:t,this.currentFade.finish(),this.currentFade=null}else this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=e?0:this.volume;return this}unmute(){return this.mute(!1)}isMuted(){return this._isMuted}pause(){if(!this._isPlaying||this._isPaused)return this;let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?(o.pause(),this.pauseOffset=o.currentTime):o instanceof AudioBufferSourceNode&&(this.pauseOffset=this.getCurrentTime(),this.sourceController.stop()),this._isPlaying=!1,this._isPaused=!0,this.emit("pause"),this}resume(){if(!this._isPaused)return this;let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement){let e=o.play();e&&typeof e.catch=="function"&&e.catch(()=>{this._isPlaying=!1,this._isPaused=!0})}else if(o instanceof AudioBufferSourceNode){let e=this.audioContext.createBufferSource();e.buffer=o.buffer,e.playbackRate.value=this.rate,e.loop=o.loop,e.loopStart=o.loopStart,e.loopEnd=o.loopEnd,this.sourceController.refreshSource(e),this.startOffset=this.pauseOffset,this.contextStartTime=this.audioContext.currentTime,this.sourceController.start(0,this.pauseOffset)}return this._isPlaying=!0,this._isPaused=!1,this.emit("resume"),this}isPlaying(){return this._isPlaying}isPaused(){return this._isPaused}stop(o={}){let{fadeDuration:e=0}=o;return e>0?this.fade(this.getVolume(),0,e).finished.then(()=>{this.doStop()}):this.doStop(),this}doStop(){this.sourceController.stop(),this._isPlaying=!1,this._isPaused=!1,this.emit("stop"),this.sourceController.destroy();try{this.gainNode.disconnect()}catch(o){en("Failed to disconnect gain node on stop().",o)}}setRate(o){return o=Math.max(.001,o),this.rate=o,this.applyRate(this.sourceController.getSource()),this}applyRate(o){o instanceof HTMLAudioElement?o.playbackRate=this.rate:o instanceof AudioBufferSourceNode&&(o.playbackRate.value=this.rate)}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new Da(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Da(this,e);this.currentFade=n;let i=this.audioContext.currentTime;return this.gainNode.gain.setValueAtTime(o,i),this.gainNode.gain.linearRampToValueAtTime(e,i+t/1e3),setTimeout(()=>{!n.isCancelled()&&!n.isFinished()&&(this.volume=e,n.finish(),this.currentFade=null)},t),n}on(o,e){return this.sourceController.on(o,e),this}off(o,e){return this.sourceController.off(o,e),this}once(o,e){return this.sourceController.once(o,e),this}},su=class{constructor(o,e,t){this.owner=e,this.releaseDelay=t,this.references=0,this.playing=0,this.dropWhenIdle=!1,this.releaseTimer=null,this.audioBuffer=o}retain(){return this.references++,this.dropWhenIdle=!1,this.cancelPendingRelease(),this}release(){this.references>0&&this.references--,this.reconsider()}addRef(){this.playing++,this.cancelPendingRelease()}releaseRef(){this.playing>0&&this.playing--,this.reconsider()}getReferenceCount(){return this.references}getPlayingCount(){return this.playing}getRefCount(){return this.playing}async unload(){this.references=0,this.dropWhenIdle=!0,this.reconsider()}async forceUnload(){this.drop()}isAlive(){return this.audioBuffer!==null}raw(){if(!this.audioBuffer)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}byteLength(){return this.audioBuffer?this.audioBuffer.length*this.audioBuffer.numberOfChannels*4:0}isIdle(){return this.audioBuffer!==null&&this.references===0&&this.playing===0}reconsider(){if(this.isIdle()){if(this.releaseDelay>0&&!this.dropWhenIdle){this.releaseTimer||(this.releaseTimer=setTimeout(()=>{this.releaseTimer=null,this.isIdle()&&this.drop()},this.releaseDelay));return}this.drop()}}cancelPendingRelease(){this.releaseTimer&&(clearTimeout(this.releaseTimer),this.releaseTimer=null)}drop(){this.cancelPendingRelease(),this.audioBuffer&&(this.audioBuffer=null,this.references=0,this.playing=0,this.owner.evict(this))}},au=class{constructor(o,e=0){this.cache=new Map,this.loadingPromises=new Map,this.generation=0,this.audioContext=o,this.releaseDelay=Math.max(0,e)}async load(o){return(await this.acquire(o)).retain()}async acquire(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.generation,i=this.doLoad(o);this.loadingPromises.set(o,i);try{let r=await i;return n!==this.generation?(await r.forceUnload(),r):(this.cache.set(o,r),r)}finally{this.loadingPromises.get(o)===i&&this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new su(t,this,this.releaseDelay)}get(o){let e=this.cache.get(o);return e&&e.isAlive()?e:null}release(o){let e=this.cache.get(o);return e?(e.release(),!0):!1}async unload(o){let e=this.cache.get(o);return e?(await e.unload(),!0):!1}evict(o){for(let[e,t]of this.cache)if(t===o){this.cache.delete(e);return}}clear(){this.generation++;for(let o of Array.from(this.cache.values()))o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){let o=0;for(let e of this.cache.values())o+=e.byteLength();return{entries:this.cache.size,loading:this.loadingPromises.size,decodedBytes:o}}},lu=10*1024*1024,cu={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1,cacheReleaseDelay:0},Ia=class Ar{constructor(e){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...cu,...e},iu(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new au(this.audioContext,this.options.cacheReleaseDelay),this.masterChannel=new nu("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(e=>{let t=()=>{if(this.destroyed){this.clearUnlockHandler(),e();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,e())}).catch(n=>{en("Failed to resume AudioContext while unlocking.",n)})};this.unlockHandler=t,document.addEventListener("click",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",t)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let e=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",e),document.removeEventListener("touchstart",e),document.removeEventListener("keydown",e)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(e,t,n){this.ensureNotDestroyed(),this.ensureReady();let{volume:i=1,rate:r=1,startTime:s=0,endTime:a,loopStart:l,load:c="auto",loop:u=!1}=t??{},p,d=null;if(typeof e=="string")if(await this.resolveLoadMode(e,c)==="stream")p=this.createStreamSource(e);else{d=await this.audioCache.acquire(e),d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=d.raw(),p=m}else{d=e,d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=e.raw(),p=m}let g=u&&a!==void 0&&a>s?{start:Ar.clampLoopStart(l,s,a),end:a}:null;p instanceof AudioBufferSourceNode?(p.loop=u,g&&(p.loopStart=g.start,p.loopEnd=g.end)):p instanceof HTMLAudioElement&&(p.loop=u);let f=new ru(this.audioContext,p,{volume:i,rate:r,startOffset:s,duration:!u&&a?a-s:0},n);if(d){let m=!1,y=()=>{m||(m=!0,d.releaseRef?.())};f.once("ended",y),f.once("stop",y)}return f}static clampLoopStart(e,t,n){return e===void 0||!Number.isFinite(e)?t:e>=t&&e<n?e:t}async resolveLoadMode(e,t){if(t==="stream"||t==="full")return t;let n=Ar.schemeOf(e);if(n==="data:"||n==="blob:")return"full";if(n!==null&&n!=="http:"&&n!=="https:")return"stream";try{let i=await fetch(e,{method:"HEAD"});if(!i.ok)return"stream";let r=i.headers.get("Content-Length");if(!r)return"stream";let s=parseInt(r,10);return isNaN(s)?"stream":s<lu?"full":"stream"}catch(i){return en("Failed to resolve load mode via HEAD request, falling back to 'stream'.",i),"stream"}}static schemeOf(e){try{let t=typeof location<"u"&&location?.href?location.href:void 0;return new URL(e,t).protocol}catch{return null}}createStreamSource(e){let t=new Audio(e);return t.crossOrigin="anonymous","preservesPitch"in t&&(t.preservesPitch=!1),t}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(e){this.registeredChannels.add(e)}unregisterChannel(e){this.registeredChannels.delete(e)}setVolume(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(e),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(e){return this.ensureNotDestroyed(),this.ensureReady(),e===void 0?this.masterChannel.mute():this.masterChannel.mute(e),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(e,t){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(e,t)}getChannel(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(e)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(e){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(e)}release(e){return this.ensureNotDestroyed(),this.audioCache.release(e)}async unload(e){return this.ensureNotDestroyed(),this.audioCache.unload(e)}getCached(e){return this.ensureNotDestroyed(),this.audioCache.get(e)}getCacheStats(){return this.audioCache.getStats()}async play(e,t){this.ensureNotDestroyed(),this.ensureReady();let n=this.masterChannel.getTokens();for(let i of n)try{i.stop()}catch{}return this.masterChannel.play(e,t)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(e=>{en("Failed to close AudioContext during destroy().",e)}))}isDestroyed(){return this.destroyed}};var Ie=class Ie{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.retained=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new Ia({maxChannels:Ie.MaxChannels,cacheReleaseDelay:Ie.CacheGrace});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=Ie.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,Ie.BusRampTimeConstant),r.setValueAtTime(s,a+Ie.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${nt.sound}" instead.`)),this.channels.get(nt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=Ie.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let r=await this.channelFor(e).play(e.config.src,{volume:0,...this.playOptionsOf(e)}),s=e.state.muted??!1;r.mute(s),e.state.muted=s,this.state.set(e,{token:r,originalVolume:t.end}),t.duration>0?await r.fade(0,t.end,t.duration).finished:r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,!e.config.loop&&t.waitForEnd!==!1&&await new Promise(a=>{r.once("ended",()=>a())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t=Ie.defaultFade(e)){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await n.play(e.config.src,{volume:0,...this.playOptionsOf(e)}),r=e.state.muted??!1;return i.mute(r),e.state.muted=r,this.state.set(e,{token:i,originalVolume:t.end}),t.duration>0?i.fade(0,t.end,t.duration):i.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,i}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return this.arm(e,i),t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new S;if(!this.state.has(e))return i.resolve(),i;let r=this.state.get(e);return r.originalVolume=t,n===0?(r.token.setVolume(t),e.state.volume=t,i.resolve()):r.token.fade(r.token.getVolume(),t,n).finished.then(()=>{e.state.volume=t,i.resolve()}),i}mute(e,t=!0){let n=new S;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}arm(e,t){let n=(t.transport??0)+1;return t.transport=n,()=>this.state.get(e)===t&&t.transport===n}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{if(!r()){n.resolve();return}i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,i.token.fade(0,i.originalVolume,t).finished.then(()=>{if(!r()){n.resolve();return}e.state.paused=!1,n.resolve()})),n}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=Ie.clampToRegion(t,Ie.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}playOptionsOf(e){return{...Ie.clipRegionOf(e),loop:e.config.loop,rate:e.state.rate,load:this.loadModeOf(e)}}loadModeOf(e){let{src:t,streaming:n,loop:i,endTime:r}=e.config;return t.startsWith("data:")||t.startsWith("blob:")?"full":n?"stream":this.gameState.game.config.audioStreaming==="declared"?"full":i&&r===void 0?"stream":"full"}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime(),...e.state.paused?{paused:!0}:{}}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=Ie.clipRegionOf(e),r=i.endTime!==void 0&&e.config.loop,s=await n.play(e.config.src,{volume:e.state.volume,...this.playOptionsOf(e),startTime:r?i.startTime:t.position});r&&Math.abs(t.position-i.startTime)>.01&&s.seek(Ie.clampToRegion(t.position,i)),this.state.set(e,{token:s,originalVolume:e.state.volume});let a=e.state.muted??!1;s.mute(a),e.state.muted=a;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?s.pause():t.isPlaying||s.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}preload(e){let t=e.config.src;if(this.loadModeOf(e)==="stream"||this.retained.has(t))return Promise.resolve();let n=this.ready.then(()=>this.sound.load(t)).then(()=>!0).catch(i=>(this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${t}")`,i),!1));return this.retained.set(t,n),n.then(()=>{})}retainOnly(e){let t=new Set(e.map(n=>n.config.src));for(let n of[...this.retained.keys()])t.has(n)||this.releaseSource(n);for(let n of e)this.preload(n)}getCacheStats(){return this.isReady?this.sound.getCacheStats():{entries:0,loading:0,decodedBytes:0}}releaseSource(e){let t=this.retained.get(e);t&&(this.retained.delete(e),t.then(n=>{n&&this.isReady&&this.sound.release(e)}))}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.retainOnly([]),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.retained.clear(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};Ie.MaxChannels=1024,Ie.BusRampTimeConstant=.02,Ie.BusRampSettle=Ie.BusRampTimeConstant*5,Ie.CacheGrace=5e3;var io=Ie;function Ma(o){if(typeof MessageChannel>"u"){let n=setTimeout(o,0);return()=>clearTimeout(n)}let e=!1,t=new MessageChannel;return t.port1.onmessage=()=>{t.port1.close(),t.port2.close(),e||o()},t.port2.postMessage(void 0),()=>{e=!0}}var oo=class{constructor(e){this.config=e;this.watching=null;this.warnings=[]}observe(e){return this.watching=e,this}warn(e,t){return this.warnings.push([e,t]),this.watching?.logger.warn(t),t}getWarnings(){return[...this.warnings]}};import*as hu from"html-to-image";var ke=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),st(()=>{this.preventAttach()})}static proxy(e){let t=new S,n=new S,i=new o(n);return i.onTimelineRegistered(()=>{n.resolve()}).onSettled(()=>{let[r,s]=i.catSettled();e(r,s)}),t.onSkipControllerRegister(r=>{r.onAbort(()=>{i.abort()})}),[t,i]}static any(e){if(e.length===0)throw new E("Cannot create an 'any' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=!1;for(let s of e)i.attachChild(s),s.then(a=>{r||(r=!0,t.resolve(a))});return t.onSkipControllerRegister(s=>{s.onAbort(()=>{i.abort()})}),[t,i]}static all(e){if(e.length===0)throw new E("Cannot create an 'all' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let l=e[a];i.attachChild(l),l.then(c=>{r[a]=c,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(l=>{a=l.onAbort(()=>{r.abort()})}),i.then(l=>{a?.cancel(),n=l,i=e(l),i?st(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new U(()=>(i&&i.abort(),t))),i=e(t),i?st(()=>s()):st(()=>r.resolve(n)),r}get status(){return this._status}isSettled(){return this._status!=="pending"}isResolved(){return this._status==="resolved"}isCancelled(){return this._status==="cancelled"}isFailed(){return this._status==="failed"}onResolved(e){this._onResolved.push(e)}onCancelled(e){this._onCancelled.push(e)}onFailed(e){this._onFailed.push(e)}onSettled(e){this.isSettled()?st(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
19
19
  Timeline attaching is only allowed synchronously after the timeline is created.
20
- Current _ableToAttach: `+this._ableToAttach);let t=S.isAwaitable(e)?new o(e,this.guard):e;return this.children.push(t),this.guard&&t.setGuard(this.guard),t.onSettled(()=>{this.resolveStatus()}),this}setGuard(e){return this.guard=e,this}catSettled(){return this.children.reduce(([e,t],n)=>(n.isResolved()?e.push(n):n.isCancelled()&&t.push(n),[e,t]),[[],[]])}onTimelineRegistered(e){return this._onTimelineRegistered.push(e),this}resolveStatus(){let e=this.children.find(t=>t.isFailed());this.awaitable.failed||e?this.setStatus("failed",this.emitEvents.bind(this)):this.awaitable.solved&&this.children.every(t=>t.isSettled())?this.setStatus("resolved",this.emitEvents.bind(this)):this.awaitable.skipController?.isAborted()&&this.setStatus("cancelled",this.emitEvents.bind(this))}emitEvents(){if(this.isResolved())this._onResolved.forEach(e=>e());else if(this.isCancelled())this._onCancelled.forEach(e=>e());else if(this.isFailed()){let e=this.children.find(t=>t.isFailed());this._onFailed.forEach(t=>t(this.awaitable.error??e?.awaitable.error))}this._onResolved=[],this._onCancelled=[],this._onFailed=[]}setStatus(e,t){if(this.isSettled()){this.guard&&this.guard.warn("unexpectedTimelineStatusChange",`Trying to resolve a settled timeline: ${this._status} -> ${e}`);return}e!==this._status&&t?(this._status=e,t()):this._status=e}preventAttach(){this._ableToAttach=!1,this._onTimelineRegistered.forEach(e=>e())}},ro=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof Pe?e:new Pe(e);return this.timelines.push(t),this.guard&&t.setGuard(this.guard),t}abortAll(){for(let e of this.timelines)e.abort();this.cleanupSettled()}cleanupSettled(){this.timelines=this.timelines.filter(e=>!e.isSettled())}};var so=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new J}addNotification(e){this.notifications.push(e),this.flush()}removeNotification(e){this.notifications=this.notifications.filter(t=>t!==e),this.flush()}clearNotifications(){this.notifications=[],this.flush()}consume(e){let t=new S,n=new Pe(t);return t.registerSkipController(new V(()=>{this.removeNotification(e)})),this.addNotification(e),e.duration&&this.gameState.schedule(()=>{t.resolve(),this.removeNotification(e)},e.duration),this.gameState.timelines.attachTimeline(n),t}onFlush(e){return this.events.on("event:notifications.flush",e)}toArray(){return[...this.notifications]}flush(){this.events.emit("event:notifications.flush")}};function ao(o,e,t){let n={},i={};Object.keys(e).forEach(s=>{let a=s;a==="style"&&e.style?Object.assign(n,e.style):e[a]!==void 0&&a!=="key"&&(i[a]=e[a])}),Object.keys(n).length>0&&Object.assign(o.style,n);let r=t?t(i):i;for(let[s,a]of Object.entries(r))o.getAttribute(s)!==a&&o.setAttribute(s,a)}var ou=4e3,Ma={zIndex:0,visibility:"visible"},ru={...Ma,zIndex:1},Ra={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function li(){return{zIndex:"auto",visibility:"visible",opacity:1,transform:"none",translate:"none",filter:"none",clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat"}}function Sr(){return{...li(),visibility:"hidden"}}var lo=class{constructor(e){this.gameState=e;this.sceneElements=new Map;this.overlayHost=null;this.running=null}registerScene(e,t){t?(this.sceneElements.set(e.getId(),t),this.gameState.isSceneSuspended(e)&&Object.assign(t.style,Sr())):this.sceneElements.delete(e.getId())}syncScenePose(e,t){if(this.running&&(this.running.roles.from===e||this.running.roles.to===e))return;let n=this.sceneElements.get(e.getId());n&&Object.assign(n.style,t?Sr():li())}registerOverlayHost(e){this.overlayHost=e}reset(){this.running?.controller.complete(),this.running=null}skip(){this.running&&(this.gameState.logger.debug("StageTransition","Transition skipped"),this.running.controller.complete())}apply(e,t,n){this.running?.controller.complete();let i=e;typeof i._setDetached=="function"&&i._setDetached(!0);let r=e.createTask(this.gameState),s=e.requestAnimations(r.animations),a=new S().registerSkipController(new V(s.cancel)),l=new Pe(a),c=[],u=r.resolve.map(h=>{if(typeof h=="function"){let m=this.createOverlay();return c.push(m),{kind:"overlay",element:m}}return{kind:"scene",sceneId:(h.key==="target"?t.to:t.from).getId(),role:h.key}}),d={task:r,controller:s,roles:t,targets:u,overlays:c,cancelLoadGate:()=>{},stale:!1};this.running=d,s.onUpdate(h=>this.applyFrame(d,h)),s.onComplete(()=>{this.settle(d,[[t.to,li()],[t.from,Sr()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(d,[[t.from,li()],[t.to,li()]]),l.abort()}),this.applyFrame(d,r.animations.map(h=>h.start));let p=this.waitForSceneReady(t.to);return d.cancelLoadGate=p.cancel,p.promise.then(()=>{d.stale||s.start()}),l}applyFrame(e,t){e.task.resolve.forEach((n,i)=>{let r=e.targets[i],s=r.kind==="overlay"?r.element:this.sceneElements.get(r.sceneId)??null;if(!s)return;let a=typeof n=="function"?n:n.resolver,l=r.kind==="overlay"?Ra:r.role==="target"?ru:Ma,c=j({style:l},a(...t));ao(s,c,su)})}settle(e,t){e.stale=!0,e.cancelLoadGate(),e.overlays.forEach(n=>n.remove()),e.overlays.length=0,t.forEach(([n,i])=>{let r=this.sceneElements.get(n.getId());r&&Object.assign(r.style,i)}),this.running===e&&(this.running=null)}createOverlay(){let e=document.createElement("div");return e.setAttribute("data-element-type","stage-transition-overlay"),Object.assign(e.style,Ra),this.overlayHost?.appendChild(e),e}waitForSceneReady(e){let t=this.sceneElements.get(e.getId());if(!t)return{promise:Promise.resolve(),cancel:()=>{}};let n=()=>{},i=new Promise(s=>{n=this.gameState.schedule(()=>{this.gameState.logger.weakWarn("StageTransition","Timed out waiting for the incoming scene to load"),s()},ou)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(au)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},Ia=["src","width","height"];function su(o){if(!Ia.some(t=>t in o))return o;let e={...o};return Ia.forEach(t=>delete e[t]),e}function au(o){return o.getAttribute("src")?typeof o.decode=="function"?o.decode().then(()=>{},()=>{}):o.complete?Promise.resolve():new Promise(e=>{let t=()=>{o.removeEventListener("load",t),o.removeEventListener("error",t),e()};o.addEventListener("load",t),o.addEventListener("error",t)}):Promise.resolve()}var co=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=Yi(6),{action:r,timeline:s,stackModel:a}=e,l=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:l,stackModel:a}),this.history.length>this.maxHistorySize){let c=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(c))}return{id:i}}has(e){return this.history.some(t=>t.id===e)}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),this.liveGame.getGameStateForce?.().logger?.debug("ActionHistory","Undoing",this.history[r].action.type),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var uo=class o{constructor(e){this.history=[];this.cursor=-1;this.resumingAtCursor=!1;this.actionHistoryMgr=e,this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){let t=this.history[this.cursor];if(this.resumingAtCursor&&t&&t.action===e.action)return this.history[this.cursor]={...e,token:t.token},this.resumingAtCursor=!1,this;this.resumingAtCursor=!1;let n=this.history[this.cursor+1];return n&&n.action===e.action?this.history[this.cursor+1]={...e,token:n.token}:(this.history.length=this.cursor+1,this.history.push(e)),this.cursor++,this}getHistory(){return this.history.slice(0,this.cursor+1)}getFuture(){return this.history.slice(this.cursor+1)}getCursor(){return this.cursor}getAt(e){return this.history[e]??null}indexOfToken(e){return this.history.findIndex(t=>t.token===e)}setCursor(e){return this.cursor=Math.max(-1,Math.min(e,this.history.length-1)),this.resumingAtCursor=!0,this}canUndo(){return this.cursor>0}canRedo(){return this.cursor<this.history.length-1}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.slice(0,this.cursor+1).map(e=>o.toSerialized(e))}serializeAll(){return this.history.map(e=>o.toSerialized(e))}load(e,t){this.history=[];for(let n of e){let i=n.actionId!=null?t.get(n.actionId):void 0;i&&this.history.push({token:n.token??Yi(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}this.cursor=this.history.length-1,this.resumingAtCursor=this.cursor>=0}reset(){this.history=[],this.cursor=-1,this.resumingAtCursor=!1}static toSerialized(e){return{token:e.token,actionId:e.action.getId(),element:e.element,isPending:e.isPending,snapshot:e.snapshot??null}}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(i=>i.id)),n=this.history.slice(0,this.cursor+1).filter(i=>t.has(i.token)).length;this.history=this.history.filter(i=>!t.has(i.token)),this.cursor=Math.max(-1,Math.min(this.cursor-n,this.history.length-1))}};var Zt=class Zt extends Y{executeAction(e,t){if(this.type===me.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===me.applyTransition){let[n,i]=this.contentNode.getContent(),r=this.callee,s=i?i(n):n;return this.applyTransition(e,r,s,t)}else if(this.type===me.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===me.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===me.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}else if(this.type===me.bringToFront)return this.bringToFront(e,this.callee,t);throw this.unknownTypeError()}applyTransform(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},l=e.getExposedStateForce(t),c=t.transformState.clone(),u=t._getLoop(),d=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let p=l.applyTransform(n,a),h=e.timelines.attachTimeline(s).attachChild(p);return p.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:h},(g,m,y)=>{s.isSettled()||s.abort(),p.abort(),t.transformState.forceOverwrite(g.state),Zt.restoreLoop(e,t,m,y)},[c,u,d]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),l=i??{};t._setLoop(n,l,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,l),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,d)=>{Zt.restoreLoop(e,t,u,d)},[s,a]);let c=new S;return c.resolve(super.executeAction(e,r)),c}stopLoop(e,t,n,i){let r=t._getLoop(),s=t._getLoopActionId();t._setLoop(null,{},null),t.markDirty();let a=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Loop","Skipped"),super.executeAction(e,i)))),l=()=>{a.isSettled()||a.resolve(super.executeAction(e,i))},c=e.getExposedState(t);if(!c||!r)return e.actionHistory.push({action:this,stackModel:i.stackModel},(p,h)=>{Zt.restoreLoop(e,t,p,h)},[r,s]),l(),a;let u=c.stopLoop(n,l),d=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(l),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:d},(p,h)=>{a.isSettled()||a.abort(),u.abort(),Zt.restoreLoop(e,t,p,h)},[r,s]),a}static restoreLoop(e,t,n,i){if(!n&&!t._getLoop())return;t._setLoop(n?.transform??null,n?.options??{},i),t.markDirty();let r=e.getExposedState(t);r&&(n?r.applyLoop(n.transform,n.options):r.stopLoop(void 0,()=>{}))}applyTransition(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},c=e.getExposedStateForce(t).applyTransition(n,a),u=e.timelines.attachTimeline(s).attachChild(c);return c.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},()=>{s.isSettled()||s.abort(),c.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let c=e.findElementByDisplayable(this.callee,i);c&&e.disposeDisplayable(n,c.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new S().registerSkipController(new V(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,c=>{c.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let l=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:l},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}bringToFront(e,t,n){let i=e.findElementByDisplayable(t),r=i&&Zt.getLayerElements(i,t);if(!r)throw new E(`Displayable not found when bringing it to front. The element may not be on stage yet. (element: ${t.getId()})`);let s=r.indexOf(t);s!==r.length-1&&(r.splice(s,1),r.push(t),e.flush()),e.actionHistory.push({action:this,stackModel:n.stackModel},l=>{let c=e.findElementByDisplayable(t),u=c&&Zt.getLayerElements(c,t);if(!u)return;let d=u.indexOf(t);d!==l&&(u.splice(d,1),u.splice(l,0,t),e.flush())},[s]);let a=new S;return a.resolve(super.executeAction(e,n)),a}static getLayerElements(e,t){for(let n of e.layers.values())if(n.includes(t))return n;return null}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};Zt.ActionTypes=me;var be=Zt;var $e=class o extends pe{constructor(){super(...arguments);this.srcManager=new Ie;this.loopTransform=null;this.loopOptions={};this.loopActionId=null}_getLoop(){return this.loopTransform?{transform:this.loopTransform,options:this.loopOptions}:null}_setLoop(t,n,i){return this.loopTransform=t,this.loopOptions=t?n:{},this.loopActionId=t?i:null,this}_getLoopActionId(){return this.loopActionId}_serializeLoop(){return this.loopActionId?{actionId:this.loopActionId,options:{...this.loopOptions}}:null}_deserializeLoop(t){return this.loopTransform=null,this.loopOptions=t?{...t.options}:{},this.loopActionId=t?t.actionId:null,this}_rebindLoop(t){if(!this.loopActionId||this.loopTransform)return this;let i=t.get(this.loopActionId)?.contentNode?.getContent(),r=Array.isArray(i)?i[0]:void 0;return r instanceof ee?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}pos(t,n,i){return this.transform(new ee({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new ee({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new ee({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new ee({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new ee({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new ee({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new ee({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new ee(t,n))}mask(t,n={}){let i=P.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l,...c}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l},c)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Ge,p=>p.transform(d).clearClip({duration:0})):this.transform(d)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Ge,p=>p.transform(d).clearClip({duration:0})):this.transform(d)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...l}=t,c={duration:s,ease:a,...l},u=o.wipeClipPath(n,100),d=o.wipeClipPath(n,0),p=o.createClipPathTransform([[i?d:u,{duration:0}],[i?u:d,c]]);return r?this.combineActions(new Ge,h=>h.transform(p).clearClip({duration:0})):this.transform(p)}filter(t,n){return this.effect({filter:t},n)}clearFilter(t){return this.effect({filter:"none"},t)}backdrop(t,n){return this.effect({backdropFilter:t},n)}blend(t,n){return this.effect({mixBlendMode:t},n)}transform(t){let n=this.chain(),i=new be(n,me.applyTransform,new x().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new be(i,me.applyLoop,new x().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new be(n,me.stopLoop,new x().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new be(t,me.bringToFront,new x().setContent([]));return t.chain(n)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new ee(t.map(([n,i])=>({props:{clipPath:n},options:i})))}static circleClipPath(t,n){return`circle(${t}% at ${n})`}static wipeClipPath(t,n){switch(t){case"right":return`inset(0 0 0 ${n}%)`;case"top":return`inset(0 0 ${n}% 0)`;case"bottom":return`inset(${n}% 0 0 0)`;case"left":default:return`inset(0 ${n}% 0 0)`}}show(t){let n=this.chain(),i=t instanceof ee?t.copy():new ee({opacity:1},t),r=new be(n,me.applyTransform,new x().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof ee?t.copy():new ee({opacity:0},t),r=new be(n,me.applyTransform,new x().setContent([i]));return n.chain(r)}};var mn=class mn extends pe{constructor(e,t={}){super(),this.config=j(mn.defaultConfig,t),this.authoredName=e||"",this.state=this.getInitialState();let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(l=>typeof l=="string")&&[t,...n].length>0&&[t,...n].every(l=>he.isSingleWord(l))){let l=e,c=he.format([t,...n]),u=new he(ra(l,c),{character:this}),d=new it(this.chain(),it.ActionTypes.say,new x().setContent(u));return this.chain(d)}let i=t||{},r=e,s=Array.isArray(r)?new he(r,{...i,character:this}):(he.isSentence(r)?r:new he(r,{...i,character:this})).copy();s.setCharacter(this);let a=new it(this.chain(),it.ActionTypes.say,new x().setContent(s));return this.chain(a)}setName(e){let t=new it(this.chain(),it.ActionTypes.setName,new x().setContent([e]));return this.chain(t)}setAvatar(e){return this.config.avatar=e===null?null:e,this}addPortrait(e,t={}){return this.config.portraits.push({image:e,avatar:t.avatar}),this}setPortraits(e){return this.config.portraits=[...e],this}apply(e,t,...n){return this.say.apply(this,[e,t,...n])}call(e,t,...n){return Array.isArray(e)&&"raw"in e?t&&he.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):he.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:mn.StateSerializer.serialize(this.state)}}fromData(e){return this.state=mn.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};mn.defaultCharacterColor="#000",mn.defaultConfig={portraits:[]},mn.StateSerializer=new _e;var po=mn,en=new po(null);var X=class o{static isLambda(e){return e instanceof o&&"handler"in e}static isLambdaHandler(e){return typeof e=="function"}static from(e){return o.isLambda(e)?e:new o(e)}static not(e){return new o(t=>!e.evaluate(t).value)}constructor(e){this.handler=e}evaluate({gameState:e}){return{value:this.handler(this.getCtx({gameState:e}))}}getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}toString(){return`Lambda(${this.handler.toString()})`}},Tr=class o extends pe{constructor(){super();this.conditions={If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static getInitialState(){return{If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static If(t,n){return new o().createIfCondition(t,n)}ElseIf(t,n){if(this.conditions.Else.action)throw new Fe(`ELSE condition already set
21
- You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:X.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new Fe(`ELSE condition already set
22
- You are trying to set multiple ELSE conditions for the same condition`);return this.conditions.Else.action=this.construct(Array.isArray(t)?t:[t]),this.chain()}evaluate(t,{gameState:n}){let i={gameState:n};if(t.If.condition?.evaluate(i)?.value)return t.If.action||null;for(let s of t.ElseIf)if(s.condition?.evaluate(i)?.value)return s.action||null;return t.Else.action||null}fromChained(t){return[Reflect.construct(Ot,[this,Ot.ActionTypes.action,new x().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,l=r[s+1]?.contentNode;l&&a.setChild(l),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return ze.toActions([this.conditions.If.action?.[0]||[],...this.conditions.ElseIf.flatMap(t=>t.action?.[0]||[]),this.conditions.Else.action?.[0]||[]])}createIfCondition(t,n){this.conditions.If.condition=X.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new Ot(i,Ot.ActionTypes.action,new x().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?en.say(n).getActions():ze.toActions([n]))}};var xn=class extends Y{executeAction(e,t){let n=new S().registerSkipController(new V(()=>{l.cancel()})),i=e.timelines.attachTimeline(n),r=this.contentNode.getContent(),s=e.createPresentationSnapshot(),a=null,l=e.createMenu(r,u=>{let d=e.getLiveGame().createStackModel([{type:this.type,node:u.action[0]?.contentNode??null}]);n.resolve({type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[d]}}),a=()=>{d.reset()},e.gameHistory.updateByToken(c,p=>{p&&p.element.type==="menu"&&(p.element.selected=u.evaluated,p.isPending=!1)})}),{id:c}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{l.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:c,action:this,element:{type:"menu",text:l.prompt,selected:null},isPending:!0,snapshot:e.getLiveGame().captureGameState()}),n}getFutureActions(e,t){let n=this.contentNode.getContent();return[...this.callee._getFutureActions(n.choices),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=i.choices.map(s=>`{${s.action.map(l=>l.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};xn.ActionTypes=ta;var wn=class wn extends pe{constructor(t,n={}){super();this.choices=[];this.prompt=he.isSentence(t)?t:t===null?null:new he(t),this.config=j(wn.defaultConfig,n)}static prompt(t,n={}){return new wn(t!==void 0?t:null,n)}static choose(t,n){return new wn(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return he.isSentence(t)&&n?i.choices.push({prompt:he.toSentence(t),action:this.narrativeToActions(n),config:{}}):(ie.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:he.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:he.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?X.from(t.config.disabled):void 0,hidden:t.config?.hidden?X.from(t.config.hidden):void 0}}):console.warn("No valid choice added to menu, ",{arg0:t,arg1:n}),i}hideIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Fe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.hideIf` before `menu.choose`");return n.config.hidden=X.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Fe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.disableIf` before `menu.choose`");return n.config.disabled=X.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:X.not(X.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:X.not(X.from(t))}})}fromChained(t){return[new xn(this.chain(),xn.ActionTypes.action,new x().setContent({prompt:this.prompt,choices:t.constructChoices()}))]}_getFutureActions(t){return t.map(n=>n.action[0]||null).filter(n=>n!==null)}narrativeToActions(t){return this.constructNodes(t.flatMap(n=>typeof n=="string"?en.say(n).getActions():ze.toActions([n])))}constructNodes(t,n,i){for(let r=0;r<t.length;r++){let s=t[r].contentNode,a=t[r+1]?.contentNode;a&&s.setChild(a),r===this.choices.length-1&&n&&s.setChild(n),r===0&&i&&i.setChild(s)}return t}constructChoices(){return this.choices.map(t=>({action:this.constructNodes(t.action),prompt:t.prompt,config:t.config??{}}))}};wn.defaultConfig={},wn.targetAction=xn;var br=wn;var ci=class ci extends Y{executeAction(e,t){let n=this;if(n.is(ci,"persistent:set")){let[i,r]=n.contentNode.getContent(),s=e.getStorable().getNamespace(n.callee.getNamespaceName()),a=s.get(i);if(typeof r=="function"){let l=s.get(i);s.set(i,r(l))}else s.set(i,r);return e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{s.set(i,l)},[a]),super.executeAction(e,t)}else if(n.is(ci,"persistent:assign")){let[i]=n.contentNode.getContent(),r=e.getStorable().getNamespace(n.callee.getNamespaceName()),s={},a=typeof i=="function"?i(r.getContent()):i;return Object.keys(a).forEach(l=>{s[l]=r.get(l),r.set(l,a[l])}),e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{Object.keys(l).forEach(c=>{r.set(c,l[c])})},[s]),super.executeAction(e,t)}throw this.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("PersistentAction")}};ci.ActionTypes=Zn;var mo=ci;var fo=class fo extends pe{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new Ht(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(Zn.set,[e,t]))}assign(e){return this.chain(this.createAction(Zn.assign,[e]))}equals(e,t){return new X(n=>{let i=n.storable.getNamespace(this.namespace),r=X.isLambda(t)||X.isLambdaHandler(t)?X.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new X(n=>{let i=n.storable.getNamespace(this.namespace),r=X.isLambda(t)||X.isLambdaHandler(t)?X.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new X(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new X(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new X(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new ie(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new ie(i=>X.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new X(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=fo.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new mo(this.chain(),e,x.create(t))}};fo.NamespacePrefix="persistent";var Un=fo,ho=class ho extends Un{constructor(e){super(e,{}),this.namespace=this.prefix(e,ho.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new Ht(this.namespace,this.defaultContent))}};ho.LocalNamespacePrefix="local";var Wn=ho;var yt={shutter:0,shutterColor:"#000",vignette:0,vignetteColor:"#000",vignetteInner:"44%",vignetteOuter:"78%"};function Ar(o){return typeof o!="number"||!Number.isFinite(o)?0:Math.max(0,Math.min(1,o))}function ui(o,e){return typeof o=="string"&&o.length>0?o:e}function Na(o){let e=Ar(o.shutter);return{backgroundColor:ui(o.shutterColor,yt.shutterColor),clipPath:`inset(0 0 ${100-50*e}% 0)`}}function Ga(o){let e=Ar(o.shutter);return{backgroundColor:ui(o.shutterColor,yt.shutterColor),clipPath:`inset(${100-50*e}% 0 0 0)`}}function Fa(o){let e=ui(o.vignetteInner,yt.vignetteInner),t=ui(o.vignetteOuter,yt.vignetteOuter),n=`radial-gradient(circle at center, transparent ${e}, black ${t})`;return{backgroundColor:ui(o.vignetteColor,yt.vignetteColor),opacity:Ar(o.vignette),maskImage:n,WebkitMaskImage:n,maskSize:"100% 100%",WebkitMaskSize:"100% 100%",maskPosition:"center",WebkitMaskPosition:"center",maskRepeat:"no-repeat",WebkitMaskRepeat:"no-repeat",maskMode:"alpha",WebkitMaskMode:"alpha"}}var ut=class ut extends $e{static get DefaultUserConfig(){return ut._defaultUserConfig??(ut._defaultUserConfig=new K({...ne.DefaultTransformState.getDefaultConfig(),opacity:1,...yt}))}constructor(e={}){super();let t=ut.DefaultUserConfig.create(e),n=ut.DefaultConfig.create();this.userConfig=t,this.config=n.get(),this.transformState=this.getInitialTransformState()}pan(e,t,n){return this.pos(e,t,n)}darken(e,t,n){let i=Math.max(0,Math.min(1,e));return this.filter(`brightness(${1-i})`,{duration:t,ease:n})}shutter(e,t,n){return this.lens({shutter:ut.clampLens(e)},{duration:t,ease:n})}vignette(e,t,n){return this.lens({vignette:ut.clampLens(e)},{duration:t,ease:n})}lens(e,t){return this.transform(new ee(e,t))}resetCamera(e,t){return this.transform(new ee([{props:{filter:"none"},options:{duration:0}},{props:{position:new at("center"),scaleX:1,scaleY:1,zoom:1,rotation:0,opacity:1,shutter:yt.shutter,vignette:yt.vignette},options:{duration:e,ease:t}},{props:{shutterColor:yt.shutterColor,vignetteColor:yt.vignetteColor,vignetteInner:yt.vignetteInner,vignetteOuter:yt.vignetteOuter},options:{duration:0}}]))}static clampLens(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}bringToFront(){throw new E(`A camera cannot be brought to front. It is not an element inside a layer, it is what the layers are viewed through, so it has nothing to be in front of \u2014 waiting for it to be added to the stage will not help. Use a camera transform such as Camera.zoom or Camera.pan to change what is in view. (camera: ${this.config.name})`)}reset(){return super.reset(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.transformState.resetTo(ne.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new ut(this.userConfig.get())}getInitialTransformState(){let[e]=this.userConfig.extract(ut.DefaultUserConfig.keys());return new ne(ut.DefaultUserConfig.create(e.get()).get())}};ut._defaultUserConfig=null,ut.DefaultConfig=new K({name:"(camera)"});var pi=ut;var fn=class fn extends Hn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.elementBaseline=null;this.hashCache=new Map;this.name=t;let{camera:i,...r}=n;this.config=j(fn.defaultConfig,r),this._camera=i??new pi}static empty(){return new fn("empty").entry(new Ye("empty"))}get camera(){return this._camera}entry(t){return this.entryScene=t,this}registerPersistent(t){return this.persistent.push(t),this}createPersistent(t,n){let i=new Un(t,n);return this.registerPersistent(i),i}registerService(t,n){return this.services.set(t,n),this}getService(t){let n=this.services.get(t);if(!n)throw new Fe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){let n=this.hashCache.get(t);if(n!==void 0)return n;let i=da(this.stringify(t));return this.hashCache.set(t,i),i}stringify(t=!1){return this.entryScene?.stringify(this,new Set,t)||""}serializeServices(){let t={};return this.services.forEach((n,i)=>{if(!n.serialize||typeof n.serialize!="function")return;let r=n.serialize();if(r!==null){{if(r instanceof Promise)throw new Z(`Service ${i} serialize method should not return a promise`);if(!cr(r))throw new Z(`Service ${i} serialize method should return a pure object.
20
+ Current _ableToAttach: `+this._ableToAttach);let t=S.isAwaitable(e)?new o(e,this.guard):e;return this.children.push(t),this.guard&&t.setGuard(this.guard),t.onSettled(()=>{this.resolveStatus()}),this}setGuard(e){return this.guard=e,this}catSettled(){return this.children.reduce(([e,t],n)=>(n.isResolved()?e.push(n):n.isCancelled()&&t.push(n),[e,t]),[[],[]])}onTimelineRegistered(e){return this._onTimelineRegistered.push(e),this}resolveStatus(){let e=this.children.find(t=>t.isFailed());this.awaitable.failed||e?this.setStatus("failed",this.emitEvents.bind(this)):this.awaitable.solved&&this.children.every(t=>t.isSettled())?this.setStatus("resolved",this.emitEvents.bind(this)):this.awaitable.skipController?.isAborted()&&this.setStatus("cancelled",this.emitEvents.bind(this))}emitEvents(){if(this.isResolved())this._onResolved.forEach(e=>e());else if(this.isCancelled())this._onCancelled.forEach(e=>e());else if(this.isFailed()){let e=this.children.find(t=>t.isFailed());this._onFailed.forEach(t=>t(this.awaitable.error??e?.awaitable.error))}this._onResolved=[],this._onCancelled=[],this._onFailed=[]}setStatus(e,t){if(this.isSettled()){this.guard&&this.guard.warn("unexpectedTimelineStatusChange",`Trying to resolve a settled timeline: ${this._status} -> ${e}`);return}e!==this._status&&t?(this._status=e,t()):this._status=e}preventAttach(){this._ableToAttach=!1,this._onTimelineRegistered.forEach(e=>e())}},ro=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof ke?e:new ke(e);return this.timelines.push(t),this.guard&&t.setGuard(this.guard),t}abortAll(){for(let e of this.timelines)e.abort();this.cleanupSettled()}cleanupSettled(){this.timelines=this.timelines.filter(e=>!e.isSettled())}};var so=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new Q}addNotification(e){this.notifications.push(e),this.flush()}removeNotification(e){this.notifications=this.notifications.filter(t=>t!==e),this.flush()}clearNotifications(){this.notifications=[],this.flush()}consume(e){let t=new S,n=new ke(t);return t.registerSkipController(new U(()=>{this.removeNotification(e)})),this.addNotification(e),e.duration&&this.gameState.schedule(()=>{t.resolve(),this.removeNotification(e)},e.duration),this.gameState.timelines.attachTimeline(n),t}onFlush(e){return this.events.on("event:notifications.flush",e)}toArray(){return[...this.notifications]}flush(){this.events.emit("event:notifications.flush")}};function ao(o,e,t){let n={},i={};Object.keys(e).forEach(s=>{let a=s;a==="style"&&e.style?Object.assign(n,e.style):e[a]!==void 0&&a!=="key"&&(i[a]=e[a])}),Object.keys(n).length>0&&Object.assign(o.style,n);let r=t?t(i):i;for(let[s,a]of Object.entries(r))o.getAttribute(s)!==a&&o.setAttribute(s,a)}var uu=4e3,Oa={zIndex:0,visibility:"visible"},pu={...Oa,zIndex:1},Ga={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function li(){return{zIndex:"auto",visibility:"visible",opacity:1,transform:"none",translate:"none",filter:"none",clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat"}}function Cr(){return{...li(),visibility:"hidden"}}var lo=class{constructor(e){this.gameState=e;this.sceneElements=new Map;this.overlayHost=null;this.running=null}registerScene(e,t){t?(this.sceneElements.set(e.getId(),t),this.gameState.isSceneSuspended(e)&&Object.assign(t.style,Cr())):this.sceneElements.delete(e.getId())}syncScenePose(e,t){if(this.running&&(this.running.roles.from===e||this.running.roles.to===e))return;let n=this.sceneElements.get(e.getId());n&&Object.assign(n.style,t?Cr():li())}registerOverlayHost(e){this.overlayHost=e}reset(){this.running?.controller.complete(),this.running=null}skip(){this.running&&(this.gameState.logger.debug("StageTransition","Transition skipped"),this.running.controller.complete())}apply(e,t,n){this.running?.controller.complete();let i=e;typeof i._setDetached=="function"&&i._setDetached(!0);let r=e.createTask(this.gameState),s=e.requestAnimations(r.animations),a=new S().registerSkipController(new U(s.cancel)),l=new ke(a),c=[],u=r.resolve.map(g=>{if(typeof g=="function"){let m=this.createOverlay();return c.push(m),{kind:"overlay",element:m}}return{kind:"scene",sceneId:(g.key==="target"?t.to:t.from).getId(),role:g.key}}),p={task:r,controller:s,roles:t,targets:u,overlays:c,cancelLoadGate:()=>{},stale:!1};this.running=p,s.onUpdate(g=>this.applyFrame(p,g)),s.onComplete(()=>{this.settle(p,[[t.to,li()],[t.from,Cr()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(p,[[t.from,li()],[t.to,li()]]),l.abort()}),this.applyFrame(p,r.animations.map(g=>g.start));let d=this.waitForSceneReady(t.to);return p.cancelLoadGate=d.cancel,d.promise.then(()=>{p.stale||s.start()}),l}applyFrame(e,t){e.task.resolve.forEach((n,i)=>{let r=e.targets[i],s=r.kind==="overlay"?r.element:this.sceneElements.get(r.sceneId)??null;if(!s)return;let a=typeof n=="function"?n:n.resolver,l=r.kind==="overlay"?Ga:r.role==="target"?pu:Oa,c=j({style:l},a(...t));ao(s,c,du)})}settle(e,t){e.stale=!0,e.cancelLoadGate(),e.overlays.forEach(n=>n.remove()),e.overlays.length=0,t.forEach(([n,i])=>{let r=this.sceneElements.get(n.getId());r&&Object.assign(r.style,i)}),this.running===e&&(this.running=null)}createOverlay(){let e=document.createElement("div");return e.setAttribute("data-element-type","stage-transition-overlay"),Object.assign(e.style,Ga),this.overlayHost?.appendChild(e),e}waitForSceneReady(e){let t=this.sceneElements.get(e.getId());if(!t)return{promise:Promise.resolve(),cancel:()=>{}};let n=()=>{},i=new Promise(s=>{n=this.gameState.schedule(()=>{this.gameState.logger.weakWarn("StageTransition","Timed out waiting for the incoming scene to load"),s()},uu)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(mu)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},Fa=["src","width","height"];function du(o){if(!Fa.some(t=>t in o))return o;let e={...o};return Fa.forEach(t=>delete e[t]),e}function mu(o){return o.getAttribute("src")?typeof o.decode=="function"?o.decode().then(()=>{},()=>{}):o.complete?Promise.resolve():new Promise(e=>{let t=()=>{o.removeEventListener("load",t),o.removeEventListener("error",t),e()};o.addEventListener("load",t),o.addEventListener("error",t)}):Promise.resolve()}var co=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=Yi(6),{action:r,timeline:s,stackModel:a}=e,l=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:l,stackModel:a}),this.history.length>this.maxHistorySize){let c=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(c))}return{id:i}}has(e){return this.history.some(t=>t.id===e)}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),this.liveGame.getGameStateForce?.().logger?.debug("ActionHistory","Undoing",this.history[r].action.type),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var uo=class o{constructor(e){this.history=[];this.cursor=-1;this.resumingAtCursor=!1;this.actionHistoryMgr=e,this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){let t=this.history[this.cursor];if(this.resumingAtCursor&&t&&t.action===e.action)return this.history[this.cursor]={...e,token:t.token},this.resumingAtCursor=!1,this;this.resumingAtCursor=!1;let n=this.history[this.cursor+1];return n&&n.action===e.action?this.history[this.cursor+1]={...e,token:n.token}:(this.history.length=this.cursor+1,this.history.push(e)),this.cursor++,this}getHistory(){return this.history.slice(0,this.cursor+1)}getFuture(){return this.history.slice(this.cursor+1)}getCursor(){return this.cursor}getAt(e){return this.history[e]??null}indexOfToken(e){return this.history.findIndex(t=>t.token===e)}setCursor(e){return this.cursor=Math.max(-1,Math.min(e,this.history.length-1)),this.resumingAtCursor=!0,this}canUndo(){return this.cursor>0}canRedo(){return this.cursor<this.history.length-1}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.slice(0,this.cursor+1).map(e=>o.toSerialized(e))}serializeAll(){return this.history.map(e=>o.toSerialized(e))}load(e,t){this.history=[];for(let n of e){let i=n.actionId!=null?t.get(n.actionId):void 0;i&&this.history.push({token:n.token??Yi(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}this.cursor=this.history.length-1,this.resumingAtCursor=this.cursor>=0}reset(){this.history=[],this.cursor=-1,this.resumingAtCursor=!1}static toSerialized(e){return{token:e.token,actionId:e.action.getId(),element:e.element,isPending:e.isPending,snapshot:e.snapshot??null}}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(i=>i.id)),n=this.history.slice(0,this.cursor+1).filter(i=>t.has(i.token)).length;this.history=this.history.filter(i=>!t.has(i.token)),this.cursor=Math.max(-1,Math.min(this.cursor-n,this.history.length-1))}};var tn=class tn extends _{executeAction(e,t){if(this.type===me.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===me.applyTransition){let[n,i]=this.contentNode.getContent(),r=this.callee,s=i?i(n):n;return this.applyTransition(e,r,s,t)}else if(this.type===me.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===me.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===me.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}else if(this.type===me.bringToFront)return this.bringToFront(e,this.callee,t);throw this.unknownTypeError()}applyTransform(e,t,n,i,r){let s=new S().registerSkipController(new U(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},l=e.getExposedStateForce(t),c=t.transformState.clone(),u=t._getLoop(),p=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let d=l.applyTransform(n,a),g=e.timelines.attachTimeline(s).attachChild(d);return d.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:g},(f,m,y)=>{s.isSettled()||s.abort(),d.abort(),t.transformState.forceOverwrite(f.state),tn.restoreLoop(e,t,m,y)},[c,u,p]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),l=i??{};t._setLoop(n,l,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,l),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,p)=>{tn.restoreLoop(e,t,u,p)},[s,a]);let c=new S;return c.resolve(super.executeAction(e,r)),c}stopLoop(e,t,n,i){let r=t._getLoop(),s=t._getLoopActionId();t._setLoop(null,{},null),t.markDirty();let a=new S().registerSkipController(new U(()=>(e.logger.info("Displayable Loop","Skipped"),super.executeAction(e,i)))),l=()=>{a.isSettled()||a.resolve(super.executeAction(e,i))},c=e.getExposedState(t);if(!c||!r)return e.actionHistory.push({action:this,stackModel:i.stackModel},(d,g)=>{tn.restoreLoop(e,t,d,g)},[r,s]),l(),a;let u=c.stopLoop(n,l),p=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(l),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:p},(d,g)=>{a.isSettled()||a.abort(),u.abort(),tn.restoreLoop(e,t,d,g)},[r,s]),a}static restoreLoop(e,t,n,i){if(!n&&!t._getLoop())return;t._setLoop(n?.transform??null,n?.options??{},i),t.markDirty();let r=e.getExposedState(t);r&&(n?r.applyLoop(n.transform,n.options):r.stopLoop(void 0,()=>{}))}applyTransition(e,t,n,i,r){let s=new S().registerSkipController(new U(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},c=e.getExposedStateForce(t).applyTransition(n,a),u=e.timelines.attachTimeline(s).attachChild(c);return c.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},()=>{s.isSettled()||s.abort(),c.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let c=e.findElementByDisplayable(this.callee,i);c&&e.disposeDisplayable(n,c.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new S().registerSkipController(new U(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,c=>{c.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let l=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:l},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}bringToFront(e,t,n){let i=e.findElementByDisplayable(t),r=i&&tn.getLayerElements(i,t);if(!r)throw new E(`Displayable not found when bringing it to front. The element may not be on stage yet. (element: ${t.getId()})`);let s=r.indexOf(t);s!==r.length-1&&(r.splice(s,1),r.push(t),e.flush()),e.actionHistory.push({action:this,stackModel:n.stackModel},l=>{let c=e.findElementByDisplayable(t),u=c&&tn.getLayerElements(c,t);if(!u)return;let p=u.indexOf(t);p!==l&&(u.splice(p,1),u.splice(l,0,t),e.flush())},[s]);let a=new S;return a.resolve(super.executeAction(e,n)),a}static getLayerElements(e,t){for(let n of e.layers.values())if(n.includes(t))return n;return null}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};tn.ActionTypes=me;var Te=tn;var $e=class o extends pe{constructor(){super(...arguments);this.srcManager=new Re;this.loopTransform=null;this.loopOptions={};this.loopActionId=null}_getLoop(){return this.loopTransform?{transform:this.loopTransform,options:this.loopOptions}:null}_setLoop(t,n,i){return this.loopTransform=t,this.loopOptions=t?n:{},this.loopActionId=t?i:null,this}_getLoopActionId(){return this.loopActionId}_serializeLoop(){return this.loopActionId?{actionId:this.loopActionId,options:{...this.loopOptions}}:null}_deserializeLoop(t){return this.loopTransform=null,this.loopOptions=t?{...t.options}:{},this.loopActionId=t?t.actionId:null,this}_rebindLoop(t){if(!this.loopActionId||this.loopTransform)return this;let i=t.get(this.loopActionId)?.contentNode?.getContent(),r=Array.isArray(i)?i[0]:void 0;return r instanceof Z?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}pos(t,n,i){return this.transform(new Z({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new Z({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new Z({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new Z({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new Z({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new Z({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new Z({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new Z(t,n))}mask(t,n={}){let i=P.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l,...c}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l},c)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...l}=t,c={duration:s,ease:a,...l},u=o.wipeClipPath(n,100),p=o.wipeClipPath(n,0),d=o.createClipPathTransform([[i?p:u,{duration:0}],[i?u:p,c]]);return r?this.combineActions(new Fe,g=>g.transform(d).clearClip({duration:0})):this.transform(d)}filter(t,n){return this.effect({filter:t},n)}clearFilter(t){return this.effect({filter:"none"},t)}backdrop(t,n){return this.effect({backdropFilter:t},n)}blend(t,n){return this.effect({mixBlendMode:t},n)}transform(t){let n=this.chain(),i=new Te(n,me.applyTransform,new C().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new Te(i,me.applyLoop,new C().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new Te(n,me.stopLoop,new C().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new Te(t,me.bringToFront,new C().setContent([]));return t.chain(n)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new Z(t.map(([n,i])=>({props:{clipPath:n},options:i})))}static circleClipPath(t,n){return`circle(${t}% at ${n})`}static wipeClipPath(t,n){switch(t){case"right":return`inset(0 0 0 ${n}%)`;case"top":return`inset(0 0 ${n}% 0)`;case"bottom":return`inset(${n}% 0 0 0)`;case"left":default:return`inset(0 ${n}% 0 0)`}}show(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:1},t),r=new Te(n,me.applyTransform,new C().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:0},t),r=new Te(n,me.applyTransform,new C().setContent([i]));return n.chain(r)}};var mn=class mn extends pe{constructor(e,t={}){super(),this.config=j(mn.defaultConfig,t),this.authoredName=e||"",this.state=this.getInitialState();let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(l=>typeof l=="string")&&[t,...n].length>0&&[t,...n].every(l=>fe.isSingleWord(l))){let l=e,c=fe.format([t,...n]),u=new fe(la(l,c),{character:this}),p=new it(this.chain(),it.ActionTypes.say,new C().setContent(u));return this.chain(p)}let i=t||{},r=e,s=Array.isArray(r)?new fe(r,{...i,character:this}):(fe.isSentence(r)?r:new fe(r,{...i,character:this})).copy();s.setCharacter(this);let a=new it(this.chain(),it.ActionTypes.say,new C().setContent(s));return this.chain(a)}setName(e){let t=new it(this.chain(),it.ActionTypes.setName,new C().setContent([e]));return this.chain(t)}setAvatar(e){return this.config.avatar=e===null?null:e,this}addPortrait(e,t={}){return this.config.portraits.push({image:e,avatar:t.avatar}),this}setPortraits(e){return this.config.portraits=[...e],this}apply(e,t,...n){return this.say.apply(this,[e,t,...n])}call(e,t,...n){return Array.isArray(e)&&"raw"in e?t&&fe.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):fe.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:mn.StateSerializer.serialize(this.state)}}fromData(e){return this.state=mn.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};mn.defaultCharacterColor="#000",mn.defaultConfig={portraits:[]},mn.StateSerializer=new _e;var po=mn,nn=new po(null);var Y=class o{static isLambda(e){return e instanceof o&&"handler"in e}static isLambdaHandler(e){return typeof e=="function"}static from(e){return o.isLambda(e)?e:new o(e)}static not(e){return new o(t=>!e.evaluate(t).value)}constructor(e){this.handler=e}evaluate({gameState:e}){return{value:this.handler(this.getCtx({gameState:e}))}}getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}toString(){return`Lambda(${this.handler.toString()})`}},xr=class o extends pe{constructor(){super();this.conditions={If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static getInitialState(){return{If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static If(t,n){return new o().createIfCondition(t,n)}ElseIf(t,n){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
21
+ You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:Y.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
22
+ You are trying to set multiple ELSE conditions for the same condition`);return this.conditions.Else.action=this.construct(Array.isArray(t)?t:[t]),this.chain()}evaluate(t,{gameState:n}){let i={gameState:n};if(t.If.condition?.evaluate(i)?.value)return t.If.action||null;for(let s of t.ElseIf)if(s.condition?.evaluate(i)?.value)return s.action||null;return t.Else.action||null}fromChained(t){return[Reflect.construct(Ht,[this,Ht.ActionTypes.action,new C().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,l=r[s+1]?.contentNode;l&&a.setChild(l),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return ze.toActions([this.conditions.If.action?.[0]||[],...this.conditions.ElseIf.flatMap(t=>t.action?.[0]||[]),this.conditions.Else.action?.[0]||[]])}createIfCondition(t,n){this.conditions.If.condition=Y.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new Ht(i,Ht.ActionTypes.action,new C().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?nn.say(n).getActions():ze.toActions([n]))}};var xn=class extends _{executeAction(e,t){let n=new S().registerSkipController(new U(()=>{l.cancel()})),i=e.timelines.attachTimeline(n),r=this.contentNode.getContent(),s=e.createPresentationSnapshot(),a=null,l=e.createMenu(r,u=>{let p=e.getLiveGame().createStackModel([{type:this.type,node:u.action[0]?.contentNode??null}]);n.resolve({type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[p]}}),a=()=>{p.reset()},e.gameHistory.updateByToken(c,d=>{d&&d.element.type==="menu"&&(d.element.selected=u.evaluated,d.isPending=!1)})}),{id:c}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{l.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:c,action:this,element:{type:"menu",text:l.prompt,selected:null},isPending:!0,snapshot:e.getLiveGame().captureGameState()}),n}getFutureActions(e,t){let n=this.contentNode.getContent();return[...this.callee._getFutureActions(n.choices),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=i.choices.map(s=>`{${s.action.map(l=>l.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};xn.ActionTypes=oa;var wn=class wn extends pe{constructor(t,n={}){super();this.choices=[];this.prompt=fe.isSentence(t)?t:t===null?null:new fe(t),this.config=j(wn.defaultConfig,n)}static prompt(t,n={}){return new wn(t!==void 0?t:null,n)}static choose(t,n){return new wn(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return fe.isSentence(t)&&n?i.choices.push({prompt:fe.toSentence(t),action:this.narrativeToActions(n),config:{}}):(oe.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:fe.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:fe.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?Y.from(t.config.disabled):void 0,hidden:t.config?.hidden?Y.from(t.config.hidden):void 0}}):console.warn("No valid choice added to menu, ",{arg0:t,arg1:n}),i}hideIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Oe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.hideIf` before `menu.choose`");return n.config.hidden=Y.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Oe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.disableIf` before `menu.choose`");return n.config.disabled=Y.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:Y.not(Y.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:Y.not(Y.from(t))}})}fromChained(t){return[new xn(this.chain(),xn.ActionTypes.action,new C().setContent({prompt:this.prompt,choices:t.constructChoices()}))]}_getFutureActions(t){return t.map(n=>n.action[0]||null).filter(n=>n!==null)}narrativeToActions(t){return this.constructNodes(t.flatMap(n=>typeof n=="string"?nn.say(n).getActions():ze.toActions([n])))}constructNodes(t,n,i){for(let r=0;r<t.length;r++){let s=t[r].contentNode,a=t[r+1]?.contentNode;a&&s.setChild(a),r===this.choices.length-1&&n&&s.setChild(n),r===0&&i&&i.setChild(s)}return t}constructChoices(){return this.choices.map(t=>({action:this.constructNodes(t.action),prompt:t.prompt,config:t.config??{}}))}};wn.defaultConfig={},wn.targetAction=xn;var wr=wn;var ci=class ci extends _{executeAction(e,t){let n=this;if(n.is(ci,"persistent:set")){let[i,r]=n.contentNode.getContent(),s=e.getStorable().getNamespace(n.callee.getNamespaceName()),a=s.get(i);if(typeof r=="function"){let l=s.get(i);s.set(i,r(l))}else s.set(i,r);return e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{s.set(i,l)},[a]),super.executeAction(e,t)}else if(n.is(ci,"persistent:assign")){let[i]=n.contentNode.getContent(),r=e.getStorable().getNamespace(n.callee.getNamespaceName()),s={},a=typeof i=="function"?i(r.getContent()):i;return Object.keys(a).forEach(l=>{s[l]=r.get(l),r.set(l,a[l])}),e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{Object.keys(l).forEach(c=>{r.set(c,l[c])})},[s]),super.executeAction(e,t)}throw this.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("PersistentAction")}};ci.ActionTypes=Zn;var mo=ci;var fo=class fo extends pe{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new Vt(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(Zn.set,[e,t]))}assign(e){return this.chain(this.createAction(Zn.assign,[e]))}equals(e,t){return new Y(n=>{let i=n.storable.getNamespace(this.namespace),r=Y.isLambda(t)||Y.isLambdaHandler(t)?Y.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new Y(n=>{let i=n.storable.getNamespace(this.namespace),r=Y.isLambda(t)||Y.isLambdaHandler(t)?Y.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new Y(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new Y(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new Y(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new oe(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new oe(i=>Y.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new Y(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=fo.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new mo(this.chain(),e,C.create(t))}};fo.NamespacePrefix="persistent";var Un=fo,ho=class ho extends Un{constructor(e){super(e,{}),this.namespace=this.prefix(e,ho.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new Vt(this.namespace,this.defaultContent))}};ho.LocalNamespacePrefix="local";var Bn=ho;var gt={shutter:0,shutterColor:"#000",vignette:0,vignetteColor:"#000",vignetteInner:"44%",vignetteOuter:"78%"};function kr(o){return typeof o!="number"||!Number.isFinite(o)?0:Math.max(0,Math.min(1,o))}function ui(o,e){return typeof o=="string"&&o.length>0?o:e}function Ha(o){let e=kr(o.shutter);return{backgroundColor:ui(o.shutterColor,gt.shutterColor),clipPath:`inset(0 0 ${100-50*e}% 0)`}}function Va(o){let e=kr(o.shutter);return{backgroundColor:ui(o.shutterColor,gt.shutterColor),clipPath:`inset(${100-50*e}% 0 0 0)`}}function Ua(o){let e=ui(o.vignetteInner,gt.vignetteInner),t=ui(o.vignetteOuter,gt.vignetteOuter),n=`radial-gradient(circle at center, transparent ${e}, black ${t})`;return{backgroundColor:ui(o.vignetteColor,gt.vignetteColor),opacity:kr(o.vignette),maskImage:n,WebkitMaskImage:n,maskSize:"100% 100%",WebkitMaskSize:"100% 100%",maskPosition:"center",WebkitMaskPosition:"center",maskRepeat:"no-repeat",WebkitMaskRepeat:"no-repeat",maskMode:"alpha",WebkitMaskMode:"alpha"}}var ut=class ut extends $e{static get DefaultUserConfig(){return ut._defaultUserConfig??(ut._defaultUserConfig=new K({...ie.DefaultTransformState.getDefaultConfig(),opacity:1,...gt}))}constructor(e={}){super();let t=ut.DefaultUserConfig.create(e),n=ut.DefaultConfig.create();this.userConfig=t,this.config=n.get(),this.transformState=this.getInitialTransformState()}pan(e,t,n){return this.pos(e,t,n)}darken(e,t,n){let i=Math.max(0,Math.min(1,e));return this.filter(`brightness(${1-i})`,{duration:t,ease:n})}shutter(e,t,n){return this.lens({shutter:ut.clampLens(e)},{duration:t,ease:n})}vignette(e,t,n){return this.lens({vignette:ut.clampLens(e)},{duration:t,ease:n})}lens(e,t){return this.transform(new Z(e,t))}resetCamera(e,t){return this.transform(new Z([{props:{filter:"none"},options:{duration:0}},{props:{position:new at("center"),scaleX:1,scaleY:1,zoom:1,rotation:0,opacity:1,shutter:gt.shutter,vignette:gt.vignette},options:{duration:e,ease:t}},{props:{shutterColor:gt.shutterColor,vignetteColor:gt.vignetteColor,vignetteInner:gt.vignetteInner,vignetteOuter:gt.vignetteOuter},options:{duration:0}}]))}static clampLens(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}bringToFront(){throw new E(`A camera cannot be brought to front. It is not an element inside a layer, it is what the layers are viewed through, so it has nothing to be in front of \u2014 waiting for it to be added to the stage will not help. Use a camera transform such as Camera.zoom or Camera.pan to change what is in view. (camera: ${this.config.name})`)}reset(){return super.reset(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new ut(this.userConfig.get())}getInitialTransformState(){let[e]=this.userConfig.extract(ut.DefaultUserConfig.keys());return new ie(ut.DefaultUserConfig.create(e.get()).get())}};ut._defaultUserConfig=null,ut.DefaultConfig=new K({name:"(camera)"});var pi=ut;var fn=class fn extends Hn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.elementBaseline=null;this.hashCache=new Map;this.name=t;let{camera:i,...r}=n;this.config=j(fn.defaultConfig,r),this._camera=i??new pi}static empty(){return new fn("empty").entry(new Ye("empty"))}get camera(){return this._camera}entry(t){return this.entryScene=t,this}registerPersistent(t){return this.persistent.push(t),this}createPersistent(t,n){let i=new Un(t,n);return this.registerPersistent(i),i}registerService(t,n){return this.services.set(t,n),this}getService(t){let n=this.services.get(t);if(!n)throw new Oe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){let n=this.hashCache.get(t);if(n!==void 0)return n;let i=ha(this.stringify(t));return this.hashCache.set(t,i),i}stringify(t=!1){return this.entryScene?.stringify(this,new Set,t)||""}serializeServices(){let t={};return this.services.forEach((n,i)=>{if(!n.serialize||typeof n.serialize!="function")return;let r=n.serialize();if(r!==null){{if(r instanceof Promise)throw new J(`Service ${i} serialize method should not return a promise`);if(!dr(r))throw new J(`Service ${i} serialize method should return a pure object.
23
23
  A pure object should:
24
24
  1. be an object literal
25
25
  2. not have any prototype
26
26
  3. no circular reference
27
27
  4. sub objects should also be pure objects or serializable data
28
28
  Return null if nothing needs to be saved. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description
29
- Returned value ${r} violates the above rules`)}t[i]=r}}),t}deserializeServices(t){this.services.forEach((n,i)=>{!n.deserialize||typeof n.deserialize!="function"||t[i]&&n.deserialize(t[i])})}getScene(t,n=!1,i){if(Ye.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||Z,[`Scene with name ${t} not found`]);return r}constructStory(){let t=this.entryScene;if(!t)throw new Error("Story must have an entry scene");return this.hashCache.clear(),this.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this.captureElementBaseline(),this.scheduleHashWarmUp(),this}scheduleHashWarmUp(){let t=globalThis.requestIdleCallback;typeof t=="function"&&t(()=>{try{this.hash()}catch{}})}captureElementBaseline(){let t=new Map;this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).forEach(n=>{let i=n.toData();i&&t.set(n.getId(),JSON.stringify(i))}),this.elementBaseline=t}getAllElementStates(){let t=this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]),n=this.elementBaseline,i=[];for(let r of t){if(n&&!r.isDirty())continue;let s=r.toData();s&&(n&&JSON.stringify(s)===n.get(r.getId())||i.push({id:r.getId(),data:s}))}return i}findUnmarkedElements(){let t=this.elementBaseline;return t?this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).filter(n=>{if(n.isDirty())return!1;let i=n.toData();return!!i&&JSON.stringify(i)!==t.get(n.getId())}):[]}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>fn.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${fn.MAX_DEPTH})`);let s=i.shift();if(Ye.isScene(s.callee)){if(n.has(s.callee))continue;s.callee.isSceneRootConstructed()||s.callee.constructSceneRoot(this),n.add(s.callee)}let a=s.getFutureActions(this,{allowFutureScene:!0});i.push(...a)}return this}initPersistent(t){return this.persistent.forEach(n=>{n.init(t)}),this}getInversionConfig(){let{origin:t}=this.config;return{invertY:t==="bottom left"||t==="bottom right",invertX:t==="bottom right"||t==="top right"}}runStaticCheck(t){return new go(t).run(this)}};fn.defaultConfig={origin:"bottom left"},fn.MAX_DEPTH=32767;var di=fn;var hn=class extends Y{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Wi.setText){let i=this.callee.state.text;return this.callee.state.text=this.contentNode.getContent()[0],e.getExposedStateForce(this.callee).flush(),e.actionHistory.push(n,r=>{this.callee.state.text=r},[i]),super.executeAction(e,t)}else if(this.type===Wi.setFontSize){let i=this.callee.state.fontSize;this.callee.state.fontSize=this.contentNode.getContent()[0];let r=e.getExposedStateForce(this.callee);return r.flush(),r.updateStyleSync(),e.actionHistory.push(n,s=>{this.callee.state.fontSize=s},[i]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("TextAction")}};hn.ActionTypes=Wi;var vt=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(vt||{});import{animate as lu}from"motion/react";var Vt=class{requestAnimations(e){let t=e.map(m=>m.start),n=[],i=0,r=!1,s=!1,a=!1,l=[],c=[],u=[],d=()=>{e.forEach((m,y)=>{t[y]=m.end}),i=e.length,l.forEach(m=>m(t)),c.forEach(m=>m())};return{onUpdate:m=>(l.push(m),{cancel:()=>{let y=l.indexOf(m);y!==-1&&l.splice(y,1)}}),onComplete:m=>(c.push(m),{cancel:()=>{let y=c.indexOf(m);y!==-1&&c.splice(y,1)}}),onCanceled:m=>(u.push(m),{cancel:()=>{let y=u.indexOf(m);y!==-1&&u.splice(y,1)}}),complete:()=>{if(!(i===e.length||s)){if(!r){a=!0;return}n.forEach(m=>m.complete())}},start:()=>{if(!(r||s||i===e.length)){if(r=!0,a){d();return}e.forEach((m,y)=>{n.push(this.requestMotion(m,{onComplete:()=>{t[y]=m.end,l.forEach(T=>T(t)),i++,i===e.length&&c.forEach(T=>T())},onUpdate:T=>{t[y]=T,l.forEach(f=>f(t))}}))})}},cancel:()=>{s=!0,n.forEach(m=>m.cancel()),u.forEach(m=>m())}}}toFinalStyle(e){return e.resolve.map(t=>typeof t=="function"?t(...e.animations.map(n=>n.end)):t.resolver(...e.animations.map(n=>n.end)))}asPrev(e){return{resolver:e,key:"current"}}asTarget(e){return{resolver:e,key:"target"}}requestMotion(e,t){return lu(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};Vt.AnimationType=vt;var mi=class extends Vt{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new E(`Trying to access text state, but element is not set
30
- This should not happen, please report this issue to the developers`);return this._element.state}};var yo=class o extends mi{constructor(e){super(),this.fontSize=e.fontSize,this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:this.getTextState().fontSize,end:this.fontSize,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(e=>({style:{fontSize:`${e}px`}}))]}}copy(){return new o({fontSize:this.fontSize,duration:this.duration,easing:this.easing})}};var Ee=class Ee extends $e{static get DefaultUserConfig(){return Ee._defaultUserConfig??(Ee._defaultUserConfig=new K({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:"",...ne.DefaultTransformState.getDefaultConfig()},{position:e=>H.tryParsePosition(e)}))}static get DefaultTextTransformState(){return Ee._defaultTextTransformState??(Ee._defaultTextTransformState=new K({fontColor:"#000000",...ne.DefaultTransformState.getDefaultConfig()}))}constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=Ee.DefaultUserConfig.create(n),r=Ee.DefaultTextConfig.create(i.get());this.userConfig=i,this.config=r.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(i)}setText(e){let t=this.chain(),n=new hn(t,hn.ActionTypes.setText,new x().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new ee({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Ge,i=>{if(t){let s=new yo({fontSize:e,duration:t,easing:n});i.chain(this._applyTransition(i,s))}let r=new hn(i,hn.ActionTypes.setFontSize,new x().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:Ee.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=Ee.StateSerializer.deserialize(e.state),this.transformState.resetTo(ne.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_init(e){return new be(this.chain(),me.init,new x().setContent([e||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}getInitialTransformState(e){let[t]=e.extract(Ee.DefaultTextTransformState.keys());return new ne(Ee.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new be(e,me.applyTransition,new x().setContent([t,n=>n._setElement(this)]))}getInitialState(){return Ee.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};Ee._defaultUserConfig=null,Ee.DefaultTextConfig=new K({alignX:"center",alignY:"center",className:"",layer:void 0}),Ee.DefaultTextState=new K({fontSize:16,display:!1,text:""}),Ee._defaultTextTransformState=null,Ee.StateSerializer=new _e;var kn=Ee;var vo=class extends Y{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(ke.getCtx({gameState:e}),n,i);return S.isAwaitable(r)?S.forward(r,{type:this.type,node:this.contentNode?.getChild()}):super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ServiceAction")}};var Cr=class extends pe{constructor(){super(...arguments);this._handlers={}}on(t,n){return this._registerActionHandler(t,n),this}trigger(t,...n){let i=this.chain();return i.chain(this._createAction(i,t,n))}triggerAction(t,n,i){let r=this._handlers[n];if(!r){t.gameState.logger.warn(`(in User-Defined Service) Trying to trigger action ${n} before it's registered, please use "service.on" to register the action`);return}if(ca(r)){let s=[],a=new S().registerSkipController(new V(()=>{for(let c of s)c?.()}));return r({...t,onAbort:c=>{s.push(c)}},...i).then(()=>a.resolve()),a}r({...t,onAbort:()=>{}},...i)}_registerActionHandler(t,n){this._handlers[t]=n}_createAction(t,n,i){return new vo(t,"service:action",new x().setContent([n,i]))}},xr=class extends Cr{},fi=class extends xr{};var Bn=class extends Y{executeAction(e,t){if(this.type===Tn.action)return super.executeAction(e,t);if(this.type===Tn.setZIndex){let[n]=this.contentNode.getContent(),i=this.callee.state.zIndex;return this.callee.state.zIndex=n,e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.zIndex=r},[i]),e.stage.update(),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("LayerAction")}};Bn.ActionTypes=Tn;var ot=class ot extends $e{static get DefaultUserConfig(){return ot._defaultUserConfig??(ot._defaultUserConfig=new K({zIndex:0,...ne.DefaultTransformState.getDefaultConfig(),opacity:1}))}constructor(e,t={}){super();let n=ot.DefaultUserConfig.create(t),i=ot.DefaultConfig.create({...n.get(),name:e});this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState()}include(e){return(Array.isArray(e)?e:[e]).forEach(n=>{n.useLayer(this)}),this}setZIndex(e){return this.chain(new Bn(this.chain(),Tn.setZIndex,new x().setContent([e])))}bringToFront(){throw new E(`A layer cannot be brought to front. Layers are ordered by z-index, not by the order they were added in \u2014 use Layer.setZIndex to raise one. (layer: ${this.config.name})`)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{state:ot.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=ot.StateSerializer.deserialize(e.state),this.transformState.resetTo(ne.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new ot(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new Bn(this.chain(),Tn.action,new x),new be(this.chain(),me.init,new x().setContent([e,null,!1]))]}getInitialState(){return ot.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(ne.DefaultTransformState.keys());return new ne(ne.DefaultTransformState.create(e.get()).get())}};ot._defaultUserConfig=null,ot.DefaultConfig=new K({name:"(anonymous)",zIndex:0}),ot.StateSerializer=new _e,ot.DefaultState=new K({zIndex:0});var zn=ot;var Et=class Et extends Y{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Et,"video:preload"))return e.isVideoAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVideo(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVideoAdded(i)&&(e.removeVideo(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(Et,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(Et,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(Et,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(Et,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(Et,"video:show")){let s=i.state.display;return e.isVideoAdded(i)||(e.addVideo(i),e.stage.update()),i.state.display=!0,e.actionHistory.push(r,a=>{i.state.display=a},[s]),this.changeState(e,a=>a.show(),t)}else if(n.is(Et,"video:hide")){let s=i.state.display;return this.changeState(e,a=>{i.state.display=!1,e.actionHistory.push(r,l=>{i.state.display=l},[s]),a.hide(),e.removeVideo(i),e.stage.update()},t)}else if(n.is(Et,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new E(`Video is being used before it is added to the game
31
- Use video.show() to add the video to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Video Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new V(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VideoAction")}};Et.ActionTypes=kt;var So=Et;var Kn=class Kn extends pe{constructor(e){super();let t=Kn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new Z("Video must have a src")}preload(){return this.chain(this.createAction(kt.preload,[]))}show(){return this.chain(this.createAction(kt.show,[]))}hide(){return this.chain(this.createAction(kt.hide,[]))}play(){return this.chain(this.createAction(kt.play,[]))}pause(){return this.chain(this.createAction(kt.pause,[]))}resume(){return this.chain(this.createAction(kt.resume,[]))}stop(){return this.chain(this.createAction(kt.stop,[]))}seek(e){return this.chain(this.createAction(kt.seek,[e]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return Kn.DefaultVideoState.create().get()}createAction(e,t){return new So(this.chain(),e,x.create(t))}};Kn.DefaultVideoConfig=new K({src:"",muted:!1}),Kn.DefaultVideoState=new K({display:!1});var wr=Kn;var tn=class tn extends Y{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(tn,"vfx:preload"))return e.isVfxAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVfx(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVfxAdded(i)&&(e.removeVfx(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(tn,"vfx:show")){let[s]=n.contentNode.getContent(),a=i.state.display;return e.isVfxAdded(i)||(e.addVfx(i),e.stage.update()),i.state.display=!0,e.actionHistory.push(r,l=>{i.state.display=l},[a]),this.changeStateAsync(e,l=>l.show(s),t)}else if(n.is(tn,"vfx:hide")){if(!e.isVfxAdded(i)||!i.state.display)return e.logger.weakWarn("NarraLeaf-React: Vfx","Hiding a Vfx that is not shown, ignored. (src: "+i.config.src+")"),S.resolve(super.executeAction(e,t));let[s]=n.contentNode.getContent(),a=i.state.display;return this.changeStateAsync(e,async l=>{await l.hide(s),i.state.display=!1,e.actionHistory.push(r,c=>{i.state.display=c},[a])},t)}else{if(n.is(tn,"vfx:pause"))return this.changeState(e,s=>{i.state.paused=!0,s.pause()},t);if(n.is(tn,"vfx:resume"))return this.changeState(e,s=>{i.state.paused=!1,s.resume()},t);if(n.is(tn,"vfx:setRate"))return this.changeState(e,s=>s.setRate(n.contentNode.getContent()[0]),t)}throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVfxAdded(this.callee))throw new E(`Vfx is being used before it is added to the game
32
- Use vfx.show() to add the vfx to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Vfx Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new V(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VfxAction")}};tn.ActionTypes=Jt;var To=tn;var $n=class $n extends pe{constructor(e){super();let t=$n.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new Z("Vfx must have a src")}preload(){return this.chain(this.createAction(Jt.preload,[]))}show(e){return this.chain(this.createAction(Jt.show,[e]))}hide(e){return this.chain(this.createAction(Jt.hide,[e]))}pause(){return this.chain(this.createAction(Jt.pause,[]))}resume(){return this.chain(this.createAction(Jt.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(Jt.setRate,[e]))}toData(){return{state:{display:this.state.display,paused:this.state.paused}}}fromData(e){let{state:t}=e;return this.state={display:t.display,paused:t.paused},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return $n.DefaultVfxState.create().get()}createAction(e,t){return new To(this.chain(),e,x.create(t))}};$n.DefaultVfxConfig=new K({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),$n.DefaultVfxState=new K({display:!1,paused:!1});var kr=$n;var hi=class extends Y{executeAction(e,t){if(this.type===et.setMotion){let[n]=this.contentNode.getContent();return this.patchState(e,t,{motion:n})}else if(this.type===et.setExpression){let[n]=this.contentNode.getContent();return this.patchState(e,t,{expression:n})}else if(this.type===et.setSkin){let[n]=this.contentNode.getContent();return this.patchState(e,t,{skin:n})}else if(this.type===et.setParam){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{params:{[n]:i}})}else if(this.type===et.setSlot){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{slots:{[n]:i}})}else if(this.type===et.command){let[n,i,r]=this.contentNode.getContent();return this.runCommand(e,t,n,i,r?.await===!0)}throw super.unknownTypeError()}patchState(e,t,n){let i=this.callee,r=i._patchState(n);return this.pushState(e,i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.state=s,this.pushState(e,i)},[r]),super.executeAction(e,t)}pushState(e,t){t._applyState().catch(n=>{e.logger.error("Puppet",`Backend "${t.config.backend}" threw while applying state`,n)})}runCommand(e,t,n,i,r){let s=this.callee,a=()=>s._runCommand(n,i).then(u=>{u||e.logger.weakWarn("Puppet",`Command "${n}" was dropped: the puppet is not on stage. Show the element before commanding it.`)}).catch(u=>{e.logger.error("Puppet",`Backend "${s.config.backend}" threw while running "${n}"`,u)});if(!r)return a(),super.executeAction(e,t);let l=new S().registerSkipController(new V(()=>(e.logger.info("Puppet Command","Skipped"),super.executeAction(e,t))));a().then(()=>{l.isSettled()||l.resolve(super.executeAction(e,t))});let c=e.timelines.attachTimeline(l);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:c},()=>{l.isSettled()||l.abort()}),l}stringify(e,t,n){return super.stringifyWithName("PuppetAction")}};hi.ActionTypes=et;var Oe=class Oe extends $e{constructor(t){super();this.events=new J;this.instance=null;this.status="unmounted";let n=Oe.DefaultUserConfig.create(t),i=Oe.DefaultPuppetConfig.create(n.get());if(this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(n),!this.config.backend)throw new Z("Puppet must have a backend name");if(!this.config.src)throw new Z("Puppet must have a src")}static get DefaultUserConfig(){return Oe._defaultUserConfig??(Oe._defaultUserConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0,motion:null,expression:null,skin:null,params:{},slots:{},...ne.DefaultTransformState.getDefaultConfig()},{position:t=>H.tryParsePosition(t)}))}static normalizeState(t){let n=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{...n,motion:typeof n.motion=="string"?n.motion:null,expression:typeof n.expression=="string"?n.expression:null,skin:typeof n.skin=="string"?n.skin:null,params:Oe.copyParams(n.params),slots:Oe.copySlots(n.slots)}}static mergeState(t,n){return Oe.normalizeState({...t,...n,params:{...t.params,...n.params||{}},slots:{...t.slots,...n.slots||{}}})}static copyParams(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))typeof r=="number"&&Number.isFinite(r)&&(n[i]=r);return n}static copySlots(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))(typeof r=="string"||r===null)&&(n[i]=r);return n}setMotion(t){return this.chain(this.createAction(et.setMotion,[t]))}setExpression(t){return this.chain(this.createAction(et.setExpression,[t]))}setSkin(t){return this.chain(this.createAction(et.setSkin,[t]))}setParam(t,n){return this.chain(this.createAction(et.setParam,[t,n]))}setSlot(t,n){return this.chain(this.createAction(et.setSlot,[t,n]))}command(t,n,i){return this.chain(this.createAction(et.command,[t,n,i]))}getStatus(){return this.status}onStatusChange(t){return this.events.on("event:puppet.statusChange",t)}useLayer(t){return this.userConfig.get().layer=t,Object.assign(this.config,{layer:t}),this}toData(){return{state:Oe.normalizeState(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(t){return this.state=Oe.normalizeState(t.state),this.transformState.resetTo(ne.deserialize(t.transformState).get()),this._deserializeLoop(t.loop),this}_init(t){return new be(this.chain(),me.init,new x().setContent([t||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}_resolveSize(t){let n=this.config.size;return n?{width:n.width,height:n.height}:{width:t.width,height:t.height}}_getStatus(){return this.getStatus()}_setStatus(t){this.status!==t&&(this.status=t,this.events.emit("event:puppet.statusChange",t))}_onStatusChange(t){return this.onStatusChange(t)}_attachInstance(t){this.instance=t}_getInstance(){return this.instance}_patchState(t){let n=Oe.normalizeState(this.state);return this.state=Oe.mergeState(this.state,t),n}async _applyState(){let t=this.instance;t&&await t.apply(Oe.normalizeState(this.state))}async _runCommand(t,n){let i=this.instance;return i?(await i.command(t,n),!0):!1}async _describe(){let t=this.instance;return!t||typeof t.describe!="function"?null:await t.describe()}createAction(t,n){return new hi(this.chain(),t,x.create(n))}getInitialTransformState(t){let[n]=t.extract(ne.DefaultTransformState.keys());return new ne(ne.DefaultTransformState.create(n.get()).get())}getInitialState(){let t=this.userConfig.get();return Oe.normalizeState({motion:t.motion,expression:t.expression,skin:t.skin,params:t.params,slots:t.slots})}};Oe._defaultUserConfig=null,Oe.DefaultPuppetConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0});var Dt=Oe;var gi=class extends pe{constructor(e){super(),this.scene=e}show(e){let t=new te(this.scene.chain(),W.nvlShow,new x().setContent([e]));return this.chain(t)}hide(e){let t=new te(this.scene.chain(),W.nvlHide,new x().setContent([e]));return this.chain(t)}end(){let e=new te(this.scene.chain(),W.nvlEnd,new x().setContent([]));return this.chain(e)}};function Er(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Ha(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return Oa(o);let i=Pr(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=Pr(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=Pr(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function Pr(o,e){if(o===!1||typeof o>"u")return{resolved:!1,source:null};if(typeof o=="function"){let t=o(e);return{resolved:typeof t<"u",source:t??null}}return{resolved:!0,source:o}}function Oa(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}function Va(o,e){let t=[],n=i=>{i&&typeof i!="function"&&P.isImageSrc(i)&&t.push(i)};n(e?.config.avatar),n(o.config.avatar);for(let i of o.config.portraits||[])n(Er(i).avatar);return t}var de=class de{constructor(e,t){this.state={sounds:[],videos:[],vfx:[],srcManagers:[],elements:[]};this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1};this._suppressNextNvlTyping=!1;this.currentHandling=null;this.playerCurrent=null;this.mainContentNode=null;this.exposedState=new Map;this.preloadingScene=null;this.flushDep=0;this.rollLock=new ei;this.htmlToImage=cu;this.pageRouter=null;this.stageClickBuffer=null;this.advanceSuspensions=new Set;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new J,this.logger=new no(e,"NarraLeaf-React"),this.audioManager=new io(this),this.guard=new oo(e.config.app.guard).observe(this),this.timelines=new ro(this.guard),this.notificationMgr=new so(this,[]),this.idManager=new Ki,this.actionHistory=new co(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new uo(this.actionHistory),this.stageTransition=new lo(this),this.events.on(de.EventTypes["event:state.player.skip"],()=>{this.game.config.allowSkipSceneTransition&&this.stageTransition.skip()})}get deps(){return this.flushDep}addVideo(e){return this.state.videos.push(e),this}removeVideo(e){let t=this.state.videos.indexOf(e);return t===-1?(this.logger.weakWarn("Video not found when removing",e.getId()),this):(this.state.videos.splice(t,1),this)}isVideoAdded(e){return this.state.videos.includes(e)}getVideos(){return this.state.videos}addVfx(e){return this.state.vfx.push(e),this}removeVfx(e){let t=this.state.vfx.indexOf(e);return t===-1?(this.logger.weakWarn("Vfx not found when removing",e.getId()),this):(this.state.vfx.splice(t,1),this)}isVfxAdded(e){return this.state.vfx.includes(e)}getVfx(){return this.state.vfx}findElementByScene(e){return this.state.elements.find(t=>t.scene===e)||null}findElementByDisplayable(e,t=null){return this.state.elements.find(n=>{if(t)return n.layers.get(t)?.includes(e)||!1;for(let i of n.layers.values())if(i.includes(e))return!0;return!1})||null}getLiveGame(){return this.game.getLiveGame()}removeElement(e){let t=this.state.elements.indexOf(e);return t===-1?(this.logger.weakWarn("Element not found when removing",e.scene.getId()),this):(this.logger.debug("GameState","Removing element",e.scene.getId()),this.state.elements.splice(t,1),this)}preloadScene(e){let t=Ye.isScene(e)?e:e.entryScene;if(!t)throw new E("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(de.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}addElement(e){return this.state.elements.push(e),this.logger.debug("GameState","Adding element",e.scene.getId()),this}addScene(e){return this.sceneExists(e)?this:(this.state.elements.unshift({scene:e,texts:[],menus:[],layers:new Map(e.config.layers.map(t=>[t,[]]))}),this.logger.debug("GameState","Adding scene",e.getId()),this)}flush(){return this.stage.update(),this}popScene(){let e=this.state.elements.pop();return e?(this.removeElements(e.scene),this.logger.debug("GameState","Popping scene",e.scene.getId()),this):this}settlePendingLines(e){let t=this.findElementByScene(e);return!t||!t.texts.length?this:([...t.texts].forEach(n=>n.onClick()),this)}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){for(let e=this.state.elements.length-1;e>=0;e--){let t=this.state.elements[e];if(!t.suspended)return t.scene}return null}setSceneSuspended(e,t){let n=this.findElementByScene(e);return n?(n.suspended=t,this.stageTransition.syncScenePose(e,t),this.logger.debug("GameState",t?"Suspending scene":"Resuming scene",e.getId()),this.stage.update(),this):(this.logger.weakWarn("Scene not found when suspending",e.getId()),this)}isSceneSuspended(e){return this.findElementByScene(e)?.suspended===!0}getSuspendedScenes(){return this.state.elements.filter(e=>e.suspended).map(e=>e.scene)}getCurrentScene(){return this.state.elements[0]?.scene||null}isFastForwarding(){return this._fastForwarding}setFastForwarding(e){this._fastForwarding=e}hasActiveMenu(){let e=this.getLastScene();return e?(this.findElementByScene(e)?.menus.length??0)>0:!1}findCurrentPortraitForCharacter(e){let t=(e.config.portraits||[]).map(Er);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let l=s[a];for(let c=l.length-1;c>=0;c--){let u=l[c],d=r.get(u);if(d&&this.isDisplayableVisible(u))return d}}return null}sceneExists(e){return e?this.state.elements.some(t=>t.scene===e):!!this.getLastScene()}isSceneActive(e){for(let{scene:t}of this.state.elements)if(t===e)return!0;return!1}wait(e){return new Promise(t=>setTimeout(t,e))}schedule(e,t){let n=[],i=setTimeout(()=>{e({retry:()=>{this.schedule(e,0)},onCleanup:r=>{n.push(r)}})},t);return()=>{n.forEach(r=>r()),clearTimeout(i)}}notify(e){this.notificationMgr.addNotification(e)}handle(e){if(this.currentHandling===e)return this;switch(this.currentHandling=e,e.type){case"condition:action":break}return this}createDialog(e,t,n,i){let r=this.findElementByScene(this.getLastSceneIfNot(i))?.texts;if(!r)throw this.sceneNotFound();let s=t.evaluate(ke.getCtx({gameState:this}));this.game.getLiveGame().events.emit(Ut.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:ie.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1)},text:ie.getText(s)}}createMenu(e,t,n){if(!e.choices.length)throw new Error("Menu must have at least one choice");let i=this.findElementByScene(this.getLastSceneIfNot(n))?.menus;if(!i)throw this.sceneNotFound();let r=e.prompt?.evaluate(ke.getCtx({gameState:this}))||null,s=this.createWaitableAction({...e,words:r},a=>{i.splice(i.indexOf(s),1),t&&t(a),this.game.getLiveGame().events.emit(Ut.EventTypes["event:menu.choose"],{sentence:a.prompt,text:a.evaluated})});return i.push(s),{cancel:()=>{let a=i.indexOf(s);a!==-1&&i.splice(a,1)},prompt:r?ie.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(de.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!0,e?.showTransition),this.emitNvlStateChange(),this}exitNvlMode(e){let t=e?.hideTransition||this.nvlState.options?.hideTransition;return this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(de.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],e),this.emitNvlStateChange(),this}removeNvlDialog(e){let t=this.nvlState.dialogs.findIndex(r=>r.id===e);if(t===-1)return this;let n=[...this.nvlState.dialogs],[i]=n.splice(t,1);return this.nvlState.dialogs=n,this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>te.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(de.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(de.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{te.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this.rebindLoops(),this}rebindLoops(){let[e,t]=this.getLiveGame().constructMaps();return t.forEach(n=>{n instanceof $e&&n._rebindLoop(e)}),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],t),this.emitNvlStateChange(),{created:!1,entry:t}):(this.appendNvlDialog(e),{created:!0,entry:e})}activateNvlDialog(e,t="typing",n=!0){return n&&this.nvlState.activeDialogId===e&&this.nvlState.phase!=="idle"||(this.nvlState.activeDialogId=e,this.nvlState.phase=t,this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}waitForNvlAdvance(e,t){return this.nvlAdvanceWaiters.set(e,t),{cancel:()=>{this.nvlAdvanceWaiters.get(e)===t&&this.nvlAdvanceWaiters.delete(e)}}}requestNvlAdvance(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?"ignore":this.nvlState.phase==="typing"?"typing":this.nvlState.phase==="awaitAdvance"?(this.resolveNvlAdvance(e),"advance"):"ignore"}requestNvlSkip(e){return this.requestNvlAdvance(e)}completeNvlTyping(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?!1:(this.nvlState.phase="awaitAdvance",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.events.emit(de.EventTypes["event:state.nvl.dialogComplete"],e),this.emitNvlStateChange(),!0)}settleNvlDialog(e){return this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}suppressNextNvlTyping(){return this._suppressNextNvlTyping=!0,this}consumeNvlTypingSuppression(){return this._suppressNextNvlTyping?(this._suppressNextNvlTyping=!1,!0):!1}beginAdvDialog(e,t){return this.advDialogState={dialogId:e,actionId:t,ended:!1},this.events.emit(de.EventTypes["event:state.dialog.change"]),this}completeAdvDialogTyping(e){return!e||!this.advDialogState||this.advDialogState.dialogId!==e?this:(this.advDialogState.ended||(this.advDialogState.ended=!0,this.events.emit(de.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(de.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}suspendAdvance(){let e=Symbol("advance-suspension");return this.advanceSuspensions.add(e),()=>{this.advanceSuspensions.delete(e)}}isAdvanceSuspended(){return this.advanceSuspensions.size>0}consumeStageClick(e=200){if(!this.stageClickBuffer)return!1;let{timestamp:t}=this.stageClickBuffer,n=Date.now()-t;return this.stageClickBuffer=null,n>=0&&n<=e}createDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i);if(!r)throw this.sceneNotFound();let s=r.layers.get(n||i.config.defaultDisplayableLayer);if(!s)throw this.layerNotFound();return s.push(e),this}disposeDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i)?.layers.get(n||i.config.defaultDisplayableLayer);if(!r)throw this.layerNotFound();let s=r.indexOf(e);if(s===-1)throw new E(`Displayables not found when disposing. (disposing: ${e.getId()})`);return r.splice(s,1),this}forceReset(){[...this.state.elements].forEach(({scene:t})=>{this.offSrcManager(t.srcManager),this.removeScene(t),t.events.clear()}),this.state.elements=[],this.state.srcManagers=[],this.state.videos=[],this.state.vfx=[],this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.audioManager.reset(),this.timelines.abortAll(),this.gameHistory.reset(),this.actionHistory.reset(),this.logger.debug("GameState","Force reset")}getHowl(){return Ua.Howl}registerSrcManager(e){return this.state.srcManagers.push(e),this}offSrcManager(e){return this.state.srcManagers=this.state.srcManagers.filter(t=>t!==e),this}getStorable(){return this.game.getLiveGame().getStorable()}getSceneByName(e){return this.game.getLiveGame().story?.getScene(e)||null}getStory(){if(!this.game.getLiveGame().story)throw new E("Story not loaded");return this.game.getLiveGame().story}setInterval(e,t){return setInterval(e,t)}clearInterval(e){clearInterval(e)}setTimeout(e,t){return setTimeout(e,t)}clearTimeout(e){clearTimeout(e)}forceAnimation(){let[e,t]=Pe.proxy(S.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof $e&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(ee.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync(),"flush"in r&&r.flush()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new xe("State already mounted");if(!e)throw new xe("Invalid state key");return this.exposedState.set(e,t),this.events.emit(de.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new E("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=this.getExposedState(e);if(n)return{cancel:this.schedule(()=>{t(n)},0)};{let i=this.events.on(de.EventTypes["event.state.onExpose"],(r,s)=>{r===e&&(t(s),i.cancel())});return i}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),...e.suspended?{suspended:!0}:{},elements:{layers:Object.fromEntries(Array.from(e.layers.entries()).map(([t,n])=>[t.getId(),n.map(i=>i.getId())]))}})),audio:this.audioManager.toData(),videos:this.state.videos.map(e=>[e.getId(),e.toData()]),vfx:this.state.vfx.map(e=>[e.getId(),e.toData()]),nvlState:{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,dialogIds:this.nvlState.dialogs.map(e=>e.id),dialogs:this.nvlState.dialogs.map(e=>({id:e.id,actionId:e.actionId,text:e.text,characterId:e.character?e.character.getId():null}))}}}loadData(e,t){if(this.state.elements=[],!this.game.getLiveGame().story)throw new Error("No story loaded");let{scenes:i,audio:r,videos:s}=e;if(i.forEach(({sceneId:a,elements:l,suspended:c})=>{this.logger.debug("Loading scene: "+a);let u=t.get(a);if(!u)throw new E("Scene not found, id: "+a+`
33
- NarraLeaf cannot find the element with the id from the saved game`);let d={scene:u,layers:this.constructLayerMap(l.layers,t),menus:[],texts:[],suspended:c===!0};this.state.elements.push(d),this.registerSrcManager(u.srcManager),d.suspended||this.getExposedStateAsync(u,p=>{te.initBackgroundMusic(u,p,this)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,l])=>{let c=t.get(a);if(!c)throw new E("Video not found, id: "+a+`
34
- NarraLeaf cannot find the element with the id from the saved game`);return c.fromData(l),c}),this.state.vfx=(e.vfx??[]).flatMap(([a,l])=>{let c=t.get(a);return c?(c.fromData(l),[c]):(this.logger.weakWarn("NarraLeaf-React: Vfx","Vfx not found when loading a saved game, skipped. (id: "+a+")"),[])}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(l=>{let c=l.characterId&&t.get(l.characterId)||null,u=l.text||"";return{id:l.id,actionId:l.actionId||l.id,character:c,sentence:new he(u,{character:c}),text:u}});this.nvlState={active:e.nvlState.active,visible:e.nvlState.visible,sessionId:e.nvlState.sessionId,dialogs:a,options:e.nvlState.options||null,activeDialogId:e.nvlState.activeDialogId||null,phase:e.nvlState.phase||(e.nvlState.activeDialogId?"awaitAdvance":"idle"),pendingAdvance:e.nvlState.pendingAdvance||!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active&&this.events.emit(de.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!0,this.nvlState.options?.showTransition),this.emitNvlStateChange()}}getLastSceneIfNot(e){let t=e||this.getLastScene();if(!t||!this.sceneExists(t))throw new E('Scene not found, please call "scene.activate()" first.');return t}createElementSnapshot(e){return{scene:e.scene,suspended:e.suspended===!0,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(i=>[i,i.toData()])]))}}fromElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(([i,r])=>(i.fromData(r),i))])),texts:[],menus:[]}}removeElements(e){let t=this.state.elements.findIndex(n=>n.scene===e);return t===-1?(this.logger.weakWarn("Scene not found when removing elements",e.getId()),this):(this.resetLayers(this.state.elements[t].layers),this.state.elements.splice(t,1),this.logger.debug("GameState","Removing elements",e.getId()),this)}resetLayers(e){let t=this.getLiveGame().story?.camera??null;e.forEach((n,i)=>{i.reset(),n.forEach(r=>{t&&r===t||r.reset()})})}syncNvlDerivedState(){this.nvlState.isTyping=this.nvlState.phase==="typing",this.nvlState.activeDialogId||(this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.nvlState.isTyping=!1)}emitNvlStateChange(){this.syncNvlDerivedState(),this.events.emit(de.EventTypes["event:state.nvl.change"],this.getNvlState()),this.stage.update()}resolveNvlAdvance(e){let t=this.nvlAdvanceWaiters.get(e);return t?(this.nvlAdvanceWaiters.delete(e),this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),t(),!0):!1}isDisplayableVisible(e){return(e.transformState.get().opacity??0)>0}createWaitableAction(e,t){return{action:e,onClick:(i=>{t&&t(i)})}}sceneNotFound(){return new E("Scene not found, target scene may not be activated. This is an internal error, please report this to the developer.")}layerNotFound(){return new E("Layer not found, target layer may not be activated. You may forget to add the layer to the scene config")}constructLayerMap(e,t){return new Map(Object.entries(e).map(([n,i])=>{let r=t.get(n);if(!r)throw new E("Layer not found, id: "+n+`
29
+ Returned value ${r} violates the above rules`)}t[i]=r}}),t}deserializeServices(t){this.services.forEach((n,i)=>{!n.deserialize||typeof n.deserialize!="function"||t[i]&&n.deserialize(t[i])})}getScene(t,n=!1,i){if(Ye.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||J,[`Scene with name ${t} not found`]);return r}constructStory(){let t=this.entryScene;if(!t)throw new Error("Story must have an entry scene");return this.hashCache.clear(),this.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this.captureElementBaseline(),this.scheduleHashWarmUp(),this}scheduleHashWarmUp(){let t=globalThis.requestIdleCallback;typeof t=="function"&&t(()=>{try{this.hash()}catch{}})}captureElementBaseline(){let t=new Map;this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).forEach(n=>{let i=n.toData();i&&t.set(n.getId(),JSON.stringify(i))}),this.elementBaseline=t}getAllElementStates(){let t=this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]),n=this.elementBaseline,i=[];for(let r of t){if(n&&!r.isDirty())continue;let s=r.toData();s&&(n&&JSON.stringify(s)===n.get(r.getId())||i.push({id:r.getId(),data:s}))}return i}findUnmarkedElements(){let t=this.elementBaseline;return t?this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).filter(n=>{if(n.isDirty())return!1;let i=n.toData();return!!i&&JSON.stringify(i)!==t.get(n.getId())}):[]}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>fn.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${fn.MAX_DEPTH})`);let s=i.shift();if(Ye.isScene(s.callee)){if(n.has(s.callee))continue;s.callee.isSceneRootConstructed()||s.callee.constructSceneRoot(this),n.add(s.callee)}let a=s.getFutureActions(this,{allowFutureScene:!0});i.push(...a)}return this}initPersistent(t){return this.persistent.forEach(n=>{n.init(t)}),this}getInversionConfig(){let{origin:t}=this.config;return{invertY:t==="bottom left"||t==="bottom right",invertX:t==="bottom right"||t==="top right"}}runStaticCheck(t){return new go(t).run(this)}};fn.defaultConfig={origin:"bottom left"},fn.MAX_DEPTH=32767;var di=fn;var hn=class extends _{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Bi.setText){let i=this.callee.state.text;return this.callee.state.text=this.contentNode.getContent()[0],e.getExposedStateForce(this.callee).flush(),e.actionHistory.push(n,r=>{this.callee.state.text=r},[i]),super.executeAction(e,t)}else if(this.type===Bi.setFontSize){let i=this.callee.state.fontSize;this.callee.state.fontSize=this.contentNode.getContent()[0];let r=e.getExposedStateForce(this.callee);return r.flush(),r.updateStyleSync(),e.actionHistory.push(n,s=>{this.callee.state.fontSize=s},[i]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("TextAction")}};hn.ActionTypes=Bi;var yt=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(yt||{});import{animate as fu}from"motion/react";var Ut=class{requestAnimations(e){let t=e.map(m=>m.start),n=[],i=0,r=!1,s=!1,a=!1,l=[],c=[],u=[],p=()=>{e.forEach((m,y)=>{t[y]=m.end}),i=e.length,l.forEach(m=>m(t)),c.forEach(m=>m())};return{onUpdate:m=>(l.push(m),{cancel:()=>{let y=l.indexOf(m);y!==-1&&l.splice(y,1)}}),onComplete:m=>(c.push(m),{cancel:()=>{let y=c.indexOf(m);y!==-1&&c.splice(y,1)}}),onCanceled:m=>(u.push(m),{cancel:()=>{let y=u.indexOf(m);y!==-1&&u.splice(y,1)}}),complete:()=>{if(!(i===e.length||s)){if(!r){a=!0;return}n.forEach(m=>m.complete())}},start:()=>{if(!(r||s||i===e.length)){if(r=!0,a){p();return}e.forEach((m,y)=>{n.push(this.requestMotion(m,{onComplete:()=>{t[y]=m.end,l.forEach(T=>T(t)),i++,i===e.length&&c.forEach(T=>T())},onUpdate:T=>{t[y]=T,l.forEach(h=>h(t))}}))})}},cancel:()=>{s=!0,n.forEach(m=>m.cancel()),u.forEach(m=>m())}}}toFinalStyle(e){return e.resolve.map(t=>typeof t=="function"?t(...e.animations.map(n=>n.end)):t.resolver(...e.animations.map(n=>n.end)))}asPrev(e){return{resolver:e,key:"current"}}asTarget(e){return{resolver:e,key:"target"}}requestMotion(e,t){return fu(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};Ut.AnimationType=yt;var mi=class extends Ut{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new E(`Trying to access text state, but element is not set
30
+ This should not happen, please report this issue to the developers`);return this._element.state}};var yo=class o extends mi{constructor(e){super(),this.fontSize=e.fontSize,this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:this.getTextState().fontSize,end:this.fontSize,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(e=>({style:{fontSize:`${e}px`}}))]}}copy(){return new o({fontSize:this.fontSize,duration:this.duration,easing:this.easing})}};var Pe=class Pe extends $e{static get DefaultUserConfig(){return Pe._defaultUserConfig??(Pe._defaultUserConfig=new K({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:"",...ie.DefaultTransformState.getDefaultConfig()},{position:e=>H.tryParsePosition(e)}))}static get DefaultTextTransformState(){return Pe._defaultTextTransformState??(Pe._defaultTextTransformState=new K({fontColor:"#000000",...ie.DefaultTransformState.getDefaultConfig()}))}constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=Pe.DefaultUserConfig.create(n),r=Pe.DefaultTextConfig.create(i.get());this.userConfig=i,this.config=r.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(i)}setText(e){let t=this.chain(),n=new hn(t,hn.ActionTypes.setText,new C().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new Z({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Fe,i=>{if(t){let s=new yo({fontSize:e,duration:t,easing:n});i.chain(this._applyTransition(i,s))}let r=new hn(i,hn.ActionTypes.setFontSize,new C().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:Pe.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=Pe.StateSerializer.deserialize(e.state),this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_init(e){return new Te(this.chain(),me.init,new C().setContent([e||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}getInitialTransformState(e){let[t]=e.extract(Pe.DefaultTextTransformState.keys());return new ie(Pe.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new Te(e,me.applyTransition,new C().setContent([t,n=>n._setElement(this)]))}getInitialState(){return Pe.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};Pe._defaultUserConfig=null,Pe.DefaultTextConfig=new K({alignX:"center",alignY:"center",className:"",layer:void 0}),Pe.DefaultTextState=new K({fontSize:16,display:!1,text:""}),Pe._defaultTextTransformState=null,Pe.StateSerializer=new _e;var kn=Pe;var vo=class extends _{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(we.getCtx({gameState:e}),n,i);return S.isAwaitable(r)?S.forward(r,{type:this.type,node:this.contentNode?.getChild()}):super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ServiceAction")}};var Pr=class extends pe{constructor(){super(...arguments);this._handlers={}}on(t,n){return this._registerActionHandler(t,n),this}trigger(t,...n){let i=this.chain();return i.chain(this._createAction(i,t,n))}triggerAction(t,n,i){let r=this._handlers[n];if(!r){t.gameState.logger.warn(`(in User-Defined Service) Trying to trigger action ${n} before it's registered, please use "service.on" to register the action`);return}if(da(r)){let s=[],a=new S().registerSkipController(new U(()=>{for(let c of s)c?.()}));return r({...t,onAbort:c=>{s.push(c)}},...i).then(()=>a.resolve()),a}r({...t,onAbort:()=>{}},...i)}_registerActionHandler(t,n){this._handlers[t]=n}_createAction(t,n,i){return new vo(t,"service:action",new C().setContent([n,i]))}},Er=class extends Pr{},fi=class extends Er{};var Wn=class extends _{executeAction(e,t){if(this.type===bn.action)return super.executeAction(e,t);if(this.type===bn.setZIndex){let[n]=this.contentNode.getContent(),i=this.callee.state.zIndex;return this.callee.state.zIndex=n,e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.zIndex=r},[i]),e.stage.update(),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("LayerAction")}};Wn.ActionTypes=bn;var ot=class ot extends $e{static get DefaultUserConfig(){return ot._defaultUserConfig??(ot._defaultUserConfig=new K({zIndex:0,...ie.DefaultTransformState.getDefaultConfig(),opacity:1}))}constructor(e,t={}){super();let n=ot.DefaultUserConfig.create(t),i=ot.DefaultConfig.create({...n.get(),name:e});this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState()}include(e){return(Array.isArray(e)?e:[e]).forEach(n=>{n.useLayer(this)}),this}setZIndex(e){return this.chain(new Wn(this.chain(),bn.setZIndex,new C().setContent([e])))}bringToFront(){throw new E(`A layer cannot be brought to front. Layers are ordered by z-index, not by the order they were added in \u2014 use Layer.setZIndex to raise one. (layer: ${this.config.name})`)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{state:ot.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=ot.StateSerializer.deserialize(e.state),this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new ot(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new Wn(this.chain(),bn.action,new C),new Te(this.chain(),me.init,new C().setContent([e,null,!1]))]}getInitialState(){return ot.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(ie.DefaultTransformState.keys());return new ie(ie.DefaultTransformState.create(e.get()).get())}};ot._defaultUserConfig=null,ot.DefaultConfig=new K({name:"(anonymous)",zIndex:0}),ot.StateSerializer=new _e,ot.DefaultState=new K({zIndex:0});var zn=ot;var Dt=class Dt extends _{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Dt,"video:preload"))return e.isVideoAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVideo(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVideoAdded(i)&&(e.removeVideo(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(Dt,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(Dt,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(Dt,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(Dt,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(Dt,"video:show")){let s=i.state.display;return e.isVideoAdded(i)||(e.addVideo(i),e.stage.update()),i.state.display=!0,e.actionHistory.push(r,a=>{i.state.display=a},[s]),this.changeState(e,a=>a.show(),t)}else if(n.is(Dt,"video:hide")){let s=i.state.display;return this.changeState(e,a=>{i.state.display=!1,e.actionHistory.push(r,l=>{i.state.display=l},[s]),a.hide(),e.removeVideo(i),e.stage.update()},t)}else if(n.is(Dt,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new E(`Video is being used before it is added to the game
31
+ Use video.show() to add the video to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Video Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new U(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VideoAction")}};Dt.ActionTypes=Pt;var So=Dt;var Kn=class Kn extends pe{constructor(e){super();let t=Kn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new J("Video must have a src")}preload(){return this.chain(this.createAction(Pt.preload,[]))}show(){return this.chain(this.createAction(Pt.show,[]))}hide(){return this.chain(this.createAction(Pt.hide,[]))}play(){return this.chain(this.createAction(Pt.play,[]))}pause(){return this.chain(this.createAction(Pt.pause,[]))}resume(){return this.chain(this.createAction(Pt.resume,[]))}stop(){return this.chain(this.createAction(Pt.stop,[]))}seek(e){return this.chain(this.createAction(Pt.seek,[e]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return Kn.DefaultVideoState.create().get()}createAction(e,t){return new So(this.chain(),e,C.create(t))}};Kn.DefaultVideoConfig=new K({src:"",muted:!1}),Kn.DefaultVideoState=new K({display:!1});var Dr=Kn;var on=class on extends _{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(on,"vfx:preload"))return e.isVfxAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVfx(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVfxAdded(i)&&(e.removeVfx(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(on,"vfx:show")){let[s]=n.contentNode.getContent(),a=i.state.display;return e.isVfxAdded(i)||(e.addVfx(i),e.stage.update()),i.state.display=!0,e.actionHistory.push(r,l=>{i.state.display=l},[a]),this.changeStateAsync(e,l=>l.show(s),t)}else if(n.is(on,"vfx:hide")){if(!e.isVfxAdded(i)||!i.state.display)return e.logger.weakWarn("NarraLeaf-React: Vfx","Hiding a Vfx that is not shown, ignored. (src: "+i.config.src+")"),S.resolve(super.executeAction(e,t));let[s]=n.contentNode.getContent(),a=i.state.display;return this.changeStateAsync(e,async l=>{await l.hide(s),i.state.display=!1,e.actionHistory.push(r,c=>{i.state.display=c},[a])},t)}else{if(n.is(on,"vfx:pause"))return this.changeState(e,s=>{i.state.paused=!0,s.pause()},t);if(n.is(on,"vfx:resume"))return this.changeState(e,s=>{i.state.paused=!1,s.resume()},t);if(n.is(on,"vfx:setRate"))return this.changeState(e,s=>s.setRate(n.contentNode.getContent()[0]),t)}throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVfxAdded(this.callee))throw new E(`Vfx is being used before it is added to the game
32
+ Use vfx.show() to add the vfx to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Vfx Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new U(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VfxAction")}};on.ActionTypes=Zt;var bo=on;var $n=class $n extends pe{constructor(e){super();let t=$n.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new J("Vfx must have a src")}preload(){return this.chain(this.createAction(Zt.preload,[]))}show(e){return this.chain(this.createAction(Zt.show,[e]))}hide(e){return this.chain(this.createAction(Zt.hide,[e]))}pause(){return this.chain(this.createAction(Zt.pause,[]))}resume(){return this.chain(this.createAction(Zt.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(Zt.setRate,[e]))}toData(){return{state:{display:this.state.display,paused:this.state.paused}}}fromData(e){let{state:t}=e;return this.state={display:t.display,paused:t.paused},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return $n.DefaultVfxState.create().get()}createAction(e,t){return new bo(this.chain(),e,C.create(t))}};$n.DefaultVfxConfig=new K({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),$n.DefaultVfxState=new K({display:!1,paused:!1});var Lr=$n;var hi=class extends _{executeAction(e,t){if(this.type===et.setMotion){let[n]=this.contentNode.getContent();return this.patchState(e,t,{motion:n})}else if(this.type===et.setExpression){let[n]=this.contentNode.getContent();return this.patchState(e,t,{expression:n})}else if(this.type===et.setSkin){let[n]=this.contentNode.getContent();return this.patchState(e,t,{skin:n})}else if(this.type===et.setParam){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{params:{[n]:i}})}else if(this.type===et.setSlot){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{slots:{[n]:i}})}else if(this.type===et.command){let[n,i,r]=this.contentNode.getContent();return this.runCommand(e,t,n,i,r?.await===!0)}throw super.unknownTypeError()}patchState(e,t,n){let i=this.callee,r=i._patchState(n);return this.pushState(e,i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.state=s,this.pushState(e,i)},[r]),super.executeAction(e,t)}pushState(e,t){t._applyState().catch(n=>{e.logger.error("Puppet",`Backend "${t.config.backend}" threw while applying state`,n)})}runCommand(e,t,n,i,r){let s=this.callee,a=()=>s._runCommand(n,i).then(u=>{u||e.logger.weakWarn("Puppet",`Command "${n}" was dropped: the puppet is not on stage. Show the element before commanding it.`)}).catch(u=>{e.logger.error("Puppet",`Backend "${s.config.backend}" threw while running "${n}"`,u)});if(!r)return a(),super.executeAction(e,t);let l=new S().registerSkipController(new U(()=>(e.logger.info("Puppet Command","Skipped"),super.executeAction(e,t))));a().then(()=>{l.isSettled()||l.resolve(super.executeAction(e,t))});let c=e.timelines.attachTimeline(l);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:c},()=>{l.isSettled()||l.abort()}),l}stringify(e,t,n){return super.stringifyWithName("PuppetAction")}};hi.ActionTypes=et;var He=class He extends $e{constructor(t){super();this.events=new Q;this.instance=null;this.status="unmounted";let n=He.DefaultUserConfig.create(t),i=He.DefaultPuppetConfig.create(n.get());if(this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(n),!this.config.backend)throw new J("Puppet must have a backend name");if(!this.config.src)throw new J("Puppet must have a src")}static get DefaultUserConfig(){return He._defaultUserConfig??(He._defaultUserConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0,motion:null,expression:null,skin:null,params:{},slots:{},...ie.DefaultTransformState.getDefaultConfig()},{position:t=>H.tryParsePosition(t)}))}static normalizeState(t){let n=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{...n,motion:typeof n.motion=="string"?n.motion:null,expression:typeof n.expression=="string"?n.expression:null,skin:typeof n.skin=="string"?n.skin:null,params:He.copyParams(n.params),slots:He.copySlots(n.slots)}}static mergeState(t,n){return He.normalizeState({...t,...n,params:{...t.params,...n.params||{}},slots:{...t.slots,...n.slots||{}}})}static copyParams(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))typeof r=="number"&&Number.isFinite(r)&&(n[i]=r);return n}static copySlots(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))(typeof r=="string"||r===null)&&(n[i]=r);return n}setMotion(t){return this.chain(this.createAction(et.setMotion,[t]))}setExpression(t){return this.chain(this.createAction(et.setExpression,[t]))}setSkin(t){return this.chain(this.createAction(et.setSkin,[t]))}setParam(t,n){return this.chain(this.createAction(et.setParam,[t,n]))}setSlot(t,n){return this.chain(this.createAction(et.setSlot,[t,n]))}command(t,n,i){return this.chain(this.createAction(et.command,[t,n,i]))}getStatus(){return this.status}onStatusChange(t){return this.events.on("event:puppet.statusChange",t)}useLayer(t){return this.userConfig.get().layer=t,Object.assign(this.config,{layer:t}),this}toData(){return{state:He.normalizeState(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(t){return this.state=He.normalizeState(t.state),this.transformState.resetTo(ie.deserialize(t.transformState).get()),this._deserializeLoop(t.loop),this}_init(t){return new Te(this.chain(),me.init,new C().setContent([t||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}_resolveSize(t){let n=this.config.size;return n?{width:n.width,height:n.height}:{width:t.width,height:t.height}}_getStatus(){return this.getStatus()}_setStatus(t){this.status!==t&&(this.status=t,this.events.emit("event:puppet.statusChange",t))}_onStatusChange(t){return this.onStatusChange(t)}_attachInstance(t){this.instance=t}_getInstance(){return this.instance}_patchState(t){let n=He.normalizeState(this.state);return this.state=He.mergeState(this.state,t),n}async _applyState(){let t=this.instance;t&&await t.apply(He.normalizeState(this.state))}async _runCommand(t,n){let i=this.instance;return i?(await i.command(t,n),!0):!1}async _describe(){let t=this.instance;return!t||typeof t.describe!="function"?null:await t.describe()}createAction(t,n){return new hi(this.chain(),t,C.create(n))}getInitialTransformState(t){let[n]=t.extract(ie.DefaultTransformState.keys());return new ie(ie.DefaultTransformState.create(n.get()).get())}getInitialState(){let t=this.userConfig.get();return He.normalizeState({motion:t.motion,expression:t.expression,skin:t.skin,params:t.params,slots:t.slots})}};He._defaultUserConfig=null,He.DefaultPuppetConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0});var Lt=He;var gi=class extends pe{constructor(e){super(),this.scene=e}show(e){let t=new ne(this.scene.chain(),W.nvlShow,new C().setContent([e]));return this.chain(t)}hide(e){let t=new ne(this.scene.chain(),W.nvlHide,new C().setContent([e]));return this.chain(t)}end(){let e=new ne(this.scene.chain(),W.nvlEnd,new C().setContent([]));return this.chain(e)}};function Ir(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Wa(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return Ba(o);let i=Rr(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=Rr(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=Rr(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function Rr(o,e){if(o===!1||typeof o>"u")return{resolved:!1,source:null};if(typeof o=="function"){let t=o(e);return{resolved:typeof t<"u",source:t??null}}return{resolved:!0,source:o}}function Ba(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}function za(o,e){let t=[],n=i=>{i&&typeof i!="function"&&P.isImageSrc(i)&&t.push(i)};n(e?.config.avatar),n(o.config.avatar);for(let i of o.config.portraits||[])n(Ir(i).avatar);return t}var de=class de{constructor(e,t){this.state={sounds:[],videos:[],vfx:[],srcManagers:[],elements:[]};this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1};this._suppressNextNvlTyping=!1;this.currentHandling=null;this.playerCurrent=null;this.mainContentNode=null;this.exposedState=new Map;this.preloadingScene=null;this.flushDep=0;this.rollLock=new ei;this.htmlToImage=hu;this.imageCache=null;this.pageRouter=null;this.stageClickBuffer=null;this.advanceSuspensions=new Set;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new Q,this.logger=new no(e,"NarraLeaf-React"),this.audioManager=new io(this),this.guard=new oo(e.config.app.guard).observe(this),this.timelines=new ro(this.guard),this.notificationMgr=new so(this,[]),this.idManager=new Ki,this.actionHistory=new co(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new uo(this.actionHistory),this.stageTransition=new lo(this),this.events.on(de.EventTypes["event:state.player.skip"],()=>{this.game.config.allowSkipSceneTransition&&this.stageTransition.skip()})}get deps(){return this.flushDep}addVideo(e){return this.state.videos.push(e),this}removeVideo(e){let t=this.state.videos.indexOf(e);return t===-1?(this.logger.weakWarn("Video not found when removing",e.getId()),this):(this.state.videos.splice(t,1),this)}isVideoAdded(e){return this.state.videos.includes(e)}getVideos(){return this.state.videos}addVfx(e){return this.state.vfx.push(e),this}removeVfx(e){let t=this.state.vfx.indexOf(e);return t===-1?(this.logger.weakWarn("Vfx not found when removing",e.getId()),this):(this.state.vfx.splice(t,1),this)}isVfxAdded(e){return this.state.vfx.includes(e)}getVfx(){return this.state.vfx}findElementByScene(e){return this.state.elements.find(t=>t.scene===e)||null}findElementByDisplayable(e,t=null){return this.state.elements.find(n=>{if(t)return n.layers.get(t)?.includes(e)||!1;for(let i of n.layers.values())if(i.includes(e))return!0;return!1})||null}getLiveGame(){return this.game.getLiveGame()}removeElement(e){let t=this.state.elements.indexOf(e);return t===-1?(this.logger.weakWarn("Element not found when removing",e.scene.getId()),this):(this.logger.debug("GameState","Removing element",e.scene.getId()),this.state.elements.splice(t,1),this)}preloadScene(e){let t=Ye.isScene(e)?e:e.entryScene;if(!t)throw new E("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(de.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}getImageCache(){return this.imageCache}setImageCache(e){return this.imageCache=e,this}addElement(e){return this.state.elements.push(e),this.logger.debug("GameState","Adding element",e.scene.getId()),this}addScene(e){return this.sceneExists(e)?this:(this.state.elements.unshift({scene:e,texts:[],menus:[],layers:new Map(e.config.layers.map(t=>[t,[]]))}),this.logger.debug("GameState","Adding scene",e.getId()),this)}flush(){return this.stage.update(),this}popScene(){let e=this.state.elements.pop();return e?(this.removeElements(e.scene),this.logger.debug("GameState","Popping scene",e.scene.getId()),this):this}settlePendingLines(e){let t=this.findElementByScene(e);return!t||!t.texts.length?this:([...t.texts].forEach(n=>n.onClick()),this)}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){for(let e=this.state.elements.length-1;e>=0;e--){let t=this.state.elements[e];if(!t.suspended)return t.scene}return null}setSceneSuspended(e,t){let n=this.findElementByScene(e);return n?(n.suspended=t,this.stageTransition.syncScenePose(e,t),this.logger.debug("GameState",t?"Suspending scene":"Resuming scene",e.getId()),this.stage.update(),this):(this.logger.weakWarn("Scene not found when suspending",e.getId()),this)}isSceneSuspended(e){return this.findElementByScene(e)?.suspended===!0}getSuspendedScenes(){return this.state.elements.filter(e=>e.suspended).map(e=>e.scene)}getCurrentScene(){return this.state.elements[0]?.scene||null}isFastForwarding(){return this._fastForwarding}setFastForwarding(e){this._fastForwarding=e}hasActiveMenu(){let e=this.getLastScene();return e?(this.findElementByScene(e)?.menus.length??0)>0:!1}findCurrentPortraitForCharacter(e){let t=(e.config.portraits||[]).map(Ir);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let l=s[a];for(let c=l.length-1;c>=0;c--){let u=l[c],p=r.get(u);if(p&&this.isDisplayableVisible(u))return p}}return null}sceneExists(e){return e?this.state.elements.some(t=>t.scene===e):!!this.getLastScene()}isSceneActive(e){for(let{scene:t}of this.state.elements)if(t===e)return!0;return!1}wait(e){return new Promise(t=>setTimeout(t,e))}schedule(e,t){let n=[],i=setTimeout(()=>{e({retry:()=>{this.schedule(e,0)},onCleanup:r=>{n.push(r)}})},t);return()=>{n.forEach(r=>r()),clearTimeout(i)}}notify(e){this.notificationMgr.addNotification(e)}handle(e){if(this.currentHandling===e)return this;switch(this.currentHandling=e,e.type){case"condition:action":break}return this}createDialog(e,t,n,i){let r=this.findElementByScene(this.getLastSceneIfNot(i))?.texts;if(!r)throw this.sceneNotFound();let s=t.evaluate(we.getCtx({gameState:this}));this.game.getLiveGame().events.emit(Bt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:oe.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1)},text:oe.getText(s)}}createMenu(e,t,n){if(!e.choices.length)throw new Error("Menu must have at least one choice");let i=this.findElementByScene(this.getLastSceneIfNot(n))?.menus;if(!i)throw this.sceneNotFound();let r=e.prompt?.evaluate(we.getCtx({gameState:this}))||null,s=this.createWaitableAction({...e,words:r},a=>{i.splice(i.indexOf(s),1),t&&t(a),this.game.getLiveGame().events.emit(Bt.EventTypes["event:menu.choose"],{sentence:a.prompt,text:a.evaluated})});return i.push(s),{cancel:()=>{let a=i.indexOf(s);a!==-1&&i.splice(a,1)},prompt:r?oe.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(de.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!0,e?.showTransition),this.emitNvlStateChange(),this}exitNvlMode(e){let t=e?.hideTransition||this.nvlState.options?.hideTransition;return this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(de.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],e),this.emitNvlStateChange(),this}removeNvlDialog(e){let t=this.nvlState.dialogs.findIndex(r=>r.id===e);if(t===-1)return this;let n=[...this.nvlState.dialogs],[i]=n.splice(t,1);return this.nvlState.dialogs=n,this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>ne.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(de.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(de.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{ne.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this.rebindLoops(),this}rebindLoops(){let[e,t]=this.getLiveGame().constructMaps();return t.forEach(n=>{n instanceof $e&&n._rebindLoop(e)}),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],t),this.emitNvlStateChange(),{created:!1,entry:t}):(this.appendNvlDialog(e),{created:!0,entry:e})}activateNvlDialog(e,t="typing",n=!0){return n&&this.nvlState.activeDialogId===e&&this.nvlState.phase!=="idle"||(this.nvlState.activeDialogId=e,this.nvlState.phase=t,this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}waitForNvlAdvance(e,t){return this.nvlAdvanceWaiters.set(e,t),{cancel:()=>{this.nvlAdvanceWaiters.get(e)===t&&this.nvlAdvanceWaiters.delete(e)}}}requestNvlAdvance(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?"ignore":this.nvlState.phase==="typing"?"typing":this.nvlState.phase==="awaitAdvance"?(this.resolveNvlAdvance(e),"advance"):"ignore"}requestNvlSkip(e){return this.requestNvlAdvance(e)}completeNvlTyping(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?!1:(this.nvlState.phase="awaitAdvance",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.events.emit(de.EventTypes["event:state.nvl.dialogComplete"],e),this.emitNvlStateChange(),!0)}settleNvlDialog(e){return this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}suppressNextNvlTyping(){return this._suppressNextNvlTyping=!0,this}consumeNvlTypingSuppression(){return this._suppressNextNvlTyping?(this._suppressNextNvlTyping=!1,!0):!1}beginAdvDialog(e,t){return this.advDialogState={dialogId:e,actionId:t,ended:!1},this.events.emit(de.EventTypes["event:state.dialog.change"]),this}completeAdvDialogTyping(e){return!e||!this.advDialogState||this.advDialogState.dialogId!==e?this:(this.advDialogState.ended||(this.advDialogState.ended=!0,this.events.emit(de.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(de.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}suspendAdvance(){let e=Symbol("advance-suspension");return this.advanceSuspensions.add(e),()=>{this.advanceSuspensions.delete(e)}}isAdvanceSuspended(){return this.advanceSuspensions.size>0}consumeStageClick(e=200){if(!this.stageClickBuffer)return!1;let{timestamp:t}=this.stageClickBuffer,n=Date.now()-t;return this.stageClickBuffer=null,n>=0&&n<=e}createDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i);if(!r)throw this.sceneNotFound();let s=r.layers.get(n||i.config.defaultDisplayableLayer);if(!s)throw this.layerNotFound();return s.push(e),this}disposeDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i)?.layers.get(n||i.config.defaultDisplayableLayer);if(!r)throw this.layerNotFound();let s=r.indexOf(e);if(s===-1)throw new E(`Displayables not found when disposing. (disposing: ${e.getId()})`);return r.splice(s,1),this}forceReset(){[...this.state.elements].forEach(({scene:t})=>{this.offSrcManager(t.srcManager),this.removeScene(t),t.events.clear()}),this.state.elements=[],this.state.srcManagers=[],this.state.videos=[],this.state.vfx=[],this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.audioManager.reset(),this.timelines.abortAll(),this.gameHistory.reset(),this.actionHistory.reset(),this.logger.debug("GameState","Force reset")}getHowl(){return Ka.Howl}registerSrcManager(e){return this.state.srcManagers.push(e),this}offSrcManager(e){return this.state.srcManagers=this.state.srcManagers.filter(t=>t!==e),this}getStorable(){return this.game.getLiveGame().getStorable()}getSceneByName(e){return this.game.getLiveGame().story?.getScene(e)||null}getStory(){if(!this.game.getLiveGame().story)throw new E("Story not loaded");return this.game.getLiveGame().story}setInterval(e,t){return setInterval(e,t)}clearInterval(e){clearInterval(e)}setTimeout(e,t){return setTimeout(e,t)}clearTimeout(e){clearTimeout(e)}forceAnimation(){let[e,t]=ke.proxy(S.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof $e&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(Z.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync(),"flush"in r&&r.flush()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new Ce("State already mounted");if(!e)throw new Ce("Invalid state key");return this.exposedState.set(e,t),this.events.emit(de.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new E("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=null,i=!1,r=null,s=()=>{if(n=null,i)return;let l=this.getExposedState(e);l&&(i=!0,r?.cancel(),t(l))},a=()=>{n?.(),n=Ma(s)};return this.getExposedState(e)&&a(),r=this.events.on(de.EventTypes["event.state.onExpose"],l=>{l===e&&!i&&a()}),{cancel:()=>{r?.cancel(),n?.()}}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),...e.suspended?{suspended:!0}:{},elements:{layers:Object.fromEntries(Array.from(e.layers.entries()).map(([t,n])=>[t.getId(),n.map(i=>i.getId())]))}})),audio:this.audioManager.toData(),videos:this.state.videos.map(e=>[e.getId(),e.toData()]),vfx:this.state.vfx.map(e=>[e.getId(),e.toData()]),nvlState:{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,dialogIds:this.nvlState.dialogs.map(e=>e.id),dialogs:this.nvlState.dialogs.map(e=>({id:e.id,actionId:e.actionId,text:e.text,characterId:e.character?e.character.getId():null}))}}}loadData(e,t){if(this.state.elements=[],!this.game.getLiveGame().story)throw new Error("No story loaded");let{scenes:i,audio:r,videos:s}=e;if(i.forEach(({sceneId:a,elements:l,suspended:c})=>{this.logger.debug("Loading scene: "+a);let u=t.get(a);if(!u)throw new E("Scene not found, id: "+a+`
33
+ NarraLeaf cannot find the element with the id from the saved game`);let p={scene:u,layers:this.constructLayerMap(l.layers,t),menus:[],texts:[],suspended:c===!0};this.state.elements.push(p),this.registerSrcManager(u.srcManager),p.suspended||this.getExposedStateAsync(u,d=>{ne.initBackgroundMusic(u,d,this)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,l])=>{let c=t.get(a);if(!c)throw new E("Video not found, id: "+a+`
34
+ NarraLeaf cannot find the element with the id from the saved game`);return c.fromData(l),c}),this.state.vfx=(e.vfx??[]).flatMap(([a,l])=>{let c=t.get(a);return c?(c.fromData(l),[c]):(this.logger.weakWarn("NarraLeaf-React: Vfx","Vfx not found when loading a saved game, skipped. (id: "+a+")"),[])}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(l=>{let c=l.characterId&&t.get(l.characterId)||null,u=l.text||"";return{id:l.id,actionId:l.actionId||l.id,character:c,sentence:new fe(u,{character:c}),text:u}});this.nvlState={active:e.nvlState.active,visible:e.nvlState.visible,sessionId:e.nvlState.sessionId,dialogs:a,options:e.nvlState.options||null,activeDialogId:e.nvlState.activeDialogId||null,phase:e.nvlState.phase||(e.nvlState.activeDialogId?"awaitAdvance":"idle"),pendingAdvance:e.nvlState.pendingAdvance||!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active&&this.events.emit(de.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!0,this.nvlState.options?.showTransition),this.emitNvlStateChange()}}getLastSceneIfNot(e){let t=e||this.getLastScene();if(!t||!this.sceneExists(t))throw new E('Scene not found, please call "scene.activate()" first.');return t}createElementSnapshot(e){return{scene:e.scene,suspended:e.suspended===!0,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(i=>[i,i.toData()])]))}}fromElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(([i,r])=>(i.fromData(r),i))])),texts:[],menus:[]}}removeElements(e){let t=this.state.elements.findIndex(n=>n.scene===e);return t===-1?(this.logger.weakWarn("Scene not found when removing elements",e.getId()),this):(this.resetLayers(this.state.elements[t].layers),this.state.elements.splice(t,1),this.logger.debug("GameState","Removing elements",e.getId()),this)}resetLayers(e){let t=this.getLiveGame().story?.camera??null;e.forEach((n,i)=>{i.reset(),n.forEach(r=>{t&&r===t||r.reset()})})}syncNvlDerivedState(){this.nvlState.isTyping=this.nvlState.phase==="typing",this.nvlState.activeDialogId||(this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.nvlState.isTyping=!1)}emitNvlStateChange(){this.syncNvlDerivedState(),this.events.emit(de.EventTypes["event:state.nvl.change"],this.getNvlState()),this.stage.update()}resolveNvlAdvance(e){let t=this.nvlAdvanceWaiters.get(e);return t?(this.nvlAdvanceWaiters.delete(e),this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),t(),!0):!1}isDisplayableVisible(e){return(e.transformState.get().opacity??0)>0}createWaitableAction(e,t){return{action:e,onClick:(i=>{t&&t(i)})}}sceneNotFound(){return new E("Scene not found, target scene may not be activated. This is an internal error, please report this to the developer.")}layerNotFound(){return new E("Layer not found, target layer may not be activated. You may forget to add the layer to the scene config")}constructLayerMap(e,t){return new Map(Object.entries(e).map(([n,i])=>{let r=t.get(n);if(!r)throw new E("Layer not found, id: "+n+`
35
35
  NarraLeaf cannot find the element with the id from the saved game`);return[r,i.map(s=>{if(!t.has(s))throw new E("Displayable not found, id: "+s+`
36
36
  NarraLeaf cannot find the element with the id from the saved game
37
- This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};de.EventTypes={"event:state.end":"event:state.end","event:state.player.skip":"event:state.player.skip","event:state.player.lineEnd":"event:state.player.lineEnd","event:state.dialog.change":"event:state.dialog.change","event:state.player.requestFlush":"event:state.player.requestFlush","event:state.player.stageClick":"event:state.player.stageClick","event:state.scene.mount":"event:state.scene.mount","event:state.scene.unmount":"event:state.scene.unmount","event.state.onExpose":"event.state.onExpose","event:state.onRender":"event:state.onRender","event:state:flushPreloadedScenes":"event:state:flushPreloadedScenes","event:state.nvl.enter":"event:state.nvl.enter","event:state.nvl.exit":"event:state.nvl.exit","event:state.nvl.dialogComplete":"event:state.nvl.dialogComplete","event:state.nvl.dialogAppend":"event:state.nvl.dialogAppend","event:state.nvl.visibilityChange":"event:state.nvl.visibilityChange","event:state.nvl.change":"event:state.nvl.change"};var L=de;var Lt=class Lt extends Y{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:ge.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}static cutTrailingVoice(e,t){let n=Lt.trailingVoice.get(e);n&&n!==t&&e.audioManager.isPlaying(n)&&e.timelines.attachTimeline(e.audioManager.stop(n,0)),t?Lt.trailingVoice.set(e,t):Lt.trailingVoice.delete(e)}executeAction(e,t){if(this.type===Qt.say){let n=null,i="",r=null,s=new S(y=>y).registerSkipController(new V(()=>{n?.()})),a=new Pe(s),l=this.contentNode.getContent(),c=e.isNvlMode(),u=e.getLiveGame(),d=e.createPresentationSnapshot(),p=u.lastDialog?{sentence:u.lastDialog.sentence,speaker:u.lastDialog.speaker}:null,h=Lt.getVoice(e,l);if(h){Lt.cutTrailingVoice(e,h);let y=e.audioManager.play(h);a.attachChild(y)}let g=h?e.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{let y=Lt.endVoiceWithPreference(e,h);y&&e.timelines.attachTimeline(y),g?.cancel()}):null;if(c){let y=this.getId(),f=(e.getActiveNvlDialogForAction(y)||e.getLatestNvlDialogForAction(y))?.id||e.allocateNvlDialogId(y),v=l.evaluate(ke.getCtx({gameState:e}));i=ie.getText(v),u.events.emit(Ut.EventTypes["event:character.prompt"],{character:l.config.character,sentence:l,text:i});let A=!1,w=()=>{A||(A=!0,e.events.emit(L.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:k}=e.ensureNvlDialog({id:f,actionId:y,character:this.callee,sentence:l,text:i});r=f;let b=e.consumeNvlTypingSuppression(),C=k&&!b?"typing":"awaitAdvance";e.activateNvlDialog(f,C,!k);let I=e.waitForNvlAdvance(f,()=>{e.settleNvlDialog(f),w()});n=()=>{I.cancel()}}else{let y=e.idManager.generateId(),T=e.createDialog(y,l,()=>{e.settleAdvDialog(y),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(y,this.getId()),i=T.text,n=()=>{e.settleAdvDialog(y),T.cancel()}}u.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:m}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(g?.cancel(),h&&e.audioManager.isPlaying(h)){let y=Lt.endVoiceWithPreference(e,h);y&&a.attachChild(y)}n?.(),r&&(e.removeNvlDialog(r),e.settleNvlDialog(r)),e.restorePresentationSnapshot(d),p?u.setLastDialog(p.sentence,p.speaker):u.lastDialog=null});return e.gameHistory.push({token:m,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,voiceId:l.config.voiceId??null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===Qt.setName){let n=this.callee.state.name;return this.callee.state.name=this.contentNode.getContent()[0],e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{this.callee.state.name=i},[n]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("CharacterAction")}};Lt.ActionTypes=Qt,Lt.trailingVoice=new WeakMap;var it=Lt;var De=class De extends Hn{constructor(t,n){super();this.srcManager=new Ie;this.events=new J;this.actions=[];this.voiceCache=new Map;this._futureActions_=[];this.labelMap=new Map;let i=De.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=De.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=De.DefaultUserConfig.create(n),a=De.DefaultSceneConfig.create({...s.get(),name:t,layers:[...s.get().layers,i,r],defaultBackgroundLayer:i,defaultDisplayableLayer:r});this.userConfig=s,this.config=a.get(),this.state=this.getInitialState(),this.localPersistent=new Wn(t)}static get DefaultSceneConfig(){return De._defaultSceneConfig??(De._defaultSceneConfig=new K({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new zn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new zn("[[Displayable Layer]]",{zIndex:0})},{voices:t=>{let n=r=>typeof r=="object"&&r!==null,i=r=>typeof r=="function";if(!t)return null;if(n(t)&&Object.values(t).forEach(r=>{ge.isSound(r)&&De.validateVoice(r)}),i(t))return t;throw new Fe(`Invalid voices config: ${t}`)}}))}static validateVoice(t){if(!to(t.config.type,[nt.voice,nt.sound]))throw new Fe(`Voice must be a voice, but got ${t.config.type}.
38
- To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof De}static getOwnedSounds(t){let n=[],i=t.callee;if(De.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof te&&t.type===W.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t,n){return new _e({backgroundImage:i=>i.toData(),backgroundMusic:i=>{let r=i?.toData();if(!r)return null;let s=i.getId();return s?{...r,id:s}:r}},{backgroundImage:i=>t.state.backgroundImage.fromData(i),backgroundMusic:i=>{if(!i)return null;let r=i.id?n?.get(i.id):void 0,s=r instanceof ge?r:t.state.backgroundMusic;return s?s.fromData(i):null}})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.combineActions(new Ge,()=>this.background.char(t,n))}jumpTo(t,n={}){let i=j({},n instanceof Vt?{transition:n}:n);return i.returnable?this._callScene(t,i.transition):this.combineActions(new Ge({allowFutureScene:!1}),r=>(r.chain(new te(r,"scene:preUnmount",new x().setContent([]))).chain(this._initScene(t))._transitionToScene(i.transition,t).chain(this._exit()),r))._jumpTo(t)}_callScene(t,n){return this.combineActions(new Ge({allowFutureScene:!1}),i=>(i.chain(this._preSuspend(t)).chain(this._initScene(t))._transitionToScene(n,t),i))._callTo(t)._resume(t)}setBackgroundMusic(t,n){return this.chain(new te(this.chain(),W.setBackgroundMusic,new x().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new gi(this),a=typeof r=="function"?r(s):r,l=this.narrativeToActions(a),c={showTransition:i,hideTransition:i},u=new te(this.chain(),W.nvlEnd,new x().setContent([c])),d=[...l,u];super.constructNodes(d);let p=new te(this.chain(),W.nvlBlock,new x().setContent([d,c]));return this.chain(p)}action(t){return this.actions=t,this}preloadImage(t){if(!P.isImageSrc(t))throw new Error("Invalid image source: "+t);return(Array.isArray(t)?t:[t]).forEach(i=>{this.srcManager.register({type:"image",src:i})}),this}toData(){return{state:De.getStateSerializer(this).serialize(this.state)}}fromData(t,n){return this.state=De.getStateSerializer(this,n).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new te(this.chain(),"scene:action",new x);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>ze.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[],l=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{ze.isChained(m)||(m instanceof F?s.push(m):m instanceof kn?a.push(m):m instanceof Dt&&l.push(m))});let c=[],u=[],d=new Map;s.forEach(m=>{m.config.isWearable?u.push(m):m.config.autoInit&&c.push(m);for(let y of m.config.wearables){if(d.get(y)&&d.get(y)!==m)throw new Error(`Wearable image cannot be used multiple times
37
+ This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};de.EventTypes={"event:state.end":"event:state.end","event:state.player.skip":"event:state.player.skip","event:state.player.lineEnd":"event:state.player.lineEnd","event:state.dialog.change":"event:state.dialog.change","event:state.player.requestFlush":"event:state.player.requestFlush","event:state.player.stageClick":"event:state.player.stageClick","event:state.scene.mount":"event:state.scene.mount","event:state.scene.unmount":"event:state.scene.unmount","event.state.onExpose":"event.state.onExpose","event:state.onRender":"event:state.onRender","event:state:flushPreloadedScenes":"event:state:flushPreloadedScenes","event:state.nvl.enter":"event:state.nvl.enter","event:state.nvl.exit":"event:state.nvl.exit","event:state.nvl.dialogComplete":"event:state.nvl.dialogComplete","event:state.nvl.dialogAppend":"event:state.nvl.dialogAppend","event:state.nvl.visibilityChange":"event:state.nvl.visibilityChange","event:state.nvl.change":"event:state.nvl.change"};var R=de;var Rt=class Rt extends _{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:ge.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}static cutTrailingVoice(e,t){let n=Rt.trailingVoice.get(e);n&&n!==t&&e.audioManager.isPlaying(n)&&e.timelines.attachTimeline(e.audioManager.stop(n,0)),t?Rt.trailingVoice.set(e,t):Rt.trailingVoice.delete(e)}executeAction(e,t){if(this.type===Jt.say){let n=null,i="",r=null,s=new S(y=>y).registerSkipController(new U(()=>{n?.()})),a=new ke(s),l=this.contentNode.getContent(),c=e.isNvlMode(),u=e.getLiveGame(),p=e.createPresentationSnapshot(),d=u.lastDialog?{sentence:u.lastDialog.sentence,speaker:u.lastDialog.speaker}:null,g=Rt.getVoice(e,l);if(g){Rt.cutTrailingVoice(e,g);let y=e.audioManager.play(g);a.attachChild(y)}let f=g?e.events.on(R.EventTypes["event:state.player.lineEnd"],()=>{let y=Rt.endVoiceWithPreference(e,g);y&&e.timelines.attachTimeline(y),f?.cancel()}):null;if(c){let y=this.getId(),h=(e.getActiveNvlDialogForAction(y)||e.getLatestNvlDialogForAction(y))?.id||e.allocateNvlDialogId(y),v=l.evaluate(we.getCtx({gameState:e}));i=oe.getText(v),u.events.emit(Bt.EventTypes["event:character.prompt"],{character:l.config.character,sentence:l,text:i});let A=!1,x=()=>{A||(A=!0,e.events.emit(R.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:k}=e.ensureNvlDialog({id:h,actionId:y,character:this.callee,sentence:l,text:i});r=h;let b=e.consumeNvlTypingSuppression(),w=k&&!b?"typing":"awaitAdvance";e.activateNvlDialog(h,w,!k);let D=e.waitForNvlAdvance(h,()=>{e.settleNvlDialog(h),x()});n=()=>{D.cancel()}}else{let y=e.idManager.generateId(),T=e.createDialog(y,l,()=>{e.settleAdvDialog(y),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(y,this.getId()),i=T.text,n=()=>{e.settleAdvDialog(y),T.cancel()}}u.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:m}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(f?.cancel(),g&&e.audioManager.isPlaying(g)){let y=Rt.endVoiceWithPreference(e,g);y&&a.attachChild(y)}n?.(),r&&(e.removeNvlDialog(r),e.settleNvlDialog(r)),e.restorePresentationSnapshot(p),d?u.setLastDialog(d.sentence,d.speaker):u.lastDialog=null});return e.gameHistory.push({token:m,action:this,element:{type:"say",text:i,voice:g?g.getSrc():null,voiceId:l.config.voiceId??null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===Jt.setName){let n=this.callee.state.name;return this.callee.state.name=this.contentNode.getContent()[0],e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{this.callee.state.name=i},[n]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("CharacterAction")}};Rt.ActionTypes=Jt,Rt.trailingVoice=new WeakMap;var it=Rt;var Ee=class Ee extends Hn{constructor(t,n){super();this.srcManager=new Re;this.events=new Q;this.actions=[];this.voiceCache=new Map;this._futureActions_=[];this.labelMap=new Map;let i=Ee.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=Ee.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=Ee.DefaultUserConfig.create(n),a=Ee.DefaultSceneConfig.create({...s.get(),name:t,layers:[...s.get().layers,i,r],defaultBackgroundLayer:i,defaultDisplayableLayer:r});this.userConfig=s,this.config=a.get(),this.state=this.getInitialState(),this.localPersistent=new Bn(t)}static get DefaultSceneConfig(){return Ee._defaultSceneConfig??(Ee._defaultSceneConfig=new K({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new zn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new zn("[[Displayable Layer]]",{zIndex:0})},{voices:t=>{let n=r=>typeof r=="object"&&r!==null,i=r=>typeof r=="function";if(!t)return null;if(n(t)&&Object.values(t).forEach(r=>{ge.isSound(r)&&Ee.validateVoice(r)}),i(t))return t;throw new Oe(`Invalid voices config: ${t}`)}}))}static validateVoice(t){if(!to(t.config.type,[nt.voice,nt.sound]))throw new Oe(`Voice must be a voice, but got ${t.config.type}.
38
+ To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Ee}static getOwnedSounds(t){let n=[],i=t.callee;if(Ee.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof ne&&t.type===W.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t,n){return new _e({backgroundImage:i=>i.toData(),backgroundMusic:i=>{let r=i?.toData();if(!r)return null;let s=i.getId();return s?{...r,id:s}:r}},{backgroundImage:i=>t.state.backgroundImage.fromData(i),backgroundMusic:i=>{if(!i)return null;let r=i.id?n?.get(i.id):void 0,s=r instanceof ge?r:t.state.backgroundMusic;return s?s.fromData(i):null}})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.combineActions(new Fe,()=>this.background.char(t,n))}jumpTo(t,n={}){let i=j({},n instanceof Ut?{transition:n}:n);return i.returnable?this._callScene(t,i.transition):this.combineActions(new Fe({allowFutureScene:!1}),r=>(r.chain(new ne(r,"scene:preUnmount",new C().setContent([]))).chain(this._initScene(t))._transitionToScene(i.transition,t).chain(this._exit()),r))._jumpTo(t)}_callScene(t,n){return this.combineActions(new Fe({allowFutureScene:!1}),i=>(i.chain(this._preSuspend(t)).chain(this._initScene(t))._transitionToScene(n,t),i))._callTo(t)._resume(t)}setBackgroundMusic(t,n){return this.chain(new ne(this.chain(),W.setBackgroundMusic,new C().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new gi(this),a=typeof r=="function"?r(s):r,l=this.narrativeToActions(a),c={showTransition:i,hideTransition:i},u=new ne(this.chain(),W.nvlEnd,new C().setContent([c])),p=[...l,u];super.constructNodes(p);let d=new ne(this.chain(),W.nvlBlock,new C().setContent([p,c]));return this.chain(d)}action(t){return this.actions=t,this}preloadImage(t){if(!P.isImageSrc(t))throw new Error("Invalid image source: "+t);return(Array.isArray(t)?t:[t]).forEach(i=>{this.srcManager.register({type:"image",src:i})}),this}toData(){return{state:Ee.getStateSerializer(this).serialize(this.state)}}fromData(t,n){return this.state=Ee.getStateSerializer(this,n).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new ne(this.chain(),"scene:action",new C);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>ze.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[],l=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{ze.isChained(m)||(m instanceof O?s.push(m):m instanceof kn?a.push(m):m instanceof Lt&&l.push(m))});let c=[],u=[],p=new Map;s.forEach(m=>{m.config.isWearable?u.push(m):m.config.autoInit&&c.push(m);for(let y of m.config.wearables){if(p.get(y)&&p.get(y)!==m)throw new Error(`Wearable image cannot be used multiple times
39
39
  Maybe you bind the same wearable image to multiple parent images
40
- Parent Conflict (src: `+d.get(y)?.state.currentSrc+`)
41
- Current Parent (src: `+m.state.currentSrc+")");d.set(y,m)}});let p=[...this._initScene(this),...c.map(m=>m._init(this)),...u.map(m=>{if(!d.has(m))throw new Error("Wearable image must have a parent image");return d.get(m)._initWearable(m)}),...a.map(m=>m._init()),...l.map(m=>m._init()),...r],h=super.constructNodes(p),g=new x(this.sceneRoot,void 0,h||void 0).setContent(this);return h?.setParent(g),this.sceneRoot?.setContentNode(g),this._futureActions_=p,this.constructLabels(t),this}constructLabels(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!1}),i=new Map;for(let r of n)if(r instanceof se&&r.type===re.label){let[s]=r.contentNode.getContent();if(i.has(s))throw new Fe(`Duplicate label "${s}" in scene "${this.config.name}". Label names must be unique within a scene.`);i.set(s,r)}this.labelMap=i;for(let r of n)if(r instanceof se&&r.type===re.jump){let[s]=r.contentNode.getContent(),a=i.get(s);if(!a)throw new Fe(`Jump target label "${s}" not found in scene "${this.config.name}". Control.jump can only jump to a Control.label declared in the same scene.`);r.setJumpTarget(a)}}getLabel(t){return this.labelMap.get(t)||null}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?en.say(n).getActions():ze.toActions([n]))}isSceneRootConstructed(){return!!this.sceneRoot}registerSrc(t,n=new Set){if(!this.sceneRoot)return;let i=new Set,r=new Set,s=[this.sceneRoot],a=new Set;for(;s.length;){let l=s.shift();if(!i.has(l)){if(i.add(l),l instanceof te){let c=l.callee;if(P.isImageSrc(c.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:P.srcToURL(c.state.backgroundImage.state.currentSrc)}),l.type===W.jumpTo||l.type===W.callTo){let d=l,p=d.contentNode.getContent()[0],h=De.getScene(t,p);if(!h)throw l._sceneNotFoundError(l.getSceneName(p));let g=Ie.getPreloadableSrc(t,l);if(g&&this.srcManager.register(g),!r.has(d)&&!n.has(h))r.add(d),a.add(h),n.add(h);else if(l.type===W.jumpTo)continue}}else if(l instanceof Se){let c=Ie.getPreloadableSrc(t,l);c&&this.srcManager.register(c)}else if(l instanceof tt)this.srcManager.register(l.callee);else if(l instanceof it){let c=l.type===Qt.say?l.contentNode.getContent():null;for(let u of Va(l.callee,c))this.srcManager.register({type:"image",src:P.srcToURL(u)})}else if(l instanceof se){let u=l.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else l instanceof be&&this.srcManager.register(l.callee.srcManager.getSrc());s.push(...l.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(l=>{l.registerSrc(t,n),this.srcManager.registerFuture(l.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let l=a.getStaticId();if(l){if(i.has(l))throw new Fe(`Duplicate static action id: ${l}`);i.add(l)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let l=a.getStaticId();a.resolveId(l||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((s,a)=>{s.resolveId(`e-${a}`)});let i=new Set;this.getAllChildren(t,this.sceneRoot||[]).forEach(s=>{De.getOwnedSounds(s).forEach(a=>i.add(a))});let r=0;i.forEach(s=>{s.getId()||s.resolveId(`s-${r}`),r++})}getVoice(t){if(!t)return null;let n=this.config.voices;if(n){if(typeof n=="function"){let r=n(t);return typeof r=="string"?this.voiceOfSrc(r):(De.validateVoice(r),r)}let i=n[t];return typeof i=="string"?this.voiceOfSrc(i):i||null}return null}voiceOfSrc(t){let n=this.voiceCache.get(t);if(n)return n;let i=ge.voice(t);return this.voiceCache.set(t,i),i}getSceneRoot(){if(!this.sceneRoot)throw new Error("Scene root is not constructed");return this.sceneRoot}stringify(t,n,i){return super.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}).map(r=>r.stringify(t,n,i)).join(";")}reset(){super.reset(),this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&!to(t.backgroundMusic.config.type,[nt.bgm]))throw new Fe(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
42
- To prevent unintended behavior and unexpected results, the sound have to be on the music bus (or any bus beneath it). Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new F({src:t.background,opacity:1,autoFit:!0,name:`[[Background Image of ${this.config.name}]]`,layer:this.config.defaultBackgroundLayer})._setIsBackground(!0),i=t.backgroundMusic?this.state?.backgroundMusic?this.state.backgroundMusic.reset():t.backgroundMusic:null;return{backgroundImage:n,backgroundMusic:i}}_jumpTo(t){return this.chain(new te(this.chain(),"scene:jumpTo",new x().setContent([t])))}_callTo(t){return this.chain(new te(this.chain(),"scene:callTo",new x().setContent([t])))}_resume(t){return this.chain(new te(this.chain(),"scene:resume",new x().setContent([t])))}_preSuspend(t){return new te(this.chain(),"scene:preSuspend",new x().setContent([t]))}_exit(){return new te(this.chain(),"scene:exit",new x().setContent([]))}_transitionToScene(t,n){let i=this.chain();return t?i.chain(new te(i,W.transitionToScene,new x().setContent([t,n]))):i}_init(t){return new te(this.chain(),"scene:init",new x().setContent([t]))}_initScene(t){return[t._init(t),...t.config.layers.flatMap(n=>n._init(t)),...t._initBackground(t,t.config.defaultBackgroundLayer)]}_initBackground(t,n){return[t.state.backgroundImage._init(t,n)]}};De.EventTypes={"event:scene.remove":"event:scene.remove","event:scene.load":"event:scene.load","event:scene.unload":"event:scene.unload","event:scene.mount":"event:scene.mount","event:scene.unmount":"event:scene.unmount","event:scene.preUnmount":"event:scene.preUnmount","event:scene.imageLoaded":"event:scene.imageLoaded"},De.DefaultUserConfig=new K({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),De._defaultSceneConfig=null;var Ye=De;var Wa=3;var Ba="scene:resume",za=32767,uu=1e3,Xe=class o{constructor(e,t=void 0){this.liveGame=e;this.__tag=void 0;this.waitingAction=null;this.executingWaitingAction=!1;this.loopConfig=null;this.loopBodyActions=[];this.loopCondition=null;this.loopStartTime=0;this.loopDebugCheckpoint=0;this.__tag=t,this.stack=new ji().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new xe("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new xe("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(S.isAwaitable(i)&&!i.isSettled())throw new xe("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!S.isAwaitable(n))throw new xe("StackModel: Unexpected non-CalledActionResult or Awaitable in stack.");return!0})}static isStackModel(e){return e instanceof o}static createStackModel(e,t,n){let i=new o(e);return i.deserialize(t,n),i}static createCountLoop(e,t,n){let i=new o(e,"loop:count");return i.initLoop({type:"count",counter:0,limit:t,bodyActionIds:n.map(r=>r.getId()),broken:!1},n,null),i}static createConditionLoop(e,t,n,i){let r=new o(e,"loop:condition");return r.initLoop({type:"condition",counter:0,conditionActionId:n,bodyActionIds:i.map(s=>s.getId()),broken:!1},i,t),r}static isCalledActionResult(e){return!!e&&!this.isStackModel(e)&&!S.isAwaitable(e)&&"type"in e}static fromAction(e){return{type:e.type,node:e.contentNode}}static executeStackModelGroup(e,t){return e==="any"?S.any(...t.map(n=>n.execute())):S.all(...t.map(n=>n.execute()))}static isStackModelsAwaiting(e,t){if(t.length===0)throw new Error("StackModel: StackModels are empty.");return e==="any"?t.every(n=>!n.isEmpty()):t.some(n=>!n.isEmpty())}initLoop(e,t,n){this.loopConfig=e,this.loopBodyActions=t,this.loopCondition=n,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=0,this.shouldContinueLoop(this.liveGame.getGameStateForce())&&this.pushLoopBody()}shouldContinueLoop(e){return!this.loopConfig||this.loopConfig.broken?!1:this.loopConfig.type==="count"?this.loopConfig.counter<(this.loopConfig.limit??0):this.loopCondition?this.loopCondition.evaluate({gameState:e}).value:!1}pushLoopBody(){if(this.loopBodyActions.length!==0)for(let e=this.loopBodyActions.length-1;e>=0;e--)this.stack.push(o.fromAction(this.loopBodyActions[e]))}onIterationComplete(){!this.loopConfig||this.loopConfig.broken||(this.loopConfig.counter++,this.liveGame.game.config.app.debug&&this.checkInfiniteLoop(),this.shouldContinueLoop(this.liveGame.getGameStateForce())&&this.pushLoopBody())}checkInfiniteLoop(){if(!this.loopConfig)return;let e=this.loopConfig.counter;if(e>0&&e%za===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=za&&t<uu){let i=new E(`[NarraLeaf] Potential infinite loop detected!
40
+ Parent Conflict (src: `+p.get(y)?.state.currentSrc+`)
41
+ Current Parent (src: `+m.state.currentSrc+")");p.set(y,m)}});let d=[...this._initScene(this),...c.map(m=>m._init(this)),...u.map(m=>{if(!p.has(m))throw new Error("Wearable image must have a parent image");return p.get(m)._initWearable(m)}),...a.map(m=>m._init()),...l.map(m=>m._init()),...r],g=super.constructNodes(d),f=new C(this.sceneRoot,void 0,g||void 0).setContent(this);return g?.setParent(f),this.sceneRoot?.setContentNode(f),this._futureActions_=d,this.constructLabels(t),this}constructLabels(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!1}),i=new Map;for(let r of n)if(r instanceof ae&&r.type===se.label){let[s]=r.contentNode.getContent();if(i.has(s))throw new Oe(`Duplicate label "${s}" in scene "${this.config.name}". Label names must be unique within a scene.`);i.set(s,r)}this.labelMap=i;for(let r of n)if(r instanceof ae&&r.type===se.jump){let[s]=r.contentNode.getContent(),a=i.get(s);if(!a)throw new Oe(`Jump target label "${s}" not found in scene "${this.config.name}". Control.jump can only jump to a Control.label declared in the same scene.`);r.setJumpTarget(a)}}getLabel(t){return this.labelMap.get(t)||null}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?nn.say(n).getActions():ze.toActions([n]))}isSceneRootConstructed(){return!!this.sceneRoot}registerSrc(t,n=new Set){if(!this.sceneRoot)return;let i=new Set,r=new Set,s=[this.sceneRoot],a=new Set;for(;s.length;){let l=s.shift();if(!i.has(l)){if(i.add(l),l instanceof ne){let c=l.callee;if(P.isImageSrc(c.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:P.srcToURL(c.state.backgroundImage.state.currentSrc)}),l.type===W.jumpTo||l.type===W.callTo){let p=l,d=p.contentNode.getContent()[0],g=Ee.getScene(t,d);if(!g)throw l._sceneNotFoundError(l.getSceneName(d));let f=Re.getPreloadableSrc(t,l);if(f&&this.srcManager.register(f),!r.has(p)&&!n.has(g))r.add(p),a.add(g),n.add(g);else if(l.type===W.jumpTo)continue}}else if(l instanceof Se){let c=Re.getPreloadableSrc(t,l);c&&this.srcManager.register(c)}else if(l instanceof tt)this.srcManager.register(l.callee);else if(l instanceof it){let c=l.type===Jt.say?l.contentNode.getContent():null;for(let u of za(l.callee,c))this.srcManager.register({type:"image",src:P.srcToURL(u)})}else if(l instanceof ae){let u=l.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else l instanceof Te&&this.srcManager.register(l.callee.srcManager.getSrc());s.push(...l.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(l=>{l.registerSrc(t,n),this.srcManager.registerFuture(l.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let l=a.getStaticId();if(l){if(i.has(l))throw new Oe(`Duplicate static action id: ${l}`);i.add(l)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let l=a.getStaticId();a.resolveId(l||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((s,a)=>{s.resolveId(`e-${a}`)});let i=new Set;this.getAllChildren(t,this.sceneRoot||[]).forEach(s=>{Ee.getOwnedSounds(s).forEach(a=>i.add(a))});let r=0;i.forEach(s=>{s.getId()||s.resolveId(`s-${r}`),r++})}getVoice(t){if(!t)return null;let n=this.config.voices;if(n){if(typeof n=="function"){let r=n(t);return typeof r=="string"?this.voiceOfSrc(r):(Ee.validateVoice(r),r)}let i=n[t];return typeof i=="string"?this.voiceOfSrc(i):i||null}return null}voiceOfSrc(t){let n=this.voiceCache.get(t);if(n)return n;let i=ge.voice(t);return this.voiceCache.set(t,i),i}getSceneRoot(){if(!this.sceneRoot)throw new Error("Scene root is not constructed");return this.sceneRoot}stringify(t,n,i){return super.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}).map(r=>r.stringify(t,n,i)).join(";")}reset(){super.reset(),this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&!to(t.backgroundMusic.config.type,[nt.bgm]))throw new Oe(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
42
+ To prevent unintended behavior and unexpected results, the sound have to be on the music bus (or any bus beneath it). Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new O({src:t.background,opacity:1,autoFit:!0,name:`[[Background Image of ${this.config.name}]]`,layer:this.config.defaultBackgroundLayer})._setIsBackground(!0),i=t.backgroundMusic?this.state?.backgroundMusic?this.state.backgroundMusic.reset():t.backgroundMusic:null;return{backgroundImage:n,backgroundMusic:i}}_jumpTo(t){return this.chain(new ne(this.chain(),"scene:jumpTo",new C().setContent([t])))}_callTo(t){return this.chain(new ne(this.chain(),"scene:callTo",new C().setContent([t])))}_resume(t){return this.chain(new ne(this.chain(),"scene:resume",new C().setContent([t])))}_preSuspend(t){return new ne(this.chain(),"scene:preSuspend",new C().setContent([t]))}_exit(){return new ne(this.chain(),"scene:exit",new C().setContent([]))}_transitionToScene(t,n){let i=this.chain();return t?i.chain(new ne(i,W.transitionToScene,new C().setContent([t,n]))):i}_init(t){return new ne(this.chain(),"scene:init",new C().setContent([t]))}_initScene(t){return[t._init(t),...t.config.layers.flatMap(n=>n._init(t)),...t._initBackground(t,t.config.defaultBackgroundLayer)]}_initBackground(t,n){return[t.state.backgroundImage._init(t,n)]}};Ee.EventTypes={"event:scene.remove":"event:scene.remove","event:scene.load":"event:scene.load","event:scene.unload":"event:scene.unload","event:scene.mount":"event:scene.mount","event:scene.unmount":"event:scene.unmount","event:scene.preUnmount":"event:scene.preUnmount","event:scene.imageLoaded":"event:scene.imageLoaded"},Ee.DefaultUserConfig=new K({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Ee._defaultSceneConfig=null;var Ye=Ee;var $a=3;var ja="scene:resume",qa=32767,gu=1e3,Xe=class o{constructor(e,t=void 0){this.liveGame=e;this.__tag=void 0;this.waitingAction=null;this.executingWaitingAction=!1;this.loopConfig=null;this.loopBodyActions=[];this.loopCondition=null;this.loopStartTime=0;this.loopDebugCheckpoint=0;this.__tag=t,this.stack=new ji().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new Ce("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new Ce("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(S.isAwaitable(i)&&!i.isSettled())throw new Ce("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!S.isAwaitable(n))throw new Ce("StackModel: Unexpected non-CalledActionResult or Awaitable in stack.");return!0})}static isStackModel(e){return e instanceof o}static createStackModel(e,t,n){let i=new o(e);return i.deserialize(t,n),i}static createCountLoop(e,t,n){let i=new o(e,"loop:count");return i.initLoop({type:"count",counter:0,limit:t,bodyActionIds:n.map(r=>r.getId()),broken:!1},n,null),i}static createConditionLoop(e,t,n,i){let r=new o(e,"loop:condition");return r.initLoop({type:"condition",counter:0,conditionActionId:n,bodyActionIds:i.map(s=>s.getId()),broken:!1},i,t),r}static isCalledActionResult(e){return!!e&&!this.isStackModel(e)&&!S.isAwaitable(e)&&"type"in e}static fromAction(e){return{type:e.type,node:e.contentNode}}static executeStackModelGroup(e,t){return e==="any"?S.any(...t.map(n=>n.execute())):S.all(...t.map(n=>n.execute()))}static isStackModelsAwaiting(e,t){if(t.length===0)throw new Error("StackModel: StackModels are empty.");return e==="any"?t.every(n=>!n.isEmpty()):t.some(n=>!n.isEmpty())}initLoop(e,t,n){this.loopConfig=e,this.loopBodyActions=t,this.loopCondition=n,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=0,this.shouldContinueLoop(this.liveGame.getGameStateForce())&&this.pushLoopBody()}shouldContinueLoop(e){return!this.loopConfig||this.loopConfig.broken?!1:this.loopConfig.type==="count"?this.loopConfig.counter<(this.loopConfig.limit??0):this.loopCondition?this.loopCondition.evaluate({gameState:e}).value:!1}pushLoopBody(){if(this.loopBodyActions.length!==0)for(let e=this.loopBodyActions.length-1;e>=0;e--)this.stack.push(o.fromAction(this.loopBodyActions[e]))}onIterationComplete(){!this.loopConfig||this.loopConfig.broken||(this.loopConfig.counter++,this.liveGame.game.config.app.debug&&this.checkInfiniteLoop(),this.shouldContinueLoop(this.liveGame.getGameStateForce())&&this.pushLoopBody())}checkInfiniteLoop(){if(!this.loopConfig)return;let e=this.loopConfig.counter;if(e>0&&e%qa===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=qa&&t<gu){let i=new E(`[NarraLeaf] Potential infinite loop detected!
43
43
  Loop has executed ${e} iterations in ${t}ms.
44
44
  This is likely a bug in your game script. Check your loop conditions.
45
- Loop type: ${this.loopConfig.type}, broken: ${this.loopConfig.broken}`);throw this.liveGame.getGameStateForce().logger.error("StackModel",i.message),i}this.loopDebugCheckpoint=e,this.loopStartTime=Date.now()}}breakLoop(){if(!this.loopConfig)throw new E("Cannot break: StackModel is not a loop");this.loopConfig.broken=!0,this.stack.clear()}isLoop(){return this.loopConfig!==null}rollNext(){if(this.stack.isEmpty())return null;let e=this.stack.peek();if(S.isAwaitable(e)&&!e.isSettled())return e;if(o.isCalledActionResult(e)&&e.wait){let n=e.wait.stackModels;if(!n.length)throw new Error("StackModel: Waiting action contains empty stackModels.");if(o.isStackModelsAwaiting(e.wait.type,n))return n.forEach(i=>i.rollNext()),e;n.forEach(i=>{i.isEmpty()||i.abandon()})}this.waitingAction=null;let t=this.stack.pop();if(S.isAwaitable(t)){if(t.isFailed())throw t.error;let n=t.result;if(n)return this.stack.push(n),this.liveGame.getGameStateForce().logger.debug("next action (resolved awaitable)",n.node?.action),n}else return this.waitingAction=t,this.executeActions(t);return null}execute(){let e=null,t=!1,n=new S().registerSkipController(new V(()=>{t=!0,e?.abort()}));return(async()=>{let r=0;for(;!t;){if(r++>this.liveGame.game.config.maxStackModelLoop)throw new Error("StackModel: Suspiciously long waiting loop.");if(this.stack.isEmpty()){if(this.loopConfig&&!this.loopConfig.broken&&(this.onIterationComplete(),!this.stack.isEmpty()))continue;t=!0;break}let s=this.rollNext();if(s){if(S.isAwaitable(s)){if(s.isFailed())throw s.error;if(s.isSettled())continue;if(e=s,await new Promise(a=>{s.onSettled(a)}),s.isFailed())throw s.error;if(s.isAborted()){t=!0;break}}else if(o.isCalledActionResult(s))if(s.wait)e=o.executeStackModelGroup(s.wait.type,s.wait.stackModels),await e;else continue}}})().then(()=>n.resolve()).catch(r=>n.fail(r)),n}abortStackTop(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)?(this.stack.pop().abort(),this.waitingAction=null):o.isCalledActionResult(e)&&e.wait&&(e.wait.stackModels.forEach(t=>t.abortStackTop()),this.waitingAction=null),this.waitingAction}getWaitingAwaitable(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)&&!e.isSettled()?e:null}getTopSync(){if(this.stack.isEmpty())return null;let e=!1;for(let t=this.stack.size()-1;t>=0;t--){let n=this.stack.get(t);if(n){if(o.isCalledActionResult(n))return n;if(e)throw new xe("StackModel: Unexpected non-CalledActionResult in stack.")}else return null;e=!0}return null}peekTopActionId(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t))return t.node?.action?.getId()??null}return null}peekExecutingActionId(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&o.isCalledActionResult(e)?e.node?.action?.getId()??null:null}snapshot(){let e=[];for(let n=this.stack.size()-1;n>=0;n--){let i=this.stack.get(n);if(!o.isCalledActionResult(i))continue;let r={actionId:i.node?.action?.getId()??null,actionType:i.node?.action?.type??null};i.wait?.stackModels&&(r.branchWaitType=i.wait.type,r.branches=i.wait.stackModels.map(s=>s.snapshot())),e.push(r)}let t={frames:e};return this.__tag&&(t.tag=this.__tag),this.loopConfig&&(t.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,broken:this.loopConfig.broken}),t}executeActions(e){if(!e.node?.action)return null;this.executingWaitingAction=!0;let t;try{t=this.liveGame.executeAction(this.liveGame.getGameStateForce(),e.node.action,{stackModel:this})}finally{this.executingWaitingAction=!1}let n=i=>i?S.isAwaitable(i)?(this.liveGame.getGameStateForce().logger.debug("next action (executed awaitable)",i),this.stack.push(i),i):i.node?.action||i.wait?.stackModels.length?(this.liveGame.getGameStateForce().logger.debug("next action (executed)",i),this.stack.push(i),i):null:null;if(Array.isArray(t)){let i=null;for(let r of t){let s=n(r);s&&(i=s)}return i}else{let i=n(t);if(i)return i}return null}isWaiting(){let e=this.stack.peek();return e?S.isAwaitable(e)?!e.isSettled():o.isCalledActionResult(e)&&e.wait?o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels):!1:!1}serialize(e=!0){let t=a=>{if(o.isCalledActionResult(a)){let l=a.node?.action?.getId()??null,c=a.node?.action?.type??null;return a.wait?.stackModels?{type:"link",actionType:c,action:l,stacks:a.wait.stackModels.map(u=>u.serialize()),stackWaitType:a.wait.type}:{type:"action",actionType:c,action:l}}return null},n=this.stack.map(t).filter(function(a){return a!==null}),i=this.stack.peek(),r=this.executingWaitingAction||S.isAwaitable(i);if(e&&this.waitingAction&&r){let a=t(this.waitingAction);a&&n.push(a)}let s={items:n};return this.loopConfig&&(s.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,conditionActionId:this.loopConfig.conditionActionId,bodyActionIds:this.loopConfig.bodyActionIds,broken:this.loopConfig.broken}),s}abandon(){let e=[];if(this.collectCallFrames(e),e.length){let t=this.liveGame.getGameStateForce();e.forEach(n=>n.abandon(t))}return this.reset(),this}collectCallFrames(e){let t=n=>{if(!o.isCalledActionResult(n))return;n.wait?.stackModels.forEach(r=>r.collectCallFrames(e));let i=n.node?.action;i&&i.type===Ba&&e.push(i)};t(this.waitingAction??void 0);for(let n=this.stack.size()-1;n>=0;n--)t(this.stack.get(n))}reset(){this.stack.forEach(e=>{o.isCalledActionResult(e)?e.wait?.stackModels.forEach(t=>t.reset()):S.isAwaitable(e)&&e.abort()}),this.waitingAction&&this.waitingAction.wait?.stackModels.forEach(e=>e.reset()),this.waitingAction=null,this.stack.clear(),this.loopConfig=null,this.loopBodyActions=[],this.loopCondition=null,this.loopStartTime=0,this.loopDebugCheckpoint=0}deserialize(e,t){this.reset();let n=e.items;for(let i of n){if(this.topIsGroupStillRunning()){this.liveGame.getGameStateForce?.().logger?.debug("StackModel","Dropping an item restored above a running group",i.action);break}if(i.type==="action"){if(!i.action)continue;let{actionType:r,action:s}=i,a=t.get(s);if(!a)throw new Error(`Action not found: ${s}`);this.stack.push({type:r,node:a.contentNode,wait:null})}else if(i.type==="link"){let{actionType:r,action:s,stacks:a,stackWaitType:l}=i;if(l==null)throw new Error(`Missing stackWaitType for link action: ${s}`);this.stack.push({type:r,node:s?t.get(s)?.contentNode??null:null,wait:{type:l,stackModels:a.map(c=>o.createStackModel(this.liveGame,c,t))}})}}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let l=t.get(a);if(!l)throw new Error(`Loop body action not found: ${a}`);r.push(l)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let l=a.contentNode.getContent();Array.isArray(l)&&l.length>=2&&X.isLambda(l[1])&&(s=l[1])}}this.loopConfig={type:i.type,counter:i.counter,limit:i.limit,conditionActionId:i.conditionActionId,bodyActionIds:i.bodyActionIds,broken:i.broken},this.loopBodyActions=r,this.loopCondition=s,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=i.counter}return this}isEmpty(){return this.stack.isEmpty()}topIsGroupStillRunning(){let e=this.stack.peek();return o.isCalledActionResult(e)&&!!e.wait&&o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels)}clearAboveCallFrame(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t)&&t.node?.action?.type===Ba){for(;this.stack.size()>e+1;){let n=this.stack.pop();S.isAwaitable(n)?n.abort():o.isCalledActionResult(n)&&n.wait?.stackModels.forEach(i=>i.reset())}return this.waitingAction=null,this}}return this.reset(),this}push(...e){return this.stack.push(...e),this}};var Me=class Me{constructor(e){this.events=new J;this.story=null;this.gameLock=new Mn;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.elementAuditCountdown=0;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new oi,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new Ht(Me.GameSpacesKey.game,Me.DefaultNamespaces.game)),this.story&&this.story.initPersistent(this._storable),this}getStorable(){return this._storable}get storable(){return this._storable}loadStory(e){return this.story=e.constructStory(),this}serialize(){this.assertGameState();let e=this.story;if(!e)throw new Error("No story loaded");if(!this.currentSavedGame||!this.stackModel)throw new Error("Failed when trying to serialize the game: The game has not started");return{name:this.currentSavedGame.name,meta:{version:Wa,created:this.currentSavedGame.meta.created,updated:Date.now(),id:this.currentSavedGame.meta.id,lastSentence:this.lastDialog?.sentence||null,lastSpeaker:this.lastDialog?.speaker||null,storyHash:e.hash()},game:{...this.serializeGameState(),history:this.gameState.gameHistory.serialize()}}}serializeGameState(){this.assertGameState();let e=this.gameState,t=this.story;if(!t)throw new Error("No story loaded");let n=this._storable.toData(),i=e.toData(),r=t.getAllElementStates();this.auditElementDirtyMarks(t);let s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(l=>l.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}auditElementDirtyMarks(e){if(!this.game.config.app.debug||this.elementAuditCountdown-- >0)return;this.elementAuditCountdown=Me.ElementAuditInterval;let t=e.findUnmarkedElements();t.length&&(t.forEach(n=>n.markDirty()),this.gameState?.logger.warn("LiveGame.auditElementDirtyMarks",`${t.length} element(s) had state that no longer matches the script but were never marked dirty, so the save just written left them out. They have been marked, so the next save will carry them - but something is writing element state outside the action dispatch: ${t.map(n=>n.getId()).join(", ")}`))}captureGameState(){try{return this.serializeGameState()}catch(e){return this.gameState?.logger.warn("LiveGame.captureGameState",e),null}}deserialize(e){if(!e)throw new Error("No saved game provided when trying to deserialize game state");this.assertGameState();let t=this.gameState,n=this.story;if(!n)throw new Error("No story loaded");this.game.hooks.trigger("beforeRestore",[]),t.rollLock.lock(),this.reset(),t.stage.forceRemount();let{game:{store:i,stage:r,elementStates:s,services:a,stackModel:l,asyncStackModels:c}}=e,[u,d]=this.constructMaps();this.initNamespaces(),this._storable.load(i),d.forEach(p=>p.reset()),s.forEach(({id:p,data:h})=>{t.logger.debug("restore element",p);let g=d.get(p);if(!g)throw new Error("Element not found, id: "+p+`
46
- NarraLeaf cannot find the element with the id from the saved game`);g instanceof Ye?g.fromData(h,d):g.fromData(h),g.markDirty()}),d.forEach(p=>{p instanceof $e&&p._rebindLoop(u)}),this.currentSavedGame=e,t.loadData(r,d),this.stackModel.deserialize(l,u),c.forEach(p=>{let h=Xe.createStackModel(this,p,u);this.asyncStackModels.add(h),t.timelines.attachTimeline(this.executeAsyncStackModel(h))}),n.deserializeServices(a),t.gameHistory.load(e.game.history??[],u),this.game.hooks.trigger("afterRestore",[]),t.events.once(L.EventTypes["event:state.onRender"],()=>{t.schedule(()=>{t.rollLock.unlock(),t.stage.next()},0)}),t.stage.forceUpdate()}getHistory(){return this.assertGameState(),this.gameState.gameHistory.getHistory()}getFuture(){return this.assertGameState(),this.gameState.gameHistory.getFuture()}canUndo(){return this.assertGameState(),this.gameState.gameHistory.canUndo()}canRedo(){return this.assertGameState(),this.gameState.gameHistory.canRedo()}undo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canUndo()?this.restoreToIndex(e.getCursor()-1,"LiveGame.undo"):(this.gameState.logger.warn("LiveGame.undo","No line to step back to"),!1)}redo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canRedo()?this.restoreToIndex(e.getCursor()+1,"LiveGame.redo"):(this.gameState.logger.warn("LiveGame.redo","No line to step forward to"),!1)}restoreToHistory(e){this.assertGameState();let t=this.gameState.gameHistory.indexOfToken(e);return t<0?(this.gameState.logger.warn("LiveGame.restoreToHistory","No history entry for token",e),!1):this.restoreToIndex(t,"LiveGame.restoreToHistory")}restoreToIndex(e,t){this.assertGameState();let n=this.gameState.gameHistory,i=n.getAt(e);if(!i)return this.gameState.logger.warn(t,"No history entry at",e),!1;if(e<n.getCursor()&&this.gameState.actionHistory.has(i.token)){let a=n.getCursor();if(n.setCursor(e),this.undoInPlace(i,t))return this.auditRestoredLine(i,t),!0;n.setCursor(a)}if(!i.snapshot)return this.gameState.logger.warn(t,"History entry has no restore snapshot",i.token),!1;let r=i.token,s={name:this.currentSavedGame?.name??"",meta:this.currentSavedGame?.meta??this.getNewSavedGame().meta,game:{...i.snapshot,history:n.serializeAll()}};return this.deserialize(s),this.gameState.gameHistory.setCursor(this.gameState.gameHistory.indexOfToken(r)),i.action.type===Qt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),!0}undoInPlace(e,t){this.assertGameState();let n=this.gameState.actionHistory;if(!n.has(e.token))return!1;let i=this.gameLock.register().lock();this.stackModel.abortStackTop();let r=n.undoUntil(e.token);if(!r)return this.gameLock.off(i.unlock()),!1;let[s]=this.constructMaps(),{rootStackSnapshot:a,stackModel:l}=r;return r.action.type===Qt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(a,s),l===this.stackModel&&this.stackModel.push(Xe.fromAction(r.action)),this.gameLock.off(i.unlock()),this.gameState.logger.debug(t,"Stepped back in place to",e.token),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0),!0}auditRestoredLine(e,t){if(!this.game.config.app.debug||!e.snapshot)return;let n=JSON.stringify([...e.snapshot.elementStates].sort((r,s)=>r.id.localeCompare(s.id))),i=JSON.stringify([...this.serializeGameState().elementStates].sort((r,s)=>r.id.localeCompare(s.id)));n!==i&&this.gameState?.logger.warn(t,`Stepping back in place did not reproduce the state this line's snapshot describes, so an action's undo does not fully reverse it. Restoring the snapshot would have been correct; this path was not.
45
+ Loop type: ${this.loopConfig.type}, broken: ${this.loopConfig.broken}`);throw this.liveGame.getGameStateForce().logger.error("StackModel",i.message),i}this.loopDebugCheckpoint=e,this.loopStartTime=Date.now()}}breakLoop(){if(!this.loopConfig)throw new E("Cannot break: StackModel is not a loop");this.loopConfig.broken=!0,this.stack.clear()}isLoop(){return this.loopConfig!==null}rollNext(){if(this.stack.isEmpty())return null;let e=this.stack.peek();if(S.isAwaitable(e)&&!e.isSettled())return e;if(o.isCalledActionResult(e)&&e.wait){let n=e.wait.stackModels;if(!n.length)throw new Error("StackModel: Waiting action contains empty stackModels.");if(o.isStackModelsAwaiting(e.wait.type,n))return n.forEach(i=>i.rollNext()),e;n.forEach(i=>{i.isEmpty()||i.abandon()})}this.waitingAction=null;let t=this.stack.pop();if(S.isAwaitable(t)){if(t.isFailed())throw t.error;let n=t.result;if(n)return this.stack.push(n),this.liveGame.getGameStateForce().logger.debug("next action (resolved awaitable)",n.node?.action),n}else return this.waitingAction=t,this.executeActions(t);return null}execute(){let e=null,t=!1,n=new S().registerSkipController(new U(()=>{t=!0,e?.abort()}));return(async()=>{let r=0;for(;!t;){if(r++>this.liveGame.game.config.maxStackModelLoop)throw new Error("StackModel: Suspiciously long waiting loop.");if(this.stack.isEmpty()){if(this.loopConfig&&!this.loopConfig.broken&&(this.onIterationComplete(),!this.stack.isEmpty()))continue;t=!0;break}let s=this.rollNext();if(s){if(S.isAwaitable(s)){if(s.isFailed())throw s.error;if(s.isSettled())continue;if(e=s,await new Promise(a=>{s.onSettled(a)}),s.isFailed())throw s.error;if(s.isAborted()){t=!0;break}}else if(o.isCalledActionResult(s))if(s.wait)e=o.executeStackModelGroup(s.wait.type,s.wait.stackModels),await e;else continue}}})().then(()=>n.resolve()).catch(r=>n.fail(r)),n}abortStackTop(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)?(this.stack.pop().abort(),this.waitingAction=null):o.isCalledActionResult(e)&&e.wait&&(e.wait.stackModels.forEach(t=>t.abortStackTop()),this.waitingAction=null),this.waitingAction}getWaitingAwaitable(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)&&!e.isSettled()?e:null}getTopSync(){if(this.stack.isEmpty())return null;let e=!1;for(let t=this.stack.size()-1;t>=0;t--){let n=this.stack.get(t);if(n){if(o.isCalledActionResult(n))return n;if(e)throw new Ce("StackModel: Unexpected non-CalledActionResult in stack.")}else return null;e=!0}return null}peekTopActionId(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t))return t.node?.action?.getId()??null}return null}peekExecutingActionId(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&o.isCalledActionResult(e)?e.node?.action?.getId()??null:null}snapshot(){let e=[];for(let n=this.stack.size()-1;n>=0;n--){let i=this.stack.get(n);if(!o.isCalledActionResult(i))continue;let r={actionId:i.node?.action?.getId()??null,actionType:i.node?.action?.type??null};i.wait?.stackModels&&(r.branchWaitType=i.wait.type,r.branches=i.wait.stackModels.map(s=>s.snapshot())),e.push(r)}let t={frames:e};return this.__tag&&(t.tag=this.__tag),this.loopConfig&&(t.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,broken:this.loopConfig.broken}),t}executeActions(e){if(!e.node?.action)return null;this.executingWaitingAction=!0;let t;try{t=this.liveGame.executeAction(this.liveGame.getGameStateForce(),e.node.action,{stackModel:this})}finally{this.executingWaitingAction=!1}let n=i=>i?S.isAwaitable(i)?(this.liveGame.getGameStateForce().logger.debug("next action (executed awaitable)",i),this.stack.push(i),i):i.node?.action||i.wait?.stackModels.length?(this.liveGame.getGameStateForce().logger.debug("next action (executed)",i),this.stack.push(i),i):null:null;if(Array.isArray(t)){let i=null;for(let r of t){let s=n(r);s&&(i=s)}return i}else{let i=n(t);if(i)return i}return null}isWaiting(){let e=this.stack.peek();return e?S.isAwaitable(e)?!e.isSettled():o.isCalledActionResult(e)&&e.wait?o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels):!1:!1}serialize(e=!0){let t=a=>{if(o.isCalledActionResult(a)){let l=a.node?.action?.getId()??null,c=a.node?.action?.type??null;return a.wait?.stackModels?{type:"link",actionType:c,action:l,stacks:a.wait.stackModels.map(u=>u.serialize()),stackWaitType:a.wait.type}:{type:"action",actionType:c,action:l}}return null},n=this.stack.map(t).filter(function(a){return a!==null}),i=this.stack.peek(),r=this.executingWaitingAction||S.isAwaitable(i);if(e&&this.waitingAction&&r){let a=t(this.waitingAction);a&&n.push(a)}let s={items:n};return this.loopConfig&&(s.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,conditionActionId:this.loopConfig.conditionActionId,bodyActionIds:this.loopConfig.bodyActionIds,broken:this.loopConfig.broken}),s}abandon(){let e=[];if(this.collectCallFrames(e),e.length){let t=this.liveGame.getGameStateForce();e.forEach(n=>n.abandon(t))}return this.reset(),this}collectCallFrames(e){let t=n=>{if(!o.isCalledActionResult(n))return;n.wait?.stackModels.forEach(r=>r.collectCallFrames(e));let i=n.node?.action;i&&i.type===ja&&e.push(i)};t(this.waitingAction??void 0);for(let n=this.stack.size()-1;n>=0;n--)t(this.stack.get(n))}reset(){this.stack.forEach(e=>{o.isCalledActionResult(e)?e.wait?.stackModels.forEach(t=>t.reset()):S.isAwaitable(e)&&e.abort()}),this.waitingAction&&this.waitingAction.wait?.stackModels.forEach(e=>e.reset()),this.waitingAction=null,this.stack.clear(),this.loopConfig=null,this.loopBodyActions=[],this.loopCondition=null,this.loopStartTime=0,this.loopDebugCheckpoint=0}deserialize(e,t){this.reset();let n=e.items;for(let i of n){if(this.topIsGroupStillRunning()){this.liveGame.getGameStateForce?.().logger?.debug("StackModel","Dropping an item restored above a running group",i.action);break}if(i.type==="action"){if(!i.action)continue;let{actionType:r,action:s}=i,a=t.get(s);if(!a)throw new Error(`Action not found: ${s}`);this.stack.push({type:r,node:a.contentNode,wait:null})}else if(i.type==="link"){let{actionType:r,action:s,stacks:a,stackWaitType:l}=i;if(l==null)throw new Error(`Missing stackWaitType for link action: ${s}`);this.stack.push({type:r,node:s?t.get(s)?.contentNode??null:null,wait:{type:l,stackModels:a.map(c=>o.createStackModel(this.liveGame,c,t))}})}}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let l=t.get(a);if(!l)throw new Error(`Loop body action not found: ${a}`);r.push(l)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let l=a.contentNode.getContent();Array.isArray(l)&&l.length>=2&&Y.isLambda(l[1])&&(s=l[1])}}this.loopConfig={type:i.type,counter:i.counter,limit:i.limit,conditionActionId:i.conditionActionId,bodyActionIds:i.bodyActionIds,broken:i.broken},this.loopBodyActions=r,this.loopCondition=s,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=i.counter}return this}isEmpty(){return this.stack.isEmpty()}topIsGroupStillRunning(){let e=this.stack.peek();return o.isCalledActionResult(e)&&!!e.wait&&o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels)}clearAboveCallFrame(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t)&&t.node?.action?.type===ja){for(;this.stack.size()>e+1;){let n=this.stack.pop();S.isAwaitable(n)?n.abort():o.isCalledActionResult(n)&&n.wait?.stackModels.forEach(i=>i.reset())}return this.waitingAction=null,this}}return this.reset(),this}push(...e){return this.stack.push(...e),this}};var Me=class Me{constructor(e){this.events=new Q;this.story=null;this.gameLock=new Mn;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.elementAuditCountdown=0;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new oi,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new Vt(Me.GameSpacesKey.game,Me.DefaultNamespaces.game)),this.story&&this.story.initPersistent(this._storable),this}getStorable(){return this._storable}get storable(){return this._storable}loadStory(e){return this.story=e.constructStory(),this}serialize(){this.assertGameState();let e=this.story;if(!e)throw new Error("No story loaded");if(!this.currentSavedGame||!this.stackModel)throw new Error("Failed when trying to serialize the game: The game has not started");return{name:this.currentSavedGame.name,meta:{version:$a,created:this.currentSavedGame.meta.created,updated:Date.now(),id:this.currentSavedGame.meta.id,lastSentence:this.lastDialog?.sentence||null,lastSpeaker:this.lastDialog?.speaker||null,storyHash:e.hash()},game:{...this.serializeGameState(),history:this.gameState.gameHistory.serialize()}}}serializeGameState(){this.assertGameState();let e=this.gameState,t=this.story;if(!t)throw new Error("No story loaded");let n=this._storable.toData(),i=e.toData(),r=t.getAllElementStates();this.auditElementDirtyMarks(t);let s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(l=>l.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}auditElementDirtyMarks(e){if(!this.game.config.app.debug||this.elementAuditCountdown-- >0)return;this.elementAuditCountdown=Me.ElementAuditInterval;let t=e.findUnmarkedElements();t.length&&(t.forEach(n=>n.markDirty()),this.gameState?.logger.warn("LiveGame.auditElementDirtyMarks",`${t.length} element(s) had state that no longer matches the script but were never marked dirty, so the save just written left them out. They have been marked, so the next save will carry them - but something is writing element state outside the action dispatch: ${t.map(n=>n.getId()).join(", ")}`))}captureGameState(){try{return this.serializeGameState()}catch(e){return this.gameState?.logger.warn("LiveGame.captureGameState",e),null}}deserialize(e){if(!e)throw new Error("No saved game provided when trying to deserialize game state");this.assertGameState();let t=this.gameState,n=this.story;if(!n)throw new Error("No story loaded");this.game.hooks.trigger("beforeRestore",[]),t.rollLock.lock(),this.reset(),t.stage.forceRemount();let{game:{store:i,stage:r,elementStates:s,services:a,stackModel:l,asyncStackModels:c}}=e,[u,p]=this.constructMaps();this.initNamespaces(),this._storable.load(i),p.forEach(d=>d.reset()),s.forEach(({id:d,data:g})=>{t.logger.debug("restore element",d);let f=p.get(d);if(!f)throw new Error("Element not found, id: "+d+`
46
+ NarraLeaf cannot find the element with the id from the saved game`);f instanceof Ye?f.fromData(g,p):f.fromData(g),f.markDirty()}),p.forEach(d=>{d instanceof $e&&d._rebindLoop(u)}),this.currentSavedGame=e,t.loadData(r,p),this.stackModel.deserialize(l,u),c.forEach(d=>{let g=Xe.createStackModel(this,d,u);this.asyncStackModels.add(g),t.timelines.attachTimeline(this.executeAsyncStackModel(g))}),n.deserializeServices(a),t.gameHistory.load(e.game.history??[],u),this.game.hooks.trigger("afterRestore",[]),t.events.once(R.EventTypes["event:state.onRender"],()=>{t.schedule(()=>{t.rollLock.unlock(),t.stage.next()},0)}),t.stage.forceUpdate()}getHistory(){return this.assertGameState(),this.gameState.gameHistory.getHistory()}getFuture(){return this.assertGameState(),this.gameState.gameHistory.getFuture()}canUndo(){return this.assertGameState(),this.gameState.gameHistory.canUndo()}canRedo(){return this.assertGameState(),this.gameState.gameHistory.canRedo()}undo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canUndo()?this.restoreToIndex(e.getCursor()-1,"LiveGame.undo"):(this.gameState.logger.warn("LiveGame.undo","No line to step back to"),!1)}redo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canRedo()?this.restoreToIndex(e.getCursor()+1,"LiveGame.redo"):(this.gameState.logger.warn("LiveGame.redo","No line to step forward to"),!1)}restoreToHistory(e){this.assertGameState();let t=this.gameState.gameHistory.indexOfToken(e);return t<0?(this.gameState.logger.warn("LiveGame.restoreToHistory","No history entry for token",e),!1):this.restoreToIndex(t,"LiveGame.restoreToHistory")}restoreToIndex(e,t){this.assertGameState();let n=this.gameState.gameHistory,i=n.getAt(e);if(!i)return this.gameState.logger.warn(t,"No history entry at",e),!1;if(e<n.getCursor()&&this.gameState.actionHistory.has(i.token)){let a=n.getCursor();if(n.setCursor(e),this.undoInPlace(i,t))return this.auditRestoredLine(i,t),!0;n.setCursor(a)}if(!i.snapshot)return this.gameState.logger.warn(t,"History entry has no restore snapshot",i.token),!1;let r=i.token,s={name:this.currentSavedGame?.name??"",meta:this.currentSavedGame?.meta??this.getNewSavedGame().meta,game:{...i.snapshot,history:n.serializeAll()}};return this.deserialize(s),this.gameState.gameHistory.setCursor(this.gameState.gameHistory.indexOfToken(r)),i.action.type===Jt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),!0}undoInPlace(e,t){this.assertGameState();let n=this.gameState.actionHistory;if(!n.has(e.token))return!1;let i=this.gameLock.register().lock();this.stackModel.abortStackTop();let r=n.undoUntil(e.token);if(!r)return this.gameLock.off(i.unlock()),!1;let[s]=this.constructMaps(),{rootStackSnapshot:a,stackModel:l}=r;return r.action.type===Jt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(a,s),l===this.stackModel&&this.stackModel.push(Xe.fromAction(r.action)),this.gameLock.off(i.unlock()),this.gameState.logger.debug(t,"Stepped back in place to",e.token),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0),!0}auditRestoredLine(e,t){if(!this.game.config.app.debug||!e.snapshot)return;let n=JSON.stringify([...e.snapshot.elementStates].sort((r,s)=>r.id.localeCompare(s.id))),i=JSON.stringify([...this.serializeGameState().elementStates].sort((r,s)=>r.id.localeCompare(s.id)));n!==i&&this.gameState?.logger.warn(t,`Stepping back in place did not reproduce the state this line's snapshot describes, so an action's undo does not fully reverse it. Restoring the snapshot would have been correct; this path was not.
47
47
  expected: ${n}
48
- actual: ${i}`)}dispose(){this.events.clear(),this.gameState?.dispose()}notify(e,t=3e3){this.assertGameState();let n=this.gameState.idManager.generateId(),i=this.gameState.notificationMgr.consume({id:n,message:e,duration:t}),r=S.toPromiseForce(i);return{cancel:()=>{i.abort()},promise:r}}playSound(e){this.assertGameState();let t=e instanceof URL?e.toString():e,n=typeof t=="string"?new ge({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(L.EventTypes["event:state.player.skip"],!0)}async fastForward(e={}){this.assertGameState();let t=this.gameState,n=e.until??"menu",i=typeof n=="object"?n.actionId:null,r=n==="menu"||i!==null,s=e.maxSteps??t.game.config.maxStackModelLoop,a=e.stepTimeout??Me.FastForwardStepTimeout,l=i!==null?{reachedTarget:!1}:{},c=t.audioManager.getGlobalVolume();t.audioManager.setGlobalVolume(0),t.setFastForwarding(!0);try{let u=0;for(;u++<s;){if(i!==null&&this.stackModel.peekExecutingActionId()===i)return{reason:"action",reachedTarget:!0};if(r&&t.hasActiveMenu())return{reason:"menu",...l};if(this.stackModel.isEmpty())return{reason:"end",...l};let d=this.stackModel.getWaitingAwaitable();if(d){if(!await Me.settleSuspendedStep(t,d,a))return{reason:"stalled",...l}}else t.stage.next(),await Promise.resolve()}return{reason:"maxSteps",...l}}finally{t.setFastForwarding(!1),t.audioManager.setGlobalVolume(c)}}static settleSuspendedStep(e,t,n){return new Promise(i=>{let r=!1,s=null,a,l=d=>{r||(r=!0,s!==null&&(clearTimeout(s),s=null),a?.cancel?.(),i(d))};if(a=t.onSettled(()=>l(!0)),r){a?.cancel?.();return}let c=Date.now()+n,u=()=>{if(!r&&(e.events.emit(L.EventTypes["event:state.player.skip"],!0),!r)){if(Date.now()>=c){l(!1);return}s=setTimeout(u,Me.FastForwardSkipInterval)}};u()})}assertScreenshot(){this.assertGameState(),this.assertPlayerElement()}capturePng(){return this.assertScreenshot(),this.gameState.htmlToImage.toPng(this.gameState.mainContentNode,this.getScreenshotOptions())}captureJpeg(){return this.assertScreenshot(),this.gameState.htmlToImage.toJpeg(this.gameState.mainContentNode,this.getScreenshotOptions())}captureSvg(){return this.assertScreenshot(),this.gameState.htmlToImage.toSvg(this.gameState.mainContentNode,this.getScreenshotOptions())}capturePngBlob(){return this.assertScreenshot(),this.assertGameState(),this.assertPlayerElement(),this.gameState.htmlToImage.toBlob(this.gameState.mainContentNode,this.getScreenshotOptions())}onCharacterPrompt(e){return this.events.on(Me.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Me.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(Me.EventTypes["event:action.current"],e)}getCurrentActionId(){return this._currentActionId}getStackSnapshot(){return this.stackModel?{root:this.stackModel.snapshot(),async:Array.from(this.asyncStackModels).map(e=>e.snapshot())}:{root:{frames:[]},async:[]}}newGame(){this.assertGameState();let e=this.gameState,t=e.logger.group("LiveGame (newGame)",!0);this.reset(),this.initNamespaces();let n=this.getNewSavedGame();n.name="NewGame-"+Date.now(),this.currentSavedGame=n;let i=this.story?.entryScene?.getSceneRoot();i?this.stackModel.push(Xe.fromAction(i)):e.logger.warn("No scene root found");let r=this.story?.getAllElementMap(this.story,this.story?.entryScene?.getSceneRoot()||[]);return r?r.forEach(s=>{e.logger.debug("reset element",s),s.reset()}):e.logger.warn("No elements found"),e.stage.forceUpdate(),e.stage.next(),t.end(),this}waitForRouterExit(){let e=null;return{promise:new Promise(t=>{e=this.game.router.onceExitComplete(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}waitForPageMount(){let e=null;return{promise:new Promise(t=>{e=this.game.router.oncePageMount(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}requestFullScreen(e){this.assertGameState();let t="LiveGame.requestFullScreen";try{let n=this.gameState.playerCurrent;if(!n){this.gameState.logger.warn(t,"No player element found");return}if(n.requestFullscreen)return n.requestFullscreen(e);this.gameState.logger.warn(t,"Fullscreen is not supported")}catch(n){this.gameState.logger.error(t,n)}}exitFullScreen(){this.assertGameState();let e="LiveGame.exitFullScreen";try{if(document.exitFullscreen)return document.exitFullscreen();this.gameState.logger.warn(e,"Fullscreen is not supported")}catch(t){this.gameState.logger.error(e,t)}}constructMaps(){let e=this.story;if(!e)throw new Error("No story loaded");if(this.mapCache)return this.mapCache;let t=new Map,n=new Map;return e.forEachChild(e,e.entryScene?.getSceneRoot()||[],i=>{t.set(i.getId(),i),n.set(i.callee.getId(),i.callee);for(let r of Ye.getOwnedSounds(i)){let s=r.getId();s&&n.set(s,r)}},{allowFutureScene:!0}),this.mapCache=[t,n],this.mapCache}getScreenshotOptions(){return{quality:this.game.config.screenshotQuality}}onPlayerEvent(e,t,n){this.assertPlayerElement();let i=this.gameState.playerCurrent;return i?(i.addEventListener(e,t,n),{cancel:()=>i.removeEventListener(e,t,n)}):(this.gameState.logger.warn("LiveGame.onEvent","No player element found"),{cancel:()=>{}})}onWindowEvent(e,t,n){return window.addEventListener(e,t,n),{cancel:()=>window.removeEventListener(e,t,n)}}reset(){this.assertGameState();let e=this.gameState;this.resetStackModels(),this.stackModel.reset(),this.currentSavedGame=null,this.lastDialog=null,e.forceReset()}next(){this.assertGameState();let e=this.gameState;if(this.gameLock.isLocked())return this.gameLock;if(!this.story)throw new Error("No story loaded");return this.stackModel.isEmpty()?(e.logger.weakWarn("Game Actions","Action stack is empty"),this.currentSavedGame?e.events.emit("event:state.end"):this.currentSavedGame=null,null):this.stackModel.rollNext()}setLastDialog(e,t){this.lastDialog={sentence:e,speaker:t}}requestAsyncStackModel(e){this.assertGameState();let t=new Xe(this);return this.asyncStackModels.add(t),t.push(...e),t}executeAsyncStackModel(e){this.assertGameState();let t=e.execute();return t.onFailed(n=>{this.gameState.logger.error("Async StackModel",n)}),t.onSettled(()=>{this.asyncStackModels.delete(e)}),t}createStackModel(e){let t=new Xe(this);return t.push(...e),t}resetStackModels(){this.asyncStackModels.forEach(e=>e.reset()),this.asyncStackModels.clear()}isPlaying(){return this.stackModel&&!this.stackModel.isEmpty()}executeAction(e,t,n){if(!this.stackModel)throw new Error("Stack model is not initialized");this._currentActionId=t.getId(),this.events.hasListeners(Me.EventTypes["event:action.current"])&&this.events.emit(Me.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type}),t.callee?.markDirty();let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new xe("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Xe(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new xe("GameState not set");return this.gameState}getAllPredictableActions(e,t,n){let i=t?.contentNode||null,r=[],s=[],a=new Set;for(;(i||s.length)&&!(n&&r.length>=n);){if(i||(i=s.pop().contentNode),[Ot].some(l=>i?.action&&i.action instanceof l)){i=null;continue}if(i.action&&i.action.is(te,W.jumpTo)){let[l]=i.action.contentNode.getContent(),c=e.getScene(l);if(!c)throw i.action._sceneNotFoundError(i.action.getSceneName(l));if(a.has(c)){i=null;continue}a.add(c),i=c.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(se,re.do)){let[l]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=l[0]?.contentNode||null}i?.action&&r.push(i.action),i=i?.getChild()||null}return r}clearMainStack(){if(!this.stackModel)throw new xe("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new xe("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:ua(),lastSentence:null,lastSpeaker:null,storyHash:this.story?.hash()||""},game:{store:{},stage:{scenes:[],audio:{sounds:[],groups:[]},videos:[]},elementStates:[],services:{},stackModel:{items:[]},asyncStackModels:[]}}}assertGameState(){if(!this.gameState)throw new E("No game state found, make sure you call this method in effect hooks or event handlers")}assertPlayerElement(){if(this.assertGameState(),!this.gameState.playerCurrent)throw new E("Player Element Not Mounted")}};Me.DefaultNamespaces={game:{}},Me.GameSpacesKey={game:"game"},Me.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},Me.ElementAuditInterval=50,Me.FastForwardStepTimeout=1e4,Me.FastForwardSkipInterval=16;var Ut=Me;var yi=class yi{constructor(e){this.events=new J;this.settings={...e},this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(yi.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(yi.EventTypes["event:game.preference.change"],(n,i)=>{typeof e=="string"?e===n&&t&&t(i):e(n,i)})}importPreferences(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setPreference(t,e[t])}exportPreferences(){let e={};for(let t in this.settings)Object.prototype.hasOwnProperty.call(this.settings,t)&&(e[t]=this.settings[t]);return e}togglePreference(e){if(typeof this.settings[e]!="boolean")throw new Error(`Preference ${e} is not a boolean`);this.setPreference(e,!this.getPreference(e))}};yi.EventTypes={"event:game.preference.change":"event:game.preference.change"};var vi=yi;import"client-only";import Yl,{useEffect as md}from"react";import"client-only";import Ka,{useContext as $a,useState as pu}from"react";var Dr=Ka.createContext(null);function ja({children:o,game:e}){"use client";let t=new q({}),[n]=pu(e||t);return Ka.createElement(Dr,{value:n},o)}function G(){let o=$a(Dr);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function qa(){return $a(Dr)}import du,{createContext as mu,useContext as _a}from"react";var Ya="/",bo=class bo{constructor(e,t=bo.rootPath){this.events=new J;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,l]=s.split("=");a&&(i[decodeURIComponent(a)]=l?decodeURIComponent(l):"")}}return{path:t||"/",query:i}}buildUrl(e,t){if(Object.keys(t).length===0)return e;let n=Object.entries(t).map(([i,r])=>`${encodeURIComponent(i)}=${encodeURIComponent(r)}`).join("&");return`${e}?${n}`}getQueryParam(e){return this.currentQuery[e]}setQueryParam(e,t){return this.currentQuery[e]=t,this.updateHistory(),this.emitOnChange(),this}setQueryParams(e){return Object.assign(this.currentQuery,e),this.updateHistory(),this.emitOnChange(),this}removeQueryParam(e){return delete this.currentQuery[e],this.updateHistory(),this.emitOnChange(),this}clearQueryParams(){return this.currentQuery={},this.updateHistory(),this.emitOnChange(),this}hasQueryParam(e){return e in this.currentQuery}getQueryParamKeys(){return Object.keys(this.currentQuery)}getQueryParamCount(){return Object.keys(this.currentQuery).length}getHistory(){return[...this.history]}getHistoryIndex(){return this.historyIndex}canGoBack(){return this.historyIndex>0}canGoForward(){return this.historyIndex<this.history.length-1}navigate(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};if(this.currentPath===r)return this.currentQuery=s,this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(r,s)),this.emitOnChange(),this;this.historyIndex<this.history.length-1&&(this.history.length=this.historyIndex+1);let a=this.buildUrl(r,s);return this.history.push(a),this.history.length>this.game.config.maxRouterHistory&&(this.history.shift(),this.historyIndex--),this.historyIndex++,this.currentPath=r,this.currentQuery=s,this.emitOnChange(),this.requestPageTransition(),this}back(){if(this.canGoBack()){this.historyIndex--;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}forward(){if(this.canGoForward()){this.historyIndex++;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}replace(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};return this.currentPath=r,this.currentQuery=s,this.historyIndex>=0?this.history[this.historyIndex]=this.buildUrl(r,s):(this.history.push(this.buildUrl(r,s)),this.historyIndex=0),this.emitOnChange(),this}clear(){return this.currentPath="",this.currentQuery={},this.history=[],this.historyIndex=-1,this.emitOnChange(),this.requestPageTransition(),this}cleanHistory(){return this.history=this.currentPath?[this.buildUrl(this.currentPath,this.currentQuery)]:[],this.historyIndex=this.currentPath?0:-1,this}parsePath(e){return e.split("/").filter(t=>t.length>0)}buildPath(e){return"/"+e.join("/")}getParentPath(e){let t=this.parsePath(e);return t.length<=1?"":this.buildPath(t.slice(0,-1))}matchPath(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length<i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}exactMatch(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length!==i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}extractParams(e,t){let n={},i=this.parsePath(e),r=this.parsePath(t);if(i.length!==r.length)return n;for(let s=0;s<r.length;s++){let a=r[s];if(a.startsWith(":")){let l=a.slice(1);n[l]=i[s]}}return n}onExitComplete(e){return this.events.on("event:router.onExitComplete",e)}onceExitComplete(e){return this.events.once("event:router.onExitComplete",e)}onPageMount(e){return this.events.on("event:router.onPageMount",e)}oncePageMount(e){return this.events.once("event:router.onPageMount",e)}onUpdate(e){return this.updateSyncHooks.add(e),{cancel:()=>{this.updateSyncHooks.delete(e)}}}emitUpdateSync(){this.updateSyncHooks.forEach(e=>e())}mount(e){if(this.mountedPaths.has(e))throw new E(`Path ${e} is already mounted. This may be caused by multiple capture segments in the same path.`);return this.mountedPaths.add(e),{cancel:()=>{this.unmount(e)}}}unmount(e){this.mountedPaths.delete(e)}mountDefaultHandler(e){if(this.defaultHandlerPaths.has(e))throw new E(`Default handler path ${e} is already mounted.`);return this.defaultHandlerPaths.add(e),{cancel:()=>{this.unmountDefaultHandler(e)}}}unmountDefaultHandler(e){this.defaultHandlerPaths.delete(e)}emitOnPageMount(){this.events.emit("event:router.onPageMount")}onRootExitComplete(e){return this.events.on("event:router.onExitComplete",e)}isActive(){return this.currentPath!==""}onChange(e){return this.events.on("event:router.onChange",e)}emitOnChange(){this.events.emit("event:router.onChange")}resolvePath(e){let t=e.split("?")[0];if(t.startsWith("/"))return t;if(t==="")return this.currentPath;let n=this.parsePath(this.currentPath),i=t.split("/"),r=[];r.push(...n);for(let s=0;s<i.length;s++){let a=i[s];a===""||a==="."||(a===".."?r.length>0&&r.pop():r.push(a))}return this.buildPath(r)}normalizePath(e){let t=e.replace(/\/\/+/g,"/").replace(/\/$/,"");return t===""?"/":(t.startsWith("/"),t)}joinPath(e,...t){let n=this.normalizePath(e),s=[n.startsWith("/")?n:"/"+n,...t.filter(a=>a.length>0)].join("/");return this.normalizePath(s)}updateHistory(){this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(this.currentPath,this.currentQuery))}requestPageTransition(){let e=()=>{this.transitioning=!0,this.emitUpdateSync(),this.emitOnChange()},t=()=>{this.events.emit("event:router.onTransitionEnd"),this.transitioning=!1,this.emitUpdateSync(),this.emitOnChange(),this.events.emit("event:router.onExitComplete")};if(e(),this.isPathsUnmounting()){let n=this.events.on("event:router.onPathUnmount",()=>{this.isPathsUnmounting()||(n.cancel(),st(()=>{t()}))})}else st(()=>{t()})}registerUnmountingPath(e){this.unmountingPaths.add(e)}isPathsUnmounting(){return this.unmountingPaths.size>0}unregisterUnmountingPath(e){this.unmountingPaths.delete(e),this.events.emit("event:router.onPathUnmount")}isTransitioning(){return this.transitioning}createToken(e){return Symbol(e)}};bo.rootPath=Ya;var gn=bo,Lr=mu(null);function Xa({children:o}){let e=G();return du.createElement(Lr,{value:{router:e.router}},o)}function Wt(){if(!_a(Lr))throw new Error("useRouter must be used within a RouterProvider");return _a(Lr).router}import Ja from"react";import Tu from"clsx";import fu,{createContext as hu,useContext as gu,useLayoutEffect as yu,useReducer as vu,useState as Su}from"react";var nn=class nn{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new J().setMaxListeners(1/0);this.lockers=[];this.updater=null}update(e,t,n){this.state.width=e,this.state.height=t,this.state.scale=n,this.events.emit(nn.EventTypes["event:aspectRatio.update"],e,t)}updateMin(e,t){this.state.minWidth=e,this.state.minHeight=t}lock(){let e=Symbol();return this.lockers.push(e),e}unlock(e){if(e&&!this.lockers.includes(e))throw new Error("Locker not found");return this.lockers=this.lockers.filter(t=>t!==e),this.triggerUpdate(),null}isLocked(){return!!this.lockers.length}getStyle(){return{width:`${this.state.width}px`,height:`${this.state.height}px`}}setUpdate(e){this.updater=e}pause(){this.state.paused=!0,this.events.emit(nn.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(nn.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(nn.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(nn.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(nn.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};nn.EventTypes={"event:aspectRatio.update":"event:aspectRatio.update","event:aspectRatio.pause":"event:aspectRatio.pause","event:aspectRatio.resume":"event:aspectRatio.resume","event:aspectRatio.requestUpdate":"event:aspectRatio.requestUpdate"};var Rr=nn,Ir=hu(null);function Qa({children:o}){"use client";let[e]=Su(()=>new Rr);return fu.createElement(Ir,{value:{ratio:e}},o)}function ye(){let o=gu(Ir),[,e]=vu(n=>n+1,0);if(!Ir||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return yu(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function Bt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=ye(),s=r.getStyle();return Ja.createElement("div",{className:Tu("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},Ja.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import bu,{useEffect as Au}from"react";function yn(o){let e=G(),[t,n]=bu.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return Au(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Mr from"react";import Ao from"react";import Za from"clsx";function Co({children:o,className:e,style:t,...n}){let{ratio:i}=ye(),r=G();return Ao.createElement(Bt,{className:Za("absolute pointer-events-none w-full h-full"),style:{transform:`scale(${i.state.scale})`,transformOrigin:"left top",width:r.config.width,height:r.config.height,pointerEvents:"none"},"data-element-type":"full",...n},Ao.createElement("div",{className:"absolute inset-0 w-full h-full"},Ao.createElement("div",{className:"inset-0 w-full h-full"},Ao.createElement("div",{className:Za("pointer-events-auto-rest",e),style:t},o))))}function Cu({children:o,className:e,style:t}){return Mr.createElement(Mr.Fragment,null,Mr.createElement(Co,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import el from"clsx";import tl from"react";function xo({className:o,children:e,...t}){let{ratio:n}=ye();return tl.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:el("w-full h-full")},tl.createElement("div",{className:el("z-20",o),...t},e))}import At,{useState as nl}from"react";import{motion as xu}from"motion/react";function wo({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let l=G(),[c,u]=nl(!1);if(!l.config.app.inspector)return At.createElement(r,{...a,ref:s},o);let d={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:c?1e3:"auto"}};return At.createElement(r,{...d,ref:s},n&&c&&At.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function wu({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=G(),[a,l]=nl(!1);if(!s.config.app.inspector)return At.createElement(i,{...r});let c={...r,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),style:{...r.style||{},outline:`${o} ${n}px ${e}`,zIndex:a?1e3:"auto"}};return At.createElement("div",null,At.createElement(i,{...c}),t&&a&&At.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function ku(o){return At.createElement(wo,{...o,as:"div"})}function Pu(o){return At.createElement(wo,{...o,as:"span"})}function Eu(o){return At.createElement(wu,{...o,as:"img"})}function Du(o){return At.createElement(wo,{...o,as:"button"})}function Lu(o){return At.createElement(wo,{...o,as:xu.div,ref:o.ref,layout:o.layout})}var Ru={Div:ku,Span:Pu,Button:Du,Img:Eu,mDiv:Lu},zt=Ru;import Ro from"clsx";import He,{useEffect as Dn,useMemo as Ju,useRef as xl,useState as qr}from"react";import{useEffect as Iu,useState as Mu}from"react";function ae(o){let[e,t]=Mu(0);Iu(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import il from"react";var Pn=il.createContext(null);function Rt(){let o=il.useContext(Pn);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}function Nr({active:o,forced:e}){return o?e?"forceSkip":"requestComplete":"ignore"}function ol(o,e){let t=Nr(e);return t==="forceSkip"?(o.setIdle(!0),o.forceSkip()):t==="requestComplete"&&o.requestComplete(),t}import ko,{useCallback as Nu,useLayoutEffect as Si,useMemo as rl,useRef as sl}from"react";import{useIsPresent as Gu}from"motion/react";var It=class It{constructor(e){this.events=new J;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.voiceWaitDisposer=null;this.config=e,this._state="pending",this.autoForwardScheduler=new Bi,this._count=0}get state(){return this._state}get deps(){return[this._count]}isIdle(){return this._idle}setIdle(e){this._idle=e}isActive(){return this._active}setActive(e){return this._active=e,e?this.state==="ended"&&(this._idle=!0):this.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(It.Events.complete):this.safeEmit(It.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(It.Events.forceSkip)))}dispatchComplete(){if(this.state==="ended"){this.config.gameState.logger.weakWarn("DialogState","Dialog is already ended. Cannot dispatch complete.");return}if(!this.events.hasListeners(It.Events.complete)){this.config.gameState.logger.weakWarn("DialogState","No listener for complete event. Cannot dispatch complete.");return}let e=this.config.gameState.game.preference;return this._state="ended",this.config.gameState.completeAdvDialogTyping(this.config.action.id),e.getPreference(q.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(It.Events.complete),this.emitFlush(),this}isEnded(){return this.state==="ended"}setPause(e){this.isEnded()||(e?this._state="paused":this._state="pending")}isForceSkipped(){return this._forceSkipped}tryScheduleAutoForward(){this.isEnded()&&this.scheduleAutoForward()}cancelAutoForward(){this.releaseVoiceWait(),this.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(It.Events.onFlush),this}onFlush(e){return this.events.on(It.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;if(!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended")return;this.releaseVoiceWait();let t=this.getPlayingVoiceToken();if(!t){this.scheduleAutoForwardDelay();return}let n=()=>{this.releaseVoiceWait(),this.scheduleAutoForwardDelay()};t.once("ended",n),t.once("stop",n),this.voiceWaitDisposer=()=>{t.off("ended",n),t.off("stop",n)}}scheduleAutoForwardDelay(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(It.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(q.Preferences.gameSpeed))}getPlayingVoiceToken(){let e=this.config.action.sentence;if(!e)return null;try{let t=it.getVoice(this.config.gameState,e);if(!t)return null;let n=this.config.gameState.audioManager.getToken(t);return n&&n.isPlaying()?n:null}catch{return null}}releaseVoiceWait(){let e=this.voiceWaitDisposer;this.voiceWaitDisposer=null,e?.()}};It.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ne=It;function Ti({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=Gu(),s=i&&r,a=sl(!1),l=sl(o),c=l.current!==o,u=rl(()=>o.sentence?.evaluate(ke.getCtx({gameState:n})),[o.sentence,n]),d=rl(()=>new Ne({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:c}),[o,n]),p=n.game.config.dialog,h=Nu(g=>{!s||a.current||(a.current=!0,e?.(g))},[s,e]);return Si(()=>{a.current=!1},[d]),Si(()=>{l.current=o},[o]),Si(()=>(d.setActive(s),()=>{d.setActive(!1)}),[d,s]),Si(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",d),d.events.on(Ne.Events.complete,g=>{n.logger.log("NarraLeaf-React: Say","Complete",d.isIdle()),s&&(d.isIdle()||g?h(!1):d.setIdle(!0))}).cancel),[d,h,n,s]),Si(()=>{let g=T=>{ol(d,{active:s,forced:T===!0})},m=n.events.on(L.EventTypes["event:state.player.skip"],g),y=n.events.on(L.EventTypes["event:state.player.stageClick"],()=>g(!1));return()=>{m.cancel(),y.cancel()}},[d,n,s]),ko.createElement(ko.Fragment,null,ko.createElement(Pn,{value:d},ko.createElement(p,null)))}import{useCallback as Hu,useEffect as Po,useState as Vu}from"react";function al(o,e,{dialogId:t,active:n,forced:i}){let r=Nr({active:n,forced:i});return r==="ignore"?"ignore":o.requestNvlAdvance(t)!=="typing"?"pageHandled":r==="forceSkip"?(e.forceSkip(),"forceSkip"):(e.requestComplete(),"requestComplete")}import{useEffect as Fu,useState as Ou}from"react";function En(o){let e=G(),[t,n]=Ou(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return Fu(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var jn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(jn||{});function Eo({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=G(),[s]=En("nextAction"),[a]=Vu(()=>{let c=o.firedTextEvents??(o.firedTextEvents=new Set);return new Ne({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:c})}),l=Hu(c=>{al(e,a,{dialogId:o.id,active:n,forced:c})},[a,o.id,e,n]);return Po(()=>{if(!n)return;let c=e.events.on(L.EventTypes["event:state.player.stageClick"],()=>l(!1)),u=e.events.on(L.EventTypes["event:state.player.skip"],d=>l(d===!0));return()=>{c.cancel(),u.cancel()}},[l,e,n]),Po(()=>{if(!n)return;let c=d=>{d.repeat||r.keyMap.match("nextAction",d.key)&&l(!1)};if(r.config.useWindowListener){let d=r.getLiveGame().onWindowEvent("keydown",c);return()=>{d.cancel()}}let u=r.getLiveGame().onPlayerEvent("keydown",c);return()=>{u.cancel()}},[l,r,n,s]),Po(()=>{let c=a.events.on(Ne.Events.complete,u=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!u&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Po(()=>{let c=a.events.on(Ne.Events.simulateClick,()=>l(!1));return()=>{c.cancel()}},[l,a]),a}function Uu(o,e){let{expression:t,sound:n}=o.config;if(t){let{image:i,appearance:r}=t;i._setAppearanceSync(r),e.stage.update();let s=e.getExposedState(i);s&&(F.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function Do(o,e,t){e.has(o)||(e.add(o),Uu(o,t))}function ll(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),Do(r,e,t)}return n}var qn=new Map,Gr=new Set;function Wu(o,e){return qn.set(o,e),Gr.delete(o),()=>{qn.get(o)===e&&qn.delete(o)}}function Bu(o){qn.delete(o)}function zu(o){return qn.get(o)??null}function Fr(o){if(!o)return null;if(typeof o!="string")return o;let e=qn.get(o);return e||(Gr.has(o)||(Gr.add(o),console.warn(`NarraLeaf-React: no word renderer is registered as "${o}"; the word is rendered as plain text. Call registerWordRenderer before the line plays.`)),null)}import{useCallback as Ku,useLayoutEffect as cl,useRef as Or,useState as $u}from"react";var ul=.5,ju=.005,qu=12,pl=.05,ml=12,Lo="--nl-text-scale",fl=`var(${Lo}, 1)`;function bi(o){return o==null||o===""?void 0:`calc(${typeof o=="number"?`${o}px`:String(o)} * ${fl})`}function hl(){return`calc(1em * ${fl})`}function dl(o,e){let t=getComputedStyle(o);return e?o.clientWidth-parseFloat(t.paddingLeft||"0")-parseFloat(t.paddingRight||"0"):o.clientHeight-parseFloat(t.paddingTop||"0")-parseFloat(t.paddingBottom||"0")}function gl({enabled:o,minFontSize:e,vertical:t,revealed:n}){let i=Or(null),[r,s]=$u(1),a=Or(1),l=Or(0);a.current=r;let c=Ku(u=>{let d=i.current,p=d?.parentElement;if(!d||!p)return;let h=dl(p,t);if(!Number.isFinite(h)||h<=0)return;l.current=h;let g=()=>t?d.offsetWidth:d.offsetHeight,m=A=>{d.style.setProperty(Lo,String(A))},y=A=>(m(A),g()<=h+ul);if(y(u)){u!==a.current&&s(u);return}m(1);let T=parseFloat(getComputedStyle(d).fontSize)||0,f=T>0?Math.min(1,Math.max(pl,e/T)):pl,v;if(f>=u||!y(f))v=f;else{let A=f,w=u;for(let k=0;k<qu&&w-A>ju;k++){let b=(A+w)/2;y(b)?A=b:w=b}v=A}m(v),s(v)},[e,t]);return cl(()=>{if(!o){a.current!==1&&s(1);return}c(a.current)},[o,c,n]),cl(()=>{let u=i.current?.parentElement;if(!o||!u||typeof ResizeObserver>"u")return;let d=new ResizeObserver(()=>{Math.abs(dl(u,t)-l.current)>ul&&c(1)});d.observe(u);let p=!1;return document.fonts?.ready.then(()=>{p||c(a.current)}),()=>{p=!0,d.disconnect()}},[o,c,t]),{containerRef:i,scale:r}}function yl(o,e){return o.fontSize!==void 0?bi(o.fontSize):o.fontScale!==void 0?Sl(o.fontScale):bi(e)}function vl(o,e){return o.fontSize!==void 0?o.fontSize:o.fontScale!==void 0?Sl(o.fontScale):e}function Sl(o){return`${o}em`}function Hr(o){return o?{textEmphasis:`${o.fill??"filled"} ${o.mark??"dot"}`,textEmphasisPosition:`${o.position??"over"} right`}:{}}var Vr="--nl-reveal-duration",bl="__narraleaf_text_reveal",Tl={duration:0,inFlight:0};function Ur(o,e,t){if(typeof o!="number"||!Number.isFinite(o)||o<=0)return Tl;let n=1e3/(Math.max(.01,e)*Math.max(.01,t)),i=Math.min(o,8*n);return i<=0?Tl:{duration:i,inFlight:Math.ceil(i/n)+1}}function Wr(o,e,t,n,i=0){if(o.inFlight<=0||t<=0)return 0;let r=n-o.inFlight,s=Math.min(t,e+t-r);return Math.max(0,Math.min(s,t-Math.max(0,i)))}import _n from"react";var _u=2;function Ai(o){return o==="vertical-rl"||o==="vertical-lr"}function Yu(o){return o===!1?0:typeof o=="number"?Number.isFinite(o)?Math.max(0,Math.round(o)):0:_u}function Kr(o,e){return Ai(o)?{writingMode:o,textOrientation:e??"mixed"}:o?{writingMode:o}:{}}var Br=/[0-9A-Za-z]+(?:[.:\-/][0-9A-Za-z]+)*/g;function Xu(o,e){if(e<=0)return[{text:o,combineUpright:!1}];let t=[],n=0;Br.lastIndex=0;for(let i=Br.exec(o);i;i=Br.exec(o))i[0].length>e||(i.index>n&&t.push({text:o.slice(n,i.index),combineUpright:!1}),t.push({text:i[0],combineUpright:!0}),n=i.index+i[0].length);return(n<o.length||t.length===0)&&t.push({text:o.slice(n),combineUpright:!1}),t}function $r(){return{wordBreak:"normal",lineBreak:"strict",overflowWrap:"break-word"}}function zr(o,e,t){let n=e?Yu(t):0;return n<=0?[{text:o,combineUpright:!1}]:Xu(o,n)}function Al(o,e){return o.some(t=>t.combineUpright)?o.map((t,n)=>t.combineUpright?_n.createElement("span",{key:`${e}${n}`,style:{textCombineUpright:"all"}},t.text):_n.createElement(_n.Fragment,{key:`${e}${n}`},t.text)):o.map(t=>t.text).join("")}function Qu(o){let e=[];for(let t of o){if(t.combineUpright){e.push(t);continue}for(let n of t.text)e.push({text:n,combineUpright:!1})}return e}function jr(o,e,t,n=0){if(n<=0)return e?Al(zr(o,e,t),""):o;let i=Qu(zr(o,e,t)),r=i.length,s=n;for(;r>0&&s>0;)r--,s-=i[r].text.length;let a=[];if(r>0){let l=i.slice(0,r).map(c=>c.text).join("");a.push(_n.createElement(_n.Fragment,{key:"s"},Al(zr(l,e,t),"s")))}for(let l=r;l<i.length;l++){let c=i[l];a.push(_n.createElement("span",{key:`r${l}`,className:bl,style:c.combineUpright?{textCombineUpright:"all"}:void 0},c.text))}return a}function*Yr(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Ke.isPause(n.text)){yield Ke.from(n.text);continue}if(lt.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
48
+ actual: ${i}`)}dispose(){this.events.clear(),this.gameState?.dispose()}notify(e,t=3e3){this.assertGameState();let n=this.gameState.idManager.generateId(),i=this.gameState.notificationMgr.consume({id:n,message:e,duration:t}),r=S.toPromiseForce(i);return{cancel:()=>{i.abort()},promise:r}}playSound(e){this.assertGameState();let t=e instanceof URL?e.toString():e,n=typeof t=="string"?new ge({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(R.EventTypes["event:state.player.skip"],!0)}async fastForward(e={}){this.assertGameState();let t=this.gameState,n=e.until??"menu",i=typeof n=="object"?n.actionId:null,r=n==="menu"||i!==null,s=e.maxSteps??t.game.config.maxStackModelLoop,a=e.stepTimeout??Me.FastForwardStepTimeout,l=i!==null?{reachedTarget:!1}:{},c=t.audioManager.getGlobalVolume();t.audioManager.setGlobalVolume(0),t.setFastForwarding(!0);try{let u=0;for(;u++<s;){if(i!==null&&this.stackModel.peekExecutingActionId()===i)return{reason:"action",reachedTarget:!0};if(r&&t.hasActiveMenu())return{reason:"menu",...l};if(this.stackModel.isEmpty())return{reason:"end",...l};let p=this.stackModel.getWaitingAwaitable();if(p){if(!await Me.settleSuspendedStep(t,p,a))return{reason:"stalled",...l}}else t.stage.next(),await Promise.resolve()}return{reason:"maxSteps",...l}}finally{t.setFastForwarding(!1),t.audioManager.setGlobalVolume(c)}}static settleSuspendedStep(e,t,n){return new Promise(i=>{let r=!1,s=null,a,l=p=>{r||(r=!0,s!==null&&(clearTimeout(s),s=null),a?.cancel?.(),i(p))};if(a=t.onSettled(()=>l(!0)),r){a?.cancel?.();return}let c=Date.now()+n,u=()=>{if(!r&&(e.events.emit(R.EventTypes["event:state.player.skip"],!0),!r)){if(Date.now()>=c){l(!1);return}s=setTimeout(u,Me.FastForwardSkipInterval)}};u()})}assertScreenshot(){this.assertGameState(),this.assertPlayerElement()}capturePng(){return this.assertScreenshot(),this.gameState.htmlToImage.toPng(this.gameState.mainContentNode,this.getScreenshotOptions())}captureJpeg(){return this.assertScreenshot(),this.gameState.htmlToImage.toJpeg(this.gameState.mainContentNode,this.getScreenshotOptions())}captureSvg(){return this.assertScreenshot(),this.gameState.htmlToImage.toSvg(this.gameState.mainContentNode,this.getScreenshotOptions())}capturePngBlob(){return this.assertScreenshot(),this.assertGameState(),this.assertPlayerElement(),this.gameState.htmlToImage.toBlob(this.gameState.mainContentNode,this.getScreenshotOptions())}onCharacterPrompt(e){return this.events.on(Me.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Me.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(Me.EventTypes["event:action.current"],e)}getCurrentActionId(){return this._currentActionId}getStackSnapshot(){return this.stackModel?{root:this.stackModel.snapshot(),async:Array.from(this.asyncStackModels).map(e=>e.snapshot())}:{root:{frames:[]},async:[]}}newGame(){this.assertGameState();let e=this.gameState,t=e.logger.group("LiveGame (newGame)",!0);this.reset(),this.initNamespaces();let n=this.getNewSavedGame();n.name="NewGame-"+Date.now(),this.currentSavedGame=n;let i=this.story?.entryScene?.getSceneRoot();i?this.stackModel.push(Xe.fromAction(i)):e.logger.warn("No scene root found");let r=this.story?.getAllElementMap(this.story,this.story?.entryScene?.getSceneRoot()||[]);return r?r.forEach(s=>{e.logger.debug("reset element",s),s.reset()}):e.logger.warn("No elements found"),e.stage.forceUpdate(),e.stage.next(),t.end(),this}waitForRouterExit(){let e=null;return{promise:new Promise(t=>{e=this.game.router.onceExitComplete(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}waitForPageMount(){let e=null;return{promise:new Promise(t=>{e=this.game.router.oncePageMount(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}requestFullScreen(e){this.assertGameState();let t="LiveGame.requestFullScreen";try{let n=this.gameState.playerCurrent;if(!n){this.gameState.logger.warn(t,"No player element found");return}if(n.requestFullscreen)return n.requestFullscreen(e);this.gameState.logger.warn(t,"Fullscreen is not supported")}catch(n){this.gameState.logger.error(t,n)}}exitFullScreen(){this.assertGameState();let e="LiveGame.exitFullScreen";try{if(document.exitFullscreen)return document.exitFullscreen();this.gameState.logger.warn(e,"Fullscreen is not supported")}catch(t){this.gameState.logger.error(e,t)}}constructMaps(){let e=this.story;if(!e)throw new Error("No story loaded");if(this.mapCache)return this.mapCache;let t=new Map,n=new Map;return e.forEachChild(e,e.entryScene?.getSceneRoot()||[],i=>{t.set(i.getId(),i),n.set(i.callee.getId(),i.callee);for(let r of Ye.getOwnedSounds(i)){let s=r.getId();s&&n.set(s,r)}},{allowFutureScene:!0}),this.mapCache=[t,n],this.mapCache}getScreenshotOptions(){return{quality:this.game.config.screenshotQuality}}onPlayerEvent(e,t,n){this.assertPlayerElement();let i=this.gameState.playerCurrent;return i?(i.addEventListener(e,t,n),{cancel:()=>i.removeEventListener(e,t,n)}):(this.gameState.logger.warn("LiveGame.onEvent","No player element found"),{cancel:()=>{}})}onWindowEvent(e,t,n){return window.addEventListener(e,t,n),{cancel:()=>window.removeEventListener(e,t,n)}}reset(){this.assertGameState();let e=this.gameState;this.resetStackModels(),this.stackModel.reset(),this.currentSavedGame=null,this.lastDialog=null,e.forceReset()}next(){this.assertGameState();let e=this.gameState;if(this.gameLock.isLocked())return this.gameLock;if(!this.story)throw new Error("No story loaded");return this.stackModel.isEmpty()?(e.logger.weakWarn("Game Actions","Action stack is empty"),this.currentSavedGame?e.events.emit("event:state.end"):this.currentSavedGame=null,null):this.stackModel.rollNext()}setLastDialog(e,t){this.lastDialog={sentence:e,speaker:t}}requestAsyncStackModel(e){this.assertGameState();let t=new Xe(this);return this.asyncStackModels.add(t),t.push(...e),t}executeAsyncStackModel(e){this.assertGameState();let t=e.execute();return t.onFailed(n=>{this.gameState.logger.error("Async StackModel",n)}),t.onSettled(()=>{this.asyncStackModels.delete(e)}),t}createStackModel(e){let t=new Xe(this);return t.push(...e),t}resetStackModels(){this.asyncStackModels.forEach(e=>e.reset()),this.asyncStackModels.clear()}isPlaying(){return this.stackModel&&!this.stackModel.isEmpty()}executeAction(e,t,n){if(!this.stackModel)throw new Error("Stack model is not initialized");this._currentActionId=t.getId(),this.events.hasListeners(Me.EventTypes["event:action.current"])&&this.events.emit(Me.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type}),t.callee?.markDirty();let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new Ce("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Xe(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Ce("GameState not set");return this.gameState}getAllPredictableActions(e,t,n){let i=t?.contentNode||null,r=[],s=[],a=new Set;for(;(i||s.length)&&!(n&&r.length>=n);){if(i||(i=s.pop().contentNode),[Ht].some(l=>i?.action&&i.action instanceof l)){i=null;continue}if(i.action&&i.action.is(ne,W.jumpTo)){let[l]=i.action.contentNode.getContent(),c=e.getScene(l);if(!c)throw i.action._sceneNotFoundError(i.action.getSceneName(l));if(a.has(c)){i=null;continue}a.add(c),i=c.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(ae,se.do)){let[l]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=l[0]?.contentNode||null}i?.action&&r.push(i.action),i=i?.getChild()||null}return r}clearMainStack(){if(!this.stackModel)throw new Ce("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Ce("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:ma(),lastSentence:null,lastSpeaker:null,storyHash:this.story?.hash()||""},game:{store:{},stage:{scenes:[],audio:{sounds:[],groups:[]},videos:[]},elementStates:[],services:{},stackModel:{items:[]},asyncStackModels:[]}}}assertGameState(){if(!this.gameState)throw new E("No game state found, make sure you call this method in effect hooks or event handlers")}assertPlayerElement(){if(this.assertGameState(),!this.gameState.playerCurrent)throw new E("Player Element Not Mounted")}};Me.DefaultNamespaces={game:{}},Me.GameSpacesKey={game:"game"},Me.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},Me.ElementAuditInterval=50,Me.FastForwardStepTimeout=1e4,Me.FastForwardSkipInterval=16;var Bt=Me;var yi=class yi{constructor(e){this.events=new Q;this.settings={...e},this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(yi.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(yi.EventTypes["event:game.preference.change"],(n,i)=>{typeof e=="string"?e===n&&t&&t(i):e(n,i)})}importPreferences(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setPreference(t,e[t])}exportPreferences(){let e={};for(let t in this.settings)Object.prototype.hasOwnProperty.call(this.settings,t)&&(e[t]=this.settings[t]);return e}togglePreference(e){if(typeof this.settings[e]!="boolean")throw new Error(`Preference ${e} is not a boolean`);this.setPreference(e,!this.getPreference(e))}};yi.EventTypes={"event:game.preference.change":"event:game.preference.change"};var vi=yi;import"client-only";import nc,{useEffect as bd}from"react";import"client-only";import _a,{useContext as Ya,useState as yu}from"react";var Mr=_a.createContext(null);function Xa({children:o,game:e}){"use client";let t=new q({}),[n]=yu(e||t);return _a.createElement(Mr,{value:n},o)}function N(){let o=Ya(Mr);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function Qa(){return Ya(Mr)}import vu,{createContext as Su,useContext as Ja}from"react";var Za="/",To=class To{constructor(e,t=To.rootPath){this.events=new Q;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,l]=s.split("=");a&&(i[decodeURIComponent(a)]=l?decodeURIComponent(l):"")}}return{path:t||"/",query:i}}buildUrl(e,t){if(Object.keys(t).length===0)return e;let n=Object.entries(t).map(([i,r])=>`${encodeURIComponent(i)}=${encodeURIComponent(r)}`).join("&");return`${e}?${n}`}getQueryParam(e){return this.currentQuery[e]}setQueryParam(e,t){return this.currentQuery[e]=t,this.updateHistory(),this.emitOnChange(),this}setQueryParams(e){return Object.assign(this.currentQuery,e),this.updateHistory(),this.emitOnChange(),this}removeQueryParam(e){return delete this.currentQuery[e],this.updateHistory(),this.emitOnChange(),this}clearQueryParams(){return this.currentQuery={},this.updateHistory(),this.emitOnChange(),this}hasQueryParam(e){return e in this.currentQuery}getQueryParamKeys(){return Object.keys(this.currentQuery)}getQueryParamCount(){return Object.keys(this.currentQuery).length}getHistory(){return[...this.history]}getHistoryIndex(){return this.historyIndex}canGoBack(){return this.historyIndex>0}canGoForward(){return this.historyIndex<this.history.length-1}navigate(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};if(this.currentPath===r)return this.currentQuery=s,this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(r,s)),this.emitOnChange(),this;this.historyIndex<this.history.length-1&&(this.history.length=this.historyIndex+1);let a=this.buildUrl(r,s);return this.history.push(a),this.history.length>this.game.config.maxRouterHistory&&(this.history.shift(),this.historyIndex--),this.historyIndex++,this.currentPath=r,this.currentQuery=s,this.emitOnChange(),this.requestPageTransition(),this}back(){if(this.canGoBack()){this.historyIndex--;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}forward(){if(this.canGoForward()){this.historyIndex++;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}replace(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};return this.currentPath=r,this.currentQuery=s,this.historyIndex>=0?this.history[this.historyIndex]=this.buildUrl(r,s):(this.history.push(this.buildUrl(r,s)),this.historyIndex=0),this.emitOnChange(),this}clear(){return this.currentPath="",this.currentQuery={},this.history=[],this.historyIndex=-1,this.emitOnChange(),this.requestPageTransition(),this}cleanHistory(){return this.history=this.currentPath?[this.buildUrl(this.currentPath,this.currentQuery)]:[],this.historyIndex=this.currentPath?0:-1,this}parsePath(e){return e.split("/").filter(t=>t.length>0)}buildPath(e){return"/"+e.join("/")}getParentPath(e){let t=this.parsePath(e);return t.length<=1?"":this.buildPath(t.slice(0,-1))}matchPath(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length<i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}exactMatch(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length!==i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}extractParams(e,t){let n={},i=this.parsePath(e),r=this.parsePath(t);if(i.length!==r.length)return n;for(let s=0;s<r.length;s++){let a=r[s];if(a.startsWith(":")){let l=a.slice(1);n[l]=i[s]}}return n}onExitComplete(e){return this.events.on("event:router.onExitComplete",e)}onceExitComplete(e){return this.events.once("event:router.onExitComplete",e)}onPageMount(e){return this.events.on("event:router.onPageMount",e)}oncePageMount(e){return this.events.once("event:router.onPageMount",e)}onUpdate(e){return this.updateSyncHooks.add(e),{cancel:()=>{this.updateSyncHooks.delete(e)}}}emitUpdateSync(){this.updateSyncHooks.forEach(e=>e())}mount(e){if(this.mountedPaths.has(e))throw new E(`Path ${e} is already mounted. This may be caused by multiple capture segments in the same path.`);return this.mountedPaths.add(e),{cancel:()=>{this.unmount(e)}}}unmount(e){this.mountedPaths.delete(e)}mountDefaultHandler(e){if(this.defaultHandlerPaths.has(e))throw new E(`Default handler path ${e} is already mounted.`);return this.defaultHandlerPaths.add(e),{cancel:()=>{this.unmountDefaultHandler(e)}}}unmountDefaultHandler(e){this.defaultHandlerPaths.delete(e)}emitOnPageMount(){this.events.emit("event:router.onPageMount")}onRootExitComplete(e){return this.events.on("event:router.onExitComplete",e)}isActive(){return this.currentPath!==""}onChange(e){return this.events.on("event:router.onChange",e)}emitOnChange(){this.events.emit("event:router.onChange")}resolvePath(e){let t=e.split("?")[0];if(t.startsWith("/"))return t;if(t==="")return this.currentPath;let n=this.parsePath(this.currentPath),i=t.split("/"),r=[];r.push(...n);for(let s=0;s<i.length;s++){let a=i[s];a===""||a==="."||(a===".."?r.length>0&&r.pop():r.push(a))}return this.buildPath(r)}normalizePath(e){let t=e.replace(/\/\/+/g,"/").replace(/\/$/,"");return t===""?"/":(t.startsWith("/"),t)}joinPath(e,...t){let n=this.normalizePath(e),s=[n.startsWith("/")?n:"/"+n,...t.filter(a=>a.length>0)].join("/");return this.normalizePath(s)}updateHistory(){this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(this.currentPath,this.currentQuery))}requestPageTransition(){let e=()=>{this.transitioning=!0,this.emitUpdateSync(),this.emitOnChange()},t=()=>{this.events.emit("event:router.onTransitionEnd"),this.transitioning=!1,this.emitUpdateSync(),this.emitOnChange(),this.events.emit("event:router.onExitComplete")};if(e(),this.isPathsUnmounting()){let n=this.events.on("event:router.onPathUnmount",()=>{this.isPathsUnmounting()||(n.cancel(),st(()=>{t()}))})}else st(()=>{t()})}registerUnmountingPath(e){this.unmountingPaths.add(e)}isPathsUnmounting(){return this.unmountingPaths.size>0}unregisterUnmountingPath(e){this.unmountingPaths.delete(e),this.events.emit("event:router.onPathUnmount")}isTransitioning(){return this.transitioning}createToken(e){return Symbol(e)}};To.rootPath=Za;var gn=To,Nr=Su(null);function el({children:o}){let e=N();return vu.createElement(Nr,{value:{router:e.router}},o)}function Wt(){if(!Ja(Nr))throw new Error("useRouter must be used within a RouterProvider");return Ja(Nr).router}import nl from"react";import ku from"clsx";import bu,{createContext as Tu,useContext as Au,useLayoutEffect as Cu,useReducer as xu,useState as wu}from"react";var rn=class rn{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new Q().setMaxListeners(1/0);this.lockers=[];this.updater=null}update(e,t,n){this.state.width=e,this.state.height=t,this.state.scale=n,this.events.emit(rn.EventTypes["event:aspectRatio.update"],e,t)}updateMin(e,t){this.state.minWidth=e,this.state.minHeight=t}lock(){let e=Symbol();return this.lockers.push(e),e}unlock(e){if(e&&!this.lockers.includes(e))throw new Error("Locker not found");return this.lockers=this.lockers.filter(t=>t!==e),this.triggerUpdate(),null}isLocked(){return!!this.lockers.length}getStyle(){return{width:`${this.state.width}px`,height:`${this.state.height}px`}}setUpdate(e){this.updater=e}pause(){this.state.paused=!0,this.events.emit(rn.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(rn.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(rn.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(rn.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(rn.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};rn.EventTypes={"event:aspectRatio.update":"event:aspectRatio.update","event:aspectRatio.pause":"event:aspectRatio.pause","event:aspectRatio.resume":"event:aspectRatio.resume","event:aspectRatio.requestUpdate":"event:aspectRatio.requestUpdate"};var Gr=rn,Fr=Tu(null);function tl({children:o}){"use client";let[e]=wu(()=>new Gr);return bu.createElement(Fr,{value:{ratio:e}},o)}function ye(){let o=Au(Fr),[,e]=xu(n=>n+1,0);if(!Fr||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return Cu(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function zt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=ye(),s=r.getStyle();return nl.createElement("div",{className:ku("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},nl.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import Pu,{useEffect as Eu}from"react";function yn(o){let e=N(),[t,n]=Pu.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return Eu(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Or from"react";import Ao from"react";import il from"clsx";function Co({children:o,className:e,style:t,...n}){let{ratio:i}=ye(),r=N();return Ao.createElement(zt,{className:il("absolute pointer-events-none w-full h-full"),style:{transform:`scale(${i.state.scale})`,transformOrigin:"left top",width:r.config.width,height:r.config.height,pointerEvents:"none"},"data-element-type":"full",...n},Ao.createElement("div",{className:"absolute inset-0 w-full h-full"},Ao.createElement("div",{className:"inset-0 w-full h-full"},Ao.createElement("div",{className:il("pointer-events-auto-rest",e),style:t},o))))}function Du({children:o,className:e,style:t}){return Or.createElement(Or.Fragment,null,Or.createElement(Co,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import ol from"clsx";import rl from"react";function xo({className:o,children:e,...t}){let{ratio:n}=ye();return rl.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:ol("w-full h-full")},rl.createElement("div",{className:ol("z-20",o),...t},e))}import Tt,{useState as sl}from"react";import{motion as Lu}from"motion/react";function wo({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let l=N(),[c,u]=sl(!1);if(!l.config.app.inspector)return Tt.createElement(r,{...a,ref:s},o);let p={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:c?1e3:"auto"}};return Tt.createElement(r,{...p,ref:s},n&&c&&Tt.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function Ru({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=N(),[a,l]=sl(!1);if(!s.config.app.inspector)return Tt.createElement(i,{...r});let c={...r,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),style:{...r.style||{},outline:`${o} ${n}px ${e}`,zIndex:a?1e3:"auto"}};return Tt.createElement("div",null,Tt.createElement(i,{...c}),t&&a&&Tt.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function Iu(o){return Tt.createElement(wo,{...o,as:"div"})}function Mu(o){return Tt.createElement(wo,{...o,as:"span"})}function Nu(o){return Tt.createElement(Ru,{...o,as:"img"})}function Gu(o){return Tt.createElement(wo,{...o,as:"button"})}function Fu(o){return Tt.createElement(wo,{...o,as:Lu.div,ref:o.ref,layout:o.layout})}var Ou={Div:Iu,Span:Mu,Button:Gu,Img:Nu,mDiv:Fu},Kt=Ou;import Ro from"clsx";import Ve,{useEffect as Dn,useMemo as op,useRef as El,useState as Qr}from"react";import{useEffect as Hu,useState as Vu}from"react";function ce(o){let[e,t]=Vu(0);Hu(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import al from"react";var Pn=al.createContext(null);function It(){let o=al.useContext(Pn);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}function Hr({active:o,forced:e}){return o?e?"forceSkip":"requestComplete":"ignore"}function ll(o,e){let t=Hr(e);return t==="forceSkip"?(o.setIdle(!0),o.forceSkip()):t==="requestComplete"&&o.requestComplete(),t}import ko,{useCallback as Uu,useLayoutEffect as Si,useMemo as cl,useRef as ul}from"react";import{useIsPresent as Bu}from"motion/react";var Mt=class Mt{constructor(e){this.events=new Q;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.voiceWaitDisposer=null;this.config=e,this._state="pending",this.autoForwardScheduler=new Wi,this._count=0}get state(){return this._state}get deps(){return[this._count]}isIdle(){return this._idle}setIdle(e){this._idle=e}isActive(){return this._active}setActive(e){return this._active=e,e?this.state==="ended"&&(this._idle=!0):this.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(Mt.Events.complete):this.safeEmit(Mt.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(Mt.Events.forceSkip)))}dispatchComplete(){if(this.state==="ended"){this.config.gameState.logger.weakWarn("DialogState","Dialog is already ended. Cannot dispatch complete.");return}if(!this.events.hasListeners(Mt.Events.complete)){this.config.gameState.logger.weakWarn("DialogState","No listener for complete event. Cannot dispatch complete.");return}let e=this.config.gameState.game.preference;return this._state="ended",this.config.gameState.completeAdvDialogTyping(this.config.action.id),e.getPreference(q.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(Mt.Events.complete),this.emitFlush(),this}isEnded(){return this.state==="ended"}setPause(e){this.isEnded()||(e?this._state="paused":this._state="pending")}isForceSkipped(){return this._forceSkipped}tryScheduleAutoForward(){this.isEnded()&&this.scheduleAutoForward()}cancelAutoForward(){this.releaseVoiceWait(),this.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(Mt.Events.onFlush),this}onFlush(e){return this.events.on(Mt.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;if(!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended")return;this.releaseVoiceWait();let t=this.getPlayingVoiceToken();if(!t){this.scheduleAutoForwardDelay();return}let n=()=>{this.releaseVoiceWait(),this.scheduleAutoForwardDelay()};t.once("ended",n),t.once("stop",n),this.voiceWaitDisposer=()=>{t.off("ended",n),t.off("stop",n)}}scheduleAutoForwardDelay(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(Mt.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(q.Preferences.gameSpeed))}getPlayingVoiceToken(){let e=this.config.action.sentence;if(!e)return null;try{let t=it.getVoice(this.config.gameState,e);if(!t)return null;let n=this.config.gameState.audioManager.getToken(t);return n&&n.isPlaying()?n:null}catch{return null}}releaseVoiceWait(){let e=this.voiceWaitDisposer;this.voiceWaitDisposer=null,e?.()}};Mt.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ne=Mt;function bi({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=Bu(),s=i&&r,a=ul(!1),l=ul(o),c=l.current!==o,u=cl(()=>o.sentence?.evaluate(we.getCtx({gameState:n})),[o.sentence,n]),p=cl(()=>new Ne({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:c}),[o,n]),d=n.game.config.dialog,g=Uu(f=>{!s||a.current||(a.current=!0,e?.(f))},[s,e]);return Si(()=>{a.current=!1},[p]),Si(()=>{l.current=o},[o]),Si(()=>(p.setActive(s),()=>{p.setActive(!1)}),[p,s]),Si(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",p),p.events.on(Ne.Events.complete,f=>{n.logger.log("NarraLeaf-React: Say","Complete",p.isIdle()),s&&(p.isIdle()||f?g(!1):p.setIdle(!0))}).cancel),[p,g,n,s]),Si(()=>{let f=T=>{ll(p,{active:s,forced:T===!0})},m=n.events.on(R.EventTypes["event:state.player.skip"],f),y=n.events.on(R.EventTypes["event:state.player.stageClick"],()=>f(!1));return()=>{m.cancel(),y.cancel()}},[p,n,s]),ko.createElement(ko.Fragment,null,ko.createElement(Pn,{value:p},ko.createElement(d,null)))}import{useCallback as Ku,useEffect as Po,useState as $u}from"react";function pl(o,e,{dialogId:t,active:n,forced:i}){let r=Hr({active:n,forced:i});return r==="ignore"?"ignore":o.requestNvlAdvance(t)!=="typing"?"pageHandled":r==="forceSkip"?(e.forceSkip(),"forceSkip"):(e.requestComplete(),"requestComplete")}import{useEffect as Wu,useState as zu}from"react";function En(o){let e=N(),[t,n]=zu(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return Wu(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var jn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(jn||{});function Eo({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=N(),[s]=En("nextAction"),[a]=$u(()=>{let c=o.firedTextEvents??(o.firedTextEvents=new Set);return new Ne({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:c})}),l=Ku(c=>{pl(e,a,{dialogId:o.id,active:n,forced:c})},[a,o.id,e,n]);return Po(()=>{if(!n)return;let c=e.events.on(R.EventTypes["event:state.player.stageClick"],()=>l(!1)),u=e.events.on(R.EventTypes["event:state.player.skip"],p=>l(p===!0));return()=>{c.cancel(),u.cancel()}},[l,e,n]),Po(()=>{if(!n)return;let c=p=>{p.repeat||r.keyMap.match("nextAction",p.key)&&l(!1)};if(r.config.useWindowListener){let p=r.getLiveGame().onWindowEvent("keydown",c);return()=>{p.cancel()}}let u=r.getLiveGame().onPlayerEvent("keydown",c);return()=>{u.cancel()}},[l,r,n,s]),Po(()=>{let c=a.events.on(Ne.Events.complete,u=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!u&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Po(()=>{let c=a.events.on(Ne.Events.simulateClick,()=>l(!1));return()=>{c.cancel()}},[l,a]),a}function ju(o,e){let{expression:t,sound:n}=o.config;if(t){let{image:i,appearance:r}=t;i._setAppearanceSync(r),e.stage.update();let s=e.getExposedState(i);s&&(O.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function Do(o,e,t){e.has(o)||(e.add(o),ju(o,t))}function dl(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),Do(r,e,t)}return n}var qn=new Map,Vr=new Set;function qu(o,e){return qn.set(o,e),Vr.delete(o),()=>{qn.get(o)===e&&qn.delete(o)}}function _u(o){qn.delete(o)}function Yu(o){return qn.get(o)??null}function Ur(o){if(!o)return null;if(typeof o!="string")return o;let e=qn.get(o);return e||(Vr.has(o)||(Vr.add(o),console.warn(`NarraLeaf-React: no word renderer is registered as "${o}"; the word is rendered as plain text. Call registerWordRenderer before the line plays.`)),null)}import{useCallback as Xu,useLayoutEffect as ml,useRef as Br,useState as Qu}from"react";var fl=.5,Ju=.005,Zu=12,hl=.05,yl=12,Lo="--nl-text-scale",vl=`var(${Lo}, 1)`;function Ti(o){return o==null||o===""?void 0:`calc(${typeof o=="number"?`${o}px`:String(o)} * ${vl})`}function Sl(){return`calc(1em * ${vl})`}function gl(o,e){let t=getComputedStyle(o);return e?o.clientWidth-parseFloat(t.paddingLeft||"0")-parseFloat(t.paddingRight||"0"):o.clientHeight-parseFloat(t.paddingTop||"0")-parseFloat(t.paddingBottom||"0")}function bl({enabled:o,minFontSize:e,vertical:t,revealed:n}){let i=Br(null),[r,s]=Qu(1),a=Br(1),l=Br(0);a.current=r;let c=Xu(u=>{let p=i.current,d=p?.parentElement;if(!p||!d)return;let g=gl(d,t);if(!Number.isFinite(g)||g<=0)return;l.current=g;let f=()=>t?p.offsetWidth:p.offsetHeight,m=A=>{p.style.setProperty(Lo,String(A))},y=A=>(m(A),f()<=g+fl);if(y(u)){u!==a.current&&s(u);return}m(1);let T=parseFloat(getComputedStyle(p).fontSize)||0,h=T>0?Math.min(1,Math.max(hl,e/T)):hl,v;if(h>=u||!y(h))v=h;else{let A=h,x=u;for(let k=0;k<Zu&&x-A>Ju;k++){let b=(A+x)/2;y(b)?A=b:x=b}v=A}m(v),s(v)},[e,t]);return ml(()=>{if(!o){a.current!==1&&s(1);return}c(a.current)},[o,c,n]),ml(()=>{let u=i.current?.parentElement;if(!o||!u||typeof ResizeObserver>"u")return;let p=new ResizeObserver(()=>{Math.abs(gl(u,t)-l.current)>fl&&c(1)});p.observe(u);let d=!1;return document.fonts?.ready.then(()=>{d||c(a.current)}),()=>{d=!0,p.disconnect()}},[o,c,t]),{containerRef:i,scale:r}}function Tl(o,e){return o.fontSize!==void 0?Ti(o.fontSize):o.fontScale!==void 0?Cl(o.fontScale):Ti(e)}function Al(o,e){return o.fontSize!==void 0?o.fontSize:o.fontScale!==void 0?Cl(o.fontScale):e}function Cl(o){return`${o}em`}function Wr(o){return o?{textEmphasis:`${o.fill??"filled"} ${o.mark??"dot"}`,textEmphasisPosition:`${o.position??"over"} right`}:{}}var zr="--nl-reveal-duration",wl="__narraleaf_text_reveal",xl={duration:0,inFlight:0};function Kr(o,e,t){if(typeof o!="number"||!Number.isFinite(o)||o<=0)return xl;let n=1e3/(Math.max(.01,e)*Math.max(.01,t)),i=Math.min(o,8*n);return i<=0?xl:{duration:i,inFlight:Math.ceil(i/n)+1}}function $r(o,e,t,n,i=0){if(o.inFlight<=0||t<=0)return 0;let r=n-o.inFlight,s=Math.min(t,e+t-r);return Math.max(0,Math.min(s,t-Math.max(0,i)))}import _n from"react";var ep=2;function Ai(o){return o==="vertical-rl"||o==="vertical-lr"}function tp(o){return o===!1?0:typeof o=="number"?Number.isFinite(o)?Math.max(0,Math.round(o)):0:ep}function _r(o,e){return Ai(o)?{writingMode:o,textOrientation:e??"mixed"}:o?{writingMode:o}:{}}var jr=/[0-9A-Za-z]+(?:[.:\-/][0-9A-Za-z]+)*/g;function np(o,e){if(e<=0)return[{text:o,combineUpright:!1}];let t=[],n=0;jr.lastIndex=0;for(let i=jr.exec(o);i;i=jr.exec(o))i[0].length>e||(i.index>n&&t.push({text:o.slice(n,i.index),combineUpright:!1}),t.push({text:i[0],combineUpright:!0}),n=i.index+i[0].length);return(n<o.length||t.length===0)&&t.push({text:o.slice(n),combineUpright:!1}),t}function Yr(){return{wordBreak:"normal",lineBreak:"strict",overflowWrap:"break-word"}}function qr(o,e,t){let n=e?tp(t):0;return n<=0?[{text:o,combineUpright:!1}]:np(o,n)}function kl(o,e){return o.some(t=>t.combineUpright)?o.map((t,n)=>t.combineUpright?_n.createElement("span",{key:`${e}${n}`,style:{textCombineUpright:"all"}},t.text):_n.createElement(_n.Fragment,{key:`${e}${n}`},t.text)):o.map(t=>t.text).join("")}function ip(o){let e=[];for(let t of o){if(t.combineUpright){e.push(t);continue}for(let n of t.text)e.push({text:n,combineUpright:!1})}return e}function Xr(o,e,t,n=0){if(n<=0)return e?kl(qr(o,e,t),""):o;let i=ip(qr(o,e,t)),r=i.length,s=n;for(;r>0&&s>0;)r--,s-=i[r].text.length;let a=[];if(r>0){let l=i.slice(0,r).map(c=>c.text).join("");a.push(_n.createElement(_n.Fragment,{key:"s"},kl(qr(l,e,t),"s")))}for(let l=r;l<i.length;l++){let c=i[l];a.push(_n.createElement("span",{key:`r${l}`,className:wl,style:c.combineUpright?{textCombineUpright:"all"}:void 0},c.text))}return a}function*Zr(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Ke.isPause(n.text)){yield Ke.from(n.text);continue}if(lt.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
49
49
  `?yield`
50
- `:yield{text:r,full:n.text,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function _r(o){let e=Yr(o),t=[];for(let n of e){if(Ke.isPause(n)||lt.isTextEvent(n))continue;let i=t[t.length-1];if(i&&i!==`
50
+ `:yield{text:r,full:n.text,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function Jr(o){let e=Zr(o),t=[];for(let n of e){if(Ke.isPause(n)||lt.isTextEvent(n))continue;let i=t[t.length-1];if(i&&i!==`
51
51
  `&&n!==`
52
52
  `&&i.tag===n.tag){let r=i.text+n.text;t[t.length-1]={...n,text:r,config:n.config,revealFrom:r.length};continue}t.push(n===`
53
- `?n:{...n,revealFrom:n.text.length})}return t}function wl(o){let e=[],t=0;for(let n of o)e.push(t),t+=n===`
54
- `?1:n.text.length;return{offsets:e,revealed:t}}function Zu(o,e,t=!1){let n=o[o.length-1];if(n&&n!==`
53
+ `?n:{...n,revealFrom:n.text.length})}return t}function Dl(o){let e=[],t=0;for(let n of o)e.push(t),t+=n===`
54
+ `?1:n.text.length;return{offsets:e,revealed:t}}function rp(o,e,t=!1){let n=o[o.length-1];if(n&&n!==`
55
55
  `&&e!==`
56
56
  `&&n.tag===e.tag){let i=n.text+e.text;return[...o.slice(0,-1),{...e,text:i,config:e.config,revealFrom:t?i.length:n.revealFrom}]}return e===`
57
- `?[...o,e]:[...o,{...e,revealFrom:t?e.text.length:0}]}function kl(o,e,t=!1){o(n=>Zu(n,e,t))}function ep(o,e,t){return t||(o!==void 0?he.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new ie(n.text,n.config)):[])}function tp(o,e,t){let n=Math.max(0,e??t);return typeof o=="object"?{enabled:o.enabled??!0,delay:Math.max(0,o.delay??n)}:{enabled:o??!0,delay:n}}function Cl(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Io(o){return o===void 0?void 0:Nn(o)}function Pl(o){return typeof o.tag2=="number"?o.tag2>=o.full.length-1:o.text.length>=o.full.length}function El({word:o,vertical:e,tateChuYoko:t,done:n,style:i,renderer:r,revealTail:s=0}){let a=o.config.ruby?He.createElement("ruby",{className:"align-bottom inline-block"},He.createElement("rt",{className:"block text-center"},o.config.ruby),jr(o.text,e,t,s)):jr(o.text,e,t,s);return r?He.createElement(r,{text:o.text,fullText:o.full,revealed:Pl(o),done:n,style:i,config:o.config,data:o.config.data},a):a}function np(o,e){return!!e&&Pl(o)}function Xr({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,writingMode:l,textOrientation:c,tateChuYoko:u,autoFit:d,autoFitMinFontSize:p,...h}){let g=G(),m=g.getLiveGame().getGameState(),y=xl(null),[T,f]=qr(()=>n&&!n.config.useTypeEffect?_r(n.config.evaluatedWords):[]),[v,A]=ae();if(!n)throw new Error("Dialog state is required");Dn(()=>{if(!(!n.config.action.sentence||y.current))return m.logger.info("Initializing the sentence",n,y.current),m.schedule(({onCleanup:oe})=>{if(!n.config.useTypeEffect){ll(n.config.evaluatedWords,n.config.firedTextEvents??new Set,m),n.dispatchComplete();return}f([]),y.current=le(),v(),y.current.onComplete(()=>{n.dispatchComplete()}),oe(()=>{y.current?.timeline?.abort()})},0)},[]),Dn(()=>n.events.depends([n.events.on(Ne.Events.requestComplete,()=>{y.current?.interact()}),n.events.on(Ne.Events.forceSkip,()=>{n.isEnded()||y.current?.forceSkip()})]).cancel,[n,A]),Dn(()=>n.onFlush(()=>{v()}).cancel,[n]),Dn(()=>g.preference.events.depends([g.preference.onPreferenceChange(q.Preferences.gameSpeed,()=>{y.current?.update()}),g.preference.onPreferenceChange(q.Preferences.autoForward,()=>{y.current?.update()}),g.preference.onPreferenceChange(q.Preferences.cps,()=>{y.current?.update()}),g.preference.onPreferenceChange(q.Preferences.textRevealDuration,()=>{v()})]).cancel,[]);let w=(d??!0)&&!g.config.disableTextScaling,{offsets:k,revealed:b}=Ju(()=>wl(T),[T]),C=Ur(n.config.useTypeEffect?g.preference.getPreference(q.Preferences.textRevealDuration):0,g.preference.getPreference(q.Preferences.cps),g.preference.getPreference(q.Preferences.gameSpeed)),{containerRef:I,scale:B}=gl({enabled:w,minFontSize:p??ml,vertical:Ai(l),revealed:b});function le(){let oe=new S,Je=new Pe(oe).setGuard(m.guard),Ue=new Set,N=n.config.firedTextEvents??new Set,Q=new Set,D=new Set,_=Yr(n.config.evaluatedWords),O=null,R=[],ue=[],Le=()=>{R.forEach(We=>We()),R.length=0},mt=()=>{if(ue.length!==0)return{done:!1,value:ue.shift()};let{done:We,value:Be}=_.next();return{done:We,value:Be}},_t=We=>{let Be=ln=>{We(ln),Q.delete(Be)};return Q.add(Be),{cancel:()=>{Q.delete(Be)}}},Gt=(We,Be=!1)=>{kl(f,We,Be)},Yt=(We=!1)=>{let Be=!1;for(;!Be;){let{done:ln,value:Ze}=mt();if(ln){Be=!0;break}if(Ke.isPause(Ze)){if(We)continue;Be=!0,ue.push(Ze);break}else lt.isTextEvent(Ze)?Do(Ze,N,m):Ze===`
58
- `?f(rt=>[...rt,Ze]):typeof Ze=="object"&&"text"in Ze&&!Ue.has(Ze)&&(Ue.add(Ze),Gt(Ze,!0))}O&&!O.isSettled()?O.abort():(D.forEach(ln=>ln()),oe.resolve())};return m.schedule(async We=>{let Be=!1,ln=!1;for(;!Be;){let{done:Ze,value:rt}=mt();if(Ze){Be=ln=!0;break}if(lt.isTextEvent(rt)){Do(rt,N,m);continue}let Fi=new S;if(m.timelines.attachTimeline(Fi),Fi.registerSkipController(new V(()=>{Le(),Be=!0,We.retry()})),Fi.onSettled(()=>{Le()}),O=Fi,Ke.isPause(rt)){let Oi=Ke.from(rt),Hi=g.preference.getPreference(q.Preferences.gameSpeed);if(Oi.config.duration){let Vi=Oi.config.duration/Hi;await _i(Vi)}else{let Vi=g.preference.getPreference(q.Preferences.autoForward),Ui=S.race([S.create(zc=>{let Kc=_t($c=>{$c(),zc.resolve()});R.push(()=>Kc.cancel())}),...Vi?[S.delay(g.config.autoForwardDefaultPause/Hi)]:[]]);m.timelines.attachTimeline(Ui),await S.wait(Ui)}}else{if(rt!==`
59
- `&&Ue.has(rt))continue;Ue.add(rt),Gt(rt);let{gameSpeed:Oi,cps:Hi}=g.preference.getPreferences(),Ui=1e3/((typeof rt=="object"&&"cps"in rt&&rt.cps!==void 0?rt.cps:Hi)*Oi);await _i(Ui)}}ln&&(D.forEach(Ze=>Ze()),oe.resolve())},0),{getToken:()=>oe,interact:()=>{let We=!1;Q.forEach(Be=>Be(()=>We=!0)),!We&&Yt()},update:()=>{O&&O.abort()},forceSkip:()=>{Yt(!0)},timeline:Je,onComplete:We=>(D.add(We),{cancel:()=>{D.delete(We)}})}}let ce=n.config.action.sentence;if(!ce)return null;let Ve=s??"bold",pt=ce.config.fontSize??i,Tt={fontWeight:ce.config.bold?Ve:r,fontSize:bi(pt)??hl(),color:Io(ce.config.color??o),fontFamily:ce.config.fontFamily??a,fontStyle:ce.config.italic?"italic":void 0},an=oe=>({fontWeight:oe.config.bold||ce.config.bold?Ve:r,fontSize:yl(oe.config,pt),color:Io(oe.config.color??ce.config.color??o),fontFamily:oe.config.fontFamily??ce.config.fontFamily??a,fontStyle:oe.config.italic??ce.config.italic?"italic":void 0,...Hr(oe.config.emphasis)}),dt=Ai(l),Ce=n.isEnded(),bt=(oe,Je)=>{if(oe===`
60
- `)return He.createElement("br",{key:Je});let Ue=an(oe),N=Fr(oe.config.render),Q=np(oe,N);return He.createElement(zt.Span,{tag:`say.word.${Je}`,key:Je,"data-element-type":Q?"interactive-word":void 0,onClick:Q?D=>D.stopPropagation():void 0,style:{...Ue,...$r(),...Gn(g.config.app.debug,{outline:"1px dashed red"})},className:Ro("inline-block",oe.config.className)},He.createElement(El,{word:oe,vertical:dt,tateChuYoko:u,done:Ce,style:Ue,renderer:N,revealTail:Wr(C,k[Je]??0,oe.text.length,b,oe.revealFrom??0)}))};return He.createElement("div",{...h,ref:I,className:Ro("whitespace-pre-wrap",e),style:{[Lo]:B,...Gn(C.duration>0,{[Vr]:`${C.duration}ms`}),...Tt,...Kr(l,c),...t}},T.map(bt))}function ip({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:l,defaultColor:c,className:u,style:d,fontSize:p,fontWeight:h,fontWeightBold:g,fontFamily:m,writingMode:y,textOrientation:T,tateChuYoko:f,onCompleted:v,...A}){let w=qa(),[,k]=qr(0),b=w?.config??q.DefaultConfig,C=w?.preference.getPreferences()??q.DefaultPreference,I=s??C.cps,B=a??C.gameSpeed,le=l??b.autoForwardDefaultPause,ce=r??b.autoForwardDefaultPause,Ve=He.useMemo(()=>ep(o,e,t),[o,e,t]),pt=He.useMemo(()=>tp(i,r,ce),[i,r,ce]),Tt=xl(v),[an,dt]=qr(()=>n?[]:_r(Ve));Dn(()=>{if(w)return w.preference.onPreferenceChange(()=>{k(O=>O+1)}).cancel},[w]),Dn(()=>{Tt.current=v},[v]),Dn(()=>{let O=!1,R=[],ue=Math.max(.01,B),Le=Gt=>new Promise(Yt=>{let Xt=setTimeout(Yt,Math.max(0,Gt));R.push(Xt)}),mt=()=>{O||Tt.current?.()};return n?Ve.length===0?(dt([]),()=>{O=!0}):((async()=>{do{let Gt=Yr(Ve);for(dt([]);!O;){let{done:Yt,value:Xt}=Gt.next();if(Yt)break;if(Ke.isPause(Xt)){let Js=Ke.from(Xt);await Le((Js.config.duration??le)/ue)}else{if(lt.isTextEvent(Xt))continue;kl(dt,Xt),Xt===`
61
- `?await Le(Cl(I,B)):await Le(Cl(Xt.cps??I,B))}}if(O)return;mt(),pt.enabled&&await Le(pt.delay)}while(!O&&pt.enabled)})(),()=>{O=!0,R.forEach(Gt=>clearTimeout(Gt))}):(dt(_r(Ve)),mt(),()=>{O=!0})},[Ve,n,pt,I,B,le]);let Ce=e?.config,bt=g??"bold",oe={fontWeight:Ce?.bold?bt:h,fontSize:Ce?.fontSize??p,color:Io(Ce?.color??c),fontFamily:Ce?.fontFamily??m,fontStyle:Ce?.italic?"italic":void 0},Je=O=>({fontWeight:O.config.bold||Ce?.bold?bt:h,fontSize:vl(O.config,Ce?.fontSize??p),color:Io(O.config.color??Ce?.color??c),fontFamily:O.config.fontFamily??Ce?.fontFamily??m,fontStyle:O.config.italic??Ce?.italic?"italic":void 0,...Hr(O.config.emphasis)}),Ue=Ai(y),N=Ur(n?C.textRevealDuration:0,I,B),{offsets:Q,revealed:D}=wl(an),_=(O,R)=>{if(O===`
62
- `)return He.createElement("br",{key:R});let ue=Je(O);return He.createElement("span",{key:R,style:{...ue,...$r()},className:Ro("inline-block",O.config.className)},He.createElement(El,{word:O,vertical:Ue,tateChuYoko:f,done:!1,style:ue,renderer:Fr(O.config.render),revealTail:Wr(N,Q[R]??0,O.text.length,D,O.revealFrom??0)}))};return He.createElement("div",{...A,className:Ro("whitespace-pre-wrap",u),style:{...Gn(N.duration>0,{[Vr]:`${N.duration}ms`}),...oe,...Kr(y,T),...d}},an.map(_))}function Dl(o){return He.createElement(Xr,{...o,key:o.dialog?.config.action.id})}function op({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Eo({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return He.createElement(Xr,{...r,dialog:s,key:s.config.action.id})}function rp(o){let e=Rt();return He.createElement(Xr,{...o,dialog:e,key:e.config.action.id})}function vn(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?He.createElement(op,{...o}):He.createElement(rp,{...o})}var sp=vn;import No,{useEffect as ap,useLayoutEffect as lp,useMemo as Rl,useRef as cp,useState as up}from"react";import Mo from"react";var Qr=Mo.createContext(null);function Jr(){let o=Mo.useContext(Qr);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var Zr=Mo.createContext(null);function Ll(){let o=Mo.useContext(Zr);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Go({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let l=cp(null),{register:c,unregister:u,getIndex:d}=Ll(),[p,h]=up(-1),{choose:g,evaluated:m,gameState:y}=Jr(),T=p===-1?null:m[p],f=Rl(()=>ke.getCtx({gameState:y}),[y]),{hidden:v,disabled:A}=Rl(()=>{if(!T)return{hidden:!1,disabled:!1};let b=T.config.hidden?.evaluate(f)?.value??!1,C=!b&&(T.config.disabled?.evaluate(f)?.value??!1);return{hidden:b,disabled:C}},[T,f]);lp(()=>{if(!l.current)return;let b=l;c(b);let C=d(b);return h(C),l.current.dataset.index=C.toString(),()=>u(b)},[c,u,d]),ap(()=>{if(!t)return;let b=C=>{C.key.toLowerCase()===t.toLowerCase()&&!C.ctrlKey&&!C.metaKey&&(C.preventDefault(),C.stopPropagation(),w())};return window.addEventListener("keydown",b,!0),()=>{window.removeEventListener("keydown",b,!0)}},[t]);function w(){if(p===-1||!m[p]||v||A)return;let b=m[p];g({...b,evaluated:ie.getText(b.words||[])})}let k=T&&!v;return No.createElement(No.Fragment,null,No.createElement("button",{className:o,style:{...e,display:k?e?.display??void 0:"none"},onClick:w,ref:l,disabled:A},k&&No.createElement(Dl,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Ne({useTypeEffect:!1,action:{sentence:T.prompt,words:T.words,character:null},gameState:y,evaluatedWords:T.words})})))}import Fo from"react";import{AnimatePresence as pp}from"motion/react";function Oo({children:o,...e}){let t=pp;return Fo.createElement(Fo.Fragment,null,Fo.createElement("div",{...e},Fo.createElement(t,null,o)))}import Il from"react";function on({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Il.useContext(Pn),l=e??o?.character??a?.config.action.character??null,c=n??l?.config.color,u=i??t??l?.state.name;return Il.createElement("div",{...s,style:{color:c?Nn(c):void 0,...r}},u)}import fp from"clsx";import hp from"react";import es,{createContext as dp,useContext as mp,useState as Ml}from"react";var Ln=class Ln{constructor(){this.preloaded=[];this.events=new J}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(Ln.EventTypes["event:preloaded.add"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this)}get(e){return this.preloaded.find(t=>this.getSrc(t)===e)}has(e){return Array.isArray(e)?e.every(t=>this.has(t)):this.preloaded.some(t=>this.getSrc(t)===e)}remove(e){if(Array.isArray(e)){let n=e.map(i=>this.getSrc(i));return this.preloaded=this.preloaded.filter(i=>!n.includes(this.getSrc(i))),this}let t=this.getSrc(e);return this.preloaded=this.preloaded.filter(n=>this.getSrc(n)!==t),this.events.emit(Ln.EventTypes["event:preloaded.remove"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Ie.getSrc(e)}};Ln.EventTypes={"event:preloaded.add":"event:preloaded.add","event:preloaded.remove":"event:preloaded.remove","event:preloaded.change":"event:preloaded.change","event:preloaded.mount":"event:preloaded.mount","event:preloaded.ready":"event:preloaded.ready","event:preloaded.complete":"event:preloaded.complete","event:preloaded.unmount":"event:preloaded.unmount"};var je=Ln;var Ho=class o{constructor(e){this.game=e;this.src=new Map;this.preloadTasks=new Map;this.decoded=new Map;this.game.addSideEffect(()=>{this.abortAll(),this.releaseAll(),this.src.clear(),this.decoded.clear()})}static getImage(e,t,n){return sa(e,{...n,signal:t})}static async decodeImage(e){if(typeof window>"u"||typeof window.Image>"u")return null;let t=new window.Image;if(t.src=e,typeof t.decode!="function")return null;try{await t.decode()}catch{return null}return t}release(e){let t=this.src.get(e);t&&t.startsWith("blob:")&&URL.revokeObjectURL(t)}releaseAll(){for(let e of this.src.keys())this.release(e)}has(e){return this.src.has(e)}add(e,t){return this.src.get(e)!==t&&this.release(e),this.src.set(e,t),this}remove(e){return this.release(e),this.src.delete(e),this.decoded.delete(e),this}get(e){return this.src.get(e)}isDecoded(e){return this.decoded.has(e)}clear(){return this.releaseAll(),this.src.clear(),this.decoded.clear(),this}size(){return this.src.size}isPreloading(e){return this.preloadTasks.has(e)}preload(e,t,n){if(this.src.has(t)||this.preloadTasks.has(t)){let p={abort:()=>{},onFinished:()=>p,onErrored:()=>p};return p}let i=t,r={};this.game.hooks.rawTrigger("preloadImage",()=>[i,(p,h)=>{i=p,r={...r,...h}}]);let s=new AbortController,a=s.signal,l=[],u={promise:o.getImage(i,a,r).then(async p=>{if(this.preloadTasks.delete(t),!p)return;this.add(t,p);let h=await o.decodeImage(p);if(this.src.get(t)!==p){URL.revokeObjectURL(p);return}h&&n?.retainDecoded&&this.decoded.set(t,h)}).catch(p=>{this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${p}`),l.forEach(h=>h(p))}),controller:s};this.preloadTasks.set(t,u);let d={abort:()=>{s.abort(),this.preloadTasks.delete(t)},onFinished:p=>(u.promise.then(p),d),onErrored:p=>(l.push(p),d)};return d}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.src.values())}filter(e){let t=new Set(e);for(let n of[...this.src.keys()])t.has(n)||(this.release(n),this.src.delete(n),this.decoded.delete(n));for(let n of this.decoded.keys())t.has(n)||this.decoded.delete(n);return this}};var ts=dp(null);function Nl({children:o}){let e=G(),[t]=Ml(()=>new je),[n]=Ml(()=>new Ho(e));return es.createElement(es.Fragment,null,es.createElement(ts,{value:{preloaded:t,cacheManager:n}},o))}function Kt(){if(!ts)throw new Error("usePreloaded must be used within a PreloadedProvider");return mp(ts)}function Gl(){let o=Rt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return vp(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?F.getSrcURL(s):null,l=s&&F.isTagSrc(s)?[...s.state.currentSrc]:null,c=Ha({character:n,sentence:i,portrait:s,currentSrc:a,tags:l,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=yp(c.source);return{visible:!!u,src:u,character:c.character,portrait:c.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function gp({className:o,style:e,alt:t,...n}){let i=Gl(),{cacheManager:r}=Kt();if(!i.visible||!i.src)return null;let s=r.get(i.src)||i.src;return hp.createElement("img",{...n,"data-element-type":"dialog-avatar",className:fp("dialog-avatar",o),src:s,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function yp(o){return o?P.srcToURL(o):null}function vp(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var ns=gp;import{useEffect as Sp}from"react";function Tp(){let o=Rt(),[e]=ae(o.deps),t=ie.getText(o.config.evaluatedWords);return Sp(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]),{done:o.isEnded(),text:t,isNarrator:o.config.action.character===null||o.config.action.character.state.name==="",metadata:o.config.action.sentence?.getMetadata()}}import{useCallback as Vo,useEffect as is,useMemo as bp,useRef as Ap,useState as Fl}from"react";function Cp(){let o=Rt(),[e]=ae(o.deps),[t,n]=Fl(!0),[i,r]=Fl(!0),s=Ap(null),a=o.config.gameState,l=o.config.action.sentence,c=l?.config.voiceId??null;is(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]);let u=bp(()=>{if(!l)return null;try{return it.getVoice(a,l)}catch{return null}},[a,l,c,l?.config.voice]);is(()=>{s.current=null,r(!0)},[l]),is(()=>{let m=!1,y=null,T=null,f=null;if(!u){n(!0);return}n(!1);let v=()=>{m||n(!0)};y=a.audioManager.getToken(u),y&&(y.isPlaying()||n(!0),T=()=>v(),f=()=>v(),y.once("ended",T),y.once("stop",f));let A=a.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{v()});return()=>{m=!0,A.cancel(),y&&T&&y.off("ended",T),y&&f&&y.off("stop",f)}},[a,u]);let d=Vo(async m=>{let y=m??u;if(!y)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let T=y instanceof URL?ge.voice(y.toString()):typeof y=="string"?ge.voice(y):y,f=await a.getLiveGame().playSound(T);s.current=f;let v=()=>{r(!0)};return f.once("ended",v),f.once("stop",v),f},[a,u]),p=Vo(()=>u,[u]),h=Vo(()=>c,[c]),g=Vo(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:d,getVoice:p,getVoiceId:h,getVoiceSrc:g}}import os,{createContext as Gp,useContext as Fp,useEffect as Vl,useRef as Op}from"react";import{useState as xp}from"react";function Uo(o){let[e]=xp(o);return e}import{AnimatePresence as wp}from"motion/react";var Wo=wp;import ki,{createContext as Lp,useContext as Rp,useEffect as Ip,useRef as Mp}from"react";import{useEffect as Ci,useLayoutEffect as kp}from"react";function Pp(){let o=Wt(),[e]=ae();return Ci(()=>o.onChange(e).cancel,[]),o.getPathname()}function Ep(){let{router:o,path:e}=wi(),[t]=ae();return Ci(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function Dp(){let o=Wt(),[e]=ae();return Ci(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function Bo(o,e){let t=Wt();kp(()=>t.onUpdate(()=>o(t)).cancel,e),Ci(()=>{o(t)},[])}function xi(){let o=Wt(),[e]=ae();return Ci(()=>o.onChange(e).cancel,[]),e}var Ol=Lp(null);function Pi({children:o,path:e,consumedBy:t}){let i={router:Wt(),path:e,consumedBy:t};return ki.createElement(Ol,{value:i},o)}function wi(){let o=Rp(Ol);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new E(`Invalid useLayout call: Trying to access layout without a parent.
63
- This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function Np({children:o,name:e,propagate:t}){let n=G(),[i]=ae(),{path:r,router:s,consumedBy:a}=wi(),l=s.joinPath(r,e),c=Uo(()=>s.createToken(l+"@layout")),u=s.getCurrentPath(),d=Mp(!1),p=g=>{d.current=g,i()},h=s.matchPath(u,l);if(xi(),Bo(g=>{let m=g.matchPath(g.getCurrentPath(),l);if(d.current&&!m){if(!o){p(!1);return}g.registerUnmountingPath(c)}m&&g.isPathsUnmounting()&&g.unregisterUnmountingPath(c),m&&!d.current&&!g.isTransitioning()&&p(!0)},[h,o]),Ip(()=>{if(!h)return;let g=s.mount(l);return()=>{g.cancel()}},[l,s,h]),a)throw new E("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return ki.createElement(Pi,{path:l},ki.createElement(Wo,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(c),p(!1)}},h&&d.current&&o))}function Hl({children:o}){return xi(),ki.createElement(Pi,{path:gn.rootPath},ki.createElement(Co,{"data-layout-path":gn.rootPath,key:gn.rootPath},o))}var rs=Gp(null);function Hp(){return Fp(rs)}function Vp({children:o,name:e}){let[t]=ae(),{path:n,router:i,consumedBy:r}=wi(),s=Hp(),a=s?.name??e,l=a??n+"@default",c=a?i.joinPath(n,a):n,u=Uo(()=>i.createToken(c+"@page")),d=i.getCurrentPath(),p=!a,h=Op(!1),g=f=>{h.current=f,t()},m=p&&i.exactMatch(d,n)||i.exactMatch(d,c);if(r&&r!==l)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");xi(),Bo(f=>{let v=p&&f.exactMatch(f.getCurrentPath(),n)||f.exactMatch(f.getCurrentPath(),c);if(h.current&&!v){if(!o){g(!1);return}f.registerUnmountingPath(u)}v&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(u),v&&!h.current&&!f.isTransitioning()&&g(!0)},[m,o]),Vl(()=>{if(!m)return;let f=p?i.mountDefaultHandler(c):i.mount(c);return i.emitOnPageMount(),()=>{f.cancel()}},[c,m]),Vl(()=>()=>{i.unregisterUnmountingPath(u),g(!1)},[]);let y=os.createElement(Pi,{path:n,consumedBy:l},os.createElement(Wo,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),g(!1)}},m&&h.current&&o));return(f=>s?os.createElement(rs,{value:{name:null}},f):f)(y)}import ss,{useCallback as Up,useEffect as as,useImperativeHandle as Wp,useMemo as Ul,useRef as ls,useState as Bp}from"react";var zp=50,Kp={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Wl={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function $p(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Bl(o,e){return e==null?o:Math.max(o,e)}function jp(o,e,t){return o<=0||e<=0||t<=0?{width:o,height:e}:o/e>t?{width:e*t,height:e}:{width:o,height:o/t}}var zl=ss.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:l,dataAttributes:c,onUpdate:u,children:d},p){let h=ls(null),[g,m]=Bp({...Wl,width:"0px",height:"0px"}),y=ls(u),T=ls(null);as(()=>{y.current=u},[u]);let f=Up(()=>{let w=h.current;if(!w)return;let k=w.clientWidth,b=w.clientHeight;if(k<=0||b<=0||e<=0)return;let C=jp(k,b,e),I=Bl(C.width,n),B=Bl(C.height,i),le=T.current;(!le||le.width!==I||le.height!==B)&&(T.current={width:I,height:B},m({...Wl,width:`${I}px`,height:`${B}px`}));let ce=t>0?I/t:1;y.current?.({width:I,height:B,scale:ce,containerWidth:k,containerHeight:b})},[e,t,n,i]),v=Ul(()=>oa(f,typeof r=="number"?r:zp),[f,r]);as(()=>{f()},[f]),as(()=>{let w=new ResizeObserver(()=>{v()});h.current&&w.observe(h.current);let k=()=>{v()};return window.addEventListener("resize",k),()=>{w.disconnect(),window.removeEventListener("resize",k)}},[v]),Wp(p,()=>({requestUpdate:f}),[f]);let A=Ul(()=>$p(c),[c]);return ss.createElement("div",{id:l,ref:h,style:Kp,...A},ss.createElement("div",{className:s,style:{...g,...a}},d))}),Kl=zl;function qp(){return G().getLiveGame()}import ps from"react";import _p,{createContext as Yp,useContext as Xp,useEffect as Qp,useState as $l}from"react";var Jp={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},jl=Yp({state:Jp,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function $t(){return Xp(jl)}function cs(){let{dialogs:o}=$t();return o}function Zp(){let{isActive:o}=$t();return o}function ed(){let{isVisible:o}=$t();return o}function us({children:o}){let t=G().getLiveGame().getGameState(),[n,i]=$l(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=$l(null);Qp(()=>{let l=g=>({...g,dialogs:[...g.dialogs]}),c=t.events.on(L.EventTypes["event:state.nvl.enter"],(g,m)=>{i(l(t.getNvlState())),s(m?.showTransition||null)}),u=t.events.on(L.EventTypes["event:state.nvl.exit"],()=>{i(l(t.getNvlState()))}),d=t.events.on(L.EventTypes["event:state.nvl.dialogAppend"],()=>{i(l(t.getNvlState()))}),p=t.events.on(L.EventTypes["event:state.nvl.visibilityChange"],(g,m)=>{i(l(t.getNvlState())),s(m||null)}),h=t.events.on(L.EventTypes["event:state.nvl.change"],g=>{i(l(g))});return()=>{c.cancel(),u.cancel(),d.cancel(),p.cancel(),h.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return _p.createElement(jl.Provider,{value:a},o)}import{AnimatePresence as td,motion as nd}from"motion/react";import id from"clsx";function ds({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=$t(),{ratio:r}=ye(),s=G(),a=i?.duration?i.duration/1e3:.3;return ps.createElement(td,null,n&&ps.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},ps.createElement(nd.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:id("w-full h-full overflow-auto",e),style:{transform:s.config.useAspectScale?`scale(${r.state.scale})`:void 0,transformOrigin:"top left",width:s.config.useAspectScale?s.config.width:"100%",height:s.config.useAspectScale?s.config.height:"100%",...t}},o)))}import Rn from"react";function ms({renderDialogItem:o,dialogs:e}){return Rn.createElement(ds,{className:"bg-black/80 text-white p-16 inset-8"},Rn.createElement("div",{"data-element-type":"nvl-dialog-list",className:"flex flex-col space-y-4 p-4"},(e??[]).map((n,i)=>{let r=n.entry.character?Rn.createElement(on,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Rn.createElement(vn,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Rn.createElement("div",{key:`${n.entry.id}:${n.isActive?"active":"idle"}`,"data-element-type":"nvl-dialog-item","data-dialog-index":i,className:"nvl-dialog-item"},o?o({entry:n.entry,index:i,isActive:n.isActive,nametag:r,texts:s}):Rn.createElement(Rn.Fragment,null,r,s))})))}import St,{useMemo as od}from"react";import ql from"clsx";function rd({children:o,className:e,style:t,renderDialogItem:n}){let i=cs(),{state:r}=$t();return St.createElement("div",{"data-element-type":"nvl-dialog-list",className:ql("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>St.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},St.createElement(sd,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?St.createElement(on,{className:"nvl-character-name font-bold mr-2"}):null,texts:St.createElement(vn,{className:"nvl-dialog-text"})}):o?St.Children.map(o,l=>St.isValidElement(l)?St.cloneElement(l,{entry:s,index:a}):l):St.createElement(_l,{entry:s,index:a})))))}function _l({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??St.createElement(vn,{className:"nvl-dialog-text"});return St.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:ql("nvl-dialog-item",t),style:n},r&&St.createElement(on,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function sd({entry:o,children:e}){let n=G().getLiveGame().getGameState(),i=od(()=>o.sentence.evaluate(ke.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",l=Eo({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return St.createElement(Pn,{value:l},e)}import zo from"react";import{createPortal as ad}from"react-dom";var fs=zo.createContext(null),ld={Portal:()=>null,measure:()=>null,container:null};function cd(){let o=zo.useContext(fs);return zo.useMemo(()=>{if(!o)return ld;let e=t=>{let n=o.offsetWidth;return!n||!t.width?1:t.width/n};return{container:o,Portal:({children:t})=>ad(zo.createElement("div",{style:{position:"absolute",left:0,top:0,pointerEvents:"auto"}},t),o),measure:t=>{if(!t)return null;let n=o.getBoundingClientRect(),i=e(n),r=t.getBoundingClientRect(),s=(r.left-n.left)/i,a=(r.top-n.top)/i,l=r.width/i,c=r.height/i;return{left:s,top:a,width:l,height:c,right:s+l,bottom:a+c}}}},[o])}import{useEffect as ud}from"react";function pd(o){let e=G();ud(()=>{if(!o)return;let t=e.getLiveGame().getGameState();if(t)return t.suspendAdvance()},[o,e])}var Ko=class{constructor(e,t){this.emit=e;this.options=t;this.held=!1;this.delayTimer=null;this.repeatTimer=null}isHeld(){return this.held}press(){this.held||(this.clearTimers(),this.held=!0,this.emit(!1),this.options.delay===0?this.startRepeating():this.delayTimer=setTimeout(()=>{this.delayTimer=null,this.startRepeating()},this.options.delay))}release(){this.clearTimers(),this.held=!1}dispose(){this.release()}startRepeating(){this.repeatTimer=setInterval(()=>{this.emit(!0)},this.options.interval)}clearTimers(){this.delayTimer!==null&&(clearTimeout(this.delayTimer),this.delayTimer=null),this.repeatTimer!==null&&(clearInterval(this.repeatTimer),this.repeatTimer=null)}};function Xl({state:o}){let e=G(),t=Wt(),[n]=yn(q.Preferences.skipDelay),[i]=yn(q.Preferences.skipInterval),[r]=En("skipAction");return md(()=>{if(!e.getLiveGame().gameState.playerCurrent){o.logger.warn("KeyEventAnnouncer","Failed to listen to playerElement events");return}if(!window){o.logger.warn("KeyEventAnnouncer","Failed to listen to window events");return}let a=new Ko(u=>{o.events.emit(L.EventTypes["event:state.player.skip"],u)},{delay:n,interval:i}),l=u=>{o.isAdvanceSuspended()||e.keyMap.match("skipAction",u.key)&&e.preference.getPreference(q.Preferences.skip)&&(a.isHeld()||o.logger.verbose("KeyEventAnnouncer","Skipping"),a.press())},c=u=>{e.keyMap.match("skipAction",u.key)&&a.release()};if(e.config.useWindowListener){let u=e.getLiveGame().onWindowEvent("keydown",l).cancel,d=e.getLiveGame().onWindowEvent("keyup",c).cancel;return()=>{a.dispose(),u(),d()}}else{let u=e.getLiveGame().onPlayerEvent("keydown",l).cancel,d=e.getLiveGame().onPlayerEvent("keyup",c).cancel;return()=>{a.dispose(),u(),d()}}},[t,n,i,r]),Yl.createElement(Yl.Fragment,null)}import Jl,{useEffect as fd}from"react";function Ql({onStage:o,dialogShown:e,advanceSuspended:t}){return o?e?t?"ignore":"advance":"restoreDialog":"ignore"}function hd(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Zl=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],gd=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]','[data-element-type="interactive-word"]','[data-element-type="dialog-overlay"]'];function yd(o,e){return!o||e&&Zl.some(t=>!!o.closest(t))?!1:[...gd,...Zl].some(t=>!!o.closest(t))}function ec(o,e){if(!e)return!1;let t=e.getBoundingClientRect();return o.clientX>=t.left&&o.clientX<=t.right&&o.clientY>=t.top&&o.clientY<=t.bottom}function tc({state:o}){let e=G();return fd(()=>{let t=e.getLiveGame().gameState?.playerCurrent;if(!t){o.logger.warn("StageClickAnnouncer","Failed to listen to playerElement events");return}let n=i=>{let r=i.target;if(!r||!t.contains(r)||!ec(i,t))return;let s=o.mainContentNode;if(s&&(!s.contains(r)||!ec(i,s))||hd(r)||yd(r,o.isNvlMode()))return;let a=Ql({onStage:!0,dialogShown:e.preference.getPreference(q.Preferences.showDialog),advanceSuspended:o.isAdvanceSuspended()});if(a!=="ignore"){if(a==="restoreDialog"){e.preference.setPreference(q.Preferences.showDialog,!0);return}o.events.emit(L.EventTypes["event:state.player.stageClick"]),o.recordStageClick()}};if(e.config.useWindowListener){let i=e.getLiveGame().onWindowEvent("click",n);return()=>{i.cancel()}}else{let i=e.getLiveGame().onPlayerEvent("click",n);return()=>{i.cancel()}}},[e,o]),Jl.createElement(Jl.Fragment,null)}import{useEffect as nc}from"react";function hs({gameState:o}){let e=o.audioManager,[t,n]=yn("globalVolume");return nc(()=>{n(e.getGlobalVolume())},[]),nc(()=>{e.setGlobalVolume(t)},[t]),null}import{useEffect as $o,useRef as vd}from"react";function ic(o){let e=Ie.catSrc(o.srcManager?.src||[]),t=Ie.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=[],s=new Set,a=o.state?.backgroundImage?.state?.currentSrc;if(P.isImageSrc(a)){let l=P.srcToURL(a);l&&(s.add(l),n.push(l))}for(let l of e.image){let c=Ie.getSrc(l);!c||s.has(c)||(s.add(c),i.push(c))}for(let l of t.image){let c=Ie.getSrc(l);!c||s.has(c)||(s.add(c),r.push(c))}return{firstFrame:n,critical:i,lookAhead:r,all:[...n,...i,...r],criticalAudio:e.audio}}function oc({state:o}){let{preloaded:e,cacheManager:t}=Kt(),n=G(),i=vd(new Set),[r]=ae(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),l=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,c=n.getLiveGame().story;function u(){o.logger.debug(s,"Preload unmounted"),e.events.emit(je.EventTypes["event:preloaded.unmount"])}return $o(()=>o.events.on(L.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),$o(()=>{if(typeof fetch>"u")return e.events.emit(je.EventTypes["event:preloaded.complete"]),e.events.emit(je.EventTypes["event:preloaded.ready"]),o.logger.warn(s,"Fetch is not supported in this environment, skipping preload"),u;if(!n.config.preloadAllImages)return e.events.emit(je.EventTypes["event:preloaded.complete"]),e.events.emit(je.EventTypes["event:preloaded.ready"]),o.logger.debug(s,"Preload all images is disabled, skipping preload"),u;if(n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(s,"Cache cleared")),!c||!a)return c?o.logger.debug(s,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(s,"Story not found, skipping preload"),u;let d=performance.now(),p=ic(a),h=new bn(n.config.preloadConcurrency,0),g=new bn(n.config.preloadConcurrency,0),m=new bn(n.config.preloadConcurrency,n.config.preloadDelay),y=o.logger.group(s,!0),T=!1;o.logger.debug(s,"preloading:",p,a);let f=(w,k,b,C)=>{k.forEach((I,B)=>{if(t.has(I)||t.isPreloading(I)){o.logger.debug(s,`Image already loaded (${b} ${B+1}/${k.length})`,I);return}w.addTask(()=>new Promise(le=>{t.preload(o,I,{retainDecoded:C}).onFinished(()=>{o.logger.debug(s,`Image loaded (${b} ${B+1}/${k.length})`,I),le()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${b} ${B+1}/${k.length})`,I),le()})}))})};f(h,p.firstFrame,"first frame",!0),f(g,p.critical,"first scene",!0),f(m,p.lookAhead,"look-ahead",!1);for(let w of p.criticalAudio)o.audioManager.preload(w);y.end();let v=()=>{e.events.emit(je.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(je.EventTypes["event:preloaded.ready"])},A=n.config.preloadGate!=="scene";return h.start().then(async()=>{o.logger.info(s,"Image preload (first frame)",`loaded ${t.size()} images in ${performance.now()-d}ms`),A&&v(),!T&&(await g.start(),o.logger.info(s,"Image preload (first scene)",`loaded ${t.size()} images in ${performance.now()-d}ms`),A||v(),!T&&(await m.start(),!T&&(o.logger.info(s,"Image preload (look-ahead)",`loaded ${t.size()} images in ${performance.now()-d}ms`),t.filter(p.all))))}),n.config.waitForPreload||e.events.emit(je.EventTypes["event:preloaded.ready"]),e.events.emit(je.EventTypes["event:preloaded.mount"]),()=>{T=!0,u()}},[a,c]),$o(()=>{i.current.clear()},[a]),$o(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!c){o.logger.weakWarn(s,"Story not found, skipping preload");return}let d=performance.now(),p=n.getLiveGame().getAllPredictableActions(c,l,n.config.maxPreloadActions).map(f=>Ie.getPreloadableSrc(c,f)).filter(function(f){return f!==null});p.filter(function(f){return f?.activeType==="scene"}).forEach(f=>{i.current.has(f)||i.current.add(f)});let g=Ie.catSrc([...i.current,...p]),m=new bn(n.config.preloadConcurrency,n.config.preloadDelay),y=[],T=o.logger.group(s);o.logger.debug(s,"preloading:",g);for(let f of g.image){let v=Ie.getSrc(f);if(v){if(y.push(v),t.has(v)||t.isPreloading(v)){o.logger.debug(s,`Image already loaded (${g.image.indexOf(f)+1}/${g.image.length})`,v);continue}m.addTask(()=>new Promise(A=>{t.preload(o,v).onFinished(()=>{o.logger.debug(s,`Image loaded (${g.image.indexOf(f)+1}/${g.image.length})`,v),A()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${g.image.indexOf(f)+1}/${g.image.length})`,v),A()})}))}}T.end(),m.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-d}ms`),t.filter(y)})},[l,c]),null}import Ei from"react";import qo from"react";import gs,{useEffect as ys,useLayoutEffect as vs,useRef as jo,useState as Ss}from"react";function jt({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:l,companionRefs:c}){let[u,d]=Ss(null),[p,h]=Ss(null),g=jo(null),m=gs.useRef(null),[y]=Ss(()=>new zi("displayable.refGroup")),T=jo(y.next()),f=jo(Je()),A=G().getLiveGame().getGameState(),w=typeof a=="function"?a(u):a,[k]=ae([p,u,f]);ys(()=>A.events.depends([A.events.on(L.EventTypes["event:state.player.skip"],oe)]).cancel,[p,u,f]),vs(()=>{if(B(),!u)return;if(f.current.some(([R])=>!R.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:N,task:Q}=u,D=R=>{f.current.forEach(([ue],Le)=>{let mt=Q.resolve[Le],_t=typeof mt=="function"?mt:mt.resolver;if(!_t)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${Le}])`);let Gt=_t(...R),Yt=j(w[Le]||w[w.length-1]||{},Gt);ce(ue,l?l(Yt):Yt)})},_=N.onUpdate(D);D(Q.animations.map(R=>R.start));let O=!1;return Promise.all(f.current.map(([R])=>{let ue=R.current;return ue?.waitForLoad?ue.waitForLoad():Promise.resolve()})).then(()=>{O||N.start()}),()=>{O=!0,_.cancel()}},[u]),ys(()=>{if(!m.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),vs(()=>{let N=e.toStyle(A,i);return Object.assign(m.current.style,N),I(),A.logger.debug("Displayable","Initial style applied",m.current,N),pt(),()=>{Ve()}},[]);let b=jo(()=>{});b.current=()=>{u||!m.current||(B(),!(p||g.current)&&(Object.assign(m.current.style,e.toStyle(A,i)),I()))},vs(()=>{g.current&&!o._getLoop()&&Ve(),b.current()});let{ratio:C}=ye();ys(()=>C.onUpdate(()=>{b.current(),requestAnimationFrame(()=>b.current())}),[C]);function I(){if(c)for(let{ref:N,project:Q}of c)N.current&&Object.assign(N.current.style,Q(e.get()))}function B(){let N=typeof a=="function"?a(u):a;if(!f.current||!f.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");f.current.some(([Q])=>!Q.current)||f.current.forEach(([Q],D)=>{ce(Q,N[D]||N[N.length-1]||{})})}function le(N){A.logger.debug("Displayable","Transform applied",e.toStyle(A,i),m.current),k(),r?.(N)}function ce(N,Q){if(!N.current)throw new E("Displayable: Trying to assign properties to unmounted element");ao(N.current,Q,l)}function Ve(){g.current&&(g.current.stop(),g.current=null,A.logger.debug("Displayable","Loop stopped",o))}function pt(){let N=o._getLoop();if(!N){Ve();return}g.current||Tt(N.transform,N.options)}function Tt(N,Q){p&&(p.abort(),h(null)),Ve(),m.current&&(g.current=N.startLoop(e,{gameState:A,ref:m,overwrites:i,companionRefs:c},Q))}function an(N,Q){return dt(new ee({},{duration:N?.duration??0,ease:N?.ease??"linear"}),Q)}function dt(N,Q){p&&(p.abort(),h(null)),Ve();let D=N.animate(e,{gameState:A,ref:m,overwrites:i,companionRefs:c}),_=new Pe(D);return A.timelines.attachTimeline(_),D.onSkipControllerRegister(O=>{O.onAbort(()=>{_.abort(),h(null)})}),h(D),D.then(()=>{h(null),le(N),Q(),pt()}),_}function Ce(N,Q){u&&u.controller.complete();let D=N.createTask(A),_=N.requestAnimations(D.animations),O=new S().registerSkipController(new V(_.cancel)),R=new Pe(O);O.skipController.onAbort(()=>{_.cancel()}),_.onCanceled(()=>{R.abort(),d(null),A.logger.debug("Displayable","Transition cancelled",N)}),_.onComplete(()=>{Ue(),d(null),s?.(N),Q(),O.resolve()}),A.timelines.attachTimeline(R),d({task:D,controller:_,transition:N,resolve:Q});let ue;if(f.current=D.resolve.map(Le=>{let mt=gs.createRef(),_t=typeof Le=="function"?void 0:Le.key;if(!_t)return[mt,y.next()];if(_t==="target")return ue=y.next(),[mt,ue];if(_t==="current")return[mt,T.current];throw new E("Displayable: Invalid key type")}),!ue)throw new E("Displayable: No target key found");return T.current=ue,R}function bt(N){return A.logger.debug("initDisplayable",o),dt(ee.immediate(e.get()),N)}function oe(){t&&p&&(p.abort(),h(null),A.logger.debug("transform skipped")),n&&u&&(u.controller.complete(),A.logger.debug("transition skipped"))}function Je(){return[[gs.createRef(),T.current]]}function Ue(){f.current.forEach(([N])=>{N.current=null}),f.current=Je()}return{transformRef:m,transitionRefs:f.current,transitionTask:u,initDisplayable:bt,applyTransform:dt,applyTransition:Ce,applyLoop:Tt,stopLoop:an,updateStyleSync:B,flush:k,deps:[p,u,f]}}import{useEffect as Sd}from"react";function Ct(o,e,t=[]){let i=G().getLiveGame().getGameState();return Sd(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function Ts({state:o,text:e}){let{ratio:t}=ye(),[n]=ae(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,updateStyleSync:d,deps:p}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:h=>({width:"fit-content",transform:ee.propToCSSTransform(o,h,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return Ct(e,{initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,flush:n,updateStyleSync:d},[...p]),qo.createElement(zt.Div,{"data-element-type":"text"},qo.createElement(zt.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([h,g])=>qo.createElement("span",{key:g,ref:h,className:e.config.className},qo.createElement("span",null,e.state.text)))))}import Mt,{forwardRef as bd,useCallback as sc,useImperativeHandle as Ad,useRef as Xo,useState as ac}from"react";import _o,{useEffect as bs,useRef as Yn,forwardRef as Td}from"react";var rc=Td(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=Yn(null),{ratio:a}=ye(),[l,c]=_o.useState(0),[u,d]=_o.useState(0),p=Yn(null),h=Yn(null),g=G(),m=Yn(!1),y=Yn(null),T=Yn(null);_o.useImperativeHandle(r,()=>s.current,[]),bs(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>{let w=()=>{let k=s.current;return!k||typeof k.decode!="function"?Promise.resolve():k.decode().catch(()=>{})};return m.current?w():(y.current||(y.current=new Promise(k=>{T.current=k})),y.current.then(w))},configurable:!0}})},[]),bs(()=>(f(),a.onUpdate(f)),[o]),bs(()=>{let w=new MutationObserver(k=>{k.forEach(b=>{b.type==="attributes"&&b.attributeName==="src"&&s.current&&f()})});return s.current&&w.observe(s.current,{attributes:!0}),()=>{w.disconnect()}},[o]);function f(){if(s.current&&s.current.naturalWidth){let w,k,b;if(s.current.naturalWidth*s.current.naturalHeight===1)w=a.state.width,k=a.state.height,b=`${w} / ${k}`;else{let le=t?g.config.width/s.current.naturalWidth:1;w=s.current.naturalWidth*a.state.scale*le,k=s.current.naturalHeight*a.state.scale*le,b="auto"}let C=p.current,I=!C||C.w!==w||C.h!==k||C.ar!==b,B=!!o&&h.current!==o;if(!I&&!B)return;I&&(p.current={w,h:k,ar:b},c(w),d(k),s.current.style.aspectRatio=b),o&&(h.current=o,o(w,k))}}function v(){f(),m.current=!0,T.current&&(T.current(),T.current=null,y.current=null),e&&e()}function A(){m.current=!0,T.current&&(T.current(),T.current=null,y.current=null)}return _o.createElement("img",{ref:s,onLoad:v,onError:A,width:l,height:u,alt:"",src:n,style:i})});rc.displayName="AspectScaleImage";var Yo=rc;import lc from"clsx";import{motion as Cd}from"motion/react";var xd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},cc=bd(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=Xo(null),a=Xo([]),l=o.findIndex(c=>c!==null);return Ad(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(c=>!c?.isLoaded||c.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(c=>c?.waitForLoad?c.waitForLoad():Promise.resolve())).then(()=>{})}),[]),Mt.createElement("div",{ref:s},o.map((c,u)=>c===null?null:Mt.createElement(Yo,{key:"layer-"+u,ref:d=>{a.current[u]=d},src:t(c),style:xd,autoFit:e,onSizeChanged:u===l?n:void 0,onLoad:u===l?i:void 0})))});cc.displayName="LayerStack";function wd(o){return{willChange:"filter, opacity",position:"absolute",top:0,left:0,right:0,bottom:0,transform:"none",translate:"none",opacity:1,clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat",filter:`brightness(${1-o})`}}function kd(o){return F.isStaticSrc(o)?o.state.currentSrc:F.getSrcURL(o)??void 0}var Pd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Ed({image:o,state:e}){let[t]=ac(()=>new J),[n,i]=ac([]),{cacheManager:r}=Kt(),s=Xo([]),a=Xo(null),l=F.isLayeredSrc(o)?F.getSrcURLs(o):null;function c(b){return!P.isInlineSrc(b)&&!r.has(b)&&!r.isPreloading(b)&&!s.current.includes(b)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${b}".
57
+ `?[...o,e]:[...o,{...e,revealFrom:t?e.text.length:0}]}function Ll(o,e,t=!1){o(n=>rp(n,e,t))}function sp(o,e,t){return t||(o!==void 0?fe.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new oe(n.text,n.config)):[])}function ap(o,e,t){let n=Math.max(0,e??t);return typeof o=="object"?{enabled:o.enabled??!0,delay:Math.max(0,o.delay??n)}:{enabled:o??!0,delay:n}}function Pl(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Io(o){return o===void 0?void 0:Nn(o)}function Rl(o){return typeof o.tag2=="number"?o.tag2>=o.full.length-1:o.text.length>=o.full.length}function Il({word:o,vertical:e,tateChuYoko:t,done:n,style:i,renderer:r,revealTail:s=0}){let a=o.config.ruby?Ve.createElement("ruby",{className:"align-bottom inline-block"},Ve.createElement("rt",{className:"block text-center"},o.config.ruby),Xr(o.text,e,t,s)):Xr(o.text,e,t,s);return r?Ve.createElement(r,{text:o.text,fullText:o.full,revealed:Rl(o),done:n,style:i,config:o.config,data:o.config.data},a):a}function lp(o,e){return!!e&&Rl(o)}function es({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,writingMode:l,textOrientation:c,tateChuYoko:u,autoFit:p,autoFitMinFontSize:d,...g}){let f=N(),m=f.getLiveGame().getGameState(),y=El(null),[T,h]=Qr(()=>n&&!n.config.useTypeEffect?Jr(n.config.evaluatedWords):[]),[v,A]=ce();if(!n)throw new Error("Dialog state is required");Dn(()=>{if(!(!n.config.action.sentence||y.current))return m.logger.info("Initializing the sentence",n,y.current),m.schedule(({onCleanup:ee})=>{if(!n.config.useTypeEffect){dl(n.config.evaluatedWords,n.config.firedTextEvents??new Set,m),n.dispatchComplete();return}h([]),y.current=le(),v(),y.current.onComplete(()=>{n.dispatchComplete()}),ee(()=>{y.current?.timeline?.abort()})},0)},[]),Dn(()=>n.events.depends([n.events.on(Ne.Events.requestComplete,()=>{y.current?.interact()}),n.events.on(Ne.Events.forceSkip,()=>{n.isEnded()||y.current?.forceSkip()})]).cancel,[n,A]),Dn(()=>n.onFlush(()=>{v()}).cancel,[n]),Dn(()=>f.preference.events.depends([f.preference.onPreferenceChange(q.Preferences.gameSpeed,()=>{y.current?.update()}),f.preference.onPreferenceChange(q.Preferences.autoForward,()=>{y.current?.update()}),f.preference.onPreferenceChange(q.Preferences.cps,()=>{y.current?.update()}),f.preference.onPreferenceChange(q.Preferences.textRevealDuration,()=>{v()})]).cancel,[]);let x=(p??!0)&&!f.config.disableTextScaling,{offsets:k,revealed:b}=op(()=>Dl(T),[T]),w=Kr(n.config.useTypeEffect?f.preference.getPreference(q.Preferences.textRevealDuration):0,f.preference.getPreference(q.Preferences.cps),f.preference.getPreference(q.Preferences.gameSpeed)),{containerRef:D,scale:V}=bl({enabled:x,minFontSize:d??yl,vertical:Ai(l),revealed:b});function le(){let ee=new S,dt=new ke(ee).setGuard(m.guard),Je=new Set,I=n.config.firedTextEvents??new Set,X=new Set,ue=new Set,F=Zr(n.config.evaluatedWords),L=null,te=[],G=[],he=()=>{te.forEach(Be=>Be()),te.length=0},Ge=()=>{if(G.length!==0)return{done:!1,value:G.shift()};let{done:Be,value:We}=F.next();return{done:Be,value:We}},Yt=Be=>{let We=cn=>{Be(cn),X.delete(We)};return X.add(We),{cancel:()=>{X.delete(We)}}},Ft=(Be,We=!1)=>{Ll(h,Be,We)},Xt=(Be=!1)=>{let We=!1;for(;!We;){let{done:cn,value:Ze}=Ge();if(cn){We=!0;break}if(Ke.isPause(Ze)){if(Be)continue;We=!0,G.push(Ze);break}else lt.isTextEvent(Ze)?Do(Ze,I,m):Ze===`
58
+ `?h(rt=>[...rt,Ze]):typeof Ze=="object"&&"text"in Ze&&!Je.has(Ze)&&(Je.add(Ze),Ft(Ze,!0))}L&&!L.isSettled()?L.abort():(ue.forEach(cn=>cn()),ee.resolve())};return m.schedule(async Be=>{let We=!1,cn=!1;for(;!We;){let{done:Ze,value:rt}=Ge();if(Ze){We=cn=!0;break}if(lt.isTextEvent(rt)){Do(rt,I,m);continue}let Fi=new S;if(m.timelines.attachTimeline(Fi),Fi.registerSkipController(new U(()=>{he(),We=!0,Be.retry()})),Fi.onSettled(()=>{he()}),L=Fi,Ke.isPause(rt)){let Oi=Ke.from(rt),Hi=f.preference.getPreference(q.Preferences.gameSpeed);if(Oi.config.duration){let Vi=Oi.config.duration/Hi;await _i(Vi)}else{let Vi=f.preference.getPreference(q.Preferences.autoForward),Ui=S.race([S.create(Yc=>{let Xc=Yt(Qc=>{Qc(),Yc.resolve()});te.push(()=>Xc.cancel())}),...Vi?[S.delay(f.config.autoForwardDefaultPause/Hi)]:[]]);m.timelines.attachTimeline(Ui),await S.wait(Ui)}}else{if(rt!==`
59
+ `&&Je.has(rt))continue;Je.add(rt),Ft(rt);let{gameSpeed:Oi,cps:Hi}=f.preference.getPreferences(),Ui=1e3/((typeof rt=="object"&&"cps"in rt&&rt.cps!==void 0?rt.cps:Hi)*Oi);await _i(Ui)}}cn&&(ue.forEach(Ze=>Ze()),ee.resolve())},0),{getToken:()=>ee,interact:()=>{let Be=!1;X.forEach(We=>We(()=>Be=!0)),!Be&&Xt()},update:()=>{L&&L.abort()},forceSkip:()=>{Xt(!0)},timeline:dt,onComplete:Be=>(ue.add(Be),{cancel:()=>{ue.delete(Be)}})}}let re=n.config.action.sentence;if(!re)return null;let De=s??"bold",St=re.config.fontSize??i,Gt={fontWeight:re.config.bold?De:r,fontSize:Ti(St)??Sl(),color:Io(re.config.color??o),fontFamily:re.config.fontFamily??a,fontStyle:re.config.italic?"italic":void 0},kt=ee=>({fontWeight:ee.config.bold||re.config.bold?De:r,fontSize:Tl(ee.config,St),color:Io(ee.config.color??re.config.color??o),fontFamily:ee.config.fontFamily??re.config.fontFamily??a,fontStyle:ee.config.italic??re.config.italic?"italic":void 0,...Wr(ee.config.emphasis)}),bt=Ai(l),Ue=n.isEnded(),pt=(ee,dt)=>{if(ee===`
60
+ `)return Ve.createElement("br",{key:dt});let Je=kt(ee),I=Ur(ee.config.render),X=lp(ee,I);return Ve.createElement(Kt.Span,{tag:`say.word.${dt}`,key:dt,"data-element-type":X?"interactive-word":void 0,onClick:X?ue=>ue.stopPropagation():void 0,style:{...Je,...Yr(),...Gn(f.config.app.debug,{outline:"1px dashed red"})},className:Ro("inline-block",ee.config.className)},Ve.createElement(Il,{word:ee,vertical:bt,tateChuYoko:u,done:Ue,style:Je,renderer:I,revealTail:$r(w,k[dt]??0,ee.text.length,b,ee.revealFrom??0)}))};return Ve.createElement("div",{...g,ref:D,className:Ro("whitespace-pre-wrap",e),style:{[Lo]:V,...Gn(w.duration>0,{[zr]:`${w.duration}ms`}),...Gt,..._r(l,c),...t}},T.map(pt))}function cp({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:l,defaultColor:c,className:u,style:p,fontSize:d,fontWeight:g,fontWeightBold:f,fontFamily:m,writingMode:y,textOrientation:T,tateChuYoko:h,onCompleted:v,...A}){let x=Qa(),[,k]=Qr(0),b=x?.config??q.DefaultConfig,w=x?.preference.getPreferences()??q.DefaultPreference,D=s??w.cps,V=a??w.gameSpeed,le=l??b.autoForwardDefaultPause,re=r??b.autoForwardDefaultPause,De=Ve.useMemo(()=>sp(o,e,t),[o,e,t]),St=Ve.useMemo(()=>ap(i,r,re),[i,r,re]),Gt=El(v),[kt,bt]=Qr(()=>n?[]:Jr(De));Dn(()=>{if(x)return x.preference.onPreferenceChange(()=>{k(L=>L+1)}).cancel},[x]),Dn(()=>{Gt.current=v},[v]),Dn(()=>{let L=!1,te=[],G=Math.max(.01,V),he=Ft=>new Promise(Xt=>{let Qt=setTimeout(Xt,Math.max(0,Ft));te.push(Qt)}),Ge=()=>{L||Gt.current?.()};return n?De.length===0?(bt([]),()=>{L=!0}):((async()=>{do{let Ft=Zr(De);for(bt([]);!L;){let{done:Xt,value:Qt}=Ft.next();if(Xt)break;if(Ke.isPause(Qt)){let ta=Ke.from(Qt);await he((ta.config.duration??le)/G)}else{if(lt.isTextEvent(Qt))continue;Ll(bt,Qt),Qt===`
61
+ `?await he(Pl(D,V)):await he(Pl(Qt.cps??D,V))}}if(L)return;Ge(),St.enabled&&await he(St.delay)}while(!L&&St.enabled)})(),()=>{L=!0,te.forEach(Ft=>clearTimeout(Ft))}):(bt(Jr(De)),Ge(),()=>{L=!0})},[De,n,St,D,V,le]);let Ue=e?.config,pt=f??"bold",ee={fontWeight:Ue?.bold?pt:g,fontSize:Ue?.fontSize??d,color:Io(Ue?.color??c),fontFamily:Ue?.fontFamily??m,fontStyle:Ue?.italic?"italic":void 0},dt=L=>({fontWeight:L.config.bold||Ue?.bold?pt:g,fontSize:Al(L.config,Ue?.fontSize??d),color:Io(L.config.color??Ue?.color??c),fontFamily:L.config.fontFamily??Ue?.fontFamily??m,fontStyle:L.config.italic??Ue?.italic?"italic":void 0,...Wr(L.config.emphasis)}),Je=Ai(y),I=Kr(n?w.textRevealDuration:0,D,V),{offsets:X,revealed:ue}=Dl(kt),F=(L,te)=>{if(L===`
62
+ `)return Ve.createElement("br",{key:te});let G=dt(L);return Ve.createElement("span",{key:te,style:{...G,...Yr()},className:Ro("inline-block",L.config.className)},Ve.createElement(Il,{word:L,vertical:Je,tateChuYoko:h,done:!1,style:G,renderer:Ur(L.config.render),revealTail:$r(I,X[te]??0,L.text.length,ue,L.revealFrom??0)}))};return Ve.createElement("div",{...A,className:Ro("whitespace-pre-wrap",u),style:{...Gn(I.duration>0,{[zr]:`${I.duration}ms`}),...ee,..._r(y,T),...p}},kt.map(F))}function Ml(o){return Ve.createElement(es,{...o,key:o.dialog?.config.action.id})}function up({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Eo({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Ve.createElement(es,{...r,dialog:s,key:s.config.action.id})}function pp(o){let e=It();return Ve.createElement(es,{...o,dialog:e,key:e.config.action.id})}function vn(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Ve.createElement(up,{...o}):Ve.createElement(pp,{...o})}var dp=vn;import No,{useEffect as mp,useLayoutEffect as fp,useMemo as Gl,useRef as hp,useState as gp}from"react";import Mo from"react";var ts=Mo.createContext(null);function ns(){let o=Mo.useContext(ts);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var is=Mo.createContext(null);function Nl(){let o=Mo.useContext(is);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Go({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let l=hp(null),{register:c,unregister:u,getIndex:p}=Nl(),[d,g]=gp(-1),{choose:f,evaluated:m,gameState:y}=ns(),T=d===-1?null:m[d],h=Gl(()=>we.getCtx({gameState:y}),[y]),{hidden:v,disabled:A}=Gl(()=>{if(!T)return{hidden:!1,disabled:!1};let b=T.config.hidden?.evaluate(h)?.value??!1,w=!b&&(T.config.disabled?.evaluate(h)?.value??!1);return{hidden:b,disabled:w}},[T,h]);fp(()=>{if(!l.current)return;let b=l;c(b);let w=p(b);return g(w),l.current.dataset.index=w.toString(),()=>u(b)},[c,u,p]),mp(()=>{if(!t)return;let b=w=>{w.key.toLowerCase()===t.toLowerCase()&&!w.ctrlKey&&!w.metaKey&&(w.preventDefault(),w.stopPropagation(),x())};return window.addEventListener("keydown",b,!0),()=>{window.removeEventListener("keydown",b,!0)}},[t]);function x(){if(d===-1||!m[d]||v||A)return;let b=m[d];f({...b,evaluated:oe.getText(b.words||[])})}let k=T&&!v;return No.createElement(No.Fragment,null,No.createElement("button",{className:o,style:{...e,display:k?e?.display??void 0:"none"},onClick:x,ref:l,disabled:A},k&&No.createElement(Ml,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Ne({useTypeEffect:!1,action:{sentence:T.prompt,words:T.words,character:null},gameState:y,evaluatedWords:T.words})})))}import Fo from"react";import{AnimatePresence as yp}from"motion/react";function Oo({children:o,...e}){let t=yp;return Fo.createElement(Fo.Fragment,null,Fo.createElement("div",{...e},Fo.createElement(t,null,o)))}import Fl from"react";function sn({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Fl.useContext(Pn),l=e??o?.character??a?.config.action.character??null,c=n??l?.config.color,u=i??t??l?.state.name;return Fl.createElement("div",{...s,style:{color:c?Nn(c):void 0,...r}},u)}import bp from"clsx";import Tp,{useRef as Ap}from"react";import os,{createContext as vp,useContext as Hl,useState as Ol}from"react";var Ln=class Ln{constructor(){this.preloaded=[];this.events=new Q}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(Ln.EventTypes["event:preloaded.add"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this)}get(e){return this.preloaded.find(t=>this.getSrc(t)===e)}has(e){return Array.isArray(e)?e.every(t=>this.has(t)):this.preloaded.some(t=>this.getSrc(t)===e)}remove(e){if(Array.isArray(e)){let n=e.map(i=>this.getSrc(i));return this.preloaded=this.preloaded.filter(i=>!n.includes(this.getSrc(i))),this}let t=this.getSrc(e);return this.preloaded=this.preloaded.filter(n=>this.getSrc(n)!==t),this.events.emit(Ln.EventTypes["event:preloaded.remove"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Re.getSrc(e)}};Ln.EventTypes={"event:preloaded.add":"event:preloaded.add","event:preloaded.remove":"event:preloaded.remove","event:preloaded.change":"event:preloaded.change","event:preloaded.mount":"event:preloaded.mount","event:preloaded.ready":"event:preloaded.ready","event:preloaded.complete":"event:preloaded.complete","event:preloaded.unmount":"event:preloaded.unmount"};var je=Ln;var Ho=class o{constructor(e){this.game=e;this.entries=new Map;this.byUrl=new Map;this.preloadTasks=new Map;this.holds=new Map;this.pinned=new Set;this.seen=new Set;this.blobBytes=0;this.decodedBytes=0;this.game.addSideEffect(()=>{this.abortAll(),this.clear()})}static getImage(e,t,n){return ca(e,{...n,signal:t})}static async decodeImage(e){if(typeof window>"u"||typeof window.Image>"u")return null;let t=new window.Image;if(t.src=e,typeof t.decode!="function")return null;try{await t.decode()}catch{return null}return t}static estimateDecodedBytes(e){return(e.naturalWidth||0)*(e.naturalHeight||0)*4}static readBudget(e){return typeof e=="number"&&!Number.isNaN(e)?Math.max(0,e):1/0}has(e){return this.entries.has(e)}wasCached(e){return this.seen.has(e)}add(e,t){return this.insert(e,t,0),this}remove(e){let t=this.entries.get(e);return t&&this.drop(t),this}get(e){let t=this.entries.get(e);if(t)return this.touch(t),t.url}isDecoded(e){return!!this.entries.get(e)?.decoded}clear(){for(let e of[...this.entries.values()])this.drop(e);return this.seen.clear(),this}size(){return this.entries.size}isPreloading(e){return this.preloadTasks.has(e)}preload(e,t,n){let i=n?.retainDecoded===!0,r=this.entries.get(t);if(r&&(!i||r.decoded))return this.touch(r),o.settledToken();let s=this.preloadTasks.get(t);if(s)return this.followTask(s,e,t,n);if(r)return this.touch(r),this.runTask(e,t,new AbortController,()=>this.decodeAgain(t,r.url));let a=t,l={};this.game.hooks.rawTrigger("preloadImage",()=>[a,(u,p)=>{a=u,l={...l,...p}}]);let c=new AbortController;return this.runTask(e,t,c,()=>this.fetchAndDecode(t,a,c.signal,l,i))}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.entries.values(),e=>e.url)}retain(e){let t=new Set(e);for(let n of[...this.entries.values()])n.stale=!t.has(n.name),n.stale&&!this.isPinned(n)&&this.drop(n);return this}pin(e){return this.pinned=new Set(e),this.enforce(),this}hold(e){this.holds.set(e,(this.holds.get(e)??0)+1)}release(e){let t=this.holds.get(e);if(t===void 0)return;if(t>1){this.holds.set(e,t-1);return}this.holds.delete(e);let n=this.byUrl.get(e);if(n){if(n.stale&&!this.isPinned(n)){this.drop(n);return}this.enforce()}}getStats(){let e=0,t=0;for(let n of this.entries.values())n.decoded&&e++,this.isPinned(n)&&t++;return{entries:this.entries.size,blobBytes:this.blobBytes,decodedEntries:e,decodedBytes:this.decodedBytes,pinned:t,budget:this.budget()}}budget(){return{blobBytes:o.readBudget(this.game.config?.imageCacheBudgetBytes),decodedBytes:o.readBudget(this.game.config?.decodedImageBudgetBytes)}}isPinned(e){return this.pinned.has(e.name)||this.holds.has(e.url)}touch(e){this.entries.delete(e.name),this.entries.set(e.name,e)}insert(e,t,n){let i=this.entries.get(e);if(i){if(i.url===t)return this.touch(i),i;this.drop(i)}let r={name:e,url:t,bytes:n,decoded:null,decodedBytes:0,stale:!1};return this.entries.set(e,r),this.byUrl.set(t,r),this.seen.add(e),this.blobBytes+=n,this.enforce(),r}drop(e){this.dropDecoded(e),e.url.startsWith("blob:")&&URL.revokeObjectURL(e.url),this.blobBytes-=e.bytes,this.entries.delete(e.name),this.byUrl.get(e.url)===e&&this.byUrl.delete(e.url)}dropDecoded(e){e.decoded&&(this.decodedBytes-=e.decodedBytes,e.decoded=null,e.decodedBytes=0)}retainDecoded(e,t){this.dropDecoded(e),e.decoded=t,e.decodedBytes=o.estimateDecodedBytes(t),this.decodedBytes+=e.decodedBytes,this.enforce()}enforce(){let e=this.budget();if(this.blobBytes>e.blobBytes)for(let t of[...this.entries.values()]){if(this.blobBytes<=e.blobBytes)break;this.isPinned(t)||this.drop(t)}if(this.decodedBytes>e.decodedBytes)for(let t of this.entries.values()){if(this.decodedBytes<=e.decodedBytes)break;t.decoded&&!this.isPinned(t)&&this.dropDecoded(t)}}async fetchAndDecode(e,t,n,i,r){let{url:s,bytes:a}=await o.getImage(t,n,i);if(!s||(this.insert(e,s,a),this.entries.get(e)?.url!==s))return;let l=await o.decodeImage(s),c=this.entries.get(e);if(!c||c.url!==s){URL.revokeObjectURL(s);return}l&&r&&this.retainDecoded(c,l)}async decodeAgain(e,t){let n=await o.decodeImage(t),i=this.entries.get(e);n&&i&&i.url===t&&!i.decoded&&this.retainDecoded(i,n)}runTask(e,t,n,i){let r={promise:Promise.resolve(),controller:n,errorHandlers:[],failed:!1};r.promise=Promise.resolve().then(i).then(()=>{this.preloadTasks.delete(t)}).catch(a=>{r.failed=!0,this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${a}`),r.errorHandlers.forEach(l=>l(a))}),this.preloadTasks.set(t,r);let s={abort:()=>{n.abort(),this.preloadTasks.delete(t)},onFinished:a=>(r.promise.then(a),s),onErrored:a=>(r.errorHandlers.push(a),s)};return s}followTask(e,t,n,i){let r={abort:()=>{},onFinished:s=>(e.promise.then(()=>{if(e.failed){s();return}this.preload(t,n,i).onFinished(s)}),r),onErrored:s=>(e.errorHandlers.push(s),r)};return r}static settledToken(){let e={abort:()=>{},onFinished:t=>(Promise.resolve().then(t),e),onErrored:()=>e};return e}};var Vo=vp(null);function Vl({children:o}){let e=N(),[t]=Ol(()=>new je),[n]=Ol(()=>new Ho(e));return os.createElement(os.Fragment,null,os.createElement(Vo,{value:{preloaded:t,cacheManager:n}},o))}function $t(){if(!Vo)throw new Error("usePreloaded must be used within a PreloadedProvider");return Hl(Vo)}function Ul(){return Hl(Vo)}import{useLayoutEffect as Bl,useRef as Sp}from"react";function Uo(o){let e=Ul()?.cacheManager??null,t=Sp(null),n=()=>{t.current?.release(),t.current=null};Bl(()=>{let i=o.current;if(t.current?.element===i||(n(),!i||!e||typeof MutationObserver>"u"))return;let r=null,s=()=>{let l=i.getAttribute("src");l!==r&&(r!==null&&e.release(r),r=l,r!==null&&e.hold(r))},a=new MutationObserver(s);t.current={element:i,release:()=>{a.disconnect(),r!==null&&(e.release(r),r=null)}},s(),a.observe(i,{attributes:!0,attributeFilter:["src"]})}),Bl(()=>n,[])}function Wl(){let o=It(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return wp(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?O.getSrcURL(s):null,l=s&&O.isTagSrc(s)?[...s.state.currentSrc]:null,c=Wa({character:n,sentence:i,portrait:s,currentSrc:a,tags:l,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=xp(c.source);return{visible:!!u,src:u,character:c.character,portrait:c.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function Cp({className:o,style:e,alt:t,...n}){let i=Wl(),{cacheManager:r}=$t(),s=Ap(null);if(Uo(s),!i.visible||!i.src)return null;let a=r.get(i.src)||i.src;return Tp.createElement("img",{...n,ref:s,"data-element-type":"dialog-avatar",className:bp("dialog-avatar",o),src:a,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function xp(o){return o?P.srcToURL(o):null}function wp(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var rs=Cp;import{useEffect as kp}from"react";function Pp(){let o=It(),[e]=ce(o.deps),t=oe.getText(o.config.evaluatedWords);return kp(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]),{done:o.isEnded(),text:t,isNarrator:o.config.action.character===null||o.config.action.character.state.name==="",metadata:o.config.action.sentence?.getMetadata()}}import{useCallback as Bo,useEffect as ss,useMemo as Ep,useRef as Dp,useState as zl}from"react";function Lp(){let o=It(),[e]=ce(o.deps),[t,n]=zl(!0),[i,r]=zl(!0),s=Dp(null),a=o.config.gameState,l=o.config.action.sentence,c=l?.config.voiceId??null;ss(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]);let u=Ep(()=>{if(!l)return null;try{return it.getVoice(a,l)}catch{return null}},[a,l,c,l?.config.voice]);ss(()=>{s.current=null,r(!0)},[l]),ss(()=>{let m=!1,y=null,T=null,h=null;if(!u){n(!0);return}n(!1);let v=()=>{m||n(!0)};y=a.audioManager.getToken(u),y&&(y.isPlaying()||n(!0),T=()=>v(),h=()=>v(),y.once("ended",T),y.once("stop",h));let A=a.events.on(R.EventTypes["event:state.player.lineEnd"],()=>{v()});return()=>{m=!0,A.cancel(),y&&T&&y.off("ended",T),y&&h&&y.off("stop",h)}},[a,u]);let p=Bo(async m=>{let y=m??u;if(!y)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let T=y instanceof URL?ge.voice(y.toString()):typeof y=="string"?ge.voice(y):y,h=await a.getLiveGame().playSound(T);s.current=h;let v=()=>{r(!0)};return h.once("ended",v),h.once("stop",v),h},[a,u]),d=Bo(()=>u,[u]),g=Bo(()=>c,[c]),f=Bo(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:p,getVoice:d,getVoiceId:g,getVoiceSrc:f}}import as,{createContext as Wp,useContext as zp,useEffect as jl,useRef as Kp}from"react";import{useState as Rp}from"react";function Wo(o){let[e]=Rp(o);return e}import{AnimatePresence as Ip}from"motion/react";var zo=Ip;import ki,{createContext as Op,useContext as Hp,useEffect as Vp,useRef as Up}from"react";import{useEffect as Ci,useLayoutEffect as Mp}from"react";function Np(){let o=Wt(),[e]=ce();return Ci(()=>o.onChange(e).cancel,[]),o.getPathname()}function Gp(){let{router:o,path:e}=wi(),[t]=ce();return Ci(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function Fp(){let o=Wt(),[e]=ce();return Ci(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function Ko(o,e){let t=Wt();Mp(()=>t.onUpdate(()=>o(t)).cancel,e),Ci(()=>{o(t)},[])}function xi(){let o=Wt(),[e]=ce();return Ci(()=>o.onChange(e).cancel,[]),e}var Kl=Op(null);function Pi({children:o,path:e,consumedBy:t}){let i={router:Wt(),path:e,consumedBy:t};return ki.createElement(Kl,{value:i},o)}function wi(){let o=Hp(Kl);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new E(`Invalid useLayout call: Trying to access layout without a parent.
63
+ This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function Bp({children:o,name:e,propagate:t}){let n=N(),[i]=ce(),{path:r,router:s,consumedBy:a}=wi(),l=s.joinPath(r,e),c=Wo(()=>s.createToken(l+"@layout")),u=s.getCurrentPath(),p=Up(!1),d=f=>{p.current=f,i()},g=s.matchPath(u,l);if(xi(),Ko(f=>{let m=f.matchPath(f.getCurrentPath(),l);if(p.current&&!m){if(!o){d(!1);return}f.registerUnmountingPath(c)}m&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(c),m&&!p.current&&!f.isTransitioning()&&d(!0)},[g,o]),Vp(()=>{if(!g)return;let f=s.mount(l);return()=>{f.cancel()}},[l,s,g]),a)throw new E("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return ki.createElement(Pi,{path:l},ki.createElement(zo,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(c),d(!1)}},g&&p.current&&o))}function $l({children:o}){return xi(),ki.createElement(Pi,{path:gn.rootPath},ki.createElement(Co,{"data-layout-path":gn.rootPath,key:gn.rootPath},o))}var ls=Wp(null);function $p(){return zp(ls)}function jp({children:o,name:e}){let[t]=ce(),{path:n,router:i,consumedBy:r}=wi(),s=$p(),a=s?.name??e,l=a??n+"@default",c=a?i.joinPath(n,a):n,u=Wo(()=>i.createToken(c+"@page")),p=i.getCurrentPath(),d=!a,g=Kp(!1),f=h=>{g.current=h,t()},m=d&&i.exactMatch(p,n)||i.exactMatch(p,c);if(r&&r!==l)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");xi(),Ko(h=>{let v=d&&h.exactMatch(h.getCurrentPath(),n)||h.exactMatch(h.getCurrentPath(),c);if(g.current&&!v){if(!o){f(!1);return}h.registerUnmountingPath(u)}v&&h.isPathsUnmounting()&&h.unregisterUnmountingPath(u),v&&!g.current&&!h.isTransitioning()&&f(!0)},[m,o]),jl(()=>{if(!m)return;let h=d?i.mountDefaultHandler(c):i.mount(c);return i.emitOnPageMount(),()=>{h.cancel()}},[c,m]),jl(()=>()=>{i.unregisterUnmountingPath(u),f(!1)},[]);let y=as.createElement(Pi,{path:n,consumedBy:l},as.createElement(zo,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),f(!1)}},m&&g.current&&o));return(h=>s?as.createElement(ls,{value:{name:null}},h):h)(y)}import cs,{useCallback as qp,useEffect as us,useImperativeHandle as _p,useMemo as ql,useRef as ps,useState as Yp}from"react";var Xp=50,Qp={position:"relative",width:"100%",height:"100%",overflow:"hidden"},_l={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function Jp(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Yl(o,e){return e==null?o:Math.max(o,e)}function Zp(o,e,t){return o<=0||e<=0||t<=0?{width:o,height:e}:o/e>t?{width:e*t,height:e}:{width:o,height:o/t}}var Xl=cs.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:l,dataAttributes:c,onUpdate:u,children:p},d){let g=ps(null),[f,m]=Yp({..._l,width:"0px",height:"0px"}),y=ps(u),T=ps(null);us(()=>{y.current=u},[u]);let h=qp(()=>{let x=g.current;if(!x)return;let k=x.clientWidth,b=x.clientHeight;if(k<=0||b<=0||e<=0)return;let w=Zp(k,b,e),D=Yl(w.width,n),V=Yl(w.height,i),le=T.current;(!le||le.width!==D||le.height!==V)&&(T.current={width:D,height:V},m({..._l,width:`${D}px`,height:`${V}px`}));let re=t>0?D/t:1;y.current?.({width:D,height:V,scale:re,containerWidth:k,containerHeight:b})},[e,t,n,i]),v=ql(()=>aa(h,typeof r=="number"?r:Xp),[h,r]);us(()=>{h()},[h]),us(()=>{let x=new ResizeObserver(()=>{v()});g.current&&x.observe(g.current);let k=()=>{v()};return window.addEventListener("resize",k),()=>{x.disconnect(),window.removeEventListener("resize",k)}},[v]),_p(d,()=>({requestUpdate:h}),[h]);let A=ql(()=>Jp(c),[c]);return cs.createElement("div",{id:l,ref:g,style:Qp,...A},cs.createElement("div",{className:s,style:{...f,...a}},p))}),Ql=Xl;function ed(){return N().getLiveGame()}import fs from"react";import td,{createContext as nd,useContext as id,useEffect as od,useState as Jl}from"react";var rd={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Zl=nd({state:rd,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function jt(){return id(Zl)}function ds(){let{dialogs:o}=jt();return o}function sd(){let{isActive:o}=jt();return o}function ad(){let{isVisible:o}=jt();return o}function ms({children:o}){let t=N().getLiveGame().getGameState(),[n,i]=Jl(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=Jl(null);od(()=>{let l=f=>({...f,dialogs:[...f.dialogs]}),c=t.events.on(R.EventTypes["event:state.nvl.enter"],(f,m)=>{i(l(t.getNvlState())),s(m?.showTransition||null)}),u=t.events.on(R.EventTypes["event:state.nvl.exit"],()=>{i(l(t.getNvlState()))}),p=t.events.on(R.EventTypes["event:state.nvl.dialogAppend"],()=>{i(l(t.getNvlState()))}),d=t.events.on(R.EventTypes["event:state.nvl.visibilityChange"],(f,m)=>{i(l(t.getNvlState())),s(m||null)}),g=t.events.on(R.EventTypes["event:state.nvl.change"],f=>{i(l(f))});return()=>{c.cancel(),u.cancel(),p.cancel(),d.cancel(),g.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return td.createElement(Zl.Provider,{value:a},o)}import{AnimatePresence as ld,motion as cd}from"motion/react";import ud from"clsx";function hs({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=jt(),{ratio:r}=ye(),s=N(),a=i?.duration?i.duration/1e3:.3;return fs.createElement(ld,null,n&&fs.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},fs.createElement(cd.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:ud("w-full h-full overflow-auto",e),style:{transform:s.config.useAspectScale?`scale(${r.state.scale})`:void 0,transformOrigin:"top left",width:s.config.useAspectScale?s.config.width:"100%",height:s.config.useAspectScale?s.config.height:"100%",...t}},o)))}import Rn from"react";function gs({renderDialogItem:o,dialogs:e}){return Rn.createElement(hs,{className:"bg-black/80 text-white p-16 inset-8"},Rn.createElement("div",{"data-element-type":"nvl-dialog-list",className:"flex flex-col space-y-4 p-4"},(e??[]).map((n,i)=>{let r=n.entry.character?Rn.createElement(sn,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Rn.createElement(vn,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Rn.createElement("div",{key:`${n.entry.id}:${n.isActive?"active":"idle"}`,"data-element-type":"nvl-dialog-item","data-dialog-index":i,className:"nvl-dialog-item"},o?o({entry:n.entry,index:i,isActive:n.isActive,nametag:r,texts:s}):Rn.createElement(Rn.Fragment,null,r,s))})))}import vt,{useMemo as pd}from"react";import ec from"clsx";function dd({children:o,className:e,style:t,renderDialogItem:n}){let i=ds(),{state:r}=jt();return vt.createElement("div",{"data-element-type":"nvl-dialog-list",className:ec("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>vt.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},vt.createElement(md,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?vt.createElement(sn,{className:"nvl-character-name font-bold mr-2"}):null,texts:vt.createElement(vn,{className:"nvl-dialog-text"})}):o?vt.Children.map(o,l=>vt.isValidElement(l)?vt.cloneElement(l,{entry:s,index:a}):l):vt.createElement(tc,{entry:s,index:a})))))}function tc({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??vt.createElement(vn,{className:"nvl-dialog-text"});return vt.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:ec("nvl-dialog-item",t),style:n},r&&vt.createElement(sn,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function md({entry:o,children:e}){let n=N().getLiveGame().getGameState(),i=pd(()=>o.sentence.evaluate(we.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",l=Eo({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return vt.createElement(Pn,{value:l},e)}import $o from"react";import{createPortal as fd}from"react-dom";var ys=$o.createContext(null),hd={Portal:()=>null,measure:()=>null,container:null};function gd(){let o=$o.useContext(ys);return $o.useMemo(()=>{if(!o)return hd;let e=t=>{let n=o.offsetWidth;return!n||!t.width?1:t.width/n};return{container:o,Portal:({children:t})=>fd($o.createElement("div",{style:{position:"absolute",left:0,top:0,pointerEvents:"auto"}},t),o),measure:t=>{if(!t)return null;let n=o.getBoundingClientRect(),i=e(n),r=t.getBoundingClientRect(),s=(r.left-n.left)/i,a=(r.top-n.top)/i,l=r.width/i,c=r.height/i;return{left:s,top:a,width:l,height:c,right:s+l,bottom:a+c}}}},[o])}import{useEffect as yd}from"react";function vd(o){let e=N();yd(()=>{if(!o)return;let t=e.getLiveGame().getGameState();if(t)return t.suspendAdvance()},[o,e])}var jo=class{constructor(e,t){this.emit=e;this.options=t;this.held=!1;this.delayTimer=null;this.repeatTimer=null}isHeld(){return this.held}press(){this.held||(this.clearTimers(),this.held=!0,this.emit(!1),this.options.delay===0?this.startRepeating():this.delayTimer=setTimeout(()=>{this.delayTimer=null,this.startRepeating()},this.options.delay))}release(){this.clearTimers(),this.held=!1}dispose(){this.release()}startRepeating(){this.repeatTimer=setInterval(()=>{this.emit(!0)},this.options.interval)}clearTimers(){this.delayTimer!==null&&(clearTimeout(this.delayTimer),this.delayTimer=null),this.repeatTimer!==null&&(clearInterval(this.repeatTimer),this.repeatTimer=null)}};function ic({state:o}){let e=N(),t=Wt(),[n]=yn(q.Preferences.skipDelay),[i]=yn(q.Preferences.skipInterval),[r]=En("skipAction");return bd(()=>{if(!e.getLiveGame().gameState.playerCurrent){o.logger.warn("KeyEventAnnouncer","Failed to listen to playerElement events");return}if(!window){o.logger.warn("KeyEventAnnouncer","Failed to listen to window events");return}let a=new jo(u=>{o.events.emit(R.EventTypes["event:state.player.skip"],u)},{delay:n,interval:i}),l=u=>{o.isAdvanceSuspended()||e.keyMap.match("skipAction",u.key)&&e.preference.getPreference(q.Preferences.skip)&&(a.isHeld()||o.logger.verbose("KeyEventAnnouncer","Skipping"),a.press())},c=u=>{e.keyMap.match("skipAction",u.key)&&a.release()};if(e.config.useWindowListener){let u=e.getLiveGame().onWindowEvent("keydown",l).cancel,p=e.getLiveGame().onWindowEvent("keyup",c).cancel;return()=>{a.dispose(),u(),p()}}else{let u=e.getLiveGame().onPlayerEvent("keydown",l).cancel,p=e.getLiveGame().onPlayerEvent("keyup",c).cancel;return()=>{a.dispose(),u(),p()}}},[t,n,i,r]),nc.createElement(nc.Fragment,null)}import rc,{useEffect as Td}from"react";function oc({onStage:o,dialogShown:e,advanceSuspended:t}){return o?e?t?"ignore":"advance":"restoreDialog":"ignore"}function Ad(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var sc=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],Cd=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]','[data-element-type="interactive-word"]','[data-element-type="dialog-overlay"]'];function xd(o,e){return!o||e&&sc.some(t=>!!o.closest(t))?!1:[...Cd,...sc].some(t=>!!o.closest(t))}function ac(o,e){if(!e)return!1;let t=e.getBoundingClientRect();return o.clientX>=t.left&&o.clientX<=t.right&&o.clientY>=t.top&&o.clientY<=t.bottom}function lc({state:o}){let e=N();return Td(()=>{let t=e.getLiveGame().gameState?.playerCurrent;if(!t){o.logger.warn("StageClickAnnouncer","Failed to listen to playerElement events");return}let n=i=>{let r=i.target;if(!r||!t.contains(r)||!ac(i,t))return;let s=o.mainContentNode;if(s&&(!s.contains(r)||!ac(i,s))||Ad(r)||xd(r,o.isNvlMode()))return;let a=oc({onStage:!0,dialogShown:e.preference.getPreference(q.Preferences.showDialog),advanceSuspended:o.isAdvanceSuspended()});if(a!=="ignore"){if(a==="restoreDialog"){e.preference.setPreference(q.Preferences.showDialog,!0);return}o.events.emit(R.EventTypes["event:state.player.stageClick"]),o.recordStageClick()}};if(e.config.useWindowListener){let i=e.getLiveGame().onWindowEvent("click",n);return()=>{i.cancel()}}else{let i=e.getLiveGame().onPlayerEvent("click",n);return()=>{i.cancel()}}},[e,o]),rc.createElement(rc.Fragment,null)}import{useEffect as cc}from"react";function vs({gameState:o}){let e=o.audioManager,[t,n]=yn("globalVolume");return cc(()=>{n(e.getGlobalVolume())},[]),cc(()=>{e.setGlobalVolume(t)},[t]),null}import{useEffect as qo,useRef as wd}from"react";function uc(o){let e=Re.catSrc(o.srcManager?.src||[]),t=Re.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=[],s=new Set,a=o.state?.backgroundImage?.state?.currentSrc;if(P.isImageSrc(a)){let l=P.srcToURL(a);l&&(s.add(l),n.push(l))}for(let l of e.image){let c=Re.getSrc(l);!c||s.has(c)||(s.add(c),i.push(c))}for(let l of t.image){let c=Re.getSrc(l);!c||s.has(c)||(s.add(c),r.push(c))}return{firstFrame:n,critical:i,lookAhead:r,all:[...n,...i,...r],criticalAudio:e.audio}}function pc({state:o}){let{preloaded:e,cacheManager:t}=$t(),n=N(),i=wd(new Set),[r]=ce(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),l=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,c=n.getLiveGame().story;function u(){o.logger.debug(s,"Preload unmounted"),e.events.emit(je.EventTypes["event:preloaded.unmount"])}return qo(()=>o.events.on(R.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),qo(()=>{if(typeof fetch>"u")return e.events.emit(je.EventTypes["event:preloaded.complete"]),e.events.emit(je.EventTypes["event:preloaded.ready"]),o.logger.warn(s,"Fetch is not supported in this environment, skipping preload"),u;if(!n.config.preloadAllImages)return e.events.emit(je.EventTypes["event:preloaded.complete"]),e.events.emit(je.EventTypes["event:preloaded.ready"]),o.logger.debug(s,"Preload all images is disabled, skipping preload"),u;if(n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(s,"Cache cleared")),!c||!a)return c?o.logger.debug(s,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(s,"Story not found, skipping preload"),u;let p=performance.now(),d=uc(a);t.pin(d.firstFrame).retain(d.all);let g=()=>{let k=t.getStats(),b=w=>(w/(1024*1024)).toFixed(1);return`loaded ${k.entries} images in ${(performance.now()-p).toFixed(0)}ms (${b(k.blobBytes)} MB fetched, ${b(k.decodedBytes)} MB decoded, ${k.pinned} pinned)`},f=new Tn(n.config.preloadConcurrency,0),m=new Tn(n.config.preloadConcurrency,0),y=new Tn(n.config.preloadConcurrency,n.config.preloadDelay),T=o.logger.group(s,!0),h=!1;o.logger.debug(s,"preloading:",d,a);let v=(k,b,w,D)=>{b.forEach((V,le)=>{if(t.has(V)&&(!D||t.isDecoded(V))){o.logger.debug(s,`Image already loaded (${w} ${le+1}/${b.length})`,V);return}k.addTask(()=>new Promise(re=>{t.preload(o,V,{retainDecoded:D}).onFinished(()=>{o.logger.debug(s,`Image loaded (${w} ${le+1}/${b.length})`,V),re()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${w} ${le+1}/${b.length})`,V),re()})}))})};v(f,d.firstFrame,"first frame",!0),v(m,d.critical,"first scene",!0),v(y,d.lookAhead,"look-ahead",!1),o.audioManager.retainOnly(d.criticalAudio),T.end();let A=()=>{e.events.emit(je.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(je.EventTypes["event:preloaded.ready"])},x=n.config.preloadGate!=="scene";return f.start().then(async()=>{o.logger.info(s,"Image preload (first frame)",g()),x&&A(),!h&&(await m.start(),o.logger.info(s,"Image preload (first scene)",g()),x||A(),!h&&(await y.start(),!h&&o.logger.info(s,"Image preload (look-ahead)",g())))}),n.config.waitForPreload||e.events.emit(je.EventTypes["event:preloaded.ready"]),e.events.emit(je.EventTypes["event:preloaded.mount"]),()=>{h=!0,u()}},[a,c]),qo(()=>{i.current.clear()},[a]),qo(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!c){o.logger.weakWarn(s,"Story not found, skipping preload");return}let p=performance.now(),d=n.getLiveGame().getAllPredictableActions(c,l,n.config.maxPreloadActions).map(h=>Re.getPreloadableSrc(c,h)).filter(function(h){return h!==null});d.filter(function(h){return h?.activeType==="scene"}).forEach(h=>{i.current.has(h)||i.current.add(h)});let f=Re.catSrc([...i.current,...d]),m=new Tn(n.config.preloadConcurrency,n.config.preloadDelay),y=[],T=o.logger.group(s);o.logger.debug(s,"preloading:",f);for(let h of f.image){let v=Re.getSrc(h);if(v){if(y.push(v),t.has(v)||t.isPreloading(v)){o.logger.debug(s,`Image already loaded (${f.image.indexOf(h)+1}/${f.image.length})`,v);continue}m.addTask(()=>new Promise(A=>{t.preload(o,v).onFinished(()=>{o.logger.debug(s,`Image loaded (${f.image.indexOf(h)+1}/${f.image.length})`,v),A()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${f.image.indexOf(h)+1}/${f.image.length})`,v),A()})}))}}T.end(),t.retain(y),m.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-p}ms`)})},[l,c]),null}import Ei from"react";import Yo from"react";import Ss,{useEffect as bs,useLayoutEffect as Ts,useRef as _o,useState as As}from"react";function qt({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:l,companionRefs:c}){let[u,p]=As(null),[d,g]=As(null),f=_o(null),m=Ss.useRef(null),[y]=As(()=>new zi("displayable.refGroup")),T=_o(y.next()),h=_o(dt()),A=N().getLiveGame().getGameState(),x=typeof a=="function"?a(u):a,[k]=ce([d,u,h]);bs(()=>A.events.depends([A.events.on(R.EventTypes["event:state.player.skip"],ee)]).cancel,[d,u,h]),Ts(()=>{if(V(),!u)return;if(h.current.some(([te])=>!te.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:I,task:X}=u,ue=te=>{h.current.forEach(([G],he)=>{let Ge=X.resolve[he],Yt=typeof Ge=="function"?Ge:Ge.resolver;if(!Yt)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${he}])`);let Ft=Yt(...te),Xt=j(x[he]||x[x.length-1]||{},Ft);re(G,l?l(Xt):Xt)})},F=I.onUpdate(ue);ue(X.animations.map(te=>te.start));let L=!1;return Promise.all(h.current.map(([te])=>{let G=te.current;return G?.waitForLoad?G.waitForLoad():Promise.resolve()})).then(()=>{L||I.start()}),()=>{L=!0,F.cancel()}},[u]),bs(()=>{if(!m.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),Ts(()=>{let I=e.toStyle(A,i);return Object.assign(m.current.style,I),D(),A.logger.debug("Displayable","Initial style applied",m.current,I),St(),()=>{De()}},[]);let b=_o(()=>{});b.current=()=>{u||!m.current||(V(),!(d||f.current)&&(Object.assign(m.current.style,e.toStyle(A,i)),D()))},Ts(()=>{f.current&&!o._getLoop()&&De(),b.current()});let{ratio:w}=ye();bs(()=>w.onUpdate(()=>{b.current(),requestAnimationFrame(()=>b.current())}),[w]);function D(){if(c)for(let{ref:I,project:X}of c)I.current&&Object.assign(I.current.style,X(e.get()))}function V(){let I=typeof a=="function"?a(u):a;if(!h.current||!h.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");h.current.some(([X])=>!X.current)||h.current.forEach(([X],ue)=>{re(X,I[ue]||I[I.length-1]||{})})}function le(I){A.logger.debug("Displayable","Transform applied",e.toStyle(A,i),m.current),k(),r?.(I)}function re(I,X){if(!I.current)throw new E("Displayable: Trying to assign properties to unmounted element");ao(I.current,X,l)}function De(){f.current&&(f.current.stop(),f.current=null,A.logger.debug("Displayable","Loop stopped",o))}function St(){let I=o._getLoop();if(!I){De();return}f.current||Gt(I.transform,I.options)}function Gt(I,X){d&&(d.abort(),g(null)),De(),m.current&&(f.current=I.startLoop(e,{gameState:A,ref:m,overwrites:i,companionRefs:c},X))}function kt(I,X){return bt(new Z({},{duration:I?.duration??0,ease:I?.ease??"linear"}),X)}function bt(I,X){d&&(d.abort(),g(null)),De();let ue=I.animate(e,{gameState:A,ref:m,overwrites:i,companionRefs:c}),F=new ke(ue);return A.timelines.attachTimeline(F),ue.onSkipControllerRegister(L=>{L.onAbort(()=>{F.abort(),g(null)})}),g(ue),ue.then(()=>{g(null),le(I),X(),St()}),F}function Ue(I,X){u&&u.controller.complete();let ue=I.createTask(A),F=I.requestAnimations(ue.animations),L=new S().registerSkipController(new U(F.cancel)),te=new ke(L);L.skipController.onAbort(()=>{F.cancel()}),F.onCanceled(()=>{te.abort(),p(null),A.logger.debug("Displayable","Transition cancelled",I)}),F.onComplete(()=>{Je(),p(null),s?.(I),X(),L.resolve()}),A.timelines.attachTimeline(te),p({task:ue,controller:F,transition:I,resolve:X});let G;if(h.current=ue.resolve.map(he=>{let Ge=Ss.createRef(),Yt=typeof he=="function"?void 0:he.key;if(!Yt)return[Ge,y.next()];if(Yt==="target")return G=y.next(),[Ge,G];if(Yt==="current")return[Ge,T.current];throw new E("Displayable: Invalid key type")}),!G)throw new E("Displayable: No target key found");return T.current=G,te}function pt(I){return A.logger.debug("initDisplayable",o),bt(Z.immediate(e.get()),I)}function ee(){t&&d&&(d.abort(),g(null),A.logger.debug("transform skipped")),n&&u&&(u.controller.complete(),A.logger.debug("transition skipped"))}function dt(){return[[Ss.createRef(),T.current]]}function Je(){h.current.forEach(([I])=>{I.current=null}),h.current=dt()}return{transformRef:m,transitionRefs:h.current,transitionTask:u,initDisplayable:pt,applyTransform:bt,applyTransition:Ue,applyLoop:Gt,stopLoop:kt,updateStyleSync:V,flush:k,deps:[d,u,h]}}import{useEffect as kd}from"react";function At(o,e,t=[]){let i=N().getLiveGame().getGameState();return kd(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function Cs({state:o,text:e}){let{ratio:t}=ye(),[n]=ce(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,updateStyleSync:p,deps:d}=qt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:g=>({width:"fit-content",transform:Z.propToCSSTransform(o,g,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return At(e,{initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,flush:n,updateStyleSync:p},[...d]),Yo.createElement(Kt.Div,{"data-element-type":"text"},Yo.createElement(Kt.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([g,f])=>Yo.createElement("span",{key:f,ref:g,className:e.config.className},Yo.createElement("span",null,e.state.text)))))}import Nt,{forwardRef as Ed,useCallback as mc,useImperativeHandle as Dd,useRef as Jo,useState as fc}from"react";import Xo,{useEffect as xs,useRef as Yn,forwardRef as Pd}from"react";var dc=Pd(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=Yn(null),{ratio:a}=ye(),[l,c]=Xo.useState(0),[u,p]=Xo.useState(0),d=Yn(null),g=Yn(null),f=N(),m=Yn(!1),y=Yn(null),T=Yn(null);Xo.useImperativeHandle(r,()=>s.current,[]),Uo(s),xs(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>{let x=()=>{let k=s.current;return!k||typeof k.decode!="function"?Promise.resolve():k.decode().catch(()=>{})};return m.current?x():(y.current||(y.current=new Promise(k=>{T.current=k})),y.current.then(x))},configurable:!0}})},[]),xs(()=>(h(),a.onUpdate(h)),[o]),xs(()=>{let x=new MutationObserver(k=>{k.forEach(b=>{b.type==="attributes"&&b.attributeName==="src"&&s.current&&h()})});return s.current&&x.observe(s.current,{attributes:!0}),()=>{x.disconnect()}},[o]);function h(){if(s.current&&s.current.naturalWidth){let x,k,b;if(s.current.naturalWidth*s.current.naturalHeight===1)x=a.state.width,k=a.state.height,b=`${x} / ${k}`;else{let le=t?f.config.width/s.current.naturalWidth:1;x=s.current.naturalWidth*a.state.scale*le,k=s.current.naturalHeight*a.state.scale*le,b="auto"}let w=d.current,D=!w||w.w!==x||w.h!==k||w.ar!==b,V=!!o&&g.current!==o;if(!D&&!V)return;D&&(d.current={w:x,h:k,ar:b},c(x),p(k),s.current.style.aspectRatio=b),o&&(g.current=o,o(x,k))}}function v(){h(),m.current=!0,T.current&&(T.current(),T.current=null,y.current=null),e&&e()}function A(){m.current=!0,T.current&&(T.current(),T.current=null,y.current=null)}return Xo.createElement("img",{ref:s,onLoad:v,onError:A,width:l,height:u,alt:"",src:n,style:i})});dc.displayName="AspectScaleImage";var Qo=dc;import hc from"clsx";import{motion as Ld}from"motion/react";var Rd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},gc=Ed(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=Jo(null),a=Jo([]),l=o.findIndex(c=>c!==null);return Dd(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(c=>!c?.isLoaded||c.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(c=>c?.waitForLoad?c.waitForLoad():Promise.resolve())).then(()=>{})}),[]),Nt.createElement("div",{ref:s},o.map((c,u)=>c===null?null:Nt.createElement(Qo,{key:"layer-"+u,ref:p=>{a.current[u]=p},src:t(c),style:Rd,autoFit:e,onSizeChanged:u===l?n:void 0,onLoad:u===l?i:void 0})))});gc.displayName="LayerStack";function Id(o){return{willChange:"filter, opacity",position:"absolute",top:0,left:0,right:0,bottom:0,transform:"none",translate:"none",opacity:1,clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat",filter:`brightness(${1-o})`}}function Md(o){return O.isStaticSrc(o)?o.state.currentSrc:O.getSrcURL(o)??void 0}var Nd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Gd({image:o,state:e}){let[t]=fc(()=>new Q),[n,i]=fc([]),{cacheManager:r}=$t(),s=Jo([]),a=Jo(null),l=O.isLayeredSrc(o)?O.getSrcURLs(o):null;function c(b){return!P.isInlineSrc(b)&&!r.wasCached(b)&&!r.isPreloading(b)&&!s.current.includes(b)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${b}".
64
64
  This may be caused by complicated image action behavior that cannot be predicted.
65
- To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(b)),r.get(b)||b}let{transformRef:u,transitionRefs:d,transitionTask:p,initDisplayable:h,applyTransition:g,applyTransform:m,applyLoop:y,stopLoop:T,updateStyleSync:f,flush:v,deps:A}=jt({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:b=>{if(l)return(b?b.task.resolve:[null]).map(B=>B&&typeof B=="function"?{style:Pd}:{style:wd(o.state.darkness)});let C=b?b.transition._getCurrentSrc():kd(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:P.isColor(C)?P.colorToString(C):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:P.isImageSrc(C)?P.srcToURL(C):F.DefaultImagePlaceholder},{style:{willChange:"filter",position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none",filter:"brightness(1)"}}]},propOverwrite:b=>b.src?{...b,src:c(b.src)}:b});Ct(o,{createWearable:b=>{i(C=>[...C,b])},disposeWearable:b=>{i(C=>C.filter(I=>I.getId()!==b.getId()))},initDisplayable:h,applyTransform:m,applyLoop:y,stopLoop:T,applyTransition:g,events:t,updateStyleSync:f,flush:v},[...A]);let w=sc((b,C)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${b}px`,height:`${C}px`}))},[t]),k=sc(()=>{t.emit("event:image.onLoad")},[t]);return Mt.createElement(Cd.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},Mt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},l?d.map(([b,C],I)=>{let B=p?p.task.resolve[I]:null;if(B&&typeof B=="function")return Mt.createElement(Yo,{key:C,ref:b,autoFit:o.config.autoFit});let le=B?B.key==="target"?p.transition._getTargetLayers():p.transition._getPrevLayers():l;return Mt.createElement(cc,{key:C,ref:b,src:le||l,autoFit:o.config.autoFit,resolveSrc:c,onSizeChanged:I===0?w:void 0,onLoad:I===0?k:void 0})}):d.map(([b,C],I)=>Mt.createElement(Yo,{key:C,ref:b,autoFit:o.config.autoFit,onSizeChanged:I===0?w:void 0,onLoad:I===0?k:void 0})),Mt.createElement("div",{className:lc("w-full h-full top-0 left-0 absolute")},n.map(b=>Mt.createElement("div",{className:lc("w-full h-full relative"),key:"wearable-"+b.getId()},Mt.createElement(uc,{image:b,state:e}))))))}var uc=Mt.memo(Ed),pc=uc;import Jo,{useEffect as mc,useMemo as Md,useRef as As}from"react";var Dd=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,Ld=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function dc(o,e){if(typeof e!="string"||!e.length)return o;if(Dd.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=Rd(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+Id(r+e.replace(/\\/g,"/"))}function Rd(o){let e=Ld.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function Id(o){let e=o.split("/"),t=[];for(let n=0;n<e.length;n++){let i=e[n];if(!(i==="."||i===""&&n!==e.length-1)){if(i===".."){t.pop();continue}t.push(i)}}return t.join("/")}var Qo=class{constructor(){this.backends=new Map;this.reportedMissing=new Set}register(e){if(!e||typeof e.name!="string"||!e.name.length)throw new Error("A puppet backend must have a non-empty name.");if(typeof e.mount!="function")throw new Error(`Puppet backend "${e.name}" must implement mount().`);return this.backends.set(e.name,e),this.reportedMissing.delete(e.name),this}get(e){return this.backends.get(e)||null}has(e){return this.backends.has(e)}list(){return Array.from(this.backends.keys())}unregister(e){return this.backends.delete(e)}reportMissing(e,t){return this.reportedMissing.has(e)?!1:(this.reportedMissing.add(e),t(`No puppet backend is registered under "${e}". The element keeps its place on the stage, its transform and its saved state, but draws nothing. Register one with game.registerPuppetBackend({name, mount}) before the game mounts.`),!0)}};function Cs({state:o,puppet:e}){let[t]=ae(),{cacheManager:n}=Kt(),i=As(null),r=Md(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=As(r);s.current=r;let{transformRef:a,transitionRefs:l,initDisplayable:c,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:g,deps:m}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipImageTransform,skipTransition:o.game.config.allowSkipImageTransition,transitionsProps:[{style:{position:"relative",width:`${r.width}px`,height:`${r.height}px`}}]});Ct(e,{initDisplayable:c,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:g,flush:t},[...m]),mc(()=>{let f=i.current;if(!f)return;let v=o.game,A=e.config.backend,w=v.getPuppetBackend(A);if(!w)return e._setStatus("missing-backend"),v.getPuppetBackendRegistry().reportMissing(A,C=>{o.logger.warn("Puppet",C)}),()=>{e._setStatus("unmounted")};let k;try{k=w.mount(f,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:T,resolveSibling:C=>T(dc(e.config.src,C)),warn:(C,I)=>{o.logger.warn("Puppet",C,I)}})}catch(C){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${A}" threw while mounting "${e.config.src}"`,C),()=>{e._setStatus("unmounted")}}let b=!1;return e._attachInstance(k),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!b&&typeof k.ready=="function"?k.ready():void 0).then(()=>{b||e._setStatus("ready")}).catch(C=>{b||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${A}" failed to load "${e.config.src}"`,C))}),()=>{b=!0,e._attachInstance(null),e._setStatus("unmounted");try{k.dispose()}catch(C){o.logger.error("Puppet",`Backend "${A}" threw while disposing`,C)}}},[]);let y=As(r);mc(()=>{let f=y.current;if(f.width===r.width&&f.height===r.height)return;y.current=r;let v=e._getInstance();if(!(!v||typeof v.resize!="function"))try{v.resize(r)}catch(A){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,A)}},[r]);function T(f){return P.isDataURI(f)?f:n.get(f)||f}return Jo.createElement(zt.Div,{"data-element-type":"puppet"},Jo.createElement(zt.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},l.map(([f,v])=>Jo.createElement("div",{key:v,ref:f,className:e.config.className},Jo.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function xs({state:o,displayable:e}){return Ei.createElement(Ei.Fragment,null,e.map(t=>{if(t instanceof kn)return Ei.createElement(Ts,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof F)return Ei.createElement(pc,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Dt)return Ei.createElement(Cs,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import Zo,{useEffect as Nd}from"react";import{motion as Gd}from"motion/react";function fc({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u,deps:d}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return Ct(e,{initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u},[...d]),Nd(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),Zo.createElement(Zo.Fragment,null,Zo.createElement(Gd.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([p,h])=>Zo.createElement("div",{className:"relative w-full h-full",ref:p,key:h},t))))}async function hc(o,e,t,n){let i=e.state.backgroundMusic,r=i&&o.audioManager.isManaged(i)?o.audioManager.stop(i,n):null;if(r&&t===i&&await r,t)try{await o.audioManager.playSoundToken(t,{end:t.state.volume,duration:n}),e.state.backgroundMusic=t}catch{e.state.backgroundMusic=null}else e.state.backgroundMusic=null;r&&await r}import Fd from"clsx";import{useEffect as ws,useRef as Od}from"react";import ks from"react";function Ps({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=Od(null);return ws(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),ws(()=>n.events.depends([n.events.on(Ye.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),ws(()=>(n.events.emit(Ye.EventTypes["event:scene.mount"]),o.events.emit(L.EventTypes["event:state.scene.mount"],n),o.logger.debug("Scene","Scene mounted",n.getId()),()=>{n.events.emit(Ye.EventTypes["event:scene.unmount"]),o.events.emit(L.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),Ct(n,{setBackgroundMusic(s,a){return hc(o,n,s,a)}}),ks.createElement("div",{className:Fd(e,"w-full h-full absolute"),ref:r,"data-element-type":"scene","data-scene-id":n.getId()},[...i.entries()].sort(([s],[a])=>s.state.zIndex-a.state.zIndex).map(([s,a])=>ks.createElement(fc,{state:o,layer:s,key:s.getId()},ks.createElement(xs,{state:o,displayable:a}))))}import{AnimatePresence as Wd}from"motion/react";import{useEffect as Bd,useReducer as zd,useRef as er}from"react";import Hd from"clsx";import qt,{useCallback as Es,useMemo as Vd,useRef as Ud}from"react";function Ds({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=G(),a=Ud([]),l=Es(g=>(a.current.push(g),a.current.indexOf(g)),[]),c=Es(g=>{let m=a.current.indexOf(g);m!==-1&&a.current.splice(m,1)},[]),u=Es(g=>a.current.indexOf(g),[]),d=s.config.menu,p=Vd(()=>e.map(g=>({...g,words:g.prompt.evaluate(ke.getCtx({gameState:n}))})),[e,n]);function h(g){t(g)}return qt.createElement(qt.Fragment,null,qt.createElement(Qr,{value:{evaluated:p,choose:h,gameState:n}},qt.createElement(Zr,{value:{register:l,unregister:c,getIndex:u}},qt.createElement(Bt,{className:"absolute"},r&&o&&qt.createElement(Ti,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),qt.createElement(zt.Div,{color:"green",border:"dashed",className:Hd("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},qt.createElement(d,{items:p.map((g,m)=>m)})))))}function gc({items:o}){return qt.createElement(xo,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>qt.createElement(Go,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Kd from"clsx";import Di from"react";var yc=120;function vc({sources:o,menuCount:e,presence:t,retained:n,lastActive:i,sceneId:r}){if(o.length===0){let l=n??(i.length>0?i.map(c=>({...c,active:!1})):null);return{items:l??[],retained:l,lastActive:i,retaining:l!==null,interactive:e>0}}let s=new Set(o.map(({slot:l})=>l));for(let[l,c]of Array.from(t.slotKeys))s.has(l)||(t.exitingKeys.add(c),t.slotKeys.delete(l));let a=o.map(({slot:l,...c})=>{let u=t.slotKeys.get(l);return(!u||t.exitingKeys.has(u))&&(u=`say-${r}-${t.nextKey++}`,t.slotKeys.set(l,u)),{...c,presenceKey:u,slot:l,active:!0}});return{items:a,retained:null,lastActive:a,retaining:!1,interactive:!0}}function Ls({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=er({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),a=er([]),l=er(null),c=er(null),[,u]=zd(y=>y+1,0),d=()=>{c.current&&(clearTimeout(c.current),c.current=null)},p=()=>{let y=l.current;if(!y)return;let T=s.current;y.forEach(({slot:f,presenceKey:v})=>{T.slotKeys.get(f)===v&&T.slotKeys.delete(f),T.exitingKeys.add(v)}),l.current=null,c.current=null,a.current=[],u()};Bd(()=>()=>{d()},[]);let h=s.current,g=i.length>0?i.map(({action:y,onClick:T},f)=>({action:y,slot:f,useTypeEffect:!0,onFinished:()=>{T(),o.events.emit(L.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((y,T)=>{if(!y.action.prompt||!y.action.words)return[];let f=h.menuPromptIds.get(y);return f||(f=`menu-prompt-${n.getId()}-${h.nextKey++}`,h.menuPromptIds.set(y,f)),[{action:{sentence:y.action.prompt,words:y.action.words,character:null,id:f},slot:T,useTypeEffect:!1}]}),m=vc({sources:g,menuCount:r.length,presence:h,retained:l.current,lastActive:a.current,sceneId:n.getId()});return l.current=m.retained,a.current=m.lastActive,m.retaining?c.current||(c.current=setTimeout(p,yc)):d(),Di.createElement("div",{className:Kd(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs",style:{pointerEvents:m.interactive?"auto":"none"}},Di.createElement(Wd,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{s.current.exitingKeys.clear()}},m.items.map(({action:y,onFinished:T,presenceKey:f,active:v,useTypeEffect:A})=>Di.createElement(Ti,{gameState:o,key:f,action:y,active:v,onFinished:T,useTypeEffect:A}))),r.map(({action:y,onClick:T},f)=>Di.createElement("div",{key:"menu-"+f,"data-element-type":"menu"},Di.createElement(Ds,{state:o,prompt:y.prompt,choices:y.choices,renderPrompt:!y.prompt,afterChoose:v=>{T(v),o.stage.next()},words:y.words}))))}import Sn,{useEffect as $d,useRef as Rs}from"react";import{motion as jd}from"motion/react";function Sc({state:o,camera:e,children:t}){let n=Rs(null),i=Rs(null),r=Rs(null),{transformRef:s,transitionRefs:a,initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h,deps:g}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:Fa},{ref:i,project:Na},{ref:r,project:Ga}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return Ct(e,{initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h},[...g]),$d(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),Sn.createElement(Sn.Fragment,null,Sn.createElement(jd.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,y])=>Sn.createElement("div",{className:"relative w-full h-full",ref:m,key:y},t))),Sn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},Sn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),Sn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),Sn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import qd from"react";import{useEffect as Is,useRef as _d}from"react";import{useCallback as Tc}from"react";function bc(o){let e=Tc(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=Tc(()=>{if(!o.current)return;let n=o.current;n.style.opacity="0",n.style.pointerEvents="none",n.style.visibility="hidden"},[o]);return{show:e,hide:t}}function Ms({gameState:o,video:e}){let t=_d(null),{show:n,hide:i}=bc(t);Is(()=>o.events.depends([o.events.on(L.EventTypes["event:state.player.skip"],()=>{o.game.config.allowSkipVideo&&(r(),o.logger.log("NarraLeaf-React: Video","Skipped"))})]).cancel,[]),Is(()=>{i(),e.state.display&&n()},[]),Is(()=>{if(!t.current)return;let s=t.current,a=!1,l=new Set,c=()=>new E(`Failed to add event listener, ref is not available
66
- at Video.tsx: useEffect`),u=h=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw c();n()},hide:()=>{if(!t.current)throw c();i()},play:()=>{if(!t.current)throw c();let g=t.current;return h||g.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(g.currentTime=0,new Promise(m=>{let y=!1,T=null,f=[],v=()=>{y||(y=!0,l.delete(v),T&&T(),f.forEach(A=>A()),m())};l.add(v),T=o.schedule(({retry:A})=>{if(y)return;if(g.readyState<3){let C=()=>{g.removeEventListener("loadeddata",C),A()};g.addEventListener("loadeddata",C),f.push(()=>g.removeEventListener("loadeddata",C));return}let w=()=>v(),k=()=>v(),b=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),v()};g.addEventListener("ended",w),g.addEventListener("stopped",k),g.addEventListener("error",b),f.push(()=>{g.removeEventListener("ended",w),g.removeEventListener("stopped",k),g.removeEventListener("error",b)}),g.play().catch(C=>{o.logger.error("Failed to play video: "+C),v()})},10)}))},pause:()=>{if(!t.current)throw c();t.current.pause()},resume:()=>{if(!t.current)throw c();return t.current.play().catch(g=>{o.logger.error("Failed to resume video: "+g)})},stop:()=>{if(!t.current)throw c();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:g=>{if(!t.current)throw c();t.current.currentTime=g}}))},d=()=>u(!1),p=()=>{o.logger.error("NarraLeaf-React: Video",`Failed to load video source: ${e.config.src}`+(s.error?` (media error code ${s.error.code})`:"")),u(!0)};return s.addEventListener("canplay",d),s.addEventListener("error",p),s.readyState>=3?u(!1):s.error&&p(),()=>{s.removeEventListener("canplay",d),s.removeEventListener("error",p),l.forEach(h=>h()),s.currentTime>0&&s.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]);function r(){t.current&&(t.current.pause(),t.current.currentTime=0,t.current.dispatchEvent(new Event("stopped")))}return qd.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,playsInline:!0,width:"100%",height:"100%",onContextMenu:s=>s.preventDefault()})}import Yd,{useEffect as Xd,useRef as Qd}from"react";var Ac={linear:"linear",easeIn:"cubic-bezier(0.42, 0, 1, 1)",easeOut:"cubic-bezier(0, 0, 0.58, 1)",easeInOut:"cubic-bezier(0.42, 0, 0.58, 1)"};function Jd(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&Ac[e]?Ac[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Ns({gameState:o,vfx:e}){let t=Qd(null);return Xd(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,l=new Set,c=new Set,u=[],d=A=>{n.style.transition="",n.style.opacity=String(A)},p=()=>{n.play().catch(A=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+A)})},h=()=>i||n.error?(o.logger.error("NarraLeaf-React: Vfx","Cannot wait for a vfx whose source failed to load: "+e.config.src),Promise.resolve()):n.readyState>=2?Promise.resolve():new Promise(A=>{let w=!1,k=()=>C(),b=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),C()},C=()=>{w||(w=!0,c.delete(C),n.removeEventListener("loadeddata",k),n.removeEventListener("error",b),A())};c.add(C),n.addEventListener("loadeddata",k),n.addEventListener("error",b),(n.readyState>=2||n.error)&&C()}),g=(A,w,k)=>{let b=w?.duration??0,C=++s;return k.instant||b<=0?(d(A),Promise.resolve()):new Promise(I=>{let B=!1,le=null,ce=()=>{B||(B=!0,c.delete(ce),le!==null&&clearTimeout(le),s===C&&t.current&&d(A),I())};c.add(ce),n.style.transition=`opacity ${b}ms ${Jd(o,w?.easing)}`,n.offsetWidth,n.style.opacity=String(A),le=setTimeout(ce,b)})},m=A=>{r||(r=!0,i=A,o.mountState(e,{show:async w=>{a=!0;let k={instant:!1};l.add(k);try{if(await h(),!t.current)return;n.playbackRate=w?.rate??e.config.playbackRate,e.state.paused||p(),await g(w?.opacity??e.config.opacity,w,k)}finally{l.delete(k)}},hide:async w=>{a=!0;let k={instant:!1};l.add(k);try{await g(0,w,k),t.current&&n.pause()}finally{l.delete(k)}},pause:()=>{n.pause()},resume:()=>{p()},setRate:w=>{n.playbackRate=w}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&d(e.config.opacity)},0)))},y=()=>m(!1),T=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),m(!0)},f=o.events.on(L.EventTypes["event:state.player.skip"],()=>{l.size===0&&c.size===0||(l.forEach(A=>{A.instant=!0}),[...c].forEach(A=>A()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),v=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&p()};return document.addEventListener("visibilitychange",v),n.style.opacity="0",n.playbackRate=e.config.playbackRate,e.config.muted||o.logger.weakWarn("NarraLeaf-React: Vfx","Vfx is not muted; autoplay may be rejected by the browser. (src: "+e.config.src+")"),e.state.display&&!e.state.paused&&p(),n.addEventListener("canplay",y),n.addEventListener("error",T),n.readyState>=3?m(!1):n.error&&T(),()=>{n.removeEventListener("canplay",y),n.removeEventListener("error",T),document.removeEventListener("visibilitychange",v),f.cancel(),u.forEach(A=>A()),[...c].forEach(A=>A()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),Yd.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,loop:e.config.loop,playsInline:!0,onContextMenu:n=>n.preventDefault(),style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:e.config.fit,pointerEvents:"none"}})}import Zd from"clsx";import em,{useCallback as tm,useEffect as tr,useRef as nm}from"react";function Gs({children:o,className:e,gameState:t}){let{ratio:n}=ye(),i=G(),[r]=ae(),s=nm(null),a=i.config.minWidth,l=i.config.minHeight,c=tm(u=>{if(n.isLocked()){t.logger.weakWarn("AspectRatio","ratio is locked, skipping update");return}n.update(u.width,u.height,u.scale),n.updateMin(a,l),r()},[r,t.logger,l,a,n]);return tr(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),tr(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),tr(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,l,a]),tr(()=>t.events.on(L.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),em.createElement(Kl,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:l,debounceMs:i.config.ratioUpdateInterval,className:Zd(e),onUpdate:c},o)}import Cc,{useEffect as im,useRef as om,useState as xc}from"react";function Fs({src:o,width:e,height:t}){let[n,i]=xc({x:0,y:0}),[r,s]=xc(!1),a=om(null),{ratio:l}=ye();return im(()=>{let c=u=>{if(a.current){let d=a.current.getBoundingClientRect(),p=u.clientX-d.left,h=u.clientY-d.top;i({x:p,y:h}),r||s(!0)}};return window.addEventListener("mousemove",c),()=>{window.removeEventListener("mousemove",c)}},[r]),Cc.createElement(Bt,{ref:a,className:"overflow-hidden absolute"},Cc.createElement("img",{src:o,style:{position:"absolute",left:n.x,top:n.y,width:e,height:t,pointerEvents:"none",zIndex:1001,display:r?"block":"none",cursor:"none",transform:`scale(${l.state.scale})`},alt:""}))}import wc from"react";import rn from"react";function Os({error:o,errorInfo:e}){return G().config.app.debug?rn.createElement("div",{className:"text-left"},rn.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),rn.createElement("p",{className:"text-red-700"},"Message: ",o.message),rn.createElement("pre",null,"Error Stack: ",o?.stack),rn.createElement("pre",null,"Component Stack: ",e?.componentStack),rn.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):rn.createElement("div",{className:"bg-white w-full h-full"},rn.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),rn.createElement("p",null,"Please contact the game developer for further assistance."))}var nr=class extends wc.Component{constructor(){super(...arguments);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t,errorInfo:null}}componentDidCatch(t,n){this.setState({error:t,errorInfo:n}),this.props.onError?.(t,n),console.error(t,n)}render(){return this.state.hasError?wc.createElement(Os,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import Ec from"clsx";import U,{useEffect as Nt,useReducer as Dc,useState as Xn}from"react";import{flushSync as Lc}from"react-dom";import{useRef as rm}from"react";import{useEffect as sm}from"react";function kc({gameState:o}){let e=rm(null);return sm(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(L.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Li,{useEffect as am}from"react";function Hs({gameState:o}){let[e]=ae(),{ratio:t}=ye(),n=o.notificationMgr;am(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Li.createElement("div",{style:{transform:`scale(${t.state.scale})`,transformOrigin:"left top"},className:"absolute top-0 left-0 w-full h-full pointer-events-none","data-element-type":"notification"},Li.createElement(i,{notifications:n.toArray()}))}function Pc({notifications:o}){return Li.createElement(Oo,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Li.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Li.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Rc({story:o=di.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:l,onError:c,children:u,active:d=!0}){let[p,h]=Dc(D=>D+1,0),[g,m]=Dc(D=>D+1,0),[y,T]=Xn(0),f=G(),[v]=Xn(()=>new L(f,{update:h,forceUpdate:()=>{v.logger.weakWarn("Player","force update"),Lc(()=>{h()})},forceRemount:()=>{v.logger.weakWarn("Player","force remount"),Lc(()=>{T(D=>D+1),h()})},next:Ue})),A=U.createRef(),w=U.createRef(),[k,b]=Xn(!1),C=U.useRef(!1),I=U.useRef(null),B=U.useRef(null),{preloaded:le}=Kt(),[ce,Ve]=Xn(!1),pt=U.useRef(!1),[Tt,an]=Xn(!1),dt=U.useRef(!1),Ce=U.useRef(null),bt=U.useRef(!1),[oe]=Xn(new Map);function Je(D){return{game:f,gameState:v,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable(),scene:D}}function Ue(){let D=()=>{oe.forEach(R=>R.cancel())};if(v.rollLock.isLocked())return;D();let _=!1,O=0;for(;!_;){if(O++>f.config.maxStackModelLoop)throw new E("Max stack model loop reached");let R=f.getLiveGame().next();if(!R){if(f.getLiveGame().stackModel&&!f.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(R)){if(I.current===R)break;I.current=R,R.onSettled(()=>{R.isFailed()||(I.current===R&&(I.current=null),Ue())}),R.onFailed(ue=>{I.current===R&&(I.current=null),v.logger.error("Player",ue)}),_=!0;break}if(R instanceof Mn){if(B.current===R)break;B.current=R,R.nextUnlock().then(()=>{B.current===R&&(B.current=null),Ue()}),_=!0;break}if(Xe.isCalledActionResult(R)&&R.wait&&Xe.isStackModelsAwaiting(R.wait.type,R.wait.stackModels)){if(I.current===R)break;if(I.current=R,R.wait){let ue=Xe.executeStackModelGroup(R.wait.type,R.wait.stackModels);ue.then(()=>{I.current===R&&(I.current=null),Ue()}),ue.onFailed(Le=>{I.current===R&&(I.current=null),v.logger.error("Player",Le)})}_=!0;break}v.handle(R)}v.stage.update()}Nt(()=>{v.audioManager.initialize()},[]),Nt(()=>(f.getLiveGame().setGameState(v),o&&!f.getLiveGame().isPlaying()&&f.getLiveGame().loadStory(o),o?.entryScene&&!v.getPreloadingScene()&&!v.getLastScene()&&v.preloadScene(o.entryScene),v.playerCurrent=A.current,v.mainContentNode=w.current,()=>{f.getLiveGame().setGameState(void 0),v.playerCurrent=null}),[f,o]),Nt(()=>st(()=>{b(!0);let D=v.getLastScene(),_=[];D?_.push(D.events.once("event:scene.mount",()=>{v.stage.next()}).cancel):v.stage.next();let O=v.events.on(L.EventTypes["event:state.end"],()=>{l&&l({game:f,gameState:v,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable()})});return v.stage.update(),()=>{D&&_.forEach(R=>R()),O.cancel()}}),[]),Nt(()=>st(()=>{k&&i&&!C.current&&(C.current=!0,v.stage.forceUpdate(),f.hooks.trigger("init",[]),i({game:f,gameState:v,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable()}))}),[k]),Nt(()=>st(()=>{if(ce&&s&&!pt.current){pt.current=!0;let D=Ce.current||v.getLastScene()||v.getPreloadingScene(),_=Je(D);s(_)}}),[ce]),Nt(()=>st(()=>{if(Tt&&!dt.current){dt.current=!0;let D=Ce.current||v.getLastScene()||v.getPreloadingScene(),_=Je(D);f.markPreloadComplete(_)&&r&&r(_)}}),[Tt]),Nt(()=>v.events.on(L.EventTypes["event:state.scene.mount"],D=>{Ce.current||(Ce.current=D,m())}).cancel,[]),Nt(()=>{if(!Tt||!d||bt.current||f.isFirstSceneReady())return;let D=Ce.current||v.getLastScene();if(!D)return;let _=null,O=null,R=!1;bt.current=!0;let ue=()=>{R=!0,bt.current=!1;let Le=Je(D);f.markFirstSceneReady(Le)&&a&&a(Le)};return typeof requestAnimationFrame=="function"?_=requestAnimationFrame(()=>{O=setTimeout(ue,0)}):O=setTimeout(ue,0),()=>{R||(bt.current=!1,_!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(_),O!==null&&clearTimeout(O))}},[d,g,p,Tt]),Nt(()=>le.events.depends([le.events.on(je.EventTypes["event:preloaded.ready"],()=>{Ve(!0),v.stage.update(),o&&f.getLiveGame().isPlaying()&&Ue()}),le.events.on(je.EventTypes["event:preloaded.complete"],()=>{an(!0)})]).cancel,[]),Nt(()=>{v.flushDep=p},[p]);let N=e||f.config.width,Q=t||f.config.height;return U.createElement(nr,{onError:c},U.createElement("div",{style:{width:typeof N=="number"?`${N}px`:N,height:typeof Q=="number"?`${Q}px`:Q},className:Ec(n,"__narraleaf_content-player"),ref:A,tabIndex:0},U.createElement(Gs,{className:Ec("flex-grow overflow-auto"),gameState:v},U.createElement(hs,{gameState:v}),U.createElement(kc,{gameState:v}),U.createElement(Bt,{className:"absolute",ref:w,style:{cursor:v.game.config.cursor?"none":"auto",overflow:v.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},f.config.cursor&&U.createElement(Fs,{src:f.config.cursor,width:f.config.cursorWidth,height:f.config.cursorHeight}),U.createElement(lm,{show:ce&&d,key:y},U.createElement(us,null,U.createElement(Xl,{state:v}),U.createElement(tc,{state:v}),U.createElement(cm,{state:v},U.createElement("div",{className:"w-full h-full absolute",style:{isolation:"isolate"},"data-element-type":"scene-group"},v.getSceneElements().map(D=>U.createElement(Ps,{key:"scene-"+D.scene.getId(),state:v,elements:D}))),U.createElement(um,{state:v}),v.getVideos().map((D,_)=>U.createElement("div",{className:"w-full h-full absolute",key:"video-"+_,"data-element-type":"video"},U.createElement(Ms,{gameState:v,video:D}))),v.getVfx().map(D=>U.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+D.getId(),"data-element-type":"vfx",style:{zIndex:D.config.zIndex,mixBlendMode:D.config.blendMode}},U.createElement(Ns,{gameState:v,vfx:D})))),v.getSceneElements().map(D=>U.createElement(Ls,{key:"scene-dialogs-"+D.scene.getId(),state:v,elements:D})),U.createElement(pm,{NvlComponent:f.config.nvlDialog}))),U.createElement(oc,{state:v}),U.createElement(Hl,null,u),U.createElement(Hs,{gameState:v})))))}function lm({children:o,show:e}){return U.createElement(U.Fragment,null,e?o:null)}function cm({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?U.createElement(Sc,{state:o,camera:t},e):U.createElement(U.Fragment,null,e)}function um({state:o}){let e=U.useRef(null);return Nt(()=>(o.stageTransition.registerOverlayHost(e.current),()=>{o.stageTransition.registerOverlayHost(null)}),[]),U.createElement("div",{className:"w-full h-full absolute pointer-events-none",ref:e,"data-element-type":"stage-transition-overlay-host"})}function pm({NvlComponent:o}){let{dialogs:e,state:t}=$t(),i=G().getLiveGame().getGameState(),r=U.useMemo(()=>e.map((s,a)=>{let l=s.sentence.evaluate(ke.getCtx({gameState:i})),c=t.activeDialogId===s.id,u=c&&t.phase==="typing";return{entry:s,index:a,isActive:c,gameState:i,words:l,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return U.createElement(o,{dialogs:r})}import"client-only";import Qn from"react";function Ic({children:o,game:e}){return Qn.createElement(Qn.Fragment,null,Qn.createElement(Qa,null,Qn.createElement(ja,{game:e},Qn.createElement(Nl,null,Qn.createElement(Xa,null,o)))))}var dm=(l=>(l.image="narraleaf:image",l.text="narraleaf:text",l.layer="narraleaf:layer",l.scene="narraleaf:scene",l.video="narraleaf:video",l.vfx="narraleaf:vfx",l.camera="narraleaf:camera",l.puppet="narraleaf:puppet",l))(dm||{});import mm from"clsx";import xt,{useEffect as Nc,useRef as fm,useState as hm}from"react";function Mc(o){return o?{className:"",ariaHidden:!1}:{className:"opacity-0",ariaHidden:!0}}import{motion as gm,useIsPresent as ym}from"motion/react";var vm={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function Sm({children:o,initial:e,transition:t,...n}){let i=G(),r=Rt(),{ratio:s}=ye(),[a]=yn(q.Preferences.showDialog),l=fm(null),[c]=En("nextAction"),u=ym(),[d,p]=hm(null),h=Mc(a);function g(){a&&(r.config.gameState.isAdvanceSuspended()||r.requestComplete())}return Nc(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
67
- at Say.tsx: onElementClick`);return}let m=T=>{T.repeat||r.config.gameState.isAdvanceSuspended()||i.keyMap.match("nextAction",T.key)&&r.requestComplete()};window.addEventListener("keydown",m);let y=r.events.on(Ne.Events.simulateClick,()=>{l.current&&l.current.click()});return()=>{window.removeEventListener("keydown",m),y.cancel()}},[r,c]),Nc(()=>{let m=i.preference.onPreferenceChange(q.Preferences.autoForward,y=>{y&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{m.cancel()}},[r]),xt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},xt.createElement("div",{className:mm("absolute bottom-0 w-full h-full",h.className),"aria-hidden":h.ariaHidden,onClick:g,style:{...Gn(i.config.useAspectScale,{maxWidth:i.config.dialogWidth,maxHeight:i.config.dialogHeight,transform:`scale(${s.state.scale})`,transformOrigin:"bottom left",width:i.config.width,height:i.config.height})},ref:l},xt.createElement(fs,{value:d},xt.createElement(gm.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&u?{duration:0}:t},o)),xt.createElement("div",{"data-element-type":"dialog-overlay",className:"absolute inset-0 pointer-events-none",ref:p})))}function Gc({children:o,...e}){let t=Rt();return!t.config.action.sentence||!t.config.action.words?null:xt.createElement(Sm,{...e},o)}var dd=Gc;function Fc(){return xt.createElement(Gc,null,xt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},xt.createElement(ns,null),xt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},xt.createElement(on,null),xt.createElement(vn,{...vm}))))}var Ri={say:Fc,menu:gc,notification:Pc,nvlDialog:ms};var ir=class{constructor(e){this.game=e;this.plugins=[];this.registerAll()}use(e){return this.plugins.push(e),this}register(e){e.register(this.game)}registerAll(){this.plugins.forEach(e=>e.register(this.game))}unregisterAll(){this.plugins.forEach(e=>e.unregister(this.game))}has(e){return this.plugins.some(t=>t.name===e.name)}};var Ii=class{constructor(e={}){this.keyMap=e;this.events=new J}setKeyBinding(e,t){this.keyMap[e]=t,this.events.emit("event:keyMap.change",e,t)}getKeyBinding(e){return this.keyMap[e]??null}addKeyBinding(e,t){if(t===null)return;let n=this.getKeyBinding(e)??[],i=r=>Array.isArray(r)?r:[r];Array.isArray(n)?this.setKeyBinding(e,[...n,...i(t)]):this.setKeyBinding(e,[n,...i(t)])}getKeyBindings(){return this.keyMap}onKeyBindingChange(e,t){return this.events.on("event:keyMap.change",(n,i)=>{n===e&&t(i)})}importKeyBindings(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setKeyBinding(t,e[t])}exportKeyBindings(){return this.keyMap}match(e,t){let n=this.getKeyBinding(e);return n===null?!1:Array.isArray(n)?n.includes(t)||n.some(i=>i.toLowerCase()===t.toLowerCase()):n===t||n.toLowerCase()===t.toLowerCase()}};var Oc=(e=>(e.game="game",e))(Oc||{}),Qe=class Qe{constructor(e){this.hooks=new $i;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new vi(Qe.DefaultPreference);this.audioBuses=new ai(()=>this.config.audioBuses??[],Ca(this.preference));this.keyMap=new Ii({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new J;this.puppetBackends=new Qo;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=j(Qe.DefaultConfig,e),this.plugins=new ir(this),this.router=new gn(this)}configure(e){let[t,n]=pa(e,this.freezeFields);return n.length>0&&console.warn(`NarraLeaf-React [Game] The following fields are not allowed to be configured: ${n.join(", ")}`),this.config=j(this.config,t),Object.prototype.hasOwnProperty.call(t,"audioBuses")&&this.audioBuses.invalidate(),this.getLiveGame().getGameState()?.events.emit(L.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}registerPuppetBackend(e){return this.puppetBackends.register(e),this}getPuppetBackend(e){return this.puppetBackends.get(e)}listPuppetBackends(){return this.puppetBackends.list()}getPuppetBackendRegistry(){return this.puppetBackends}onPreloadComplete(e){return this.lifecycleEvents.on(Qe.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(Qe.LifecycleEventTypes["event:game.preloadComplete"],e)}whenPreloadComplete(){return this.preloadCompleteContext?Promise.resolve(this.preloadCompleteContext):new Promise(e=>{this.oncePreloadComplete(e)})}isPreloadComplete(){return this.preloadCompleteContext!==null}onFirstSceneReady(e){return this.lifecycleEvents.on(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e)}whenFirstSceneReady(){return this.firstSceneReadyContext?Promise.resolve(this.firstSceneReadyContext):new Promise(e=>{this.onceFirstSceneReady(e)})}isFirstSceneReady(){return this.firstSceneReadyContext!==null}markPreloadComplete(e){return this.preloadCompleteContext?!1:(this.preloadCompleteContext=e,this.lifecycleEvents.emit(Qe.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.audioBuses.dispose(),this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new Ut(this)}};Qe.defaultSettings={volume:1},Qe.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,textRevealDuration:0,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:0,skipInterval:100},Qe.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",textRevealDuration:"textRevealDuration",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},Qe.DefaultConfig={app:{debug:!1,logger:{log:!1,info:!1,warn:!0,error:!0,debug:!1,trace:!1,verbose:!1},inspector:!1,guard:{invalidExposedStateUnmounting:!0,unexpectedTimelineStatusChange:!0}},contentContainerId:"__narraleaf_content",aspectRatio:16/9,minWidth:800,minHeight:450,width:1920,height:1080,useWindowListener:!0,ratioUpdateInterval:50,preloadDelay:100,preloadConcurrency:5,waitForPreload:!0,preloadGate:"firstFrame",preloadAllImages:!0,forceClearCache:!1,maxPreloadActions:10,cursor:null,cursorHeight:30,cursorWidth:30,showOverflow:!1,maxRouterHistory:10,screenshotQuality:1,useAspectScale:!0,autoForwardDelay:3*1e3,autoForwardDefaultPause:1e3,allowSkipImageTransform:!0,allowSkipImageTransition:!0,allowSkipBackgroundTransform:!0,allowSkipSceneTransition:!0,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:Ri.notification,menu:Ri.menu,dialog:Ri.say,nvlDialog:Ri.nvlDialog,onError:e=>{console.error(e)},disableTextScaling:!1,stage:null,maxStackModelLoop:1e3,maxActionHistory:100,maxSceneCallDepth:8,audioBuses:[]},Qe.GameSettingsNamespace=Oc,Qe.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var q=Qe;var or=class or extends Y{constructor(){super(...arguments);this._jumpTarget=null}setJumpTarget(t){return this._jumpTarget=t,this}getJumpTarget(){return this._jumpTarget}static executeActionsAsync(t,n){let i=t.game.getLiveGame().requestAsyncStackModel([{type:n.type,node:n.contentNode}]);return t.game.getLiveGame().executeAsyncStackModel(i)}checkActionChain(t){if(t.some(n=>!!n.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return t}executeAction(t,n){let i=this.contentNode,[r]=i.getContent();if(this.type===re.do)return r.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:r[0].contentNode}];if(this.type===re.doAsync){if(r.length===0)return super.executeAction(t,n);let s=or.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===re.any){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:s}}}else if(this.type===re.all){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:s}}}else if(this.type===re.allAsync){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().requestAsyncStackModel([{type:a.type,node:a.contentNode}]));return t.timelines.attachTimeline(S.all(...s.map(a=>t.game.getLiveGame().executeAsyncStackModel(a)))),super.executeAction(t,n)}else if(this.type===re.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let l=Xe.createCountLoop(t.game.getLiveGame(),a,this.checkActionChain(s));return t.logger.debug("ControlAction","repeat",s,a),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[l]}}}else if(this.type===re.while){let[s,a]=this.contentNode.getContent();if(s.length===0)return super.executeAction(t,n);if(!a.evaluate({gameState:t}).value)return super.executeAction(t,n);let l=Xe.createConditionLoop(t.game.getLiveGame(),a,this.getId(),this.checkActionChain(s));return t.logger.debug("ControlAction","while",s),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[l]}}}else if(this.type===re.break){if(!n.stackModel.isLoop())throw new Error("Control.breakLoop() can only be used inside a loop (repeat/while)");return n.stackModel.breakLoop(),{type:this.type,node:null}}else if(this.type===re.sleep){let[,s]=this.contentNode.getContent();if(t.isFastForwarding())return{type:this.type,node:this.contentNode.getChild()};let a;typeof s=="number"?a=S.delay(s):S.isAwaitable(s)?a=s:a=S.fromPromise(s);let l=new S,c=new Pe(a);return t.timelines.attachTimeline(c),a.then(()=>{l.resolve({type:this.type,node:this.contentNode.getChild()})}),l.onSkipControllerRegister(u=>{u.onAbort(()=>{c.abort()})}),l}else if(this.type===re.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,l=new Pe(a);t.timelines.attachTimeline(l);let c=t.game.preference,u=c.getPreference(q.Preferences.autoForward),d=c.getPreference(q.Preferences.gameSpeed),p=u?t.game.config.autoForwardDelay/d:null,h=!1,g=null,m=null,y=null,T=()=>{m?.cancel(),y?.cancel(),g&&(clearTimeout(g),g=null)},f=()=>{h||(h=!0,T(),a.resolve())};return m=t.events.on(L.EventTypes["event:state.player.stageClick"],f),y=t.events.on(L.EventTypes["event:state.player.skip"],f),p!==null&&(g=setTimeout(f,p)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(v=>{v.onAbort(()=>{h||(h=!0,T(),l.abort())})}),s}else{if(this.type===re.label)return super.executeAction(t,n);if(this.type===re.jump){let s=this._jumpTarget;if(!s){let[c]=this.contentNode.getContent();throw new xe(`Jump target label "${c}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),l=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},c=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(c,u)},[l]),a.getStackModelForce().clearAboveCallFrame().push({type:this.type,node:s.contentNode}),null}}throw new Error("Unknown control action type: "+this.type)}getFutureActions(t,n){if(this.callee.config.allowFutureScene===!1&&n.allowFutureScene===!1)return[...super.getFutureActions(t,n)];if(this.type===re.break||this.type===re.waitForClick||this.type===re.label||this.type===re.jump)return super.getFutureActions(t,n);let i=this.contentNode.getContent()[0],r=super.getFutureActions(t,n);return[...i??[],...r]}stringify(t,n,i){if(this.type===re.break)return super.stringifyWithContent("Control","break");if(this.type===re.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===re.label||this.type===re.jump){let[a]=this.contentNode.getContent(),l=this.type===re.label?"label":"jump";return super.stringifyWithContent("Control",`${l}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};or.ActionTypes=re;var se=or;var Ge=class o extends pe{constructor(t={}){super();this.config=t}static do(t){return new o().do(t)}static doAsync(t){return new o().doAsync(t)}static any(t){return new o().any(t)}static all(t){return new o().all(t)}static allAsync(t){return new o().allAsync(t)}static repeat(t,n){return new o().repeat(t,n)}static whileLoop(t,n){return new o().whileLoop(t,n)}static breakLoop(){return new o().breakLoop()}static sleep(t){return new o().sleep(t)}static waitForClick(){return new o().waitForClick()}static label(t){return new o().label(t)}static jump(t){return new o().jump(t)}do(t){return this.push(se.ActionTypes.do,t)}doAsync(t){return this.push(se.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(se.ActionTypes.any,t)}all(t){return this.pushUnchained(se.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(se.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(se.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=X.from(t);return this.pushWithLambda(se.ActionTypes.while,n,i)}breakLoop(){let t=new se(this.chain(),se.ActionTypes.break,new x().setContent([]));return this.chain(t)}sleep(t){return this.push(se.ActionTypes.sleep,[],t)}waitForClick(){let t=new se(this.chain(),se.ActionTypes.waitForClick,new x().setContent([]));return this.chain(t)}label(t){let n=new se(this.chain(),se.ActionTypes.label,new x().setContent([t]));return this.chain(n)}jump(t){let n=new se(this.chain(),se.ActionTypes.jump,new x().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new x().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new x().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new x().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?en.say(n).getActions():ze.toActions([n]))}};var $=class $ extends $e{static get DefaultUserConfig(){return $._defaultUserConfig??($._defaultUserConfig=new K({name:"(anonymous)",autoInit:!0,src:$.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...ne.DefaultTransformState.getDefaultConfig()},{position:e=>H.tryParsePosition(e)}))}static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return P.isStaticImageData(t)?P.srcToURL(t):P.isColor(t)?t:P.isImageSrc(t)?P.srcToURL(t):$.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isLayeredSrc(e){return!!e.config.src?.slots}static isSrcDefinitionObject(e){return typeof e=="object"&&e!==null&&!P.isImageSrc(e)&&!P.isColor(e)}static isLayeredDefinition(e){return this.isSrcDefinitionObject(e)&&"layers"in e}static isTagDefinition(e){return this.isSrcDefinitionObject(e)&&"resolve"in e}static isLayerVariants(e){return typeof e=="object"&&e!==null}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(P.isImageSrc(t)||P.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:$.isLayeredSrc(e)?null:$.isTagSrc(e)&&e.config.src.resolve?$.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):$.isStaticSrc(e)?P.isStaticImageData(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):P.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static getSrcURLs(e,t){let n=e.config.src?.slots;if(!n)return[];let i=new Set(t??e.state.currentSrc);return n.map(r=>$.resolveLayerSlot(r,i))}static resolveLayerSlot(e,t){if(e===null||typeof e=="string")return e;if(typeof e=="function")return e(t);for(let[n,i]of Object.entries(e))if(t.has(n))return i;return null}static getAllLayerSrc(e){let t=e.config.src?.slots;if(!t)return[];let n=[];for(let i of t)if(typeof i=="string")n.push(i);else if($.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new $({src:e})}constructor(e={}){super();let t=$.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new Ge,n=>{if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Error("Color src is not allowed for non-background image");return n.chain(this._setSrc(n,e,t))}else{let i=new Se(n,Se.ActionTypes.setAppearance,new x().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Ge,i=>i.chain(this._setDarkness(i,e,t,n)))}addWearable(e){let t=Array.isArray(e)?e:[e];for(let n of t){if(n===this)throw new Z("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:$.StateSerializer.serialize(this.state),transformState:ne.TransformStateSerializer.serialize(this.transformState.get()),loop:this._serializeLoop()}}fromData(e){return this.state=$.StateSerializer.deserialize(e.state),this.transformState.resetTo(ne.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_applyTransition(e,t){return new be(this.chain(),me.applyTransition,new x().setContent([e,t]))}_init(e,t){return new be(this.chain(),me.init,new x().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new Se(this.chain(),Se.ActionTypes.initWearable,new x().setContent([e]))}_flush(){return new Se(this.chain(),Se.ActionTypes.flush,new x)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get()),this}resolveTags(e,t){if(!$.isTagSrc(this))throw new Error(`Tag not defined
68
- Tag must be defined in the image config`);let n=this.constructTagMap(this.config.src.groups),i=new Map,r=[];this.config.src.groups.forEach(a=>{i.set(a,null)});let s=a=>{a.forEach(l=>{let c=n.get(l);c&&i.set(c,l)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let l=i.get(a);if(!l)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(l)}),r}_setAppearanceSync(e){if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Z("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!$.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new Z(`Trying to mix src and tags
65
+ To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(b)),r.get(b)||b}let{transformRef:u,transitionRefs:p,transitionTask:d,initDisplayable:g,applyTransition:f,applyTransform:m,applyLoop:y,stopLoop:T,updateStyleSync:h,flush:v,deps:A}=qt({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:b=>{if(l)return(b?b.task.resolve:[null]).map(V=>V&&typeof V=="function"?{style:Nd}:{style:Id(o.state.darkness)});let w=b?b.transition._getCurrentSrc():Md(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:P.isColor(w)?P.colorToString(w):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:P.isImageSrc(w)?P.srcToURL(w):O.DefaultImagePlaceholder},{style:{willChange:"filter",position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none",filter:"brightness(1)"}}]},propOverwrite:b=>b.src?{...b,src:c(b.src)}:b});At(o,{createWearable:b=>{i(w=>[...w,b])},disposeWearable:b=>{i(w=>w.filter(D=>D.getId()!==b.getId()))},initDisplayable:g,applyTransform:m,applyLoop:y,stopLoop:T,applyTransition:f,events:t,updateStyleSync:h,flush:v},[...A]);let x=mc((b,w)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${b}px`,height:`${w}px`}))},[t]),k=mc(()=>{t.emit("event:image.onLoad")},[t]);return Nt.createElement(Ld.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},Nt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},l?p.map(([b,w],D)=>{let V=d?d.task.resolve[D]:null;if(V&&typeof V=="function")return Nt.createElement(Qo,{key:w,ref:b,autoFit:o.config.autoFit});let le=V?V.key==="target"?d.transition._getTargetLayers():d.transition._getPrevLayers():l;return Nt.createElement(gc,{key:w,ref:b,src:le||l,autoFit:o.config.autoFit,resolveSrc:c,onSizeChanged:D===0?x:void 0,onLoad:D===0?k:void 0})}):p.map(([b,w],D)=>Nt.createElement(Qo,{key:w,ref:b,autoFit:o.config.autoFit,onSizeChanged:D===0?x:void 0,onLoad:D===0?k:void 0})),Nt.createElement("div",{className:hc("w-full h-full top-0 left-0 absolute")},n.map(b=>Nt.createElement("div",{className:hc("w-full h-full relative"),key:"wearable-"+b.getId()},Nt.createElement(yc,{image:b,state:e}))))))}var yc=Nt.memo(Gd),vc=yc;import er,{useEffect as ws,useMemo as Ud,useRef as tr}from"react";var Fd=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,Od=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function Sc(o,e){if(typeof e!="string"||!e.length)return o;if(Fd.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=Hd(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+Vd(r+e.replace(/\\/g,"/"))}function Hd(o){let e=Od.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function Vd(o){let e=o.split("/"),t=[];for(let n=0;n<e.length;n++){let i=e[n];if(!(i==="."||i===""&&n!==e.length-1)){if(i===".."){t.pop();continue}t.push(i)}}return t.join("/")}var Zo=class{constructor(){this.backends=new Map;this.reportedMissing=new Set}register(e){if(!e||typeof e.name!="string"||!e.name.length)throw new Error("A puppet backend must have a non-empty name.");if(typeof e.mount!="function")throw new Error(`Puppet backend "${e.name}" must implement mount().`);return this.backends.set(e.name,e),this.reportedMissing.delete(e.name),this}get(e){return this.backends.get(e)||null}has(e){return this.backends.has(e)}list(){return Array.from(this.backends.keys())}unregister(e){return this.backends.delete(e)}reportMissing(e,t){return this.reportedMissing.has(e)?!1:(this.reportedMissing.add(e),t(`No puppet backend is registered under "${e}". The element keeps its place on the stage, its transform and its saved state, but draws nothing. Register one with game.registerPuppetBackend({name, mount}) before the game mounts.`),!0)}};function ks({state:o,puppet:e}){let[t]=ce(),{cacheManager:n}=$t(),i=tr(null),r=Ud(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=tr(r);s.current=r;let{transformRef:a,transitionRefs:l,initDisplayable:c,applyTransform:u,applyLoop:p,stopLoop:d,applyTransition:g,updateStyleSync:f,deps:m}=qt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipImageTransform,skipTransition:o.game.config.allowSkipImageTransition,transitionsProps:[{style:{position:"relative",width:`${r.width}px`,height:`${r.height}px`}}]});At(e,{initDisplayable:c,applyTransform:u,applyLoop:p,stopLoop:d,applyTransition:g,updateStyleSync:f,flush:t},[...m]),ws(()=>{let v=i.current;if(!v)return;let A=o.game,x=e.config.backend,k=A.getPuppetBackend(x);if(!k)return e._setStatus("missing-backend"),A.getPuppetBackendRegistry().reportMissing(x,D=>{o.logger.warn("Puppet",D)}),()=>{e._setStatus("unmounted")};let b;try{b=k.mount(v,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:h,resolveSibling:D=>h(Sc(e.config.src,D)),warn:(D,V)=>{o.logger.warn("Puppet",D,V)}})}catch(D){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${x}" threw while mounting "${e.config.src}"`,D),()=>{e._setStatus("unmounted")}}let w=!1;return e._attachInstance(b),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!w&&typeof b.ready=="function"?b.ready():void 0).then(()=>{w||e._setStatus("ready")}).catch(D=>{w||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${x}" failed to load "${e.config.src}"`,D))}),()=>{w=!0,e._attachInstance(null),e._setStatus("unmounted");try{b.dispose()}catch(D){o.logger.error("Puppet",`Backend "${x}" threw while disposing`,D)}}},[]);let y=tr(r);ws(()=>{let v=y.current;if(v.width===r.width&&v.height===r.height)return;y.current=r;let A=e._getInstance();if(!(!A||typeof A.resize!="function"))try{A.resize(r)}catch(x){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,x)}},[r]);let T=tr(new Set);ws(()=>{let v=T.current;return()=>{v.forEach(A=>n.release(A)),v.clear()}},[]);function h(v){if(P.isDataURI(v))return v;let A=n.get(v);return A?(T.current.has(A)||(T.current.add(A),n.hold(A)),A):v}return er.createElement(Kt.Div,{"data-element-type":"puppet"},er.createElement(Kt.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},l.map(([v,A])=>er.createElement("div",{key:A,ref:v,className:e.config.className},er.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function Ps({state:o,displayable:e}){return Ei.createElement(Ei.Fragment,null,e.map(t=>{if(t instanceof kn)return Ei.createElement(Cs,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof O)return Ei.createElement(vc,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Lt)return Ei.createElement(ks,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import nr,{useEffect as Bd}from"react";import{motion as Wd}from"motion/react";function bc({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u,deps:p}=qt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return At(e,{initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u},[...p]),Bd(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),nr.createElement(nr.Fragment,null,nr.createElement(Wd.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([d,g])=>nr.createElement("div",{className:"relative w-full h-full",ref:d,key:g},t))))}async function Tc(o,e,t,n){let i=e.state.backgroundMusic,r=i&&o.audioManager.isManaged(i)?o.audioManager.stop(i,n):null;if(r&&t===i&&await r,t)try{await o.audioManager.playSoundToken(t,{end:t.state.volume,duration:n}),e.state.backgroundMusic=t}catch{e.state.backgroundMusic=null}else e.state.backgroundMusic=null;r&&await r}import zd from"clsx";import{useEffect as Es,useRef as Kd}from"react";import Ds from"react";function Ls({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=Kd(null);return Es(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),Es(()=>n.events.depends([n.events.on(Ye.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),Es(()=>(n.events.emit(Ye.EventTypes["event:scene.mount"]),o.events.emit(R.EventTypes["event:state.scene.mount"],n),o.logger.debug("Scene","Scene mounted",n.getId()),()=>{n.events.emit(Ye.EventTypes["event:scene.unmount"]),o.events.emit(R.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),At(n,{setBackgroundMusic(s,a){return Tc(o,n,s,a)}}),Ds.createElement("div",{className:zd(e,"w-full h-full absolute"),ref:r,"data-element-type":"scene","data-scene-id":n.getId()},[...i.entries()].sort(([s],[a])=>s.state.zIndex-a.state.zIndex).map(([s,a])=>Ds.createElement(bc,{state:o,layer:s,key:s.getId()},Ds.createElement(Ps,{state:o,displayable:a}))))}import{AnimatePresence as _d}from"motion/react";import{useEffect as Yd,useReducer as Xd,useRef as ir}from"react";import $d from"clsx";import _t,{useCallback as Rs,useMemo as jd,useRef as qd}from"react";function Is({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=N(),a=qd([]),l=Rs(f=>(a.current.push(f),a.current.indexOf(f)),[]),c=Rs(f=>{let m=a.current.indexOf(f);m!==-1&&a.current.splice(m,1)},[]),u=Rs(f=>a.current.indexOf(f),[]),p=s.config.menu,d=jd(()=>e.map(f=>({...f,words:f.prompt.evaluate(we.getCtx({gameState:n}))})),[e,n]);function g(f){t(f)}return _t.createElement(_t.Fragment,null,_t.createElement(ts,{value:{evaluated:d,choose:g,gameState:n}},_t.createElement(is,{value:{register:l,unregister:c,getIndex:u}},_t.createElement(zt,{className:"absolute"},r&&o&&_t.createElement(bi,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),_t.createElement(Kt.Div,{color:"green",border:"dashed",className:$d("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},_t.createElement(p,{items:d.map((f,m)=>m)})))))}function Ac({items:o}){return _t.createElement(xo,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>_t.createElement(Go,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Qd from"clsx";import Di from"react";var Cc=120;function xc({sources:o,menuCount:e,presence:t,retained:n,lastActive:i,sceneId:r}){if(o.length===0){let l=n??(i.length>0?i.map(c=>({...c,active:!1})):null);return{items:l??[],retained:l,lastActive:i,retaining:l!==null,interactive:e>0}}let s=new Set(o.map(({slot:l})=>l));for(let[l,c]of Array.from(t.slotKeys))s.has(l)||(t.exitingKeys.add(c),t.slotKeys.delete(l));let a=o.map(({slot:l,...c})=>{let u=t.slotKeys.get(l);return(!u||t.exitingKeys.has(u))&&(u=`say-${r}-${t.nextKey++}`,t.slotKeys.set(l,u)),{...c,presenceKey:u,slot:l,active:!0}});return{items:a,retained:null,lastActive:a,retaining:!1,interactive:!0}}function Ms({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=ir({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),a=ir([]),l=ir(null),c=ir(null),[,u]=Xd(y=>y+1,0),p=()=>{c.current&&(clearTimeout(c.current),c.current=null)},d=()=>{let y=l.current;if(!y)return;let T=s.current;y.forEach(({slot:h,presenceKey:v})=>{T.slotKeys.get(h)===v&&T.slotKeys.delete(h),T.exitingKeys.add(v)}),l.current=null,c.current=null,a.current=[],u()};Yd(()=>()=>{p()},[]);let g=s.current,f=i.length>0?i.map(({action:y,onClick:T},h)=>({action:y,slot:h,useTypeEffect:!0,onFinished:()=>{T(),o.events.emit(R.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((y,T)=>{if(!y.action.prompt||!y.action.words)return[];let h=g.menuPromptIds.get(y);return h||(h=`menu-prompt-${n.getId()}-${g.nextKey++}`,g.menuPromptIds.set(y,h)),[{action:{sentence:y.action.prompt,words:y.action.words,character:null,id:h},slot:T,useTypeEffect:!1}]}),m=xc({sources:f,menuCount:r.length,presence:g,retained:l.current,lastActive:a.current,sceneId:n.getId()});return l.current=m.retained,a.current=m.lastActive,m.retaining?c.current||(c.current=setTimeout(d,Cc)):p(),Di.createElement("div",{className:Qd(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs",style:{pointerEvents:m.interactive?"auto":"none"}},Di.createElement(_d,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{s.current.exitingKeys.clear()}},m.items.map(({action:y,onFinished:T,presenceKey:h,active:v,useTypeEffect:A})=>Di.createElement(bi,{gameState:o,key:h,action:y,active:v,onFinished:T,useTypeEffect:A}))),r.map(({action:y,onClick:T},h)=>Di.createElement("div",{key:"menu-"+h,"data-element-type":"menu"},Di.createElement(Is,{state:o,prompt:y.prompt,choices:y.choices,renderPrompt:!y.prompt,afterChoose:v=>{T(v),o.stage.next()},words:y.words}))))}import Sn,{useEffect as Jd,useRef as Ns}from"react";import{motion as Zd}from"motion/react";function wc({state:o,camera:e,children:t}){let n=Ns(null),i=Ns(null),r=Ns(null),{transformRef:s,transitionRefs:a,initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:p,stopLoop:d,updateStyleSync:g,deps:f}=qt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:Ua},{ref:i,project:Ha},{ref:r,project:Va}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return At(e,{initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:p,stopLoop:d,updateStyleSync:g},[...f]),Jd(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),Sn.createElement(Sn.Fragment,null,Sn.createElement(Zd.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,y])=>Sn.createElement("div",{className:"relative w-full h-full",ref:m,key:y},t))),Sn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},Sn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),Sn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),Sn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import em from"react";import{useEffect as Gs,useRef as tm}from"react";import{useCallback as kc}from"react";function Pc(o){let e=kc(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=kc(()=>{if(!o.current)return;let n=o.current;n.style.opacity="0",n.style.pointerEvents="none",n.style.visibility="hidden"},[o]);return{show:e,hide:t}}function Fs({gameState:o,video:e}){let t=tm(null),{show:n,hide:i}=Pc(t);Gs(()=>o.events.depends([o.events.on(R.EventTypes["event:state.player.skip"],()=>{o.game.config.allowSkipVideo&&(r(),o.logger.log("NarraLeaf-React: Video","Skipped"))})]).cancel,[]),Gs(()=>{i(),e.state.display&&n()},[]),Gs(()=>{if(!t.current)return;let s=t.current,a=!1,l=new Set,c=()=>new E(`Failed to add event listener, ref is not available
66
+ at Video.tsx: useEffect`),u=g=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw c();n()},hide:()=>{if(!t.current)throw c();i()},play:()=>{if(!t.current)throw c();let f=t.current;return g||f.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(f.currentTime=0,new Promise(m=>{let y=!1,T=null,h=[],v=()=>{y||(y=!0,l.delete(v),T&&T(),h.forEach(A=>A()),m())};l.add(v),T=o.schedule(({retry:A})=>{if(y)return;if(f.readyState<3){let w=()=>{f.removeEventListener("loadeddata",w),A()};f.addEventListener("loadeddata",w),h.push(()=>f.removeEventListener("loadeddata",w));return}let x=()=>v(),k=()=>v(),b=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),v()};f.addEventListener("ended",x),f.addEventListener("stopped",k),f.addEventListener("error",b),h.push(()=>{f.removeEventListener("ended",x),f.removeEventListener("stopped",k),f.removeEventListener("error",b)}),f.play().catch(w=>{o.logger.error("Failed to play video: "+w),v()})},10)}))},pause:()=>{if(!t.current)throw c();t.current.pause()},resume:()=>{if(!t.current)throw c();return t.current.play().catch(f=>{o.logger.error("Failed to resume video: "+f)})},stop:()=>{if(!t.current)throw c();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:f=>{if(!t.current)throw c();t.current.currentTime=f}}))},p=()=>u(!1),d=()=>{o.logger.error("NarraLeaf-React: Video",`Failed to load video source: ${e.config.src}`+(s.error?` (media error code ${s.error.code})`:"")),u(!0)};return s.addEventListener("canplay",p),s.addEventListener("error",d),s.readyState>=3?u(!1):s.error&&d(),()=>{s.removeEventListener("canplay",p),s.removeEventListener("error",d),l.forEach(g=>g()),s.currentTime>0&&s.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]);function r(){t.current&&(t.current.pause(),t.current.currentTime=0,t.current.dispatchEvent(new Event("stopped")))}return em.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,playsInline:!0,width:"100%",height:"100%",onContextMenu:s=>s.preventDefault()})}import nm,{useEffect as im,useRef as om}from"react";var Ec={linear:"linear",easeIn:"cubic-bezier(0.42, 0, 1, 1)",easeOut:"cubic-bezier(0, 0, 0.58, 1)",easeInOut:"cubic-bezier(0.42, 0, 0.58, 1)"};function rm(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&Ec[e]?Ec[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Os({gameState:o,vfx:e}){let t=om(null);return im(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,l=new Set,c=new Set,u=[],p=A=>{n.style.transition="",n.style.opacity=String(A)},d=()=>{n.play().catch(A=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+A)})},g=()=>i||n.error?(o.logger.error("NarraLeaf-React: Vfx","Cannot wait for a vfx whose source failed to load: "+e.config.src),Promise.resolve()):n.readyState>=2?Promise.resolve():new Promise(A=>{let x=!1,k=()=>w(),b=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),w()},w=()=>{x||(x=!0,c.delete(w),n.removeEventListener("loadeddata",k),n.removeEventListener("error",b),A())};c.add(w),n.addEventListener("loadeddata",k),n.addEventListener("error",b),(n.readyState>=2||n.error)&&w()}),f=(A,x,k)=>{let b=x?.duration??0,w=++s;return k.instant||b<=0?(p(A),Promise.resolve()):new Promise(D=>{let V=!1,le=null,re=()=>{V||(V=!0,c.delete(re),le!==null&&clearTimeout(le),s===w&&t.current&&p(A),D())};c.add(re),n.style.transition=`opacity ${b}ms ${rm(o,x?.easing)}`,n.offsetWidth,n.style.opacity=String(A),le=setTimeout(re,b)})},m=A=>{r||(r=!0,i=A,o.mountState(e,{show:async x=>{a=!0;let k={instant:!1};l.add(k);try{if(await g(),!t.current)return;n.playbackRate=x?.rate??e.config.playbackRate,e.state.paused||d(),await f(x?.opacity??e.config.opacity,x,k)}finally{l.delete(k)}},hide:async x=>{a=!0;let k={instant:!1};l.add(k);try{await f(0,x,k),t.current&&n.pause()}finally{l.delete(k)}},pause:()=>{n.pause()},resume:()=>{d()},setRate:x=>{n.playbackRate=x}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&p(e.config.opacity)},0)))},y=()=>m(!1),T=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),m(!0)},h=o.events.on(R.EventTypes["event:state.player.skip"],()=>{l.size===0&&c.size===0||(l.forEach(A=>{A.instant=!0}),[...c].forEach(A=>A()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),v=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&d()};return document.addEventListener("visibilitychange",v),n.style.opacity="0",n.playbackRate=e.config.playbackRate,e.config.muted||o.logger.weakWarn("NarraLeaf-React: Vfx","Vfx is not muted; autoplay may be rejected by the browser. (src: "+e.config.src+")"),e.state.display&&!e.state.paused&&d(),n.addEventListener("canplay",y),n.addEventListener("error",T),n.readyState>=3?m(!1):n.error&&T(),()=>{n.removeEventListener("canplay",y),n.removeEventListener("error",T),document.removeEventListener("visibilitychange",v),h.cancel(),u.forEach(A=>A()),[...c].forEach(A=>A()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),nm.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,loop:e.config.loop,playsInline:!0,onContextMenu:n=>n.preventDefault(),style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:e.config.fit,pointerEvents:"none"}})}import sm from"clsx";import am,{useCallback as lm,useEffect as or,useRef as cm}from"react";function Hs({children:o,className:e,gameState:t}){let{ratio:n}=ye(),i=N(),[r]=ce(),s=cm(null),a=i.config.minWidth,l=i.config.minHeight,c=lm(u=>{if(n.isLocked()){t.logger.weakWarn("AspectRatio","ratio is locked, skipping update");return}n.update(u.width,u.height,u.scale),n.updateMin(a,l),r()},[r,t.logger,l,a,n]);return or(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),or(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),or(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,l,a]),or(()=>t.events.on(R.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),am.createElement(Ql,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:l,debounceMs:i.config.ratioUpdateInterval,className:sm(e),onUpdate:c},o)}import Dc,{useEffect as um,useRef as pm,useState as Lc}from"react";function Vs({src:o,width:e,height:t}){let[n,i]=Lc({x:0,y:0}),[r,s]=Lc(!1),a=pm(null),{ratio:l}=ye();return um(()=>{let c=u=>{if(a.current){let p=a.current.getBoundingClientRect(),d=u.clientX-p.left,g=u.clientY-p.top;i({x:d,y:g}),r||s(!0)}};return window.addEventListener("mousemove",c),()=>{window.removeEventListener("mousemove",c)}},[r]),Dc.createElement(zt,{ref:a,className:"overflow-hidden absolute"},Dc.createElement("img",{src:o,style:{position:"absolute",left:n.x,top:n.y,width:e,height:t,pointerEvents:"none",zIndex:1001,display:r?"block":"none",cursor:"none",transform:`scale(${l.state.scale})`},alt:""}))}import Rc from"react";import an from"react";function Us({error:o,errorInfo:e}){return N().config.app.debug?an.createElement("div",{className:"text-left"},an.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),an.createElement("p",{className:"text-red-700"},"Message: ",o.message),an.createElement("pre",null,"Error Stack: ",o?.stack),an.createElement("pre",null,"Component Stack: ",e?.componentStack),an.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):an.createElement("div",{className:"bg-white w-full h-full"},an.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),an.createElement("p",null,"Please contact the game developer for further assistance."))}var rr=class extends Rc.Component{constructor(){super(...arguments);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t,errorInfo:null}}componentDidCatch(t,n){this.setState({error:t,errorInfo:n}),this.props.onError?.(t,n),console.error(t,n)}render(){return this.state.hasError?Rc.createElement(Us,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import Nc from"clsx";import B,{useEffect as Ct,useReducer as Gc,useState as Xn}from"react";import{flushSync as Fc}from"react-dom";import{useRef as dm}from"react";import{useEffect as mm}from"react";function Ic({gameState:o}){let e=dm(null);return mm(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(R.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Li,{useEffect as fm}from"react";function Bs({gameState:o}){let[e]=ce(),{ratio:t}=ye(),n=o.notificationMgr;fm(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Li.createElement("div",{style:{transform:`scale(${t.state.scale})`,transformOrigin:"left top"},className:"absolute top-0 left-0 w-full h-full pointer-events-none","data-element-type":"notification"},Li.createElement(i,{notifications:n.toArray()}))}function Mc({notifications:o}){return Li.createElement(Oo,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Li.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Li.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Oc({story:o=di.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:l,onError:c,children:u,active:p=!0}){let[d,g]=Gc(F=>F+1,0),[f,m]=Gc(F=>F+1,0),[y,T]=Xn(0),h=N(),[v]=Xn(()=>new R(h,{update:g,forceUpdate:()=>{v.logger.weakWarn("Player","force update"),Fc(()=>{g()})},forceRemount:()=>{v.logger.weakWarn("Player","force remount"),Fc(()=>{T(F=>F+1),g()})},next:I})),A=B.createRef(),x=B.createRef(),[k,b]=Xn(!1),w=B.useRef(!1),D=B.useRef(null),V=B.useRef(null),{preloaded:le,cacheManager:re}=$t(),[De,St]=Xn(!1),Gt=B.useRef(!1),[kt,bt]=Xn(!1),Ue=B.useRef(!1),pt=B.useRef(null),ee=B.useRef(!1),[dt]=Xn(new Map);function Je(F){return{game:h,gameState:v,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable(),scene:F}}function I(){let F=()=>{dt.forEach(G=>G.cancel())};if(v.rollLock.isLocked())return;F();let L=!1,te=0;for(;!L;){if(te++>h.config.maxStackModelLoop)throw new E("Max stack model loop reached");let G=h.getLiveGame().next();if(!G){if(h.getLiveGame().stackModel&&!h.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(G)){if(D.current===G)break;D.current=G,G.onSettled(()=>{G.isFailed()||(D.current===G&&(D.current=null),I())}),G.onFailed(he=>{D.current===G&&(D.current=null),v.logger.error("Player",he)}),L=!0;break}if(G instanceof Mn){if(V.current===G)break;V.current=G,G.nextUnlock().then(()=>{V.current===G&&(V.current=null),I()}),L=!0;break}if(Xe.isCalledActionResult(G)&&G.wait&&Xe.isStackModelsAwaiting(G.wait.type,G.wait.stackModels)){if(D.current===G)break;if(D.current=G,G.wait){let he=Xe.executeStackModelGroup(G.wait.type,G.wait.stackModels);he.then(()=>{D.current===G&&(D.current=null),I()}),he.onFailed(Ge=>{D.current===G&&(D.current=null),v.logger.error("Player",Ge)})}L=!0;break}v.handle(G)}v.stage.update()}Ct(()=>{v.audioManager.initialize()},[]),Ct(()=>(v.setImageCache(re),()=>{v.setImageCache(null)}),[re]),Ct(()=>(h.getLiveGame().setGameState(v),o&&!h.getLiveGame().isPlaying()&&h.getLiveGame().loadStory(o),o?.entryScene&&!v.getPreloadingScene()&&!v.getLastScene()&&v.preloadScene(o.entryScene),v.playerCurrent=A.current,v.mainContentNode=x.current,()=>{h.getLiveGame().setGameState(void 0),v.playerCurrent=null}),[h,o]),Ct(()=>st(()=>{b(!0);let F=v.getLastScene(),L=[];F?L.push(F.events.once("event:scene.mount",()=>{v.stage.next()}).cancel):v.stage.next();let te=v.events.on(R.EventTypes["event:state.end"],()=>{l&&l({game:h,gameState:v,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable()})});return v.stage.update(),()=>{F&&L.forEach(G=>G()),te.cancel()}}),[]),Ct(()=>st(()=>{k&&i&&!w.current&&(w.current=!0,v.stage.forceUpdate(),h.hooks.trigger("init",[]),i({game:h,gameState:v,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable()}))}),[k]),Ct(()=>st(()=>{if(De&&s&&!Gt.current){Gt.current=!0;let F=pt.current||v.getLastScene()||v.getPreloadingScene(),L=Je(F);s(L)}}),[De]),Ct(()=>st(()=>{if(kt&&!Ue.current){Ue.current=!0;let F=pt.current||v.getLastScene()||v.getPreloadingScene(),L=Je(F);h.markPreloadComplete(L)&&r&&r(L)}}),[kt]),Ct(()=>v.events.on(R.EventTypes["event:state.scene.mount"],F=>{pt.current||(pt.current=F,m())}).cancel,[]),Ct(()=>{if(!kt||!p||ee.current||h.isFirstSceneReady())return;let F=pt.current||v.getLastScene();if(!F)return;let L=null,te=null,G=!1;ee.current=!0;let he=()=>{G=!0,ee.current=!1;let Ge=Je(F);h.markFirstSceneReady(Ge)&&a&&a(Ge)};return typeof requestAnimationFrame=="function"?L=requestAnimationFrame(()=>{te=setTimeout(he,0)}):te=setTimeout(he,0),()=>{G||(ee.current=!1,L!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(L),te!==null&&clearTimeout(te))}},[p,f,d,kt]),Ct(()=>le.events.depends([le.events.on(je.EventTypes["event:preloaded.ready"],()=>{St(!0),v.stage.update(),o&&h.getLiveGame().isPlaying()&&I()}),le.events.on(je.EventTypes["event:preloaded.complete"],()=>{bt(!0)})]).cancel,[]),Ct(()=>{v.flushDep=d},[d]);let X=e||h.config.width,ue=t||h.config.height;return B.createElement(rr,{onError:c},B.createElement("div",{style:{width:typeof X=="number"?`${X}px`:X,height:typeof ue=="number"?`${ue}px`:ue},className:Nc(n,"__narraleaf_content-player"),ref:A,tabIndex:0},B.createElement(Hs,{className:Nc("flex-grow overflow-auto"),gameState:v},B.createElement(vs,{gameState:v}),B.createElement(Ic,{gameState:v}),B.createElement(zt,{className:"absolute",ref:x,style:{cursor:v.game.config.cursor?"none":"auto",overflow:v.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},h.config.cursor&&B.createElement(Vs,{src:h.config.cursor,width:h.config.cursorWidth,height:h.config.cursorHeight}),B.createElement(hm,{show:De&&p,key:y},B.createElement(ms,null,B.createElement(ic,{state:v}),B.createElement(lc,{state:v}),B.createElement(gm,{state:v},B.createElement("div",{className:"w-full h-full absolute",style:{isolation:"isolate"},"data-element-type":"scene-group"},v.getSceneElements().map(F=>B.createElement(Ls,{key:"scene-"+F.scene.getId(),state:v,elements:F}))),B.createElement(ym,{state:v}),v.getVideos().map((F,L)=>B.createElement("div",{className:"w-full h-full absolute",key:"video-"+L,"data-element-type":"video"},B.createElement(Fs,{gameState:v,video:F}))),v.getVfx().map(F=>B.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+F.getId(),"data-element-type":"vfx",style:{zIndex:F.config.zIndex,mixBlendMode:F.config.blendMode}},B.createElement(Os,{gameState:v,vfx:F})))),v.getSceneElements().map(F=>B.createElement(Ms,{key:"scene-dialogs-"+F.scene.getId(),state:v,elements:F})),B.createElement(vm,{NvlComponent:h.config.nvlDialog}))),B.createElement(pc,{state:v}),B.createElement($l,null,u),B.createElement(Bs,{gameState:v})))))}function hm({children:o,show:e}){return B.createElement(B.Fragment,null,e?o:null)}function gm({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?B.createElement(wc,{state:o,camera:t},e):B.createElement(B.Fragment,null,e)}function ym({state:o}){let e=B.useRef(null);return Ct(()=>(o.stageTransition.registerOverlayHost(e.current),()=>{o.stageTransition.registerOverlayHost(null)}),[]),B.createElement("div",{className:"w-full h-full absolute pointer-events-none",ref:e,"data-element-type":"stage-transition-overlay-host"})}function vm({NvlComponent:o}){let{dialogs:e,state:t}=jt(),i=N().getLiveGame().getGameState(),r=B.useMemo(()=>e.map((s,a)=>{let l=s.sentence.evaluate(we.getCtx({gameState:i})),c=t.activeDialogId===s.id,u=c&&t.phase==="typing";return{entry:s,index:a,isActive:c,gameState:i,words:l,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return B.createElement(o,{dialogs:r})}import"client-only";import Qn from"react";function Hc({children:o,game:e}){return Qn.createElement(Qn.Fragment,null,Qn.createElement(tl,null,Qn.createElement(Xa,{game:e},Qn.createElement(Vl,null,Qn.createElement(el,null,o)))))}var Sm=(l=>(l.image="narraleaf:image",l.text="narraleaf:text",l.layer="narraleaf:layer",l.scene="narraleaf:scene",l.video="narraleaf:video",l.vfx="narraleaf:vfx",l.camera="narraleaf:camera",l.puppet="narraleaf:puppet",l))(Sm||{});import bm from"clsx";import xt,{useEffect as Uc,useRef as Tm,useState as Am}from"react";function Vc(o){return o?{className:"",ariaHidden:!1}:{className:"opacity-0",ariaHidden:!0}}import{motion as Cm,useIsPresent as xm}from"motion/react";var wm={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function km({children:o,initial:e,transition:t,...n}){let i=N(),r=It(),{ratio:s}=ye(),[a]=yn(q.Preferences.showDialog),l=Tm(null),[c]=En("nextAction"),u=xm(),[p,d]=Am(null),g=Vc(a);function f(){a&&(r.config.gameState.isAdvanceSuspended()||r.requestComplete())}return Uc(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
67
+ at Say.tsx: onElementClick`);return}let m=T=>{T.repeat||r.config.gameState.isAdvanceSuspended()||i.keyMap.match("nextAction",T.key)&&r.requestComplete()};window.addEventListener("keydown",m);let y=r.events.on(Ne.Events.simulateClick,()=>{l.current&&l.current.click()});return()=>{window.removeEventListener("keydown",m),y.cancel()}},[r,c]),Uc(()=>{let m=i.preference.onPreferenceChange(q.Preferences.autoForward,y=>{y&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{m.cancel()}},[r]),xt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},xt.createElement("div",{className:bm("absolute bottom-0 w-full h-full",g.className),"aria-hidden":g.ariaHidden,onClick:f,style:{...Gn(i.config.useAspectScale,{maxWidth:i.config.dialogWidth,maxHeight:i.config.dialogHeight,transform:`scale(${s.state.scale})`,transformOrigin:"bottom left",width:i.config.width,height:i.config.height})},ref:l},xt.createElement(ys,{value:p},xt.createElement(Cm.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&u?{duration:0}:t},o)),xt.createElement("div",{"data-element-type":"dialog-overlay",className:"absolute inset-0 pointer-events-none",ref:d})))}function Bc({children:o,...e}){let t=It();return!t.config.action.sentence||!t.config.action.words?null:xt.createElement(km,{...e},o)}var Sd=Bc;function Wc(){return xt.createElement(Bc,null,xt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},xt.createElement(rs,null),xt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},xt.createElement(sn,null),xt.createElement(vn,{...wm}))))}var Ri={say:Wc,menu:Ac,notification:Mc,nvlDialog:gs};var sr=class{constructor(e){this.game=e;this.plugins=[];this.registerAll()}use(e){return this.plugins.push(e),this}register(e){e.register(this.game)}registerAll(){this.plugins.forEach(e=>e.register(this.game))}unregisterAll(){this.plugins.forEach(e=>e.unregister(this.game))}has(e){return this.plugins.some(t=>t.name===e.name)}};var Ii=class{constructor(e={}){this.keyMap=e;this.events=new Q}setKeyBinding(e,t){this.keyMap[e]=t,this.events.emit("event:keyMap.change",e,t)}getKeyBinding(e){return this.keyMap[e]??null}addKeyBinding(e,t){if(t===null)return;let n=this.getKeyBinding(e)??[],i=r=>Array.isArray(r)?r:[r];Array.isArray(n)?this.setKeyBinding(e,[...n,...i(t)]):this.setKeyBinding(e,[n,...i(t)])}getKeyBindings(){return this.keyMap}onKeyBindingChange(e,t){return this.events.on("event:keyMap.change",(n,i)=>{n===e&&t(i)})}importKeyBindings(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setKeyBinding(t,e[t])}exportKeyBindings(){return this.keyMap}match(e,t){let n=this.getKeyBinding(e);return n===null?!1:Array.isArray(n)?n.includes(t)||n.some(i=>i.toLowerCase()===t.toLowerCase()):n===t||n.toLowerCase()===t.toLowerCase()}};var zc=(e=>(e.game="game",e))(zc||{}),Qe=class Qe{constructor(e){this.hooks=new $i;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new vi(Qe.DefaultPreference);this.audioBuses=new ai(()=>this.config.audioBuses??[],ka(this.preference));this.keyMap=new Ii({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new Q;this.puppetBackends=new Zo;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=j(Qe.DefaultConfig,e),this.plugins=new sr(this),this.router=new gn(this)}configure(e){let[t,n]=fa(e,this.freezeFields);return n.length>0&&console.warn(`NarraLeaf-React [Game] The following fields are not allowed to be configured: ${n.join(", ")}`),this.config=j(this.config,t),Object.prototype.hasOwnProperty.call(t,"audioBuses")&&this.audioBuses.invalidate(),this.getLiveGame().getGameState()?.events.emit(R.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}registerPuppetBackend(e){return this.puppetBackends.register(e),this}getPuppetBackend(e){return this.puppetBackends.get(e)}listPuppetBackends(){return this.puppetBackends.list()}getPuppetBackendRegistry(){return this.puppetBackends}onPreloadComplete(e){return this.lifecycleEvents.on(Qe.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(Qe.LifecycleEventTypes["event:game.preloadComplete"],e)}whenPreloadComplete(){return this.preloadCompleteContext?Promise.resolve(this.preloadCompleteContext):new Promise(e=>{this.oncePreloadComplete(e)})}isPreloadComplete(){return this.preloadCompleteContext!==null}onFirstSceneReady(e){return this.lifecycleEvents.on(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e)}whenFirstSceneReady(){return this.firstSceneReadyContext?Promise.resolve(this.firstSceneReadyContext):new Promise(e=>{this.onceFirstSceneReady(e)})}isFirstSceneReady(){return this.firstSceneReadyContext!==null}markPreloadComplete(e){return this.preloadCompleteContext?!1:(this.preloadCompleteContext=e,this.lifecycleEvents.emit(Qe.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.audioBuses.dispose(),this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new Bt(this)}};Qe.defaultSettings={volume:1},Qe.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,textRevealDuration:0,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:0,skipInterval:100},Qe.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",textRevealDuration:"textRevealDuration",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},Qe.DefaultConfig={app:{debug:!1,logger:{log:!1,info:!1,warn:!0,error:!0,debug:!1,trace:!1,verbose:!1},inspector:!1,guard:{invalidExposedStateUnmounting:!0,unexpectedTimelineStatusChange:!0}},contentContainerId:"__narraleaf_content",aspectRatio:16/9,minWidth:800,minHeight:450,width:1920,height:1080,useWindowListener:!0,ratioUpdateInterval:50,preloadDelay:100,preloadConcurrency:5,waitForPreload:!0,preloadGate:"firstFrame",preloadAllImages:!0,forceClearCache:!1,maxPreloadActions:10,imageCacheBudgetBytes:256*1024*1024,decodedImageBudgetBytes:128*1024*1024,cursor:null,cursorHeight:30,cursorWidth:30,showOverflow:!1,maxRouterHistory:10,screenshotQuality:1,useAspectScale:!0,autoForwardDelay:3*1e3,autoForwardDefaultPause:1e3,allowSkipImageTransform:!0,allowSkipImageTransition:!0,allowSkipBackgroundTransform:!0,allowSkipSceneTransition:!0,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:Ri.notification,menu:Ri.menu,dialog:Ri.say,nvlDialog:Ri.nvlDialog,onError:e=>{console.error(e)},disableTextScaling:!1,stage:null,maxStackModelLoop:1e3,maxActionHistory:100,maxSceneCallDepth:8,audioBuses:[],audioStreaming:"loops"},Qe.GameSettingsNamespace=zc,Qe.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var q=Qe;var ar=class ar extends _{constructor(){super(...arguments);this._jumpTarget=null}setJumpTarget(t){return this._jumpTarget=t,this}getJumpTarget(){return this._jumpTarget}static executeActionsAsync(t,n){let i=t.game.getLiveGame().requestAsyncStackModel([{type:n.type,node:n.contentNode}]);return t.game.getLiveGame().executeAsyncStackModel(i)}checkActionChain(t){if(t.some(n=>!!n.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return t}executeAction(t,n){let i=this.contentNode,[r]=i.getContent();if(this.type===se.do)return r.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:r[0].contentNode}];if(this.type===se.doAsync){if(r.length===0)return super.executeAction(t,n);let s=ar.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===se.any){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:s}}}else if(this.type===se.all){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:s}}}else if(this.type===se.allAsync){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().requestAsyncStackModel([{type:a.type,node:a.contentNode}]));return t.timelines.attachTimeline(S.all(...s.map(a=>t.game.getLiveGame().executeAsyncStackModel(a)))),super.executeAction(t,n)}else if(this.type===se.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let l=Xe.createCountLoop(t.game.getLiveGame(),a,this.checkActionChain(s));return t.logger.debug("ControlAction","repeat",s,a),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[l]}}}else if(this.type===se.while){let[s,a]=this.contentNode.getContent();if(s.length===0)return super.executeAction(t,n);if(!a.evaluate({gameState:t}).value)return super.executeAction(t,n);let l=Xe.createConditionLoop(t.game.getLiveGame(),a,this.getId(),this.checkActionChain(s));return t.logger.debug("ControlAction","while",s),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[l]}}}else if(this.type===se.break){if(!n.stackModel.isLoop())throw new Error("Control.breakLoop() can only be used inside a loop (repeat/while)");return n.stackModel.breakLoop(),{type:this.type,node:null}}else if(this.type===se.sleep){let[,s]=this.contentNode.getContent();if(t.isFastForwarding())return{type:this.type,node:this.contentNode.getChild()};let a;typeof s=="number"?a=S.delay(s):S.isAwaitable(s)?a=s:a=S.fromPromise(s);let l=new S,c=new ke(a);return t.timelines.attachTimeline(c),a.then(()=>{l.resolve({type:this.type,node:this.contentNode.getChild()})}),l.onSkipControllerRegister(u=>{u.onAbort(()=>{c.abort()})}),l}else if(this.type===se.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,l=new ke(a);t.timelines.attachTimeline(l);let c=t.game.preference,u=c.getPreference(q.Preferences.autoForward),p=c.getPreference(q.Preferences.gameSpeed),d=u?t.game.config.autoForwardDelay/p:null,g=!1,f=null,m=null,y=null,T=()=>{m?.cancel(),y?.cancel(),f&&(clearTimeout(f),f=null)},h=()=>{g||(g=!0,T(),a.resolve())};return m=t.events.on(R.EventTypes["event:state.player.stageClick"],h),y=t.events.on(R.EventTypes["event:state.player.skip"],h),d!==null&&(f=setTimeout(h,d)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(v=>{v.onAbort(()=>{g||(g=!0,T(),l.abort())})}),s}else{if(this.type===se.label)return super.executeAction(t,n);if(this.type===se.jump){let s=this._jumpTarget;if(!s){let[c]=this.contentNode.getContent();throw new Ce(`Jump target label "${c}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),l=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},c=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(c,u)},[l]),a.getStackModelForce().clearAboveCallFrame().push({type:this.type,node:s.contentNode}),null}}throw new Error("Unknown control action type: "+this.type)}getFutureActions(t,n){if(this.callee.config.allowFutureScene===!1&&n.allowFutureScene===!1)return[...super.getFutureActions(t,n)];if(this.type===se.break||this.type===se.waitForClick||this.type===se.label||this.type===se.jump)return super.getFutureActions(t,n);let i=this.contentNode.getContent()[0],r=super.getFutureActions(t,n);return[...i??[],...r]}stringify(t,n,i){if(this.type===se.break)return super.stringifyWithContent("Control","break");if(this.type===se.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===se.label||this.type===se.jump){let[a]=this.contentNode.getContent(),l=this.type===se.label?"label":"jump";return super.stringifyWithContent("Control",`${l}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};ar.ActionTypes=se;var ae=ar;var Fe=class o extends pe{constructor(t={}){super();this.config=t}static do(t){return new o().do(t)}static doAsync(t){return new o().doAsync(t)}static any(t){return new o().any(t)}static all(t){return new o().all(t)}static allAsync(t){return new o().allAsync(t)}static repeat(t,n){return new o().repeat(t,n)}static whileLoop(t,n){return new o().whileLoop(t,n)}static breakLoop(){return new o().breakLoop()}static sleep(t){return new o().sleep(t)}static waitForClick(){return new o().waitForClick()}static label(t){return new o().label(t)}static jump(t){return new o().jump(t)}do(t){return this.push(ae.ActionTypes.do,t)}doAsync(t){return this.push(ae.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(ae.ActionTypes.any,t)}all(t){return this.pushUnchained(ae.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(ae.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(ae.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=Y.from(t);return this.pushWithLambda(ae.ActionTypes.while,n,i)}breakLoop(){let t=new ae(this.chain(),ae.ActionTypes.break,new C().setContent([]));return this.chain(t)}sleep(t){return this.push(ae.ActionTypes.sleep,[],t)}waitForClick(){let t=new ae(this.chain(),ae.ActionTypes.waitForClick,new C().setContent([]));return this.chain(t)}label(t){let n=new ae(this.chain(),ae.ActionTypes.label,new C().setContent([t]));return this.chain(n)}jump(t){let n=new ae(this.chain(),ae.ActionTypes.jump,new C().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new ae(this.chain(),t,new C().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new ae(this.chain(),t,new C().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new ae(this.chain(),t,new C().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?nn.say(n).getActions():ze.toActions([n]))}};var $=class $ extends $e{static get DefaultUserConfig(){return $._defaultUserConfig??($._defaultUserConfig=new K({name:"(anonymous)",autoInit:!0,src:$.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...ie.DefaultTransformState.getDefaultConfig()},{position:e=>H.tryParsePosition(e)}))}static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return P.isStaticImageData(t)?P.srcToURL(t):P.isColor(t)?t:P.isImageSrc(t)?P.srcToURL(t):$.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isLayeredSrc(e){return!!e.config.src?.slots}static isSrcDefinitionObject(e){return typeof e=="object"&&e!==null&&!P.isImageSrc(e)&&!P.isColor(e)}static isLayeredDefinition(e){return this.isSrcDefinitionObject(e)&&"layers"in e}static isTagDefinition(e){return this.isSrcDefinitionObject(e)&&"resolve"in e}static isLayerVariants(e){return typeof e=="object"&&e!==null}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(P.isImageSrc(t)||P.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:$.isLayeredSrc(e)?null:$.isTagSrc(e)&&e.config.src.resolve?$.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):$.isStaticSrc(e)?P.isStaticImageData(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):P.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static getSrcURLs(e,t){let n=e.config.src?.slots;if(!n)return[];let i=new Set(t??e.state.currentSrc);return n.map(r=>$.resolveLayerSlot(r,i))}static resolveLayerSlot(e,t){if(e===null||typeof e=="string")return e;if(typeof e=="function")return e(t);for(let[n,i]of Object.entries(e))if(t.has(n))return i;return null}static getAllLayerSrc(e){let t=e.config.src?.slots;if(!t)return[];let n=[];for(let i of t)if(typeof i=="string")n.push(i);else if($.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new $({src:e})}constructor(e={}){super();let t=$.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new Fe,n=>{if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Error("Color src is not allowed for non-background image");return n.chain(this._setSrc(n,e,t))}else{let i=new Se(n,Se.ActionTypes.setAppearance,new C().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Fe,i=>i.chain(this._setDarkness(i,e,t,n)))}addWearable(e){let t=Array.isArray(e)?e:[e];for(let n of t){if(n===this)throw new J("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:$.StateSerializer.serialize(this.state),transformState:ie.TransformStateSerializer.serialize(this.transformState.get()),loop:this._serializeLoop()}}fromData(e){return this.state=$.StateSerializer.deserialize(e.state),this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_applyTransition(e,t){return new Te(this.chain(),me.applyTransition,new C().setContent([e,t]))}_init(e,t){return new Te(this.chain(),me.init,new C().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new Se(this.chain(),Se.ActionTypes.initWearable,new C().setContent([e]))}_flush(){return new Se(this.chain(),Se.ActionTypes.flush,new C)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get()),this}resolveTags(e,t){if(!$.isTagSrc(this))throw new Error(`Tag not defined
68
+ Tag must be defined in the image config`);let n=this.constructTagMap(this.config.src.groups),i=new Map,r=[];this.config.src.groups.forEach(a=>{i.set(a,null)});let s=a=>{a.forEach(l=>{let c=n.get(l);c&&i.set(c,l)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let l=i.get(a);if(!l)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(l)}),r}_setAppearanceSync(e){if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new J("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!$.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new J(`Trying to mix src and tags
69
69
  To better understand the behavior of the image, you cannot mix static src and tags in the same image. `)}_invalidSrcHandlerError(){throw new Error("Invalid src handler, If you are using tags, config.src must be a function that resolves the src from the tags. If you are using src, config.src must be a string or StaticImageData")}_invalidWearableError(e){throw new Error(`Invalid wearable
70
70
  Wearable must be an Image with isWearable set to true
71
71
  It seems like you are trying to add a non-wearable image to wearables
72
72
  Image below violates the rule:
73
73
  `+e)}_invalidTagGroupDefinitionError(e,t=!1){throw new Error("Invalid tag group definition. Tags in groups must be unique and not conflicting with each other."+(e?`
74
74
  Tag "${e}" belongs to more than one group.`:"")+(t?`
75
- Layers offering the same tag set share one group, so a shared tag means two layers offer different sets. Repeat the whole set on every layer that follows the group, using null where that layer draws nothing.`:""))}_setSrc(e,t,n){return n&&e.chain(this._applyTransition(n.copy(),i=>i._setPrevSrc(Se.resolveCurrentSrc(this))._setTargetSrc(t))),new Se(e,Se.ActionTypes.setSrc,new x().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?$.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc($.getSrcFromTags(e.defaults,e.resolve)):P.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(P.srcToURL(this.state.currentSrc)),this}static collectLayerGroups(e){let t=[],n=new Set;for(let i of e){if(!$.isLayerVariants(i))continue;let r=Object.keys(i),s=[...r].sort().join("\0");n.has(s)||(n.add(s),t.push(r))}return t}static normalizeSrcDefinition(e){return $.isLayeredDefinition(e)?{groups:$.collectLayerGroups(e.layers),defaults:[...e.defaults],resolve:null,slots:e.layers}:$.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return $.DefaultImageConfig.create({...t,src:$.normalizeSrcDefinition(t.src)})}getInitialState(){return $.DefaultImageState.create().assign({currentSrc:$.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(ne.DefaultTransformState.keys());return new ne(ne.DefaultTransformState.create(t.get()).get())}checkConfig(){for(let e of this.config.wearables)if(!e.config.isWearable)throw this._invalidWearableError(JSON.stringify(e.config));if($.isTagSrc(this)){let e=this.config.src,t=new Set;for(let r of e.groups)for(let s of r){if(t.has(s))throw this._invalidTagGroupDefinitionError(s,!!e.slots);t.add(s)}let n=this.constructTagMap(e.groups),i=new Set;for(let r of e.defaults){if(i.has(r))throw new Error(`Tag conflict
75
+ Layers offering the same tag set share one group, so a shared tag means two layers offer different sets. Repeat the whole set on every layer that follows the group, using null where that layer draws nothing.`:""))}_setSrc(e,t,n){return n&&e.chain(this._applyTransition(n.copy(),i=>i._setPrevSrc(Se.resolveCurrentSrc(this))._setTargetSrc(t))),new Se(e,Se.ActionTypes.setSrc,new C().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?$.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc($.getSrcFromTags(e.defaults,e.resolve)):P.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(P.srcToURL(this.state.currentSrc)),this}static collectLayerGroups(e){let t=[],n=new Set;for(let i of e){if(!$.isLayerVariants(i))continue;let r=Object.keys(i),s=[...r].sort().join("\0");n.has(s)||(n.add(s),t.push(r))}return t}static normalizeSrcDefinition(e){return $.isLayeredDefinition(e)?{groups:$.collectLayerGroups(e.layers),defaults:[...e.defaults],resolve:null,slots:e.layers}:$.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return $.DefaultImageConfig.create({...t,src:$.normalizeSrcDefinition(t.src)})}getInitialState(){return $.DefaultImageState.create().assign({currentSrc:$.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(ie.DefaultTransformState.keys());return new ie(ie.DefaultTransformState.create(t.get()).get())}checkConfig(){for(let e of this.config.wearables)if(!e.config.isWearable)throw this._invalidWearableError(JSON.stringify(e.config));if($.isTagSrc(this)){let e=this.config.src,t=new Set;for(let r of e.groups)for(let s of r){if(t.has(s))throw this._invalidTagGroupDefinitionError(s,!!e.slots);t.add(s)}let n=this.constructTagMap(e.groups),i=new Set;for(let r of e.defaults){if(i.has(r))throw new Error(`Tag conflict
76
76
  Tag "${r}" is conflicting with another tag
77
77
  Error found in config.tag.defaults`);if(!n.has(r))throw new Error(`Tag not found
78
78
  Tag "${r}" is not defined in tagDefinitions
79
- Error found in config.tag.defaults`);n.get(r)?.forEach(s=>i.add(s))}if(e.slots){let r=new Set(e.defaults);for(let s of e.groups)if(!s.some(a=>r.has(a)))throw new Z(`Layer has no default
80
- The group with tags "${s.join(", ")}" needs exactly one of them listed in src.defaults`)}}return this}constructTagMap(e){let t=new Map;for(let n of e)for(let i of n)t.set(i,n);return t}_setDarkness(e,t,n,i){return new Se(e,Se.ActionTypes.setDarkness,new x().setContent([t,n,i]))}};$.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",$.StateSerializer=new _e,$._defaultUserConfig=null,$.DefaultImageConfig=new K({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),$.DefaultImageState=new K({currentSrc:$.DefaultImagePlaceholder,darkness:0});var F=$;var Ae=class extends Vt{constructor(){super(...arguments);this._detached=!1}_setDetached(t){return this._detached=t,this}_isDetached(){return this._detached}_setPrevLayers(t){return this._prevLayers=t,this}_setTargetLayers(t){return this._targetLayers=t,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(t){return this._prevSrc=t,this}_setTargetSrc(t){return this._targetSrc=t,this}_setCurrentSrc(t){return this._currentSrc=t,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),n}asPrev(t){return super.asPrev((...n)=>j(t(...n),this._srcToProps(this._prevSrc)))}asTarget(t){return super.asTarget((...n)=>j(t(...n),this._srcToProps(this._targetSrc)))}_srcToProps(t){if(this._isLayered()||this._detached)return{};if(P.isColor(t))return{src:F.DefaultImagePlaceholder,style:{backgroundColor:P.isRGBAColor(t)?P.RGBAColorToHex(t):t}};if(P.isImageSrc(t))return{src:P.srcToURL(t)};throw new Z("Image transition src cannot be identified, using: "+t)}};import{anticipate as Tm,backIn as bm,backInOut as Am,backOut as Cm,circIn as xm,circInOut as wm,circOut as km,cubicBezier as Pm,easeIn as Em,easeInOut as Vc,easeOut as Dm}from"motion/react";var Hc=1;function z(o){return o<0?0:o>1?1:o}function Uc(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function Vs(o){return{position:"absolute",top:"50%",left:"50%",width:`calc(100% + ${Hc*2}px)`,height:`calc(100% + ${Hc*2}px)`,transform:"translate(-50%, -50%)",backgroundColor:o}}function Wc(o){switch(o){case"left":return"to left";case"top":return"to top";case"bottom":return"to bottom";case"right":default:return"to right"}}function Bc(o){return o==="vertical"?"to right":"to bottom"}var Lm={easeIn:Em,easeOut:Dm,easeInOut:Vc,circIn:xm,circOut:km,circInOut:wm,backIn:bm,backOut:Cm,backInOut:Am,anticipate:Tm};function Us(o){return typeof o=="function"?o:Array.isArray(o)?Pm(o[0],o[1],o[2],o[3]):o==="linear"?e=>e:Lm[o??"easeInOut"]??Vc}function rr(o){let e=Us(o.easing),t=(1-Mi(o))/2,n=1-t;return i=>i<=t?t<=0?1:e(z(i/t)):i>=n?n>=1?1:e(z((1-i)/(1-n))):1}function Mi(o){return o.holdMs!==void 0?o.duration<=0?o.holdMs>0?1:0:z(o.holdMs/o.duration):z(o.hold??0)}var Ni=class o extends Ae{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.holdMs=e.holdMs,this.easing=e.easing}createTask(){let e=Mi({duration:this.duration,holdMs:this.holdMs}),t=Us(this.easing),n=i=>i<=e?this.from:e>=1?this.from:this.from+(this.to-this.from)*t((i-e)/(1-e));return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asTarget(i=>({style:{filter:`brightness(${1-n(i)})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o({from:this.from,to:this.to,duration:this.duration,holdMs:this.holdMs,easing:this.easing})}};var Gi=class Gi extends Y{static resolveTagSrc(e,t){if(!F.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return F.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(F.isLayeredSrc(e))throw e._mixedSrcError();if(F.isStaticSrc(e))return P.isImageSrc(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):e.state.currentSrc;if(F.isTagSrc(e)&&e.config.src.resolve)return F.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===ft.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new S(s=>s);return i.createWearable(n),e.getExposedStateAsync(n,s=>{s.initDisplayable(()=>{r.resolve(super.executeAction(e,t))})}),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.disposeWearable(s)},[n]),r}else if(this.type===ft.setSrc){let n=this.contentNode.getContent()[0];if(P.isColor(n)&&!this.callee.config.isBackground)throw new Z("Color src is not allowed for non-background image");let i=this.callee.state.currentSrc;return this.callee.state.currentSrc=n,e.logger.debug("Image Set Src",n),e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.currentSrc=r},[i]),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else{if(this.type===ft.flush)return super.executeAction(e,t);if(this.type===ft.setAppearance){let[n,i]=this.contentNode.getContent();if(!F.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],l=()=>{this.callee.state.currentSrc=a};if(F.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let d=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevLayers(F.getSrcURLs(this.callee))._setTargetLayers(F.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),g=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:g},l,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.flush(),super.executeAction(e,t)}let c=this.callee.config.src.resolve;if(!c)throw this.callee._invalidSrcHandlerError();let u=F.getSrcFromTags(s,c);if(e.logger.debug("Image - Set Appearance",s,u),i){let d=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevSrc(Gi.resolveCurrentSrc(this.callee))._setTargetSrc(u);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),g=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:g},l,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===ft.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},l=e.getExposedStateForce(this.callee);if(i){let c=new S(h=>h),u=new Ni({from:s,to:n,duration:i,easing:r});if(F.isLayeredSrc(this.callee)){let h=F.getSrcURLs(this.callee);u._setPrevLayers(h)._setTargetLayers(h)}else{let h=Gi.resolveCurrentSrc(this.callee);u._setPrevSrc(h)._setTargetSrc(h)}let d=l.applyTransition(u,()=>{this.callee.state.darkness=n,c.resolve(super.executeAction(e,t))}),p=e.timelines.attachTimeline(c).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:p},()=>{c.isSettled()||c.abort(),d.abort(),a()}),c}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),l.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};Gi.ActionTypes=ft;var Se=Gi;var Ws=class o{static isHexString(e){return typeof e!="string"?!1:/^#[0-9A-F]{6}$/i.test(e)}static fromHex(e){let t=e.slice(1),n=parseInt(t.slice(0,2),16),i=parseInt(t.slice(2,4),16),r=parseInt(t.slice(4,6),16),s=t.length===8?parseInt(t.slice(6,8),16)/255:1;return new o(n,i,r,s)}constructor(e,t,n,i=1){this.r=e,this.g=t,this.b=n,this.a=i}toString(){return`rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`}toHex(){return"#"+this.r.toString(16)+this.g.toString(16)+this.b.toString(16)}},wt=class wt{static srcToURL(e){return typeof e=="string"?e:e.src}static staticImageDataToSrc(e){return typeof e=="string"?e:e.src}static isStaticImageData(e){return e?.src!==void 0&&typeof e.src=="string"}static isExternalSrc(e){return e.startsWith("http://")||e.startsWith("https://")}static isImageSrc(e){return typeof e=="string"&&!this.isColor(e)||wt.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return wt.isHexString(e)||wt.isNamedColor(e)||wt.isRGBAColor(e)}static isNamedColor(e){return la(e)}static isRGBAColor(e){return e&&typeof e=="object"&&"r"in e&&"g"in e&&"b"in e}static RGBAColorToHex(e){let t=e.r.toString(16).padStart(2,"0"),n=e.g.toString(16).padStart(2,"0"),i=e.b.toString(16).padStart(2,"0"),r=e.a?Math.round(e.a*255).toString(16).padStart(2,"0"):"";return`#${t}${n}${i}${r}`}static colorToString(e){if(wt.isHexString(e))return e;if(wt.isNamedColor(e))return e;if(wt.isRGBAColor(e))return wt.RGBAColorToHex(e);throw new Error("Unknown color type")}static isHexString(e){return typeof e!="string"?!1:/^#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})$/i.test(e)}static toBackgroundSrc(e){return typeof e=="string"?e:e.src}static isDataURI(e){return e.startsWith("data:")}static isInlineSrc(e){return wt.isDataURI(e)||e.startsWith("blob:")}static offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,l=this.calc(i,s),c=this.calc(r,a),u=n.invertX?{right:l}:{left:l},d=n.invertY?{bottom:c}:{top:c};return{left:"auto",right:"auto",top:"auto",bottom:"auto",...u,...d}}static calc(e,t){let n=typeof e=="string"?e:`${e}px`;if(t===void 0)return`calc(${n} + 0px)`;let i=typeof t=="string"?"+":t<0?"-":"+",r=typeof t=="string"?t:`${Math.abs(t)}px`;return`calc(${n} ${i} ${r})`}static formatLength(e){return typeof e=="number"?`${e}px`:e}static toPixel(e){return typeof e=="number"?e:parseFloat(e)}};wt.RGBColor=Ws;var P=wt,Bs=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},Fe=class o extends Bs{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},go=class{constructor(e){this.scene=e}run(e){let t=new Map,n=new Map,i=[],r=new Set,s=this.scene.getAllChildren(e,this.scene.getSceneRoot());if(!s.length)return null;for(i.push(s[0]);i.length;){let a=i.shift();this.checkAction(e,a,{imageStates:t,scenes:n},r);let l=a.contentNode.getChild();l&&l.action&&i.push(l.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof Se)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof te){let s=t.callee;if(i.has(s.config.name)){if(i.get(s.config.name)!==s){let a=`Scene with name: ${s.config.name} is duplicated
79
+ Error found in config.tag.defaults`);n.get(r)?.forEach(s=>i.add(s))}if(e.slots){let r=new Set(e.defaults);for(let s of e.groups)if(!s.some(a=>r.has(a)))throw new J(`Layer has no default
80
+ The group with tags "${s.join(", ")}" needs exactly one of them listed in src.defaults`)}}return this}constructTagMap(e){let t=new Map;for(let n of e)for(let i of n)t.set(i,n);return t}_setDarkness(e,t,n,i){return new Se(e,Se.ActionTypes.setDarkness,new C().setContent([t,n,i]))}};$.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",$.StateSerializer=new _e,$._defaultUserConfig=null,$.DefaultImageConfig=new K({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),$.DefaultImageState=new K({currentSrc:$.DefaultImagePlaceholder,darkness:0});var O=$;var Ae=class extends Ut{constructor(){super(...arguments);this._detached=!1}_setDetached(t){return this._detached=t,this}_isDetached(){return this._detached}_setPrevLayers(t){return this._prevLayers=t,this}_setTargetLayers(t){return this._targetLayers=t,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(t){return this._prevSrc=t,this}_setTargetSrc(t){return this._targetSrc=t,this}_setCurrentSrc(t){return this._currentSrc=t,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),n}asPrev(t){return super.asPrev((...n)=>j(t(...n),this._srcToProps(this._prevSrc)))}asTarget(t){return super.asTarget((...n)=>j(t(...n),this._srcToProps(this._targetSrc)))}_srcToProps(t){if(this._isLayered()||this._detached)return{};if(P.isColor(t))return{src:O.DefaultImagePlaceholder,style:{backgroundColor:P.isRGBAColor(t)?P.RGBAColorToHex(t):t}};if(P.isImageSrc(t))return{src:P.srcToURL(t)};throw new J("Image transition src cannot be identified, using: "+t)}};import{anticipate as Pm,backIn as Em,backInOut as Dm,backOut as Lm,circIn as Rm,circInOut as Im,circOut as Mm,cubicBezier as Nm,easeIn as Gm,easeInOut as $c,easeOut as Fm}from"motion/react";var Kc=1;function z(o){return o<0?0:o>1?1:o}function jc(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function Ws(o){return{position:"absolute",top:"50%",left:"50%",width:`calc(100% + ${Kc*2}px)`,height:`calc(100% + ${Kc*2}px)`,transform:"translate(-50%, -50%)",backgroundColor:o}}function qc(o){switch(o){case"left":return"to left";case"top":return"to top";case"bottom":return"to bottom";case"right":default:return"to right"}}function _c(o){return o==="vertical"?"to right":"to bottom"}var Om={easeIn:Gm,easeOut:Fm,easeInOut:$c,circIn:Rm,circOut:Mm,circInOut:Im,backIn:Em,backOut:Lm,backInOut:Dm,anticipate:Pm};function zs(o){return typeof o=="function"?o:Array.isArray(o)?Nm(o[0],o[1],o[2],o[3]):o==="linear"?e=>e:Om[o??"easeInOut"]??$c}function lr(o){let e=zs(o.easing),t=(1-Mi(o))/2,n=1-t;return i=>i<=t?t<=0?1:e(z(i/t)):i>=n?n>=1?1:e(z((1-i)/(1-n))):1}function Mi(o){return o.holdMs!==void 0?o.duration<=0?o.holdMs>0?1:0:z(o.holdMs/o.duration):z(o.hold??0)}var Ni=class o extends Ae{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.holdMs=e.holdMs,this.easing=e.easing}createTask(){let e=Mi({duration:this.duration,holdMs:this.holdMs}),t=zs(this.easing),n=i=>i<=e?this.from:e>=1?this.from:this.from+(this.to-this.from)*t((i-e)/(1-e));return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asTarget(i=>({style:{filter:`brightness(${1-n(i)})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o({from:this.from,to:this.to,duration:this.duration,holdMs:this.holdMs,easing:this.easing})}};var Gi=class Gi extends _{static resolveTagSrc(e,t){if(!O.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return O.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(O.isLayeredSrc(e))throw e._mixedSrcError();if(O.isStaticSrc(e))return P.isImageSrc(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):e.state.currentSrc;if(O.isTagSrc(e)&&e.config.src.resolve)return O.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===mt.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new S(s=>s);return i.createWearable(n),e.getExposedStateAsync(n,s=>{s.initDisplayable(()=>{r.resolve(super.executeAction(e,t))})}),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.disposeWearable(s)},[n]),r}else if(this.type===mt.setSrc){let n=this.contentNode.getContent()[0];if(P.isColor(n)&&!this.callee.config.isBackground)throw new J("Color src is not allowed for non-background image");let i=this.callee.state.currentSrc;return this.callee.state.currentSrc=n,e.logger.debug("Image Set Src",n),e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.currentSrc=r},[i]),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else{if(this.type===mt.flush)return super.executeAction(e,t);if(this.type===mt.setAppearance){let[n,i]=this.contentNode.getContent();if(!O.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],l=()=>{this.callee.state.currentSrc=a};if(O.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let p=new S(m=>m).registerSkipController(new U(()=>super.executeAction(e,t)));i._setPrevLayers(O.getSrcURLs(this.callee))._setTargetLayers(O.getSrcURLs(this.callee,s));let g=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(p).attachChild(g);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.flush(),super.executeAction(e,t)}let c=this.callee.config.src.resolve;if(!c)throw this.callee._invalidSrcHandlerError();let u=O.getSrcFromTags(s,c);if(e.logger.debug("Image - Set Appearance",s,u),i){let p=new S(m=>m).registerSkipController(new U(()=>super.executeAction(e,t)));i._setPrevSrc(Gi.resolveCurrentSrc(this.callee))._setTargetSrc(u);let g=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(p).attachChild(g);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===mt.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},l=e.getExposedStateForce(this.callee);if(i){let c=new S(g=>g),u=new Ni({from:s,to:n,duration:i,easing:r});if(O.isLayeredSrc(this.callee)){let g=O.getSrcURLs(this.callee);u._setPrevLayers(g)._setTargetLayers(g)}else{let g=Gi.resolveCurrentSrc(this.callee);u._setPrevSrc(g)._setTargetSrc(g)}let p=l.applyTransition(u,()=>{this.callee.state.darkness=n,c.resolve(super.executeAction(e,t))}),d=e.timelines.attachTimeline(c).attachChild(p);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:d},()=>{c.isSettled()||c.abort(),p.abort(),a()}),c}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),l.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};Gi.ActionTypes=mt;var Se=Gi;var Ks=class o{static isHexString(e){return typeof e!="string"?!1:/^#[0-9A-F]{6}$/i.test(e)}static fromHex(e){let t=e.slice(1),n=parseInt(t.slice(0,2),16),i=parseInt(t.slice(2,4),16),r=parseInt(t.slice(4,6),16),s=t.length===8?parseInt(t.slice(6,8),16)/255:1;return new o(n,i,r,s)}constructor(e,t,n,i=1){this.r=e,this.g=t,this.b=n,this.a=i}toString(){return`rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`}toHex(){return"#"+this.r.toString(16)+this.g.toString(16)+this.b.toString(16)}},wt=class wt{static srcToURL(e){return typeof e=="string"?e:e.src}static staticImageDataToSrc(e){return typeof e=="string"?e:e.src}static isStaticImageData(e){return e?.src!==void 0&&typeof e.src=="string"}static isExternalSrc(e){return e.startsWith("http://")||e.startsWith("https://")}static isImageSrc(e){return typeof e=="string"&&!this.isColor(e)||wt.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return wt.isHexString(e)||wt.isNamedColor(e)||wt.isRGBAColor(e)}static isNamedColor(e){return pa(e)}static isRGBAColor(e){return e&&typeof e=="object"&&"r"in e&&"g"in e&&"b"in e}static RGBAColorToHex(e){let t=e.r.toString(16).padStart(2,"0"),n=e.g.toString(16).padStart(2,"0"),i=e.b.toString(16).padStart(2,"0"),r=e.a?Math.round(e.a*255).toString(16).padStart(2,"0"):"";return`#${t}${n}${i}${r}`}static colorToString(e){if(wt.isHexString(e))return e;if(wt.isNamedColor(e))return e;if(wt.isRGBAColor(e))return wt.RGBAColorToHex(e);throw new Error("Unknown color type")}static isHexString(e){return typeof e!="string"?!1:/^#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})$/i.test(e)}static toBackgroundSrc(e){return typeof e=="string"?e:e.src}static isDataURI(e){return e.startsWith("data:")}static isInlineSrc(e){return wt.isDataURI(e)||e.startsWith("blob:")}static offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,l=this.calc(i,s),c=this.calc(r,a),u=n.invertX?{right:l}:{left:l},p=n.invertY?{bottom:c}:{top:c};return{left:"auto",right:"auto",top:"auto",bottom:"auto",...u,...p}}static calc(e,t){let n=typeof e=="string"?e:`${e}px`;if(t===void 0)return`calc(${n} + 0px)`;let i=typeof t=="string"?"+":t<0?"-":"+",r=typeof t=="string"?t:`${Math.abs(t)}px`;return`calc(${n} ${i} ${r})`}static formatLength(e){return typeof e=="number"?`${e}px`:e}static toPixel(e){return typeof e=="number"?e:parseFloat(e)}};wt.RGBColor=Ks;var P=wt,$s=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},Oe=class o extends $s{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},go=class{constructor(e){this.scene=e}run(e){let t=new Map,n=new Map,i=[],r=new Set,s=this.scene.getAllChildren(e,this.scene.getSceneRoot());if(!s.length)return null;for(i.push(s[0]);i.length;){let a=i.shift();this.checkAction(e,a,{imageStates:t,scenes:n},r);let l=a.contentNode.getChild();l&&l.action&&i.push(l.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof Se)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof ne){let s=t.callee;if(i.has(s.config.name)){if(i.get(s.config.name)!==s){let a=`Scene with name: ${s.config.name} is duplicated
81
81
  Scene: ${s.config.name}
82
82
 
83
- At: ${t.__stack}`;throw new Fe(a)}}else i.set(s.config.name,s);if(t.type===W.jumpTo){let a=t.contentNode.getContent()[0],l=e.getScene(a,!0);if(r.has(l))return;r.add(l)}}}checkImage(e,t){if(t.type===ft.setSrc){let i=t.contentNode.getContent()[0];P.isImageURL(i)&&P.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},Z=class o extends Error{static describeAction(e,t){return`
83
+ At: ${t.__stack}`;throw new Oe(a)}}else i.set(s.config.name,s);if(t.type===W.jumpTo){let a=t.contentNode.getContent()[0],l=e.getScene(a,!0);if(r.has(l))return;r.add(l)}}}checkImage(e,t){if(t.type===mt.setSrc){let i=t.contentNode.getContent()[0];P.isImageURL(i)&&P.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},J=class o extends Error{static describeAction(e,t){return`
84
84
  Action: (id: ${e.id}) ${e.type}`+(t?`
85
85
  At: ${t}`:"")}static getActionTrace(e){return o.describeAction({id:e.getId(),type:String(e.type)},e.__stack)}static toMessage(e,t){let n=[];return n.push(...Array.isArray(e)?e:[e]),t&&n.push(...Array.isArray(t)?t.map(o.getActionTrace):[o.getActionTrace(t)]),n.join("")}constructor(e,t){super(Array.isArray(e)?e.join(""):e),this.name="RuntimeScriptError";let n=t===void 0?[]:Array.isArray(t)?t:[t],i=n[0];if(i&&(this.action={id:i.getId(),type:String(i.type)},this.actionStack=i.__stack),this.traceTail=n.map(o.getActionTrace).join(""),this.traceTail&&typeof this.stack=="string"){let r=this.stack.indexOf(this.message);this.stack=r===-1?`${this.name}: ${this.composedMessage}
86
- ${this.stack}`:this.stack.slice(0,r)+this.composedMessage+this.stack.slice(r+this.message.length)}}get composedMessage(){return this.message+this.traceTail}},E=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},xe=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function Rm(o,e){return ie.color(o,e)}function Im(o){return ie.bold(o)}function Mm(o){return ie.italic(o)}var zs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(e=>({style:{opacity:1-e}})),this.asTarget(e=>({style:{opacity:e}}))]}}copy(){return new o({duration:this.duration,easing:this.easing})}};var Ks=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.offset=e.offset??[0,0],this.easing=e.easing}createTask(e){let{invertX:t,invertY:n}=e.getStory().getInversionConfig();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing},{type:0,start:this.offset[0],end:0,duration:this.duration,ease:this.easing},{type:0,start:this.offset[1],end:0,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget((i,r,s)=>({style:{opacity:i,translate:`${t?-r:r}px ${n?-s:s}px`}}))]}}copy(){return new o({duration:this.duration,offset:this.offset,easing:this.easing})}};var $s=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.blur=e.blur??16,this.easing=e.easing}createTask(){let e=Math.max(0,this.blur);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:{opacity:1-z(t),filter:`blur(${e*z(t)}px)`}})),this.asTarget(t=>({style:{opacity:z(t),filter:`blur(${e*(1-z(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var js=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.direction=e.direction??"left",this.easing=e.easing}axisSign(){switch(this.direction){case"right":return{axis:"x",sign:1};case"top":return{axis:"y",sign:-1};case"bottom":return{axis:"y",sign:1};case"left":default:return{axis:"x",sign:-1}}}translate(e){let{axis:t}=this.axisSign(),n=`${e}%`;return{translate:t==="x"?`${n} 0px`:`0px ${n}`}}createTask(){let{sign:e}=this.axisSign();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:this.translate(e*100*z(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-z(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};var qs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.ev=e.ev??4.6,this.lift=e.lift??.04,this.hold=e.hold,this.holdMs=e.holdMs,this.easing=e.easing}burnStyle(e){let t=z(e);if(t<=0)return{filter:"none"};let n=z(this.lift)*t,i=Math.pow(2,Math.max(0,this.ev)*t);return{filter:`invert(1) brightness(${1-n}) invert(1) brightness(${i})`}}createTask(){let t=rr({duration:this.duration,hold:this.hold,holdMs:this.holdMs,easing:this.easing});return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(n=>({style:{opacity:n<.5?1:0,...this.burnStyle(t(n))}})),this.asTarget(n=>({style:{opacity:n<.5?0:1,...this.burnStyle(t(n))}}))]}}copy(){return new o({duration:this.duration,ev:this.ev,lift:this.lift,hold:this.hold,holdMs:this.holdMs,easing:this.easing})}};function M(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function In(o,e,t){return o<e?e:o>t?t:o}var sn=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${M(t)}deg`:Wc(t);return{mask:(r,s)=>{let a=-n+(s?1-z(r):z(r))*(100+n);return s?`linear-gradient(${i}, transparent ${M(a)}%, #000 ${M(a+n)}%)`:`linear-gradient(${i}, #000 ${M(a)}%, transparent ${M(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${M(t)}deg`,`${M(t+180)}deg`]:t==="vertical"?["to bottom","to top"]:["to right","to left"];return{mask:(s,a)=>{let l=-n+z(s)*(50+n);if(!a){let c=u=>`linear-gradient(${u}, #000 ${M(l)}%, transparent ${M(l+n)}%)`;return`${c(i)}, ${c(r)}`}if(l<0){let c=z((l+n)/Math.max(n,1e-6));return`linear-gradient(${i}, transparent ${M(50-l-n)}%, rgba(0,0,0,${M(c)}) 50%, transparent ${M(50+l+n)}%)`}return`linear-gradient(${i}, transparent ${M(50-l-n)}%, #000 ${M(50-l)}%, #000 ${M(50+l)}%, transparent ${M(50+l+n)}%)`}}}static iris(e={}){let t=e.center??"50% 50%",n=Math.max(0,e.feather??12),i=e.shape??"circle";return{mask:(r,s)=>{if(s){let l=(1-z(r))*150;return`radial-gradient(${i} at ${t}, transparent ${M(l-n)}%, #000 ${M(l)}%)`}let a=z(r)*150;return`radial-gradient(${i} at ${t}, #000 ${M(a-n)}%, transparent ${M(a)}%)`}}}static clock(e={}){let t=e.center??"50% 50%",n=e.from??0,i=Math.max(0,e.feather??24),r=e.direction??"clockwise";return{mask:(s,a)=>{let l=r==="counterclockwise"!=!!a,c=-i+z(s)*(360+i);if(l){let d=Math.max(0,360-c-i),p=Math.max(d,360-c);return`conic-gradient(from ${M(n)}deg at ${t}, transparent ${M(d)}deg, #000 ${M(p)}deg)`}let u=Math.max(0,c);return`conic-gradient(from ${M(n)}deg at ${t}, #000 ${M(u)}deg, transparent ${M(Math.max(u,c+i))}deg)`}}}static fan(e={}){let t=Math.max(1,Math.round(e.blades??4)),n=e.center??"50% 50%",i=e.from??0,r=Math.max(0,e.feather??10),s=360/t;return{mask:(a,l)=>{let c=-r+(l?1-z(a):z(a))*(s+r),u=In(c,0,s),d=In(c+r,0,s),p=`repeating-conic-gradient(from ${M(i)}deg at ${n}`;return l?`${p}, transparent 0deg, transparent ${M(u)}deg, #000 ${M(d)}deg, #000 ${M(s)}deg)`:`${p}, #000 0deg, #000 ${M(u)}deg, transparent ${M(d)}deg, transparent ${M(s)}deg)`}}}static blinds(e={}){let t=e.orientation??"horizontal",n=Math.max(1,Math.round(e.slats??8)),i=Math.max(0,e.feather??0),r=In(e.stagger??0,-1,1),s=typeof t=="number"?`${M(t)}deg`:Bc(t),a=100/n,l=Math.abs(r)/n,c=1-l*(n-1),u=(p,h)=>l*(r>=0!==h?p:n-1-p),d=(p,h,g)=>{let m=-i+(g?1-h:h)*(a+i),y=In(m,0,a),T=In(m+i,0,a),f=p*a;return g?`linear-gradient(${s}, transparent ${M(f+y)}%, #000 ${M(f+T)}%, #000 ${M(f+a)}%, transparent ${M(f+a)}%)`:`linear-gradient(${s}, transparent ${M(f)}%, #000 ${M(f)}%, #000 ${M(f+y)}%, transparent ${M(f+T)}%)`};return{mask:(p,h)=>{if(r!==0){let T=[];for(let f=0;f<n;f++)T.push(d(f,z((z(p)-u(f,!!h))/c),!!h));return T.join(", ")}let g=-i+(h?1-z(p):z(p))*(a+i),m=In(g,0,a),y=In(g+i,0,a);return h?`repeating-linear-gradient(${s}, transparent 0, transparent ${M(m)}%, #000 ${M(y)}%, #000 ${M(a)}%)`:`repeating-linear-gradient(${s}, #000 0, #000 ${M(m)}%, transparent ${M(y)}%, transparent ${M(a)}%)`}}}static dots(e={}){let t=Math.max(1,e.rows??6),n=Math.max(1,e.cols??10),i=Math.max(0,e.feather??20),s=z(e.stagger??0)*.5,a=(l,c,u)=>{let d=-i+z(c)*(100+i);return u?`radial-gradient(circle farthest-corner at ${l}, transparent ${M(d)}%, #000 ${M(d+i)}%)`:`radial-gradient(circle farthest-corner at ${l}, #000 ${M(d)}%, transparent ${M(d+i)}%)`};return{size:`${M(100/n)}% ${M(100/t)}%`,repeat:"repeat",mask:(l,c)=>{let u=c?1-z(l):z(l);if(s<=0)return a("50% 50%",u,c);let d=z(u/(1-s)),p=z((u-s)/(1-s));return c?`${a("50% 50%",p,!0)}, ${a("0% 0%",d,!0)}`:`${a("50% 50%",d)}, ${a("0% 0%",p)}`}}}static invert(e){return{...e,mask:(t,n)=>e.mask(t,!n)}}static toStyle(e,t,n=!1){return Uc(e.mask(t,n),e.size,e.repeat)}};var Nm=.3,_s=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold,this.holdMs=e.holdMs,this.pattern=e.pattern??null,this.inverted=e.inverted??!1,this.uncover=e.uncover??"retreat",this.easing=e.easing}coverStyle(e,t){if(!this.pattern)return{...Vs(this.color),opacity:z(e)};let n={...Vs(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...sn.toStyle(this.pattern,e,!this.inverted)}:{...n,...sn.toStyle(this.uncover,e)}:{...n,...sn.toStyle(this.pattern,e,this.inverted)}}createTask(){let e={duration:this.duration,hold:this.hold??(this.holdMs===void 0?Nm:void 0),holdMs:this.holdMs,easing:this.easing},t=1-(1-Mi(e))/2,n=.5,i=rr(e);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(r=>({style:{opacity:r<n?1:0}})),this.asTarget(r=>({style:{opacity:r<n?0:1}})),r=>({src:F.DefaultImagePlaceholder,style:this.coverStyle(i(r),r>=t)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,holdMs:this.holdMs,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var Ys=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.pattern=e.pattern,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(e=>({style:sn.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var Jn="http://www.w3.org/2000/svg",Gm="http://www.w3.org/1999/xlink",Fm=.002,Om=1,Hm=.12,Vm=0,Xs=class o extends Ae{constructor(t){super();this.filterId=null;this.host=null;this.cut=null;this.duration=t.duration,this.rule=P.srcToURL(t.rule),this.feather=Math.min(Om,Math.max(Fm,t.feather??Hm)),this.inverted=t.inverted??!1,this.easing=t.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(t=>({style:this.styleAt(t)}))]}}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>this.dispose()),n.onCanceled(()=>this.dispose()),n}copy(){return new o({duration:this.duration,rule:this.rule,feather:this.feather,inverted:this.inverted,easing:this.easing})}styleAt(t){if(t>=1)return this.dispose(),{filter:""};let n=this.ensureScaffold();if(!n)return{filter:""};let i=t*(1+this.feather),r=(this.inverted?1:-1)/this.feather,s=(this.inverted?i-1:i)/this.feather;return this.cut?.setAttribute("k3",String(r)),this.cut?.setAttribute("k4",String(s)),{filter:`url(#${n})`}}ensureScaffold(){if(typeof document>"u")return null;if(this.filterId&&this.host)return this.filterId;let t=`nl-rule-${++Vm}`,n=document.createElementNS(Jn,"svg");n.setAttribute("aria-hidden","true"),n.setAttribute("data-element-type","rule-transition"),n.setAttribute("width","0"),n.setAttribute("height","0"),Object.assign(n.style,{position:"absolute",width:"0",height:"0",overflow:"hidden"});let i=document.createElementNS(Jn,"filter");i.setAttribute("id",t),i.setAttribute("color-interpolation-filters","sRGB"),i.setAttribute("primitiveUnits","objectBoundingBox"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("width","100%"),i.setAttribute("height","100%");let r=document.createElementNS(Jn,"feImage");r.setAttribute("href",this.rule),r.setAttributeNS(Gm,"xlink:href",this.rule),r.setAttribute("preserveAspectRatio","none"),r.setAttribute("x","0"),r.setAttribute("y","0"),r.setAttribute("width","1"),r.setAttribute("height","1"),r.setAttribute("result","rule");let s=document.createElementNS(Jn,"feColorMatrix");s.setAttribute("in","rule"),s.setAttribute("type","luminanceToAlpha"),s.setAttribute("result","lum");let a=document.createElementNS(Jn,"feComposite");a.setAttribute("in","lum"),a.setAttribute("in2","lum"),a.setAttribute("operator","arithmetic"),a.setAttribute("k1","0"),a.setAttribute("k2","0"),a.setAttribute("k3","0"),a.setAttribute("k4","0"),a.setAttribute("result","cut");let l=document.createElementNS(Jn,"feComposite");return l.setAttribute("in","SourceGraphic"),l.setAttribute("in2","cut"),l.setAttribute("operator","in"),i.append(r,s,a,l),n.appendChild(i),document.body.appendChild(n),this.filterId=t,this.host=n,this.cut=a,t}dispose(){this.host?.remove(),this.host=null,this.cut=null,this.filterId=null}};var Qs=class extends fi{constructor(){super();this.unlocked={};this.setupActions()}serialize(){return{unlocked:this.unlocked}}deserialize(t){this.unlocked=t.unlocked}add(t,n){return this.trigger("add",t,n)}has(t){return new X(()=>this.unlocked[t]!==void 0)}remove(t){return this.trigger("remove",t)}clear(){return this.trigger("clear")}$remove(t){delete this.unlocked[t]}$clear(){this.unlocked={}}$get(t){return this.unlocked[t]}$set(t,n){this.unlocked[t]=n}$getAll(){return this.unlocked}$has(t){return this.unlocked[t]!==void 0}setupActions(){this.on("add",(t,n,i)=>{let r={gameState:t.gameState,game:t.game,liveGame:t.liveGame,storable:t.storable,$:t.$},s=typeof i=="function"?i(r):i;this.unlocked[n]=s}),this.on("remove",(t,n)=>{delete this.unlocked[n]}),this.on("clear",t=>{this.$clear()})}};var sr=class{static getActionId(e){return e.getId()}static setActionId(e,t){return e.setId(t),e}static getStaticId(e){return e.getStaticId()}static setStaticId(e,t){return e.setStaticId(t),e}static chainToActions(e){return e.getActions()}static wrapAction(e){let t=ze.isChained(e)?e.getActions():e;return Ge.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static getLayerSrcs(e,t){return F.getSrcURLs(e,t)}static registerDisplayable(e,t,n=null,i=null){e.findElementByDisplayable(t)||(e.createDisplayable(t,n,i),e.flush())}static setElementId(e,t){e.setId(t)}static setElementStaticId(e,t){e.setStaticId(t)}static getDisplayableTransformProps(e){return{...e.transformState.get()}}static setDisplayableTransformProps(e,t,n,i={}){let r=t.transformState;i.merge===!1?r.forceOverwrite(n):r.assign(Symbol("DevTools.setDisplayableTransformProps"),n),t.markDirty(),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}static getPuppetStatus(e){return e._getStatus()}static onPuppetStatusChange(e,t){return e._onStatusChange(t)}static async describePuppet(e,t){try{return await t._describe()}catch(n){return e.logger.error("DevTools","Puppet backend threw while describing itself",n),null}}static getPuppetState(e){return Dt.normalizeState(e.state)}static setPuppetState(e,t,n,i={}){t.state=i.merge===!1?Dt.normalizeState(n):Dt.mergeState(t.state,n),t._applyState().catch(r=>{e.logger.error("DevTools","Puppet backend threw while applying state",r)}),e.flush()}static async runPuppetCommand(e,t,n,i){try{await t._runCommand(n,i)||e.logger.weakWarn("DevTools",`Puppet command "${n}" was dropped: the puppet is not mounted.`)}catch(r){e.logger.error("DevTools",`Puppet backend threw while running "${n}"`,r)}}static listPuppetBackends(e){return e.listPuppetBackends()}static getCurrentDialog(e){if(e.isNvlMode()){let n=e.getNvlState();if(!n.activeDialogId||n.phase==="idle")return null;let i=e.getNvlDialog(n.activeDialogId);return i?{actionId:i.actionId||null,ended:n.phase==="awaitAdvance",mode:"nvl"}:null}let t=e.getAdvDialogState();return t?{actionId:t.actionId,ended:t.ended,mode:"adv"}:null}static onDialogStateChange(e,t){let n=[e.events.on(L.EventTypes["event:state.dialog.change"],t),e.events.on(L.EventTypes["event:state.nvl.change"],t)];return{cancel:()=>{for(let i of n)i.cancel()}}}};sr.DynamicPersistent=Wn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
86
+ ${this.stack}`:this.stack.slice(0,r)+this.composedMessage+this.stack.slice(r+this.message.length)}}get composedMessage(){return this.message+this.traceTail}},E=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},Ce=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function Hm(o,e){return oe.color(o,e)}function Vm(o){return oe.bold(o)}function Um(o){return oe.italic(o)}var js=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(e=>({style:{opacity:1-e}})),this.asTarget(e=>({style:{opacity:e}}))]}}copy(){return new o({duration:this.duration,easing:this.easing})}};var qs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.offset=e.offset??[0,0],this.easing=e.easing}createTask(e){let{invertX:t,invertY:n}=e.getStory().getInversionConfig();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing},{type:0,start:this.offset[0],end:0,duration:this.duration,ease:this.easing},{type:0,start:this.offset[1],end:0,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget((i,r,s)=>({style:{opacity:i,translate:`${t?-r:r}px ${n?-s:s}px`}}))]}}copy(){return new o({duration:this.duration,offset:this.offset,easing:this.easing})}};var _s=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.blur=e.blur??16,this.easing=e.easing}createTask(){let e=Math.max(0,this.blur);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:{opacity:1-z(t),filter:`blur(${e*z(t)}px)`}})),this.asTarget(t=>({style:{opacity:z(t),filter:`blur(${e*(1-z(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var Ys=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.direction=e.direction??"left",this.easing=e.easing}axisSign(){switch(this.direction){case"right":return{axis:"x",sign:1};case"top":return{axis:"y",sign:-1};case"bottom":return{axis:"y",sign:1};case"left":default:return{axis:"x",sign:-1}}}translate(e){let{axis:t}=this.axisSign(),n=`${e}%`;return{translate:t==="x"?`${n} 0px`:`0px ${n}`}}createTask(){let{sign:e}=this.axisSign();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:this.translate(e*100*z(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-z(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};var Xs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.ev=e.ev??4.6,this.lift=e.lift??.04,this.hold=e.hold,this.holdMs=e.holdMs,this.easing=e.easing}burnStyle(e){let t=z(e);if(t<=0)return{filter:"none"};let n=z(this.lift)*t,i=Math.pow(2,Math.max(0,this.ev)*t);return{filter:`invert(1) brightness(${1-n}) invert(1) brightness(${i})`}}createTask(){let t=lr({duration:this.duration,hold:this.hold,holdMs:this.holdMs,easing:this.easing});return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(n=>({style:{opacity:n<.5?1:0,...this.burnStyle(t(n))}})),this.asTarget(n=>({style:{opacity:n<.5?0:1,...this.burnStyle(t(n))}}))]}}copy(){return new o({duration:this.duration,ev:this.ev,lift:this.lift,hold:this.hold,holdMs:this.holdMs,easing:this.easing})}};function M(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function In(o,e,t){return o<e?e:o>t?t:o}var ln=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${M(t)}deg`:qc(t);return{mask:(r,s)=>{let a=-n+(s?1-z(r):z(r))*(100+n);return s?`linear-gradient(${i}, transparent ${M(a)}%, #000 ${M(a+n)}%)`:`linear-gradient(${i}, #000 ${M(a)}%, transparent ${M(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${M(t)}deg`,`${M(t+180)}deg`]:t==="vertical"?["to bottom","to top"]:["to right","to left"];return{mask:(s,a)=>{let l=-n+z(s)*(50+n);if(!a){let c=u=>`linear-gradient(${u}, #000 ${M(l)}%, transparent ${M(l+n)}%)`;return`${c(i)}, ${c(r)}`}if(l<0){let c=z((l+n)/Math.max(n,1e-6));return`linear-gradient(${i}, transparent ${M(50-l-n)}%, rgba(0,0,0,${M(c)}) 50%, transparent ${M(50+l+n)}%)`}return`linear-gradient(${i}, transparent ${M(50-l-n)}%, #000 ${M(50-l)}%, #000 ${M(50+l)}%, transparent ${M(50+l+n)}%)`}}}static iris(e={}){let t=e.center??"50% 50%",n=Math.max(0,e.feather??12),i=e.shape??"circle";return{mask:(r,s)=>{if(s){let l=(1-z(r))*150;return`radial-gradient(${i} at ${t}, transparent ${M(l-n)}%, #000 ${M(l)}%)`}let a=z(r)*150;return`radial-gradient(${i} at ${t}, #000 ${M(a-n)}%, transparent ${M(a)}%)`}}}static clock(e={}){let t=e.center??"50% 50%",n=e.from??0,i=Math.max(0,e.feather??24),r=e.direction??"clockwise";return{mask:(s,a)=>{let l=r==="counterclockwise"!=!!a,c=-i+z(s)*(360+i);if(l){let p=Math.max(0,360-c-i),d=Math.max(p,360-c);return`conic-gradient(from ${M(n)}deg at ${t}, transparent ${M(p)}deg, #000 ${M(d)}deg)`}let u=Math.max(0,c);return`conic-gradient(from ${M(n)}deg at ${t}, #000 ${M(u)}deg, transparent ${M(Math.max(u,c+i))}deg)`}}}static fan(e={}){let t=Math.max(1,Math.round(e.blades??4)),n=e.center??"50% 50%",i=e.from??0,r=Math.max(0,e.feather??10),s=360/t;return{mask:(a,l)=>{let c=-r+(l?1-z(a):z(a))*(s+r),u=In(c,0,s),p=In(c+r,0,s),d=`repeating-conic-gradient(from ${M(i)}deg at ${n}`;return l?`${d}, transparent 0deg, transparent ${M(u)}deg, #000 ${M(p)}deg, #000 ${M(s)}deg)`:`${d}, #000 0deg, #000 ${M(u)}deg, transparent ${M(p)}deg, transparent ${M(s)}deg)`}}}static blinds(e={}){let t=e.orientation??"horizontal",n=Math.max(1,Math.round(e.slats??8)),i=Math.max(0,e.feather??0),r=In(e.stagger??0,-1,1),s=typeof t=="number"?`${M(t)}deg`:_c(t),a=100/n,l=Math.abs(r)/n,c=1-l*(n-1),u=(d,g)=>l*(r>=0!==g?d:n-1-d),p=(d,g,f)=>{let m=-i+(f?1-g:g)*(a+i),y=In(m,0,a),T=In(m+i,0,a),h=d*a;return f?`linear-gradient(${s}, transparent ${M(h+y)}%, #000 ${M(h+T)}%, #000 ${M(h+a)}%, transparent ${M(h+a)}%)`:`linear-gradient(${s}, transparent ${M(h)}%, #000 ${M(h)}%, #000 ${M(h+y)}%, transparent ${M(h+T)}%)`};return{mask:(d,g)=>{if(r!==0){let T=[];for(let h=0;h<n;h++)T.push(p(h,z((z(d)-u(h,!!g))/c),!!g));return T.join(", ")}let f=-i+(g?1-z(d):z(d))*(a+i),m=In(f,0,a),y=In(f+i,0,a);return g?`repeating-linear-gradient(${s}, transparent 0, transparent ${M(m)}%, #000 ${M(y)}%, #000 ${M(a)}%)`:`repeating-linear-gradient(${s}, #000 0, #000 ${M(m)}%, transparent ${M(y)}%, transparent ${M(a)}%)`}}}static dots(e={}){let t=Math.max(1,e.rows??6),n=Math.max(1,e.cols??10),i=Math.max(0,e.feather??20),s=z(e.stagger??0)*.5,a=(l,c,u)=>{let p=-i+z(c)*(100+i);return u?`radial-gradient(circle farthest-corner at ${l}, transparent ${M(p)}%, #000 ${M(p+i)}%)`:`radial-gradient(circle farthest-corner at ${l}, #000 ${M(p)}%, transparent ${M(p+i)}%)`};return{size:`${M(100/n)}% ${M(100/t)}%`,repeat:"repeat",mask:(l,c)=>{let u=c?1-z(l):z(l);if(s<=0)return a("50% 50%",u,c);let p=z(u/(1-s)),d=z((u-s)/(1-s));return c?`${a("50% 50%",d,!0)}, ${a("0% 0%",p,!0)}`:`${a("50% 50%",p)}, ${a("0% 0%",d)}`}}}static invert(e){return{...e,mask:(t,n)=>e.mask(t,!n)}}static toStyle(e,t,n=!1){return jc(e.mask(t,n),e.size,e.repeat)}};var Bm=.3,Qs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold,this.holdMs=e.holdMs,this.pattern=e.pattern??null,this.inverted=e.inverted??!1,this.uncover=e.uncover??"retreat",this.easing=e.easing}coverStyle(e,t){if(!this.pattern)return{...Ws(this.color),opacity:z(e)};let n={...Ws(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...ln.toStyle(this.pattern,e,!this.inverted)}:{...n,...ln.toStyle(this.uncover,e)}:{...n,...ln.toStyle(this.pattern,e,this.inverted)}}createTask(){let e={duration:this.duration,hold:this.hold??(this.holdMs===void 0?Bm:void 0),holdMs:this.holdMs,easing:this.easing},t=1-(1-Mi(e))/2,n=.5,i=lr(e);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(r=>({style:{opacity:r<n?1:0}})),this.asTarget(r=>({style:{opacity:r<n?0:1}})),r=>({src:O.DefaultImagePlaceholder,style:this.coverStyle(i(r),r>=t)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,holdMs:this.holdMs,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var Js=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.pattern=e.pattern,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(e=>({style:ln.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var Jn="http://www.w3.org/2000/svg",Wm="http://www.w3.org/1999/xlink",zm=.002,Km=1,$m=.12,jm=0,Zs=class o extends Ae{constructor(t){super();this.filterId=null;this.host=null;this.cut=null;this.duration=t.duration,this.rule=P.srcToURL(t.rule),this.feather=Math.min(Km,Math.max(zm,t.feather??$m)),this.inverted=t.inverted??!1,this.easing=t.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(t=>({style:this.styleAt(t)}))]}}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>this.dispose()),n.onCanceled(()=>this.dispose()),n}copy(){return new o({duration:this.duration,rule:this.rule,feather:this.feather,inverted:this.inverted,easing:this.easing})}styleAt(t){if(t>=1)return this.dispose(),{filter:""};let n=this.ensureScaffold();if(!n)return{filter:""};let i=t*(1+this.feather),r=(this.inverted?1:-1)/this.feather,s=(this.inverted?i-1:i)/this.feather;return this.cut?.setAttribute("k3",String(r)),this.cut?.setAttribute("k4",String(s)),{filter:`url(#${n})`}}ensureScaffold(){if(typeof document>"u")return null;if(this.filterId&&this.host)return this.filterId;let t=`nl-rule-${++jm}`,n=document.createElementNS(Jn,"svg");n.setAttribute("aria-hidden","true"),n.setAttribute("data-element-type","rule-transition"),n.setAttribute("width","0"),n.setAttribute("height","0"),Object.assign(n.style,{position:"absolute",width:"0",height:"0",overflow:"hidden"});let i=document.createElementNS(Jn,"filter");i.setAttribute("id",t),i.setAttribute("color-interpolation-filters","sRGB"),i.setAttribute("primitiveUnits","objectBoundingBox"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("width","100%"),i.setAttribute("height","100%");let r=document.createElementNS(Jn,"feImage");r.setAttribute("href",this.rule),r.setAttributeNS(Wm,"xlink:href",this.rule),r.setAttribute("preserveAspectRatio","none"),r.setAttribute("x","0"),r.setAttribute("y","0"),r.setAttribute("width","1"),r.setAttribute("height","1"),r.setAttribute("result","rule");let s=document.createElementNS(Jn,"feColorMatrix");s.setAttribute("in","rule"),s.setAttribute("type","luminanceToAlpha"),s.setAttribute("result","lum");let a=document.createElementNS(Jn,"feComposite");a.setAttribute("in","lum"),a.setAttribute("in2","lum"),a.setAttribute("operator","arithmetic"),a.setAttribute("k1","0"),a.setAttribute("k2","0"),a.setAttribute("k3","0"),a.setAttribute("k4","0"),a.setAttribute("result","cut");let l=document.createElementNS(Jn,"feComposite");return l.setAttribute("in","SourceGraphic"),l.setAttribute("in2","cut"),l.setAttribute("operator","in"),i.append(r,s,a,l),n.appendChild(i),document.body.appendChild(n),this.filterId=t,this.host=n,this.cut=a,t}dispose(){this.host?.remove(),this.host=null,this.cut=null,this.filterId=null}};var ea=class extends fi{constructor(){super();this.unlocked={};this.setupActions()}serialize(){return{unlocked:this.unlocked}}deserialize(t){this.unlocked=t.unlocked}add(t,n){return this.trigger("add",t,n)}has(t){return new Y(()=>this.unlocked[t]!==void 0)}remove(t){return this.trigger("remove",t)}clear(){return this.trigger("clear")}$remove(t){delete this.unlocked[t]}$clear(){this.unlocked={}}$get(t){return this.unlocked[t]}$set(t,n){this.unlocked[t]=n}$getAll(){return this.unlocked}$has(t){return this.unlocked[t]!==void 0}setupActions(){this.on("add",(t,n,i)=>{let r={gameState:t.gameState,game:t.game,liveGame:t.liveGame,storable:t.storable,$:t.$},s=typeof i=="function"?i(r):i;this.unlocked[n]=s}),this.on("remove",(t,n)=>{delete this.unlocked[n]}),this.on("clear",t=>{this.$clear()})}};var cr=class{static getActionId(e){return e.getId()}static setActionId(e,t){return e.setId(t),e}static getStaticId(e){return e.getStaticId()}static setStaticId(e,t){return e.setStaticId(t),e}static chainToActions(e){return e.getActions()}static wrapAction(e){let t=ze.isChained(e)?e.getActions():e;return Fe.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static getLayerSrcs(e,t){return O.getSrcURLs(e,t)}static registerDisplayable(e,t,n=null,i=null){e.findElementByDisplayable(t)||(e.createDisplayable(t,n,i),e.flush())}static setElementId(e,t){e.setId(t)}static setElementStaticId(e,t){e.setStaticId(t)}static getDisplayableTransformProps(e){return{...e.transformState.get()}}static setDisplayableTransformProps(e,t,n,i={}){let r=t.transformState;i.merge===!1?r.forceOverwrite(n):r.assign(Symbol("DevTools.setDisplayableTransformProps"),n),t.markDirty(),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}static getPuppetStatus(e){return e._getStatus()}static onPuppetStatusChange(e,t){return e._onStatusChange(t)}static async describePuppet(e,t){try{return await t._describe()}catch(n){return e.logger.error("DevTools","Puppet backend threw while describing itself",n),null}}static getPuppetState(e){return Lt.normalizeState(e.state)}static setPuppetState(e,t,n,i={}){t.state=i.merge===!1?Lt.normalizeState(n):Lt.mergeState(t.state,n),t._applyState().catch(r=>{e.logger.error("DevTools","Puppet backend threw while applying state",r)}),e.flush()}static async runPuppetCommand(e,t,n,i){try{await t._runCommand(n,i)||e.logger.weakWarn("DevTools",`Puppet command "${n}" was dropped: the puppet is not mounted.`)}catch(r){e.logger.error("DevTools",`Puppet backend threw while running "${n}"`,r)}}static listPuppetBackends(e){return e.listPuppetBackends()}static getCurrentDialog(e){if(e.isNvlMode()){let n=e.getNvlState();if(!n.activeDialogId||n.phase==="idle")return null;let i=e.getNvlDialog(n.activeDialogId);return i?{actionId:i.actionId||null,ended:n.phase==="awaitAdvance",mode:"nvl"}:null}let t=e.getAdvDialogState();return t?{actionId:t.actionId,ended:t.ended,mode:"adv"}:null}static onDialogStateChange(e,t){let n=[e.events.on(R.EventTypes["event:state.dialog.change"],t),e.events.on(R.EventTypes["event:state.nvl.change"],t)];return{cancel:()=>{for(let i of n)i.cancel()}}}};cr.DynamicPersistent=Bn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
87
87
  @layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.isolate{isolation:isolate}.z-20{z-index:20}.container{width:100%}.\\!hidden{display:none!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-\\[80px\\]{height:80px}.h-full{height:100%}.h-max{height:-moz-max-content;height:max-content}.w-1\\/2{width:50%}.w-\\[100px\\]{width:100px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-full{min-width:100%}.flex-grow,.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.text-center{text-align:center}.text-left{text-align:left}.align-bottom{vertical-align:bottom}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.opacity-0{opacity:0}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.__narraleaf_content-player *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.__narraleaf_content-player img{pointer-events:none;-webkit-user-drag:none;-webkit-user-select:none}.__narraleaf_content-player .pointer-disabled{pointer-events:none}.__narraleaf_content-player .pointer-disabled>:not(.pointer-disabled){pointer-events:auto}.__narraleaf_content-player img:before,.__narraleaf_content-player img:after{content:none!important;border:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.bg-cover{background-size:cover}.bg-center{background-position:50%}.pointer-events-auto-rest *{pointer-events:auto}@keyframes __narraleaf_text_reveal{0%{opacity:0}to{opacity:1}}.__narraleaf_text_reveal{animation:__narraleaf_text_reveal var(--nl-reveal-duration,0s) ease-out both}@media (prefers-reduced-motion:reduce){.__narraleaf_text_reveal{animation:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}\r
88
- `,document.head.appendChild(o)}export{An as Align,un as AudioBusError,ai as AudioBusMixer,si as AudioBusTree,ns as Avatar,$s as BlurDissolve,pi as Camera,po as Character,at as CommonPosition,Fn as CommonPositionType,Tr as Condition,Ge as Control,gt as Coord2D,Ni as Darkness,nt as DefaultAudioBusIds,ms as DefaultNvlContainer,_l as DefaultNvlDialogItem,sr as DevTools,dd as Dialog,zs as Dissolve,dm as ExposedStateType,qs as Exposure,Ks as FadeIn,zl as FixedAspectRatioContainer,Qs as Gallery,q as Game,xo as GameMenu,Ic as GameProviders,L as GameState,F as Image,Ae as ImageTransition,Bt as Isolated,Go as Item,jn as KeyBindingType,Ii as KeyMap,X as Lambda,zn as Layer,Np as Layout,Pi as LayoutRouterProvider,Ut as LiveGame,sn as Mask,eo as MaxAudioBusDepth,br as Menu,gi as NVLToken,Ht as Namespace,on as Nametag,en as Narrator,Oo as Notifications,ds as NvlContainer,rd as NvlDialogList,us as NvlProvider,Vp as Page,rs as PageInjectContext,Ke as Pause,Un as Persistent,Rc as Player,vi as Preference,Dt as Puppet,js as Push,Ys as Reveal,Ya as RootPath,Xs as RuleReveal,Ye as Scene,ke as Script,Aa as SeededBusPreferenceKeys,he as Sentence,fi as Service,ge as Sound,xa as SoundType,Cu as Stage,oi as Storable,di as Story,kn as Text,lt as TextEvent,mi as TextTransition,sp as Texts,ip as TextsPreview,_s as ThroughColor,ee as Transform,Vt as Transition,kr as Vfx,wr as Video,ie as Word,to as acceptsAudioBus,Im as b,Rm as c,vr as getActiveAudioBusTree,zu as getWordRenderer,Mm as i,Wu as registerWordRenderer,Bu as unregisterWordRenderer,Gl as useAvatar,Tp as useDialog,cd as useDialogOverlay,G as useGame,Zp as useIsNvlMode,ed as useIsNvlVisible,En as useKeyBinding,qp as useLiveGame,$t as useNvl,cs as useNvlDialogs,Ep as useParams,Pp as usePathname,yn as usePreference,Dp as useQueryParams,Wt as useRouter,pd as useSuspendAdvance,Jr as useUIMenuContext,Cp as useVoiceState};
88
+ `,document.head.appendChild(o)}export{An as Align,pn as AudioBusError,ai as AudioBusMixer,si as AudioBusTree,rs as Avatar,_s as BlurDissolve,pi as Camera,po as Character,at as CommonPosition,Fn as CommonPositionType,xr as Condition,Fe as Control,ht as Coord2D,Ni as Darkness,nt as DefaultAudioBusIds,gs as DefaultNvlContainer,tc as DefaultNvlDialogItem,cr as DevTools,Sd as Dialog,js as Dissolve,Sm as ExposedStateType,Xs as Exposure,qs as FadeIn,Xl as FixedAspectRatioContainer,ea as Gallery,q as Game,xo as GameMenu,Hc as GameProviders,R as GameState,O as Image,Ae as ImageTransition,zt as Isolated,Go as Item,jn as KeyBindingType,Ii as KeyMap,Y as Lambda,zn as Layer,Bp as Layout,Pi as LayoutRouterProvider,Bt as LiveGame,ln as Mask,eo as MaxAudioBusDepth,wr as Menu,gi as NVLToken,Vt as Namespace,sn as Nametag,nn as Narrator,Oo as Notifications,hs as NvlContainer,dd as NvlDialogList,ms as NvlProvider,jp as Page,ls as PageInjectContext,Ke as Pause,Un as Persistent,Oc as Player,vi as Preference,Lt as Puppet,Ys as Push,Js as Reveal,Za as RootPath,Zs as RuleReveal,Ye as Scene,we as Script,wa as SeededBusPreferenceKeys,fe as Sentence,fi as Service,ge as Sound,Pa as SoundType,Du as Stage,oi as Storable,di as Story,kn as Text,lt as TextEvent,mi as TextTransition,dp as Texts,cp as TextsPreview,Qs as ThroughColor,Z as Transform,Ut as Transition,Lr as Vfx,Dr as Video,oe as Word,to as acceptsAudioBus,Vm as b,Hm as c,Tr as getActiveAudioBusTree,Yu as getWordRenderer,Um as i,qu as registerWordRenderer,_u as unregisterWordRenderer,Wl as useAvatar,Pp as useDialog,gd as useDialogOverlay,N as useGame,sd as useIsNvlMode,ad as useIsNvlVisible,En as useKeyBinding,ed as useLiveGame,jt as useNvl,ds as useNvlDialogs,Gp as useParams,Np as usePathname,yn as usePreference,Fp as useQueryParams,Wt as useRouter,vd as useSuspendAdvance,ns as useUIMenuContext,Lp as useVoiceState};