narraleaf-react 0.19.1 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1,73 +1,73 @@
1
- var Le={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",init:"displayable:init"},cn={say:"character:say",action:"character:action",setName:"character:setName"},q={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var et={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},Gr={action:"condition:action"},Hr={action:"script:action"},Fr={action:"menu:action"},It={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute"},_={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"},si={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},Pn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},Xt={action:"layer:action",setZIndex:"layer:setZIndex"},yt={action:"video:action",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"},Vt={action:"vfx:action",show:"vfx:show",hide:"vfx:hide",pause:"vfx:pause",resume:"vfx:resume",setRate:"vfx:setRate"};var Vr=(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))(Vr||{}),go=(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});go.DataTypes=Vr;function W(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,c)=>go(a)===3&&go(c)===3?a.constructor!==Object||c.constructor!==Object?c||a:W(a,c):Array.isArray(a)&&Array.isArray(c)?c&&c.length>0?[...c]:[...a]:a===void 0&&Array.isArray(c)?[...c]:c===void 0?Array.isArray(a)?[...a]:a:Array.isArray(c)?[...c]:c;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]=W({},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 W(i,s,...a)}return i}var Ke=class Ke{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=yo()}static isAwaitable(e){return e instanceof Ke}static fromPromise(e){let t=new Ke;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new Ke;return t.resolve(e),t}static delay(e){let t=new Ke;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new Ke;return e(t),t}static wait(e){let t=new Ke;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new Ke;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 Ke().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 Ke;return e.length===0?(t.resolve(),t):(e.forEach(n=>{n.onSettled(()=>t.resolve()),n.onFailed(i=>{e.forEach(r=>{r!==n&&r.abort()}),t.fail(i)})}),t.registerSkipController(new V(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new Ke;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>=Ke.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>=Ke.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()}}};Ke.nothing=e=>e,Ke.maxListeners=8;var S=Ke;function Ur(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 pn(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 X=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 c=a?.(...t);c!==null&&typeof c=="object"&&c.then?c.then(n):n(c)}}).listener})}setMaxListeners(e){return this.maxListeners=e,this}hasListeners(e){return this.events[e]?.length>0}clear(){this.events={}}};function yo(o=1){let e=new Error().stack;return e?e.split(`
1
+ var Le={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",init:"displayable:init"},Vt={say:"character:say",action:"character:action",setName:"character:setName"},q={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var et={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},Hr={action:"condition:action"},Fr={action:"script:action"},Vr={action:"menu:action"},It={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute"},_={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"},si={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},Pn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},Yt={action:"layer:action",setZIndex:"layer:setZIndex"},yt={action:"video:action",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"},Ut={action:"vfx:action",show:"vfx:show",hide:"vfx:hide",pause:"vfx:pause",resume:"vfx:resume",setRate:"vfx:setRate"};var Ur=(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))(Ur||{}),go=(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});go.DataTypes=Ur;function W(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,c)=>go(a)===3&&go(c)===3?a.constructor!==Object||c.constructor!==Object?c||a:W(a,c):Array.isArray(a)&&Array.isArray(c)?c&&c.length>0?[...c]:[...a]:a===void 0&&Array.isArray(c)?[...c]:c===void 0?Array.isArray(a)?[...a]:a:Array.isArray(c)?[...c]:c;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]=W({},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 W(i,s,...a)}return i}var Ke=class Ke{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=yo()}static isAwaitable(e){return e instanceof Ke}static fromPromise(e){let t=new Ke;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new Ke;return t.resolve(e),t}static delay(e){let t=new Ke;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new Ke;return e(t),t}static wait(e){let t=new Ke;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new Ke;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 Ke().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 Ke;return e.length===0?(t.resolve(),t):(e.forEach(n=>{n.onSettled(()=>t.resolve()),n.onFailed(i=>{e.forEach(r=>{r!==n&&r.abort()}),t.fail(i)})}),t.registerSkipController(new V(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new Ke;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>=Ke.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>=Ke.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()}}};Ke.nothing=e=>e,Ke.maxListeners=8;var S=Ke;function Or(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 dn(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 X=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 c=a?.(...t);c!==null&&typeof c=="object"&&c.then?c.then(n):n(c)}}).listener})}setMaxListeners(e){return this.maxListeners=e,this}hasListeners(e){return this.events[e]?.length>0}clear(){this.events={}}};function yo(o=1){let e=new Error().stack;return e?e.split(`
2
2
  `).slice(o+1).join(`
3
- `).trim():""}function mi(o){return new Promise(e=>setTimeout(e,o))}var di=class di{constructor(e){this.abortHandler=e;this.events=new X;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(di.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};di.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=di;var Dn=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}},ln=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new Dn;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 fi(o,e,t={}){return o?e:t}function Or(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var ai=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 Kr(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 Wr(o,e){return new Promise((t,n)=>{fetch(o,e).then(i=>i.blob()).then(i=>{let r=new FileReader;r.onload=()=>{t(r.result)},r.readAsDataURL(i)}).catch(n)})}var un=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 mi(this.delay),await e())};await e()}};function Qe(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function zr(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var qe=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 $r(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 Br(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function vo(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function So(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"&&!So(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var ci=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function hi(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 jr(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var li=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},ui=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 pi=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 qr(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 Qr(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,c=16777216,l=r*a>>>0,u=r*c+s*a>>>0,d=s*c+(u>>>0)>>>0;e=l,t=d}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var Ln=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=yo(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}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]:[]}};Ln.ActionTypes={action:"action"};var j=class extends Ln{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 To=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},A=class o extends To{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 gi={center:"center",left:"left",right:"right"};import{animate as Ua}from"motion/react";var dn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(dn||{}),Xr={left:"33.33%",center:"50%",right:"66.66%"},tt=class tt{static isUnknown(e){return e===tt.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},c=t?{right:s}:{left:s};return this.wrap({...a,...c})}static calc(e,t,n){if(!e||tt.isUnknown(e))return"auto";let i=!(t===void 0||tt.isUnknown(t));if(typeof n=="number"&&n>0){let s=tt.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}return i?`calc(${typeof e=="number"?`${e}px`:e} + ${t}px)`:`calc(${e} + 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(Xe.isCommonPositionType(e))return nt.fromCommonPosition(e);if(nt.isCoord2DPosition(e))return e;if(Jt.isAlignPosition(e))return nt.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 tt.isUnknown(e)||e===void 0?tt.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return nt.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:tt.isUnknown(t.x)?0:t.x,y:tt.isUnknown(t.y)?0:t.y,xoffset:tt.isUnknown(t.xoffset)?0:t.xoffset,yoffset:tt.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(dn).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 Xe||e instanceof nt||e instanceof Jt}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return nt.fromCommonPosition(new Xe(e));if(this.isRawAlignPosition(e))return nt.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new nt(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}}};tt.Unknown=Symbol("Unknown");var N=tt,yi=class yi{static isCommonPositionType(e){return e instanceof yi}constructor(e){this.position=e}toCSS(){return{x:Xr[this.position],y:"50%",xoffset:0,yoffset:0}}};yi.Positions=dn;var Xe=yi,nt=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:Xr[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||N.isUnknown(n)?N.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:N.isUnknown(t.x)?e.x:t.x,y:N.isUnknown(t.y)?e.y:t.y,xoffset:N.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:N.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=N.orUnknown(e.x),this.y=N.orUnknown(e.y),this.xoffset=N.orUnknown(e.xoffset),this.yoffset=N.orUnknown(e.yoffset)):(this.x=N.orUnknown(e),this.y=N.orUnknown(t),this.xoffset=N.Unknown,this.yoffset=N.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}}},Jt=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=N.orUnknown(e.xalign),this.yalign=N.orUnknown(e.yalign),this.xoffset=N.orUnknown(e.xoffset),this.yoffset=N.orUnknown(e.yoffset)):(this.xalign=N.orUnknown(e),this.yalign=N.orUnknown(t),this.xoffset=N.Unknown,this.yoffset=N.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:N.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:N.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var $=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new bo(this.mergeWithDefaultConfig(e))}copy(){return new o(W({},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)?W({},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}},bo=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(W({},this.config))}join(e){let t=zr(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 Oa={[gi.left]:"25.33%",[gi.center]:"50%",[gi.right]:"75.66%"},lt=class lt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new lt(lt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?N.toCoord2D(N.tryParsePosition(e||t)):N.mergePosition(N.tryParsePosition(e),N.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=lt.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 vo(J.constructStyle(e,this.state,t))}toStyle(e,t){return vo(J.constructStyle(e,this.state,t))}serialize(){return lt.TransformStateSerializer.serialize(this.state)}clone(){return new lt(lt.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=lt.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}};lt.DefaultTransformState=new $({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new Xe("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}),lt.TransformStateSerializer=new qe({position:e=>N.serializePosition(N.tryParsePosition(e))},{position:e=>N.toCoord2D(e)});var le=lt,we=class we{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},we.defaultConfig,t||{});else{let[n,i]=[e,t||we.defaultOptions];this.sequences.push({props:n,options:i||we.defaultOptions}),this.config=Object.assign({},we.defaultConfig)}}static isPosition(e){return Xe.isCommonPositionType(e)||nt.isCoord2DPosition(e)||Jt.isAlignPosition(e)}static immediate(e){return new we(e,{duration:0,ease:"linear"})}static left(e,t){return new we({position:Xe.Positions.Left},{duration:e,ease:t})}static right(e,t){return new we({position:Xe.Positions.Right},{duration:e,ease:t})}static center(e,t){return new we({position:Xe.Positions.Center},{duration:e,ease:t})}static create(e){return new we([],e)}static positionToCSS(e,t,n,i){return e?N.isRawPosition(e)?N.D2PositionToCSS(N.rawPositionToCoord2D(e),n,t,i):N.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?N.toCoord2D(N.tryParsePosition(e||t)):N.mergePosition(N.tryParsePosition(e),N.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...W(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,c=function(p,h,m){return typeof p>"u"?typeof m<"u"?h(m):"":h(p)},l=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${l}, ${u})`,c(t.rotation,p=>`rotate(${p}deg)`,0),c(t.scaleX,p=>`scaleX(${p*a})`,1),c(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,c=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...we.positionToCSS(t.position,i,r,c),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?pn(t.fontColor):void 0,transform:we.propToCSSTransform(e,t),...we.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}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:r,sequences:s,options:a}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current});s.length||t.logger.warn("Transform","No sequences to animate.");let c=!1,l=e.lock(),u=Ua(s,a),d=()=>{e.overwrite(l,r.get()).unlock(l),u.complete(),c=!0},p=new S().registerSkipController(new V(d)),h=()=>{c||e.overwrite(l,r.get()).unlock(l),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),p.resolve()};return u.then(h,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{h()}catch{p.resolve()}})),u.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:r,sequences:s,options:a},this),p}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...we.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}){let r=t.clone(),s=r.lock(),a=this.sequences.map(({props:c,options:l})=>{let u=r.assign(s,c).toFramesDefinition(e,n);return[i,u,this.getOptions(l)]});return{finalState:r.unlock(s).freeze(),sequences:a,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0)}}copy(){return new we(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}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 ue("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 ue("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};we.defaultConfig={sync:!0},we.defaultOptions={duration:0,ease:"linear"},we.CommonImagePositionMap=Oa;var J=we;var vi=class{constructor(){this.id=""}setId(e){this.id=e}getId(){return this.id}reset(){}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 Jr=Symbol("_Chained"),Yr;Yr=Jr;var Co=class Co{constructor(e){this[Yr]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[Jr]}static toActions(e){return e.flat(2).map(t=>Co.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()}},Ie=Co,mn=class extends vi{chain(e){let t=Ie.isChained(this)?this:this.proxy(this,new Ie(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 oe=class extends mn{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var vt=class extends j{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",c=s.action?s.action.map(l=>l.stringify(e,t,n)).join(";"):"null";return`(${a}) {${c}}`};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)}}`:""}`)}};vt.ActionTypes=Gr;function Zr(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function xo(o,e){if(Object.is(o,e))return!0;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((t,n)=>xo(t,e[n]));if(Zr(o)&&Zr(e)){let t=Object.keys(o);return t.length===Object.keys(e).length&&t.every(n=>Object.prototype.hasOwnProperty.call(e,n)&&xo(o[n],e[n]))}return!1}var St=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=W({},t),this.defaultContent=t}static isSerializable(e){return["number","string","boolean"].includes(typeof e)||e instanceof Date||e==null?!0:Array.isArray(e)?e.every(o.isSerializable):typeof e=="object"?Object.getPrototypeOf(e)===Object.prototype&&Object.values(e).every(o.isSerializable):!1}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
4
- 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=W({},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)}),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){let t={any:i=>({type:"any",data:i}),date:i=>({type:"date",data:i.toString()})},n=this.toTypeName(e);return t[n](e)}unwrap(e){return{any:n=>n.data,date:n=>new Date(n.data)}[e.type](e)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||xo(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},Ut=class Ut{constructor(){this.events=new X;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new St(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 I(`Namespace ${e} is not initialized, did you forget to register it?
5
- 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 I("No listener provided when subscribing to storable changes");return this.events.on(Ut.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(Ut.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 St(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(Ut.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(Ut.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(Ut.EventTypes["event:storable.restore"],{namespaces:[e]})}};Ut.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var In=Ut;var Je=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===It.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===It.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===It.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,c=>{c&&this.callee.fromData(c)},[s]),a}else if(this.type===It.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===It.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===It.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===It.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")}};Je.ActionTypes=It;var Ot=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(Ot||{}),Ce=class Ce extends oe{static toSound(e){return e==null?null:typeof e=="string"?new Ce({src:e}):e}static isSound(e){return e instanceof Ce}static voice(e){let t=typeof e=="string"?{src:e}:e;return new Ce({...t,type:"voice"})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new Ce({...t,type:"bgm"})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new Ce({...t,type:"sound"})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=Ce.DefaultUserConfig.create(t),[i]=n.extract(Ce.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){if(this.config.type==="bgm")throw new xe(`Sound (src: ${this.config.src}) is marked as bgm, but it is being played as a normal sound.
6
- To prevent unintended behavior, the sound marked as bgm cannot be played using \`play()\`.`);return this.pushAction(Je.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(Je.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(Je.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(Je.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(Je.ActionTypes.setRate,[e])}pause(e){return this.pushAction(Je.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(Je.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}getSrc(){return this.config.src}toData(){return{state:Ce.StateSerializer.serialize(this.state)}}fromData(e){return this.state=Ce.StateSerializer.deserialize(e.state),this}copy(){return new Ce(this.userConfig.get())}reset(){return this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return Ce.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new Je(this.chain(),e,new A().setContent(t)))}};Ce.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",Ce.DefaultUserConfig=new $({src:Ce.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,type:"sound"}),Ce.DefaultConfig=new $({src:Ce.noSound,loop:!1,streaming:!1,seek:0,type:"sound"}),Ce.DefaultState=new $({volume:1,rate:1,paused:!1,muted:!1}),Ce.StateSerializer=new qe;var Se=Ce;var _r=2;var Fp={};var fn=class extends mn{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 c=a.getFutureActions(e,i).filter(l=>!r.has(l));s.push(...c)}}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 Yt=class Yt{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===Yt.SrcTypes.image?t.add(s):r===Yt.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 R?R.getSrcURL(e):e.type==="image"?R.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(re,q.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(D.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof ge){let n=t;if(t.is(ge,et.setSrc)){let i=t.contentNode.getContent()[0];if(D.isImageSrc(i))return{type:"image",src:D.srcToURL(i),activeType:"scene"}}else{if(t.type===et.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===et.setAppearance){let i=t.contentNode.getContent()[0];if(R.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(R.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:R.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 Se){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof R||D.isStaticImageData(e)){if(e instanceof R){if(!D.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(R.getSrcURL(e)))return this}else if(this.isSrcRegistered(D.srcToURL(e.src)))return this;this.src.push({type:"image",src:D.isStaticImageData(e)?D.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 Se?t:new Se({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 Se?e.getSrc():e;return this.src.some(n=>n.type===Yt.SrcTypes.audio?t===n.src.getSrc():n.type===Yt.SrcTypes.image?t===R.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)}};Yt.SrcTypes={image:"image",video:"video",audio:"audio"};var ke=Yt;var Kt=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===si.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===si.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")}};Kt.ActionTypes=si;var Re=class extends j{executeAction(e,t){if(this.type===Le.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===Le.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===Le.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,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)))},c=e.getExposedStateForce(t),l=t.transformState.clone(),u=c.applyTransform(n,a),d=e.timelines.attachTimeline(s).attachChild(u);return u.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:d},p=>{s.isSettled()||s.abort(),u.abort(),t.transformState.forceOverwrite(p.state)},[l]),s}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)))},l=e.getExposedStateForce(t).applyTransition(n,a),u=e.timelines.attachTimeline(s).attachChild(l);return l.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},()=>{s.isSettled()||s.abort(),l.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let l=e.findElementByDisplayable(this.callee,i);l&&e.disposeDisplayable(n,l.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new S().registerSkipController(new V(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,l=>{l.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let c=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:c},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};Re.ActionTypes=Le;var st=class o extends oe{constructor(){super(...arguments);this.srcManager=new ke}pos(t,n,i){return this.transform(new J({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new J({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new J({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new J({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new J({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 J({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new J({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new J(t,n))}mask(t,n={}){let i=D.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c,...l}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c},l)}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:c="easeInOut",...l}=t,u={duration:a,ease:c,...l},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Me,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:c="easeInOut",...l}=t,u={duration:a,ease:c,...l},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Me,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",...c}=t,l={duration:s,ease:a,...c},u=o.wipeClipPath(n,100),d=o.wipeClipPath(n,0),p=o.createClipPathTransform([[i?d:u,{duration:0}],[i?u:d,l]]);return r?this.combineActions(new Me,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 Re(n,Le.applyTransform,new A().setContent([t.copy()]));return n.chain(i)}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 J(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 J?t.copy():new J({opacity:1},t),r=new Re(n,Le.applyTransform,new A().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof J?t.copy():new J({opacity:0},t),r=new Re(n,Le.applyTransform,new A().setContent([i]));return n.chain(r)}};var ut=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(ut||{});import{animate as Ka}from"motion/react";var Tt=class{requestAnimations(e){let t=e.map(y=>y.start),n=[],i=0,r=!1,s=!1,a=!1,c=[],l=[],u=[],d=()=>{e.forEach((y,v)=>{t[v]=y.end}),i=e.length,c.forEach(y=>y(t)),l.forEach(y=>y())};return{onUpdate:y=>(c.push(y),{cancel:()=>{let v=c.indexOf(y);v!==-1&&c.splice(v,1)}}),onComplete:y=>(l.push(y),{cancel:()=>{let v=l.indexOf(y);v!==-1&&l.splice(v,1)}}),onCanceled:y=>(u.push(y),{cancel:()=>{let v=u.indexOf(y);v!==-1&&u.splice(v,1)}}),complete:()=>{if(!(i===e.length||s)){if(!r){a=!0;return}n.forEach(y=>y.complete())}},start:()=>{if(!(r||s||i===e.length)){if(r=!0,a){d();return}e.forEach((y,v)=>{n.push(this.requestMotion(y,{onComplete:()=>{t[v]=y.end,c.forEach(C=>C(t)),i++,i===e.length&&l.forEach(C=>C())},onUpdate:C=>{t[v]=C,c.forEach(f=>f(t))}}))})}},cancel:()=>{s=!0,n.forEach(y=>y.cancel()),u.forEach(y=>y())}}}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 Ka(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};Tt.AnimationType=ut;var Rn=class extends Tt{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new I(`Trying to access text state, but element is not set
7
- This should not happen, please report this issue to the developers`);return this._element.state}};var Si=class o extends Rn{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 Ye=class Ye extends st{constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=Ye.DefaultUserConfig.create(n),r=Ye.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 Kt(t,Kt.ActionTypes.setText,new A().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new J({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Me,i=>{if(t){let s=new Si({fontSize:e,duration:t,easing:n});i.chain(this._applyTransition(i,s))}let r=new Kt(i,Kt.ActionTypes.setFontSize,new A().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:Ye.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=Ye.StateSerializer.deserialize(e.state),this.transformState=le.deserialize(e.transformState),this}_init(e){return new Re(this.chain(),Le.init,new A().setContent([e||null,this.config.layer||null]))}reset(){this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig)}getInitialTransformState(e){let[t]=e.extract(Ye.DefaultTextTransformState.keys());return new le(Ye.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new Re(e,Le.applyTransition,new A().setContent([t,n=>n._setElement(this)]))}getInitialState(){return Ye.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};Ye.DefaultUserConfig=new $({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:""}),Ye.DefaultTextConfig=new $({alignX:"center",alignY:"center",className:"",layer:void 0}),Ye.DefaultTextState=new $({fontSize:16,display:!1,text:""}),Ye.DefaultTextTransformState=new $({fontColor:"#000000",...le.DefaultTransformState.getDefaultConfig()}),Ye.StateSerializer=new qe;var Zt=Ye;var Mn=class Mn extends j{executeAction(e,t){let n=this;if(n.is(Mn,"persistent:set")){let[i,r]=n.contentNode.getContent(),s=e.getStorable().getNamespace(n.callee.getNamespaceName()),a=s.get(i);if(typeof r=="function"){let c=s.get(i);s.set(i,r(c))}else s.set(i,r);return e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{s.set(i,c)},[a]),super.executeAction(e,t)}else if(n.is(Mn,"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(c=>{s[c]=r.get(c),r.set(c,a[c])}),e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{Object.keys(c).forEach(l=>{r.set(l,c[l])})},[s]),super.executeAction(e,t)}throw this.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("PersistentAction")}};Mn.ActionTypes=Pn;var Ti=Mn;var Ne=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 Ze=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}};var Ge=class Ge{static isWord(e){return e instanceof Ge}static color(e,t){return Ge.isWord(e)?e.copy().assign({color:t}):new Ge(e,{color:t})}static bold(e){return Ge.isWord(e)?e.copy().assign({bold:!0}):new Ge(e,{bold:!0})}static italic(e){return Ge.isWord(e)?e.copy().assign({italic:!0}):new Ge(e,{italic:!0})}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=W(Ge.defaultConfig,t)}evaluate(e){if(Ne.isPause(this.text))return[this];if(Ze.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Ge.isWord(n)?n.inherit(this.config).evaluate(e):new Ge(n,this.config)).flat():Ge.isWord(t)?t.inherit(this.config).evaluate(e):[new Ge(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}assign(e){return this.config=W(this.config,e),this}copy(){return new Ge(this.text,this.config)}isPause(){return Ne.isPause(this.text)}isTextEvent(){return Ze.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Ge.defaultConfig={},Ge.defaultColor="#000";var Q=Ge;var _e=class _e{static isSentence(e){return e instanceof _e}static toSentence(e){return _e.isSentence(e)?e:new _e(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 Q.isWord(e)?e:new Q(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[Q.isWord(e)?e:new Q(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(_e.isSingleWord):_e.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||Q.isWord(e)||Ne.isPause(e)||Ze.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=_e.format(e),this.config=W(_e.defaultConfig,{...t,voice:typeof t.voice=="string"?Se.voice(t.voice):Se.toSound(t.voice)}),this.state=Ur(_e.defaultState)}toData(){return null}fromData(e){return this.state=W(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(..._e.formatStaticWord(i))}return t}copy(){return new _e([...this.text],this.config)}};_e.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},_e.defaultState={};var ve=_e;var Wt=class extends j{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")}};Wt.ActionTypes=Hr;var Ae=class o extends oe{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 Wt(t,Wt.ActionTypes.action,new A().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new Wt(this.chain(),Wt.ActionTypes.action,new A().setContent(e))]}};var bi=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]}};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()}),Qe(()=>{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 I("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 I("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 c=e[a];i.attachChild(c),c.then(l=>{r[a]=l,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(c=>{a=c.onAbort(()=>{r.abort()})}),i.then(c=>{a?.cancel(),n=c,i=e(c),i?Qe(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?Qe(()=>s()):Qe(()=>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()?Qe(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 I(`Attaching to this timeline violates the timeline's state.
3
+ `).trim():""}function mi(o){return new Promise(e=>setTimeout(e,o))}var di=class di{constructor(e){this.abortHandler=e;this.events=new X;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(di.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};di.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=di;var Dn=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}},un=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new Dn;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 fi(o,e,t={}){return o?e:t}function Kr(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var ai=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 Wr(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 zr(o,e){return new Promise((t,n)=>{fetch(o,e).then(i=>i.blob()).then(i=>{let r=new FileReader;r.onload=()=>{t(r.result)},r.readAsDataURL(i)}).catch(n)})}var pn=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 mi(this.delay),await e())};await e()}};function Qe(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function $r(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var qe=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 Br(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 jr(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function vo(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function So(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"&&!So(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var ci=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function hi(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 qr(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var li=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},ui=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 pi=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 Qr(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 Xr(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,c=16777216,l=r*a>>>0,u=r*c+s*a>>>0,d=s*c+(u>>>0)>>>0;e=l,t=d}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var Ln=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=yo(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}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]:[]}};Ln.ActionTypes={action:"action"};var j=class extends Ln{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 To=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},A=class o extends To{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 gi={center:"center",left:"left",right:"right"};import{animate as Oa}from"motion/react";var mn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(mn||{}),Jr={left:"33.33%",center:"50%",right:"66.66%"},tt=class tt{static isUnknown(e){return e===tt.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},c=t?{right:s}:{left:s};return this.wrap({...a,...c})}static calc(e,t,n){if(!e||tt.isUnknown(e))return"auto";let i=!(t===void 0||tt.isUnknown(t));if(typeof n=="number"&&n>0){let s=tt.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}return i?`calc(${typeof e=="number"?`${e}px`:e} + ${t}px)`:`calc(${e} + 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(Xe.isCommonPositionType(e))return nt.fromCommonPosition(e);if(nt.isCoord2DPosition(e))return e;if(Zt.isAlignPosition(e))return nt.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 tt.isUnknown(e)||e===void 0?tt.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return nt.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:tt.isUnknown(t.x)?0:t.x,y:tt.isUnknown(t.y)?0:t.y,xoffset:tt.isUnknown(t.xoffset)?0:t.xoffset,yoffset:tt.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(mn).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 Xe||e instanceof nt||e instanceof Zt}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return nt.fromCommonPosition(new Xe(e));if(this.isRawAlignPosition(e))return nt.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new nt(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}}};tt.Unknown=Symbol("Unknown");var N=tt,yi=class yi{static isCommonPositionType(e){return e instanceof yi}constructor(e){this.position=e}toCSS(){return{x:Jr[this.position],y:"50%",xoffset:0,yoffset:0}}};yi.Positions=mn;var Xe=yi,nt=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:Jr[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||N.isUnknown(n)?N.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:N.isUnknown(t.x)?e.x:t.x,y:N.isUnknown(t.y)?e.y:t.y,xoffset:N.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:N.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=N.orUnknown(e.x),this.y=N.orUnknown(e.y),this.xoffset=N.orUnknown(e.xoffset),this.yoffset=N.orUnknown(e.yoffset)):(this.x=N.orUnknown(e),this.y=N.orUnknown(t),this.xoffset=N.Unknown,this.yoffset=N.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}}},Zt=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=N.orUnknown(e.xalign),this.yalign=N.orUnknown(e.yalign),this.xoffset=N.orUnknown(e.xoffset),this.yoffset=N.orUnknown(e.yoffset)):(this.xalign=N.orUnknown(e),this.yalign=N.orUnknown(t),this.xoffset=N.Unknown,this.yoffset=N.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:N.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:N.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var $=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new bo(this.mergeWithDefaultConfig(e))}copy(){return new o(W({},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)?W({},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}},bo=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(W({},this.config))}join(e){let t=$r(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 Ka={[gi.left]:"25.33%",[gi.center]:"50%",[gi.right]:"75.66%"},ut=class ut{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new ut(ut.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?N.toCoord2D(N.tryParsePosition(e||t)):N.mergePosition(N.tryParsePosition(e),N.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=ut.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 vo(J.constructStyle(e,this.state,t))}toStyle(e,t){return vo(J.constructStyle(e,this.state,t))}serialize(){return ut.TransformStateSerializer.serialize(this.state)}clone(){return new ut(ut.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=ut.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}};ut.DefaultTransformState=new $({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new Xe("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}),ut.TransformStateSerializer=new qe({position:e=>N.serializePosition(N.tryParsePosition(e))},{position:e=>N.toCoord2D(e)});var le=ut,we=class we{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},we.defaultConfig,t||{});else{let[n,i]=[e,t||we.defaultOptions];this.sequences.push({props:n,options:i||we.defaultOptions}),this.config=Object.assign({},we.defaultConfig)}}static isPosition(e){return Xe.isCommonPositionType(e)||nt.isCoord2DPosition(e)||Zt.isAlignPosition(e)}static immediate(e){return new we(e,{duration:0,ease:"linear"})}static left(e,t){return new we({position:Xe.Positions.Left},{duration:e,ease:t})}static right(e,t){return new we({position:Xe.Positions.Right},{duration:e,ease:t})}static center(e,t){return new we({position:Xe.Positions.Center},{duration:e,ease:t})}static create(e){return new we([],e)}static positionToCSS(e,t,n,i){return e?N.isRawPosition(e)?N.D2PositionToCSS(N.rawPositionToCoord2D(e),n,t,i):N.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?N.toCoord2D(N.tryParsePosition(e||t)):N.mergePosition(N.tryParsePosition(e),N.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...W(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,c=function(p,h,m){return typeof p>"u"?typeof m<"u"?h(m):"":h(p)},l=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${l}, ${u})`,c(t.rotation,p=>`rotate(${p}deg)`,0),c(t.scaleX,p=>`scaleX(${p*a})`,1),c(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,c=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...we.positionToCSS(t.position,i,r,c),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?dn(t.fontColor):void 0,transform:we.propToCSSTransform(e,t),...we.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}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:r,sequences:s,options:a}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current});s.length||t.logger.warn("Transform","No sequences to animate.");let c=!1,l=e.lock(),u=Oa(s,a),d=()=>{e.overwrite(l,r.get()).unlock(l),u.complete(),c=!0},p=new S().registerSkipController(new V(d)),h=()=>{c||e.overwrite(l,r.get()).unlock(l),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),p.resolve()};return u.then(h,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{h()}catch{p.resolve()}})),u.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:r,sequences:s,options:a},this),p}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...we.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}){let r=t.clone(),s=r.lock(),a=this.sequences.map(({props:c,options:l})=>{let u=r.assign(s,c).toFramesDefinition(e,n);return[i,u,this.getOptions(l)]});return{finalState:r.unlock(s).freeze(),sequences:a,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0)}}copy(){return new we(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}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 ue("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 ue("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};we.defaultConfig={sync:!0},we.defaultOptions={duration:0,ease:"linear"},we.CommonImagePositionMap=Ka;var J=we;var vi=class{constructor(){this.id=""}setId(e){this.id=e}getId(){return this.id}reset(){}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 Yr=Symbol("_Chained"),Zr;Zr=Yr;var Co=class Co{constructor(e){this[Zr]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[Yr]}static toActions(e){return e.flat(2).map(t=>Co.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()}},Ie=Co,fn=class extends vi{chain(e){let t=Ie.isChained(this)?this:this.proxy(this,new Ie(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 oe=class extends fn{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var vt=class extends j{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",c=s.action?s.action.map(l=>l.stringify(e,t,n)).join(";"):"null";return`(${a}) {${c}}`};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)}}`:""}`)}};vt.ActionTypes=Hr;function _r(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function xo(o,e){if(Object.is(o,e))return!0;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((t,n)=>xo(t,e[n]));if(_r(o)&&_r(e)){let t=Object.keys(o);return t.length===Object.keys(e).length&&t.every(n=>Object.prototype.hasOwnProperty.call(e,n)&&xo(o[n],e[n]))}return!1}var St=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=W({},t),this.defaultContent=t}static isSerializable(e){return["number","string","boolean"].includes(typeof e)||e instanceof Date||e==null?!0:Array.isArray(e)?e.every(o.isSerializable):typeof e=="object"?Object.getPrototypeOf(e)===Object.prototype&&Object.values(e).every(o.isSerializable):!1}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
4
+ 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=W({},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)}),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){let t={any:i=>({type:"any",data:i}),date:i=>({type:"date",data:i.toString()})},n=this.toTypeName(e);return t[n](e)}unwrap(e){return{any:n=>n.data,date:n=>new Date(n.data)}[e.type](e)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||xo(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},Ot=class Ot{constructor(){this.events=new X;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new St(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 I(`Namespace ${e} is not initialized, did you forget to register it?
5
+ 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 I("No listener provided when subscribing to storable changes");return this.events.on(Ot.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(Ot.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 St(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(Ot.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(Ot.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(Ot.EventTypes["event:storable.restore"],{namespaces:[e]})}};Ot.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var In=Ot;var Je=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===It.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===It.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===It.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,c=>{c&&this.callee.fromData(c)},[s]),a}else if(this.type===It.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===It.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===It.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===It.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")}};Je.ActionTypes=It;var Kt=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(Kt||{}),Ce=class Ce extends oe{static toSound(e){return e==null?null:typeof e=="string"?new Ce({src:e}):e}static isSound(e){return e instanceof Ce}static voice(e){let t=typeof e=="string"?{src:e}:e;return new Ce({...t,type:"voice"})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new Ce({...t,type:"bgm"})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new Ce({...t,type:"sound"})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=Ce.DefaultUserConfig.create(t),[i]=n.extract(Ce.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){if(this.config.type==="bgm")throw new xe(`Sound (src: ${this.config.src}) is marked as bgm, but it is being played as a normal sound.
6
+ To prevent unintended behavior, the sound marked as bgm cannot be played using \`play()\`.`);return this.pushAction(Je.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(Je.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(Je.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(Je.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(Je.ActionTypes.setRate,[e])}pause(e){return this.pushAction(Je.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(Je.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}getSrc(){return this.config.src}toData(){return{state:Ce.StateSerializer.serialize(this.state)}}fromData(e){return this.state=Ce.StateSerializer.deserialize(e.state),this}copy(){return new Ce(this.userConfig.get())}reset(){return this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return Ce.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new Je(this.chain(),e,new A().setContent(t)))}};Ce.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",Ce.DefaultUserConfig=new $({src:Ce.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,type:"sound"}),Ce.DefaultConfig=new $({src:Ce.noSound,loop:!1,streaming:!1,seek:0,type:"sound"}),Ce.DefaultState=new $({volume:1,rate:1,paused:!1,muted:!1}),Ce.StateSerializer=new qe;var Se=Ce;var es=2;var Vp={};var hn=class extends fn{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 c=a.getFutureActions(e,i).filter(l=>!r.has(l));s.push(...c)}}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 _t=class _t{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===_t.SrcTypes.image?t.add(s):r===_t.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 R?R.getSrcURL(e):e.type==="image"?R.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(re,q.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(k.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof ge){let n=t;if(t.is(ge,et.setSrc)){let i=t.contentNode.getContent()[0];if(k.isImageSrc(i))return{type:"image",src:k.srcToURL(i),activeType:"scene"}}else{if(t.type===et.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===et.setAppearance){let i=t.contentNode.getContent()[0];if(R.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(R.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:R.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 Se){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof R||k.isStaticImageData(e)){if(e instanceof R){if(!k.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(R.getSrcURL(e)))return this}else if(this.isSrcRegistered(k.srcToURL(e.src)))return this;this.src.push({type:"image",src:k.isStaticImageData(e)?k.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 Se?t:new Se({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 Se?e.getSrc():e;return this.src.some(n=>n.type===_t.SrcTypes.audio?t===n.src.getSrc():n.type===_t.SrcTypes.image?t===R.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)}};_t.SrcTypes={image:"image",video:"video",audio:"audio"};var ke=_t;var Re=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 Ye=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}};var Me=class Me{static isWord(e){return e instanceof Me}static color(e,t){return Me.isWord(e)?e.copy().assign({color:t}):new Me(e,{color:t})}static bold(e){return Me.isWord(e)?e.copy().assign({bold:!0}):new Me(e,{bold:!0})}static italic(e){return Me.isWord(e)?e.copy().assign({italic:!0}):new Me(e,{italic:!0})}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=W(Me.defaultConfig,t)}evaluate(e){if(Re.isPause(this.text))return[this];if(Ye.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Me.isWord(n)?n.inherit(this.config).evaluate(e):new Me(n,this.config)).flat():Me.isWord(t)?t.inherit(this.config).evaluate(e):[new Me(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}assign(e){return this.config=W(this.config,e),this}copy(){return new Me(this.text,this.config)}isPause(){return Re.isPause(this.text)}isTextEvent(){return Ye.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Me.defaultConfig={},Me.defaultColor="#000";var Q=Me;var Wt=class extends j{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")}};Wt.ActionTypes=Fr;var Ae=class o extends oe{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 Wt(t,Wt.ActionTypes.action,new A().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new Wt(this.chain(),Wt.ActionTypes.action,new A().setContent(e))]}};var Si=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]}};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()}),Qe(()=>{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 I("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 I("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 c=e[a];i.attachChild(c),c.then(l=>{r[a]=l,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(c=>{a=c.onAbort(()=>{r.abort()})}),i.then(c=>{a?.cancel(),n=c,i=e(c),i?Qe(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?Qe(()=>s()):Qe(()=>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()?Qe(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 I(`Attaching to this timeline violates the timeline's state.
8
7
  Timeline attaching is only allowed synchronously after the timeline is created.
9
- 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())}},Ci=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 hn=class hn extends j{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:Se.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)}executeAction(e,t){if(this.type===cn.say){let n=null,i="",r=null,s=new S(v=>v).registerSkipController(new V(()=>{n?.()})),a=new Pe(s),c=this.contentNode.getContent(),l=e.isNvlMode(),u=e.getLiveGame(),d=e.createPresentationSnapshot(),p=u.lastDialog?{sentence:u.lastDialog.sentence,speaker:u.lastDialog.speaker}:null,h=hn.getVoice(e,c);if(h){let v=e.audioManager.play(h);a.attachChild(v)}let m=h?e.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{let v=hn.endVoiceWithPreference(e,h);v&&e.timelines.attachTimeline(v),m?.cancel()}):null;if(l){let v=this.getId(),f=(e.getActiveNvlDialogForAction(v)||e.getLatestNvlDialogForAction(v))?.id||e.allocateNvlDialogId(v),g=c.evaluate(Ae.getCtx({gameState:e}));i=Q.getText(g),u.events.emit(bt.EventTypes["event:character.prompt"],{character:c.config.character,sentence:c,text:i});let w=!1,T=()=>{w||(w=!0,e.events.emit(L.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(y),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:b}=e.ensureNvlDialog({id:f,actionId:v,character:this.callee,sentence:c,text:i});r=f;let x=e.consumeNvlTypingSuppression(),E=b&&!x?"typing":"awaitAdvance";e.activateNvlDialog(f,E,!b);let O=e.waitForNvlAdvance(f,()=>{e.settleNvlDialog(f),T()});n=()=>{O.cancel()}}else{let v=e.idManager.generateId(),C=e.createDialog(v,c,()=>{e.settleAdvDialog(v),e.gameHistory.resolvePending(y),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(v,this.getId()),i=C.text,n=()=>{e.settleAdvDialog(v),C.cancel()}}u.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:y}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(m?.cancel(),h&&e.audioManager.isPlaying(h)){let v=hn.endVoiceWithPreference(e,h);v&&a.attachChild(v)}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:y,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===cn.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")}};hn.ActionTypes=cn;var pt=hn;var Nn=class Nn extends oe{constructor(e,t={}){super(),this.config=W(Nn.defaultConfig,t),this.state={name:e||""};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(c=>typeof c=="string")&&[t,...n].length>0&&[t,...n].every(c=>ve.isSingleWord(c))){let c=e,l=ve.format([t,...n]),u=new ve(Kr(c,l),{character:this}),d=new pt(this.chain(),pt.ActionTypes.say,new A().setContent(u));return this.chain(d)}let i=t||{},r=e,s=Array.isArray(r)?new ve(r,{...i,character:this}):(ve.isSentence(r)?r:new ve(r,{...i,character:this})).copy();s.setCharacter(this);let a=new pt(this.chain(),pt.ActionTypes.say,new A().setContent(s));return this.chain(a)}setName(e){let t=new pt(this.chain(),pt.ActionTypes.setName,new A().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&&ve.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):ve.isSentence(e)?this.say(e):this.say(e,t)}};Nn.defaultCharacterColor="#000",Nn.defaultConfig={portraits:[]};var xi=Nn,Rt=new xi(null);var z=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()})`}},Ao=class o extends oe{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 xe(`ELSE condition already set
8
+ 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())}},Ti=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 gn=class gn extends j{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:Se.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)}executeAction(e,t){if(this.type===Vt.say){let n=null,i="",r=null,s=new S(v=>v).registerSkipController(new V(()=>{n?.()})),a=new Pe(s),c=this.contentNode.getContent(),l=e.isNvlMode(),u=e.getLiveGame(),d=e.createPresentationSnapshot(),p=u.lastDialog?{sentence:u.lastDialog.sentence,speaker:u.lastDialog.speaker}:null,h=gn.getVoice(e,c);if(h){let v=e.audioManager.play(h);a.attachChild(v)}let m=h?e.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{let v=gn.endVoiceWithPreference(e,h);v&&e.timelines.attachTimeline(v),m?.cancel()}):null;if(l){let v=this.getId(),f=(e.getActiveNvlDialogForAction(v)||e.getLatestNvlDialogForAction(v))?.id||e.allocateNvlDialogId(v),g=c.evaluate(Ae.getCtx({gameState:e}));i=Q.getText(g),u.events.emit(Tt.EventTypes["event:character.prompt"],{character:c.config.character,sentence:c,text:i});let w=!1,T=()=>{w||(w=!0,e.events.emit(L.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(y),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:b}=e.ensureNvlDialog({id:f,actionId:v,character:this.callee,sentence:c,text:i});r=f;let x=e.consumeNvlTypingSuppression(),P=b&&!x?"typing":"awaitAdvance";e.activateNvlDialog(f,P,!b);let O=e.waitForNvlAdvance(f,()=>{e.settleNvlDialog(f),T()});n=()=>{O.cancel()}}else{let v=e.idManager.generateId(),C=e.createDialog(v,c,()=>{e.settleAdvDialog(v),e.gameHistory.resolvePending(y),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(v,this.getId()),i=C.text,n=()=>{e.settleAdvDialog(v),C.cancel()}}u.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:y}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(m?.cancel(),h&&e.audioManager.isPlaying(h)){let v=gn.endVoiceWithPreference(e,h);v&&a.attachChild(v)}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:y,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===Vt.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")}};gn.ActionTypes=Vt;var it=gn;function wo(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function is(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return ns(o);let i=Ao(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=Ao(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=Ao(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function Ao(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 ns(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}function os(o,e){let t=[],n=i=>{i&&typeof i!="function"&&k.isImageSrc(i)&&t.push(i)};n(e?.config.avatar),n(o.config.avatar);for(let i of o.config.portraits||[])n(wo(i).avatar);return t}var zt=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===si.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===si.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")}};zt.ActionTypes=si;var Ne=class extends j{executeAction(e,t){if(this.type===Le.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===Le.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===Le.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,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)))},c=e.getExposedStateForce(t),l=t.transformState.clone(),u=c.applyTransform(n,a),d=e.timelines.attachTimeline(s).attachChild(u);return u.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:d},p=>{s.isSettled()||s.abort(),u.abort(),t.transformState.forceOverwrite(p.state)},[l]),s}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)))},l=e.getExposedStateForce(t).applyTransition(n,a),u=e.timelines.attachTimeline(s).attachChild(l);return l.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},()=>{s.isSettled()||s.abort(),l.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let l=e.findElementByDisplayable(this.callee,i);l&&e.disposeDisplayable(n,l.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new S().registerSkipController(new V(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,l=>{l.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let c=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:c},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};Ne.ActionTypes=Le;var at=class o extends oe{constructor(){super(...arguments);this.srcManager=new ke}pos(t,n,i){return this.transform(new J({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new J({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new J({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new J({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new J({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 J({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new J({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new J(t,n))}mask(t,n={}){let i=k.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c,...l}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c},l)}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:c="easeInOut",...l}=t,u={duration:a,ease:c,...l},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:c="easeInOut",...l}=t,u={duration:a,ease:c,...l},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",...c}=t,l={duration:s,ease:a,...c},u=o.wipeClipPath(n,100),d=o.wipeClipPath(n,0),p=o.createClipPathTransform([[i?d:u,{duration:0}],[i?u:d,l]]);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 Ne(n,Le.applyTransform,new A().setContent([t.copy()]));return n.chain(i)}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 J(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 J?t.copy():new J({opacity:1},t),r=new Ne(n,Le.applyTransform,new A().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof J?t.copy():new J({opacity:0},t),r=new Ne(n,Le.applyTransform,new A().setContent([i]));return n.chain(r)}};var pt=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(pt||{});import{animate as Wa}from"motion/react";var bt=class{requestAnimations(e){let t=e.map(y=>y.start),n=[],i=0,r=!1,s=!1,a=!1,c=[],l=[],u=[],d=()=>{e.forEach((y,v)=>{t[v]=y.end}),i=e.length,c.forEach(y=>y(t)),l.forEach(y=>y())};return{onUpdate:y=>(c.push(y),{cancel:()=>{let v=c.indexOf(y);v!==-1&&c.splice(v,1)}}),onComplete:y=>(l.push(y),{cancel:()=>{let v=l.indexOf(y);v!==-1&&l.splice(v,1)}}),onCanceled:y=>(u.push(y),{cancel:()=>{let v=u.indexOf(y);v!==-1&&u.splice(v,1)}}),complete:()=>{if(!(i===e.length||s)){if(!r){a=!0;return}n.forEach(y=>y.complete())}},start:()=>{if(!(r||s||i===e.length)){if(r=!0,a){d();return}e.forEach((y,v)=>{n.push(this.requestMotion(y,{onComplete:()=>{t[v]=y.end,c.forEach(C=>C(t)),i++,i===e.length&&l.forEach(C=>C())},onUpdate:C=>{t[v]=C,c.forEach(f=>f(t))}}))})}},cancel:()=>{s=!0,n.forEach(y=>y.cancel()),u.forEach(y=>y())}}}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 Wa(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};bt.AnimationType=pt;var Rn=class extends bt{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new I(`Trying to access text state, but element is not set
9
+ This should not happen, please report this issue to the developers`);return this._element.state}};var bi=class o extends Rn{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 Ze=class Ze extends at{constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=Ze.DefaultUserConfig.create(n),r=Ze.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 zt(t,zt.ActionTypes.setText,new A().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new J({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Ge,i=>{if(t){let s=new bi({fontSize:e,duration:t,easing:n});i.chain(this._applyTransition(i,s))}let r=new zt(i,zt.ActionTypes.setFontSize,new A().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:Ze.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=Ze.StateSerializer.deserialize(e.state),this.transformState=le.deserialize(e.transformState),this}_init(e){return new Ne(this.chain(),Le.init,new A().setContent([e||null,this.config.layer||null]))}reset(){this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig)}getInitialTransformState(e){let[t]=e.extract(Ze.DefaultTextTransformState.keys());return new le(Ze.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new Ne(e,Le.applyTransition,new A().setContent([t,n=>n._setElement(this)]))}getInitialState(){return Ze.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};Ze.DefaultUserConfig=new $({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:""}),Ze.DefaultTextConfig=new $({alignX:"center",alignY:"center",className:"",layer:void 0}),Ze.DefaultTextState=new $({fontSize:16,display:!1,text:""}),Ze.DefaultTextTransformState=new $({fontColor:"#000000",...le.DefaultTransformState.getDefaultConfig()}),Ze.StateSerializer=new qe;var en=Ze;var Mn=class Mn extends j{executeAction(e,t){let n=this;if(n.is(Mn,"persistent:set")){let[i,r]=n.contentNode.getContent(),s=e.getStorable().getNamespace(n.callee.getNamespaceName()),a=s.get(i);if(typeof r=="function"){let c=s.get(i);s.set(i,r(c))}else s.set(i,r);return e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{s.set(i,c)},[a]),super.executeAction(e,t)}else if(n.is(Mn,"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(c=>{s[c]=r.get(c),r.set(c,a[c])}),e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{Object.keys(c).forEach(l=>{r.set(l,c[l])})},[s]),super.executeAction(e,t)}throw this.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("PersistentAction")}};Mn.ActionTypes=Pn;var Ci=Mn;var _e=class _e{static isSentence(e){return e instanceof _e}static toSentence(e){return _e.isSentence(e)?e:new _e(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 Q.isWord(e)?e:new Q(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[Q.isWord(e)?e:new Q(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(_e.isSingleWord):_e.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||Q.isWord(e)||Re.isPause(e)||Ye.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=_e.format(e),this.config=W(_e.defaultConfig,{...t,voice:typeof t.voice=="string"?Se.voice(t.voice):Se.toSound(t.voice)}),this.state=Or(_e.defaultState)}toData(){return null}fromData(e){return this.state=W(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(..._e.formatStaticWord(i))}return t}copy(){return new _e([...this.text],this.config)}};_e.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},_e.defaultState={};var ve=_e;var Nn=class Nn extends oe{constructor(e,t={}){super(),this.config=W(Nn.defaultConfig,t),this.state={name:e||""};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(c=>typeof c=="string")&&[t,...n].length>0&&[t,...n].every(c=>ve.isSingleWord(c))){let c=e,l=ve.format([t,...n]),u=new ve(Wr(c,l),{character:this}),d=new it(this.chain(),it.ActionTypes.say,new A().setContent(u));return this.chain(d)}let i=t||{},r=e,s=Array.isArray(r)?new ve(r,{...i,character:this}):(ve.isSentence(r)?r:new ve(r,{...i,character:this})).copy();s.setCharacter(this);let a=new it(this.chain(),it.ActionTypes.say,new A().setContent(s));return this.chain(a)}setName(e){let t=new it(this.chain(),it.ActionTypes.setName,new A().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&&ve.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):ve.isSentence(e)?this.say(e):this.say(e,t)}};Nn.defaultCharacterColor="#000",Nn.defaultConfig={portraits:[]};var xi=Nn,Rt=new xi(null);var z=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()})`}},ko=class o extends oe{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 xe(`ELSE condition already set
10
10
  You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:z.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new xe(`ELSE condition already set
11
- 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(vt,[this,vt.ActionTypes.action,new A().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,c=r[s+1]?.contentNode;c&&a.setChild(c),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return Ie.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=z.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new vt(i,vt.ActionTypes.action,new A().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Rt.say(n).getActions():Ie.toActions([n]))}};var Ai=class Ai extends oe{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new St(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(Pn.set,[e,t]))}assign(e){return this.chain(this.createAction(Pn.assign,[e]))}equals(e,t){return new z(n=>{let i=n.storable.getNamespace(this.namespace),r=z.isLambda(t)||z.isLambdaHandler(t)?z.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new z(n=>{let i=n.storable.getNamespace(this.namespace),r=z.isLambda(t)||z.isLambdaHandler(t)?z.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new z(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new z(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new z(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new Q(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new Q(i=>z.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new z(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=Ai.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new Ti(this.chain(),e,A.create(t))}};Ai.NamespacePrefix="persistent";var gn=Ai,wi=class wi extends gn{constructor(e){super(e,{}),this.namespace=this.prefix(e,wi.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new St(this.namespace,this.defaultContent))}};wi.LocalNamespacePrefix="local";var yn=wi;var vn=class extends j{executeAction(e,t){if(this.type===Xt.action)return super.executeAction(e,t);if(this.type===Xt.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")}};vn.ActionTypes=Xt;var at=class at extends st{constructor(e,t={}){super();let n=at.DefaultUserConfig.create(t),i=at.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 vn(this.chain(),Xt.setZIndex,new A().setContent([e])))}toData(){return{state:at.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=at.StateSerializer.deserialize(e.state),this.transformState=le.deserialize(e.transformState),this}copy(){return new at(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new vn(this.chain(),Xt.action,new A),new Re(this.chain(),Le.init,new A().setContent([e,null,!1]))]}getInitialState(){return at.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(le.DefaultTransformState.keys());return new le(le.DefaultTransformState.create(e.get()).get())}};at.DefaultUserConfig=new $({zIndex:0,...le.DefaultTransformState.getDefaultConfig(),opacity:1}),at.DefaultConfig=new $({name:"(anonymous)",zIndex:0}),at.StateSerializer=new qe,at.DefaultState=new $({zIndex:0});var Sn=at;var Gn=class extends oe{constructor(e){super(),this.scene=e}show(e){let t=new re(this.scene.chain(),q.nvlShow,new A().setContent([e]));return this.chain(t)}hide(e){let t=new re(this.scene.chain(),q.nvlHide,new A().setContent([e]));return this.chain(t)}end(){let e=new re(this.scene.chain(),q.nvlEnd,new A().setContent([]));return this.chain(e)}};var Be=class Be extends fn{constructor(t,n){super();this.srcManager=new ke;this.events=new X;this.actions=[];this._futureActions_=[];this.labelMap=new Map;let i=Be.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=Be.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=Be.DefaultUserConfig.create(n),a=Be.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 yn(t)}static validateVoice(t){if(t.config.type!=="voice"&&t.config.type!=="sound")throw new xe(`Voice must be a voice, but got ${t.config.type}.
12
- To prevent unintended behavior and unexpected results, the sound have to be marked as voice. Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Be}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t){return new qe({backgroundImage:n=>n.toData(),backgroundMusic:n=>n?.toData()||null},{backgroundImage:n=>t.state.backgroundImage.fromData(n),backgroundMusic:n=>t.state.backgroundMusic&&n?t.state.backgroundMusic.fromData(n):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.chain().chain(Me.do([this.background.char(t,n)]))}jumpTo(t,n={}){return this.combineActions(new Me({allowFutureScene:!1}),i=>{let s=W({},n instanceof Tt?{transition:n}:n);return i.chain(new re(i,"scene:preUnmount",new A().setContent([]))).chain(this._initScene(t))._transitionToScene(s.transition,t.state.backgroundImage.state.currentSrc).chain(this._exit()),i})._jumpTo(t)}setBackgroundMusic(t,n){return this.chain(new re(this.chain(),q.setBackgroundMusic,new A().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new Gn(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},u=new re(this.chain(),q.nvlEnd,new A().setContent([l])),d=[...c,u];super.constructNodes(d);let p=new re(this.chain(),q.nvlBlock,new A().setContent([d,l]));return this.chain(p)}action(t){return this.actions=t,this}preloadImage(t){if(!D.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:Be.getStateSerializer(this).serialize(this.state)}}fromData(t){return this.state=Be.getStateSerializer(this).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new re(this.chain(),"scene:action",new A);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>Ie.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{Ie.isChained(m)||(m instanceof R?s.push(m):m instanceof Zt&&a.push(m))});let c=[],l=[],u=new Map;s.forEach(m=>{m.config.isWearable?l.push(m):m.config.autoInit&&c.push(m);for(let y of m.config.wearables){if(u.get(y)&&u.get(y)!==m)throw new Error(`Wearable image cannot be used multiple times
11
+ 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(vt,[this,vt.ActionTypes.action,new A().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,c=r[s+1]?.contentNode;c&&a.setChild(c),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return Ie.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=z.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new vt(i,vt.ActionTypes.action,new A().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Rt.say(n).getActions():Ie.toActions([n]))}};var Ai=class Ai extends oe{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new St(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(Pn.set,[e,t]))}assign(e){return this.chain(this.createAction(Pn.assign,[e]))}equals(e,t){return new z(n=>{let i=n.storable.getNamespace(this.namespace),r=z.isLambda(t)||z.isLambdaHandler(t)?z.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new z(n=>{let i=n.storable.getNamespace(this.namespace),r=z.isLambda(t)||z.isLambdaHandler(t)?z.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new z(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new z(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new z(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new Q(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new Q(i=>z.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new z(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=Ai.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new Ci(this.chain(),e,A.create(t))}};Ai.NamespacePrefix="persistent";var yn=Ai,wi=class wi extends yn{constructor(e){super(e,{}),this.namespace=this.prefix(e,wi.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new St(this.namespace,this.defaultContent))}};wi.LocalNamespacePrefix="local";var vn=wi;var Sn=class extends j{executeAction(e,t){if(this.type===Yt.action)return super.executeAction(e,t);if(this.type===Yt.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")}};Sn.ActionTypes=Yt;var ct=class ct extends at{constructor(e,t={}){super();let n=ct.DefaultUserConfig.create(t),i=ct.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 Sn(this.chain(),Yt.setZIndex,new A().setContent([e])))}toData(){return{state:ct.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=ct.StateSerializer.deserialize(e.state),this.transformState=le.deserialize(e.transformState),this}copy(){return new ct(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new Sn(this.chain(),Yt.action,new A),new Ne(this.chain(),Le.init,new A().setContent([e,null,!1]))]}getInitialState(){return ct.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(le.DefaultTransformState.keys());return new le(le.DefaultTransformState.create(e.get()).get())}};ct.DefaultUserConfig=new $({zIndex:0,...le.DefaultTransformState.getDefaultConfig(),opacity:1}),ct.DefaultConfig=new $({name:"(anonymous)",zIndex:0}),ct.StateSerializer=new qe,ct.DefaultState=new $({zIndex:0});var Tn=ct;var Gn=class extends oe{constructor(e){super(),this.scene=e}show(e){let t=new re(this.scene.chain(),q.nvlShow,new A().setContent([e]));return this.chain(t)}hide(e){let t=new re(this.scene.chain(),q.nvlHide,new A().setContent([e]));return this.chain(t)}end(){let e=new re(this.scene.chain(),q.nvlEnd,new A().setContent([]));return this.chain(e)}};var Be=class Be extends hn{constructor(t,n){super();this.srcManager=new ke;this.events=new X;this.actions=[];this._futureActions_=[];this.labelMap=new Map;let i=Be.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=Be.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=Be.DefaultUserConfig.create(n),a=Be.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 vn(t)}static validateVoice(t){if(t.config.type!=="voice"&&t.config.type!=="sound")throw new xe(`Voice must be a voice, but got ${t.config.type}.
12
+ To prevent unintended behavior and unexpected results, the sound have to be marked as voice. Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Be}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t){return new qe({backgroundImage:n=>n.toData(),backgroundMusic:n=>n?.toData()||null},{backgroundImage:n=>t.state.backgroundImage.fromData(n),backgroundMusic:n=>t.state.backgroundMusic&&n?t.state.backgroundMusic.fromData(n):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.chain().chain(Ge.do([this.background.char(t,n)]))}jumpTo(t,n={}){return this.combineActions(new Ge({allowFutureScene:!1}),i=>{let s=W({},n instanceof bt?{transition:n}:n);return i.chain(new re(i,"scene:preUnmount",new A().setContent([]))).chain(this._initScene(t))._transitionToScene(s.transition,t.state.backgroundImage.state.currentSrc).chain(this._exit()),i})._jumpTo(t)}setBackgroundMusic(t,n){return this.chain(new re(this.chain(),q.setBackgroundMusic,new A().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new Gn(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},u=new re(this.chain(),q.nvlEnd,new A().setContent([l])),d=[...c,u];super.constructNodes(d);let p=new re(this.chain(),q.nvlBlock,new A().setContent([d,l]));return this.chain(p)}action(t){return this.actions=t,this}preloadImage(t){if(!k.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:Be.getStateSerializer(this).serialize(this.state)}}fromData(t){return this.state=Be.getStateSerializer(this).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new re(this.chain(),"scene:action",new A);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>Ie.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{Ie.isChained(m)||(m instanceof R?s.push(m):m instanceof en&&a.push(m))});let c=[],l=[],u=new Map;s.forEach(m=>{m.config.isWearable?l.push(m):m.config.autoInit&&c.push(m);for(let y of m.config.wearables){if(u.get(y)&&u.get(y)!==m)throw new Error(`Wearable image cannot be used multiple times
13
13
  Maybe you bind the same wearable image to multiple parent images
14
14
  Parent Conflict (src: `+u.get(y)?.state.currentSrc+`)
15
- Current Parent (src: `+m.state.currentSrc+")");u.set(y,m)}});let d=[...this._initScene(this),...c.map(m=>m._init(this)),...l.map(m=>{if(!u.has(m))throw new Error("Wearable image must have a parent image");return u.get(m)._initWearable(m)}),...a.map(m=>m._init()),...r],p=super.constructNodes(d),h=new A(this.sceneRoot,void 0,p||void 0).setContent(this);return p?.setParent(h),this.sceneRoot?.setContentNode(h),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 ee&&r.type===_.label){let[s]=r.contentNode.getContent();if(i.has(s))throw new xe(`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 ee&&r.type===_.jump){let[s]=r.contentNode.getContent(),a=i.get(s);if(!a)throw new xe(`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"?Rt.say(n).getActions():Ie.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 c=s.shift();if(!i.has(c)){if(i.add(c),c instanceof re){let l=c.callee;if(D.isImageSrc(l.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:D.srcToURL(l.state.backgroundImage.state.currentSrc)}),c.type===q.jumpTo){let u=c,d=Be.getScene(t,u.contentNode.getContent()[0]);if(!d)throw c._sceneNotFoundError(c.getSceneName(u.contentNode.getContent()[0]));let p=ke.getPreloadableSrc(t,c);if(p&&this.srcManager.register(p),r.has(u)||n.has(d))continue;r.add(u),a.add(d),n.add(d)}}else if(c instanceof ge){let l=ke.getPreloadableSrc(t,c);l&&this.srcManager.register(l)}else if(c instanceof Je)this.srcManager.register(c.callee);else if(c instanceof ee){let u=c.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else c instanceof Re&&this.srcManager.register(c.callee.srcManager.getSrc());s.push(...c.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(c=>{c.registerSrc(t,n),this.srcManager.registerFuture(c.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let c=a.getStaticId();if(c){if(i.has(c))throw new xe(`Duplicate static action id: ${c}`);i.add(c)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let c=a.getStaticId();a.resolveId(c||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((i,r)=>{i.setId(`e-${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"?Se.voice(r):(Be.validateVoice(r),r)}let i=n[t];return typeof i=="string"?Se.voice(i):i||null}return null}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(){this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&t.backgroundMusic.config.type!=="bgm")throw new xe(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
16
- To prevent unintended behavior and unexpected results, the sound have to be marked as bgm. Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new R({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 re(this.chain(),"scene:jumpTo",new A().setContent([t])))}_exit(){return new re(this.chain(),"scene:exit",new A().setContent([]))}_transitionToScene(t,n){let i=this.chain();if(t&&n){let r=this.state.backgroundImage.char(n,t);i.chain(r.getActions())}return i}_init(t){return new re(this.chain(),"scene:init",new A().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)]}};Be.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"},Be.DefaultUserConfig=new $({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Be.DefaultSceneConfig=new $({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new Sn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new Sn("[[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=>{Se.isSound(r)&&Be.validateVoice(r)}),i(t))return t;throw new xe(`Invalid voices config: ${t}`)}});var it=Be;import*as cs from"howler";var ki=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 Wa={volume:1,limit:1/0},za=class ns{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={...Wa,...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 ns(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}}},is=!1;function $a(o){is=o}function zt(o,e){is||(e!==void 0?console.warn(o,e):console.warn(o))}var Ba=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){zt("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){zt("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){zt("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()}},ts=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}},ja=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 Ba(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){zt("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){zt("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 ts(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new ts(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}},qa=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}},Qa=10*1024*1024,Xa=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 qa(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}}},Ja={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},os=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...Ja,...o},$a(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Xa(this.audioContext),this.masterChannel=new za("__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=>{zt("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:c=!1}=e??{},l,u=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")l=this.createStreamSource(o);else{u=await this.audioCache.load(o),u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=u.raw(),l=p}else{u=o,u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=o.raw(),l=p}let d=new ja(this.audioContext,l,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(l instanceof AudioBufferSourceNode?(l.loop=c,c&&s!==void 0&&(l.loopStart=r,l.loopEnd=s)):l instanceof HTMLAudioElement&&(l.loop=c),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<Qa?"full":"stream"}catch(t){return zt("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=>{zt("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var Ei=class{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.channelVolumes=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1;Object.values(Ot).forEach(t=>{this.channelVolumes.set(t,1)})}initialize(){if(this.isReady||this.isInitializing)return;let e=new os;this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),Object.values(Ot).forEach(t=>{let n=this.channelVolumes.get(t)??1,i=e.getChannel(t)??e.createChannel(t,{volume:n});i.setVolume(n),this.channels.set(t,i)}),this.isReady=!0,this.isInitializing=!1,this.setupGroupVolume()}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}play(e,t={end:1,duration:0}){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channels.get(e.config.type),r=await this.sound.load(e.config.src),s=await i.play(r,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),a=e.state.muted??!1;s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:r,originalVolume:t.end}),t.duration>0?await s.fade(0,t.end,t.duration).finished:s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(c=>{s.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={end:1,duration:0}){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channels.get(e.config.type);if(!n)throw new I(`Channel not found for sound type: "${e.config.type}"`);let i=await this.sound.load(e.config.src),r=await n.play(i,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),s=e.state.muted??!1;return r.mute(s),e.state.muted=s,this.state.set(e,{token:r,cachedAudio:i,originalVolume:t.end}),t.duration>0?r.fade(0,t.end,t.duration):r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,r}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 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)}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);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(()=>{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);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(),i.token.fade(0,i.originalVolume,t).finished.then(()=>{e.state.paused=!1,n.resolve()})),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()}]),groups:[...this.channelVolumes.entries()].map(([e,t])=>[e,t])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setGroupVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r)throw new I(`Sound not found (id: "${n}")
17
- NarraLeaf cannot find the element with the id from the saved game`);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.channels.get(e.config.type),i=await this.sound.load(e.config.src),r=await n.play(i,{volume:e.state.volume,startTime:t.position,loop:e.config.loop,rate:1});this.state.set(e,{token:r,cachedAudio:i,originalVolume:e.state.volume});let s=e.state.muted??!1;r.mute(s),e.state.muted=s,e.state.paused?r.pause():t.isPlaying||r.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),Object.values(Ot).forEach(e=>{if(this.channelVolumes.set(e,1),this.isReady){let t=this.channels.get(e);t&&t.setVolume(1)}}),this.setupGroupVolume()}setGroupVolume(e,t){if(this.channelVolumes.set(e,t),this.isReady){let n=this.channels.get(e);n&&n.setVolume(t)}}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}getGroupVolume(e){return this.channelVolumes.get(e)??1}destroy(){this.reset(),this.sound.destroy()}setupGroupVolume(){let{soundVolume:e,bgmVolume:t,voiceVolume:n}=this.gameState.game.preference.getPreferences();this.setGroupVolume("sound",e),this.setGroupVolume("bgm",t),this.setGroupVolume("voice",n)}};import*as Ya from"html-to-image";var Pi=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new X}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")}};var Di=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=hi(6),{action:r,timeline:s,stackModel:a}=e,c=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:c,stackModel:a}),this.history.length>this.maxHistorySize){let l=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(l))}return{id:i}}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(),console.log("NarraLeaf-React [ActionHistory] Undoing",this.history[r].action.type,this.history[r]),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 Li=class o{constructor(e){this.history=[];this.actionHistoryMgr=e,this.actionHistoryMgr.onUndo(t=>{this.crossFilter(t)}),this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){return this.history.push(e),this}getHistory(){return this.history}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.map(e=>o.toSerialized(e))}serializeUntil(e){let t=this.history.findIndex(n=>n.token===e);return t<0?[]:this.history.slice(0,t+1).map(n=>o.toSerialized(n))}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:hi(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}}reset(){this.history=[]}static toSerialized(e){return{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(n=>n.id));this.history=this.history.filter(n=>!t.has(n.token))}};var _t=class extends j{executeAction(e,t){let n=new S().registerSkipController(new V(()=>{c.cancel()})),i=e.timelines.attachTimeline(n),r=this.contentNode.getContent(),s=e.createPresentationSnapshot(),a=null,c=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(l,p=>{p&&p.element.type==="menu"&&(p.element.selected=u.evaluated,p.isPending=!1)})}),{id:l}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{c.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:l,action:this,element:{type:"menu",text:c.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(c=>c.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};_t.ActionTypes=Fr;var en=class en extends oe{constructor(t,n={}){super();this.choices=[];this.prompt=ve.isSentence(t)?t:t===null?null:new ve(t),this.config=W(en.defaultConfig,n)}static prompt(t,n={}){return new en(t!==void 0?t:null,n)}static choose(t,n){return new en(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return ve.isSentence(t)&&n?i.choices.push({prompt:ve.toSentence(t),action:this.narrativeToActions(n),config:{}}):(Q.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:ve.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:ve.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?z.from(t.config.disabled):void 0,hidden:t.config?.hidden?z.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 xe("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=z.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new xe("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=z.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:z.not(z.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:z.not(z.from(t))}})}fromChained(t){return[new _t(this.chain(),_t.ActionTypes.action,new A().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"?Rt.say(n).getActions():Ie.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??{}}))}};en.defaultConfig={},en.targetAction=_t;var wo=en;var tn=class tn extends st{constructor(e={}){super();let t=tn.DefaultUserConfig.create(e),n=tn.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})}reset(e,t){return this.transform(new J({position:new Xe("center"),scaleX:1,scaleY:1,zoom:1,rotation:0,opacity:1,filter:"none"},{duration:e,ease:t}))}toData(){return{transformState:this.transformState.serialize()}}fromData(e){return this.transformState=le.deserialize(e.transformState),this}copy(){return new tn(this.userConfig.get())}getInitialTransformState(){let[e]=this.userConfig.extract(le.DefaultTransformState.keys());return new le(le.DefaultTransformState.create(e.get()).get())}};tn.DefaultUserConfig=new $({...le.DefaultTransformState.getDefaultConfig(),opacity:1}),tn.DefaultConfig=new $({name:"(camera)"});var Hn=tn;var $t=class $t extends fn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.name=t;let{camera:i,...r}=n;this.config=W($t.defaultConfig,r),this._camera=i??new Hn}static empty(){return new $t("empty").entry(new it("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 gn(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 xe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){return Qr(this.stringify(t))}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 ue(`Service ${i} serialize method should not return a promise`);if(!So(r))throw new ue(`Service ${i} serialize method should return a pure object.
15
+ Current Parent (src: `+m.state.currentSrc+")");u.set(y,m)}});let d=[...this._initScene(this),...c.map(m=>m._init(this)),...l.map(m=>{if(!u.has(m))throw new Error("Wearable image must have a parent image");return u.get(m)._initWearable(m)}),...a.map(m=>m._init()),...r],p=super.constructNodes(d),h=new A(this.sceneRoot,void 0,p||void 0).setContent(this);return p?.setParent(h),this.sceneRoot?.setContentNode(h),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 ee&&r.type===_.label){let[s]=r.contentNode.getContent();if(i.has(s))throw new xe(`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 ee&&r.type===_.jump){let[s]=r.contentNode.getContent(),a=i.get(s);if(!a)throw new xe(`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"?Rt.say(n).getActions():Ie.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 c=s.shift();if(!i.has(c)){if(i.add(c),c instanceof re){let l=c.callee;if(k.isImageSrc(l.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:k.srcToURL(l.state.backgroundImage.state.currentSrc)}),c.type===q.jumpTo){let u=c,d=Be.getScene(t,u.contentNode.getContent()[0]);if(!d)throw c._sceneNotFoundError(c.getSceneName(u.contentNode.getContent()[0]));let p=ke.getPreloadableSrc(t,c);if(p&&this.srcManager.register(p),r.has(u)||n.has(d))continue;r.add(u),a.add(d),n.add(d)}}else if(c instanceof ge){let l=ke.getPreloadableSrc(t,c);l&&this.srcManager.register(l)}else if(c instanceof Je)this.srcManager.register(c.callee);else if(c instanceof it){let l=c.type===Vt.say?c.contentNode.getContent():null;for(let u of os(c.callee,l))this.srcManager.register({type:"image",src:k.srcToURL(u)})}else if(c instanceof ee){let u=c.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else c instanceof Ne&&this.srcManager.register(c.callee.srcManager.getSrc());s.push(...c.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(c=>{c.registerSrc(t,n),this.srcManager.registerFuture(c.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let c=a.getStaticId();if(c){if(i.has(c))throw new xe(`Duplicate static action id: ${c}`);i.add(c)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let c=a.getStaticId();a.resolveId(c||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((i,r)=>{i.setId(`e-${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"?Se.voice(r):(Be.validateVoice(r),r)}let i=n[t];return typeof i=="string"?Se.voice(i):i||null}return null}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(){this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&t.backgroundMusic.config.type!=="bgm")throw new xe(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
16
+ To prevent unintended behavior and unexpected results, the sound have to be marked as bgm. Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new R({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 re(this.chain(),"scene:jumpTo",new A().setContent([t])))}_exit(){return new re(this.chain(),"scene:exit",new A().setContent([]))}_transitionToScene(t,n){let i=this.chain();if(t&&n){let r=this.state.backgroundImage.char(n,t);i.chain(r.getActions())}return i}_init(t){return new re(this.chain(),"scene:init",new A().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)]}};Be.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"},Be.DefaultUserConfig=new $({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Be.DefaultSceneConfig=new $({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new Tn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new Tn("[[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=>{Se.isSound(r)&&Be.validateVoice(r)}),i(t))return t;throw new xe(`Invalid voices config: ${t}`)}});var ot=Be;import*as ls from"howler";var ki=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 za={volume:1,limit:1/0},$a=class ss{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={...za,...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 ss(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}}},as=!1;function Ba(o){as=o}function $t(o,e){as||(e!==void 0?console.warn(o,e):console.warn(o))}var ja=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){$t("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){$t("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){$t("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()}},rs=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}},qa=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 ja(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){$t("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){$t("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 rs(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new rs(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}},Qa=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}},Xa=10*1024*1024,Ja=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 Qa(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}}},Ya={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},cs=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...Ya,...o},Ba(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Ja(this.audioContext),this.masterChannel=new $a("__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=>{$t("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:c=!1}=e??{},l,u=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")l=this.createStreamSource(o);else{u=await this.audioCache.load(o),u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=u.raw(),l=p}else{u=o,u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=o.raw(),l=p}let d=new qa(this.audioContext,l,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(l instanceof AudioBufferSourceNode?(l.loop=c,c&&s!==void 0&&(l.loopStart=r,l.loopEnd=s)):l instanceof HTMLAudioElement&&(l.loop=c),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<Xa?"full":"stream"}catch(t){return $t("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=>{$t("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var Ei=class{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.channelVolumes=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1;Object.values(Kt).forEach(t=>{this.channelVolumes.set(t,1)})}initialize(){if(this.isReady||this.isInitializing)return;let e=new cs;this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),Object.values(Kt).forEach(t=>{let n=this.channelVolumes.get(t)??1,i=e.getChannel(t)??e.createChannel(t,{volume:n});i.setVolume(n),this.channels.set(t,i)}),this.isReady=!0,this.isInitializing=!1,this.setupGroupVolume()}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}play(e,t={end:1,duration:0}){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channels.get(e.config.type),r=await this.sound.load(e.config.src),s=await i.play(r,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),a=e.state.muted??!1;s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:r,originalVolume:t.end}),t.duration>0?await s.fade(0,t.end,t.duration).finished:s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(c=>{s.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={end:1,duration:0}){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channels.get(e.config.type);if(!n)throw new I(`Channel not found for sound type: "${e.config.type}"`);let i=await this.sound.load(e.config.src),r=await n.play(i,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),s=e.state.muted??!1;return r.mute(s),e.state.muted=s,this.state.set(e,{token:r,cachedAudio:i,originalVolume:t.end}),t.duration>0?r.fade(0,t.end,t.duration):r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,r}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 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)}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);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(()=>{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);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(),i.token.fade(0,i.originalVolume,t).finished.then(()=>{e.state.paused=!1,n.resolve()})),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()}]),groups:[...this.channelVolumes.entries()].map(([e,t])=>[e,t])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setGroupVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r)throw new I(`Sound not found (id: "${n}")
17
+ NarraLeaf cannot find the element with the id from the saved game`);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.channels.get(e.config.type),i=await this.sound.load(e.config.src),r=await n.play(i,{volume:e.state.volume,startTime:t.position,loop:e.config.loop,rate:1});this.state.set(e,{token:r,cachedAudio:i,originalVolume:e.state.volume});let s=e.state.muted??!1;r.mute(s),e.state.muted=s,e.state.paused?r.pause():t.isPlaying||r.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),Object.values(Kt).forEach(e=>{if(this.channelVolumes.set(e,1),this.isReady){let t=this.channels.get(e);t&&t.setVolume(1)}}),this.setupGroupVolume()}setGroupVolume(e,t){if(this.channelVolumes.set(e,t),this.isReady){let n=this.channels.get(e);n&&n.setVolume(t)}}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}getGroupVolume(e){return this.channelVolumes.get(e)??1}destroy(){this.reset(),this.sound.destroy()}setupGroupVolume(){let{soundVolume:e,bgmVolume:t,voiceVolume:n}=this.gameState.game.preference.getPreferences();this.setGroupVolume("sound",e),this.setGroupVolume("bgm",t),this.setGroupVolume("voice",n)}};import*as Za from"html-to-image";var Pi=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new X}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")}};var Di=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=hi(6),{action:r,timeline:s,stackModel:a}=e,c=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:c,stackModel:a}),this.history.length>this.maxHistorySize){let l=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(l))}return{id:i}}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(),console.log("NarraLeaf-React [ActionHistory] Undoing",this.history[r].action.type,this.history[r]),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 Li=class o{constructor(e){this.history=[];this.actionHistoryMgr=e,this.actionHistoryMgr.onUndo(t=>{this.crossFilter(t)}),this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){return this.history.push(e),this}getHistory(){return this.history}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.map(e=>o.toSerialized(e))}serializeUntil(e){let t=this.history.findIndex(n=>n.token===e);return t<0?[]:this.history.slice(0,t+1).map(n=>o.toSerialized(n))}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:hi(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}}reset(){this.history=[]}static toSerialized(e){return{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(n=>n.id));this.history=this.history.filter(n=>!t.has(n.token))}};var tn=class extends j{executeAction(e,t){let n=new S().registerSkipController(new V(()=>{c.cancel()})),i=e.timelines.attachTimeline(n),r=this.contentNode.getContent(),s=e.createPresentationSnapshot(),a=null,c=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(l,p=>{p&&p.element.type==="menu"&&(p.element.selected=u.evaluated,p.isPending=!1)})}),{id:l}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{c.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:l,action:this,element:{type:"menu",text:c.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(c=>c.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};tn.ActionTypes=Vr;var nn=class nn extends oe{constructor(t,n={}){super();this.choices=[];this.prompt=ve.isSentence(t)?t:t===null?null:new ve(t),this.config=W(nn.defaultConfig,n)}static prompt(t,n={}){return new nn(t!==void 0?t:null,n)}static choose(t,n){return new nn(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return ve.isSentence(t)&&n?i.choices.push({prompt:ve.toSentence(t),action:this.narrativeToActions(n),config:{}}):(Q.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:ve.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:ve.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?z.from(t.config.disabled):void 0,hidden:t.config?.hidden?z.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 xe("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=z.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new xe("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=z.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:z.not(z.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:z.not(z.from(t))}})}fromChained(t){return[new tn(this.chain(),tn.ActionTypes.action,new A().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"?Rt.say(n).getActions():Ie.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??{}}))}};nn.defaultConfig={},nn.targetAction=tn;var Eo=nn;var on=class on extends at{constructor(e={}){super();let t=on.DefaultUserConfig.create(e),n=on.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})}reset(e,t){return this.transform(new J({position:new Xe("center"),scaleX:1,scaleY:1,zoom:1,rotation:0,opacity:1,filter:"none"},{duration:e,ease:t}))}toData(){return{transformState:this.transformState.serialize()}}fromData(e){return this.transformState=le.deserialize(e.transformState),this}copy(){return new on(this.userConfig.get())}getInitialTransformState(){let[e]=this.userConfig.extract(le.DefaultTransformState.keys());return new le(le.DefaultTransformState.create(e.get()).get())}};on.DefaultUserConfig=new $({...le.DefaultTransformState.getDefaultConfig(),opacity:1}),on.DefaultConfig=new $({name:"(camera)"});var Hn=on;var Bt=class Bt extends hn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.name=t;let{camera:i,...r}=n;this.config=W(Bt.defaultConfig,r),this._camera=i??new Hn}static empty(){return new Bt("empty").entry(new ot("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 yn(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 xe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){return Xr(this.stringify(t))}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 ue(`Service ${i} serialize method should not return a promise`);if(!So(r))throw new ue(`Service ${i} serialize method should return a pure object.
18
18
  A pure object should:
19
19
  1. be an object literal
20
20
  2. not have any prototype
21
21
  3. no circular reference
22
22
  4. sub objects should also be pure objects or serializable data
23
23
  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
24
- 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(it.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||ue,[`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.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this}getAllElementStates(){return this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).map(n=>({id:n.getId(),data:n.toData()})).filter(n=>!!n.data)}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>$t.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${$t.MAX_DEPTH})`);let s=i.shift();if(it.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 Ii(t).run(this)}};$t.defaultConfig={origin:"bottom left"},$t.MAX_DEPTH=32767;var Fn=$t;var Ri=class extends j{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(Ae.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 ko=class extends oe{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(Br(r)){let s=[],a=new S().registerSkipController(new V(()=>{for(let l of s)l?.()}));return r({...t,onAbort:l=>{s.push(l)}},...i).then(()=>a.resolve()),a}r({...t,onAbort:()=>{}},...i)}_registerActionHandler(t,n){this._handlers[t]=n}_createAction(t,n,i){return new Ri(t,"service:action",new A().setContent([n,i]))}},Eo=class extends ko{},Vn=class extends Eo{};var Ct=class Ct extends j{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Ct,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(Ct,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(Ct,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(Ct,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(Ct,"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(Ct,"video:hide")){let s=i.state.display;return this.changeState(e,a=>{i.state.display=!1,e.actionHistory.push(r,c=>{i.state.display=c},[s]),a.hide(),e.removeVideo(i),e.stage.update()},t)}else if(n.is(Ct,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new I(`Video is being used before it is added to the game
25
- 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")}};Ct.ActionTypes=yt;var Mi=Ct;var Tn=class Tn extends oe{constructor(e){super();let t=Tn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new ue("Video must have a src")}show(){return this.chain(this.createAction(yt.show,[]))}hide(){return this.chain(this.createAction(yt.hide,[]))}play(){return this.chain(this.createAction(yt.play,[]))}pause(){return this.chain(this.createAction(yt.pause,[]))}resume(){return this.chain(this.createAction(yt.resume,[]))}stop(){return this.chain(this.createAction(yt.stop,[]))}seek(e){return this.chain(this.createAction(yt.seek,[e]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return this.state=this.getInitialState(),this}getInitialState(){return Tn.DefaultVideoState.create().get()}createAction(e,t){return new Mi(this.chain(),e,A.create(t))}};Tn.DefaultVideoConfig=new $({src:"",muted:!1}),Tn.DefaultVideoState=new $({display:!1});var Po=Tn;var Bt=class Bt extends j{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Bt,"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,c=>{i.state.display=c},[a]),this.changeStateAsync(e,c=>c.show(s),t)}else if(n.is(Bt,"vfx:hide")){if(!e.isVfxAdded(i))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 c=>{await c.hide(s),i.state.display=!1,e.actionHistory.push(r,l=>{i.state.display=l},[a]),e.removeVfx(i),e.stage.update()},t)}else{if(n.is(Bt,"vfx:pause"))return this.changeState(e,s=>{i.state.paused=!0,s.pause()},t);if(n.is(Bt,"vfx:resume"))return this.changeState(e,s=>{i.state.paused=!1,s.resume()},t);if(n.is(Bt,"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 I(`Vfx is being used before it is added to the game
26
- 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")}};Bt.ActionTypes=Vt;var Ni=Bt;var bn=class bn extends oe{constructor(e){super();let t=bn.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new ue("Vfx must have a src")}show(e){return this.chain(this.createAction(Vt.show,[e]))}hide(e){return this.chain(this.createAction(Vt.hide,[e]))}pause(){return this.chain(this.createAction(Vt.pause,[]))}resume(){return this.chain(this.createAction(Vt.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(Vt.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 this.state=this.getInitialState(),this}getInitialState(){return bn.DefaultVfxState.create().get()}createAction(e,t){return new Ni(this.chain(),e,A.create(t))}};bn.DefaultVfxConfig=new $({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),bn.DefaultVfxState=new $({display:!1,paused:!1});var Do=bn;function ss(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function as(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return rs(o);let i=Lo(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=Lo(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=Lo(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function Lo(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 rs(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}var pe=class pe{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 Dn;this.htmlToImage=Ya;this.pageRouter=null;this.stageClickBuffer=null;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new X,this.logger=new ki(e,"NarraLeaf-React"),this.audioManager=new Ei(this),this.guard=new bi(e.config.app.guard).observe(this),this.timelines=new Ci(this.guard),this.notificationMgr=new Pi(this,[]),this.idManager=new li,this.actionHistory=new Di(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new Li(this.actionHistory)}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=it.isScene(e)?e:e.entryScene;if(!t)throw new I("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(pe.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}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){return this.state.elements[this.state.elements.length-1]?.scene||null}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(ss);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 c=s[a];for(let l=c.length-1;l>=0;l--){let u=c[l],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(Ae.getCtx({gameState:this}));this.game.getLiveGame().events.emit(bt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:Q.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1)},text:Q.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(Ae.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?Q.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(pe.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(pe.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(pe.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(pe.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(pe.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(pe.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(pe.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})=>re.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(pe.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(pe.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(pe.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(pe.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{re.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),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(pe.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(pe.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(pe.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(pe.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(pe.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}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 I(`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 cs.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 I("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 st&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(J.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 De("State already mounted");if(!e)throw new De("Invalid state key");return this.exposedState.set(e,t),this.events.emit(pe.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 I("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(pe.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(),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:c})=>{this.logger.debug("Loading scene: "+a);let l=t.get(a);if(!l)throw new I("Scene not found, id: "+a+`
24
+ 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(ot.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||ue,[`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.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this}getAllElementStates(){return this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).map(n=>({id:n.getId(),data:n.toData()})).filter(n=>!!n.data)}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>Bt.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${Bt.MAX_DEPTH})`);let s=i.shift();if(ot.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 Ii(t).run(this)}};Bt.defaultConfig={origin:"bottom left"},Bt.MAX_DEPTH=32767;var Fn=Bt;var Ri=class extends j{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(Ae.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 Po=class extends oe{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(jr(r)){let s=[],a=new S().registerSkipController(new V(()=>{for(let l of s)l?.()}));return r({...t,onAbort:l=>{s.push(l)}},...i).then(()=>a.resolve()),a}r({...t,onAbort:()=>{}},...i)}_registerActionHandler(t,n){this._handlers[t]=n}_createAction(t,n,i){return new Ri(t,"service:action",new A().setContent([n,i]))}},Do=class extends Po{},Vn=class extends Do{};var Ct=class Ct extends j{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Ct,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(Ct,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(Ct,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(Ct,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(Ct,"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(Ct,"video:hide")){let s=i.state.display;return this.changeState(e,a=>{i.state.display=!1,e.actionHistory.push(r,c=>{i.state.display=c},[s]),a.hide(),e.removeVideo(i),e.stage.update()},t)}else if(n.is(Ct,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new I(`Video is being used before it is added to the game
25
+ 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")}};Ct.ActionTypes=yt;var Mi=Ct;var bn=class bn extends oe{constructor(e){super();let t=bn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new ue("Video must have a src")}show(){return this.chain(this.createAction(yt.show,[]))}hide(){return this.chain(this.createAction(yt.hide,[]))}play(){return this.chain(this.createAction(yt.play,[]))}pause(){return this.chain(this.createAction(yt.pause,[]))}resume(){return this.chain(this.createAction(yt.resume,[]))}stop(){return this.chain(this.createAction(yt.stop,[]))}seek(e){return this.chain(this.createAction(yt.seek,[e]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return this.state=this.getInitialState(),this}getInitialState(){return bn.DefaultVideoState.create().get()}createAction(e,t){return new Mi(this.chain(),e,A.create(t))}};bn.DefaultVideoConfig=new $({src:"",muted:!1}),bn.DefaultVideoState=new $({display:!1});var Lo=bn;var jt=class jt extends j{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(jt,"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,c=>{i.state.display=c},[a]),this.changeStateAsync(e,c=>c.show(s),t)}else if(n.is(jt,"vfx:hide")){if(!e.isVfxAdded(i))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 c=>{await c.hide(s),i.state.display=!1,e.actionHistory.push(r,l=>{i.state.display=l},[a]),e.removeVfx(i),e.stage.update()},t)}else{if(n.is(jt,"vfx:pause"))return this.changeState(e,s=>{i.state.paused=!0,s.pause()},t);if(n.is(jt,"vfx:resume"))return this.changeState(e,s=>{i.state.paused=!1,s.resume()},t);if(n.is(jt,"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 I(`Vfx is being used before it is added to the game
26
+ 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")}};jt.ActionTypes=Ut;var Ni=jt;var Cn=class Cn extends oe{constructor(e){super();let t=Cn.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new ue("Vfx must have a src")}show(e){return this.chain(this.createAction(Ut.show,[e]))}hide(e){return this.chain(this.createAction(Ut.hide,[e]))}pause(){return this.chain(this.createAction(Ut.pause,[]))}resume(){return this.chain(this.createAction(Ut.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(Ut.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 this.state=this.getInitialState(),this}getInitialState(){return Cn.DefaultVfxState.create().get()}createAction(e,t){return new Ni(this.chain(),e,A.create(t))}};Cn.DefaultVfxConfig=new $({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),Cn.DefaultVfxState=new $({display:!1,paused:!1});var Io=Cn;var pe=class pe{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 Dn;this.htmlToImage=Za;this.pageRouter=null;this.stageClickBuffer=null;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new X,this.logger=new ki(e,"NarraLeaf-React"),this.audioManager=new Ei(this),this.guard=new Si(e.config.app.guard).observe(this),this.timelines=new Ti(this.guard),this.notificationMgr=new Pi(this,[]),this.idManager=new li,this.actionHistory=new Di(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new Li(this.actionHistory)}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=ot.isScene(e)?e:e.entryScene;if(!t)throw new I("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(pe.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}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){return this.state.elements[this.state.elements.length-1]?.scene||null}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(wo);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 c=s[a];for(let l=c.length-1;l>=0;l--){let u=c[l],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(Ae.getCtx({gameState:this}));this.game.getLiveGame().events.emit(Tt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:Q.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1)},text:Q.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(Ae.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(Tt.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?Q.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(pe.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(pe.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(pe.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(pe.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(pe.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(pe.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(pe.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})=>re.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(pe.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(pe.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(pe.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(pe.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{re.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),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(pe.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(pe.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(pe.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(pe.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(pe.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}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 I(`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 ls.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 I("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 at&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(J.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 De("State already mounted");if(!e)throw new De("Invalid state key");return this.exposedState.set(e,t),this.events.emit(pe.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 I("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(pe.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(),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:c})=>{this.logger.debug("Loading scene: "+a);let l=t.get(a);if(!l)throw new I("Scene not found, id: "+a+`
27
27
  NarraLeaf cannot find the element with the id from the saved game`);let u={scene:l,layers:this.constructLayerMap(c.layers,t),menus:[],texts:[]};this.state.elements.push(u),this.registerSrcManager(l.srcManager),this.getExposedStateAsync(l,d=>{re.initBackgroundMusic(l,d)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,c])=>{let l=t.get(a);if(!l)throw new I("Video not found, id: "+a+`
28
28
  NarraLeaf cannot find the element with the id from the saved game`);return l.fromData(c),l}),this.state.vfx=(e.vfx??[]).map(([a,c])=>{let l=t.get(a);if(!l)throw new I("Vfx not found, id: "+a+`
29
29
  NarraLeaf cannot find the element with the id from the saved game`);return l.fromData(c),l}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(c=>{let l=c.characterId&&t.get(c.characterId)||null,u=c.text||"";return{id:c.id,actionId:c.actionId||c.id,character:l,sentence:new ve(u,{character:l}),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(pe.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(pe.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 I('Scene not found, please call "scene.activate()" first.');return t}createElementSnapshot(e){return{scene:e.scene,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){e.forEach(t=>{t.forEach(n=>{n.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(pe.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 I("Scene not found, target scene may not be activated. This is an internal error, please report this to the developer.")}layerNotFound(){return new I("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 I("Layer not found, id: "+n+`
30
30
  NarraLeaf cannot find the element with the id from the saved game`);return[r,i.map(s=>{if(!t.has(s))throw new I("Displayable not found, id: "+s+`
31
31
  NarraLeaf cannot find the element with the id from the saved game
32
- This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};pe.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=pe;var ls=32767,Za=1e3,We=class o{constructor(e,t=void 0){this.liveGame=e;this.__tag=void 0;this.waitingAction=null;this.loopConfig=null;this.loopBodyActions=[];this.loopCondition=null;this.loopStartTime=0;this.loopDebugCheckpoint=0;this.__tag=t,this.stack=new pi().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new De("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new De("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(S.isAwaitable(i)&&!i.isSettled())throw new De("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!S.isAwaitable(n))throw new De("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%ls===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=ls&&t<Za){let i=new I(`[NarraLeaf] Potential infinite loop detected!
32
+ This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};pe.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=pe;var us=32767,_a=1e3,We=class o{constructor(e,t=void 0){this.liveGame=e;this.__tag=void 0;this.waitingAction=null;this.loopConfig=null;this.loopBodyActions=[];this.loopCondition=null;this.loopStartTime=0;this.loopDebugCheckpoint=0;this.__tag=t,this.stack=new pi().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new De("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new De("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(S.isAwaitable(i)&&!i.isSettled())throw new De("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!S.isAwaitable(n))throw new De("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%us===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=us&&t<_a){let i=new I(`[NarraLeaf] Potential infinite loop detected!
33
33
  Loop has executed ${e} iterations in ${t}ms.
34
34
  This is likely a bug in your game script. Check your loop conditions.
35
- 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 I("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}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 De("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;let t=this.liveGame.executeAction(this.liveGame.getGameStateForce(),e.node.action,{stackModel:this}),n=i=>i?S.isAwaitable(i)?(this.liveGame.getGameStateForce().logger.debug("next action (executed awaitable)",i),this.stack.push(i),i):i.node?.action?(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=r=>{if(o.isCalledActionResult(r)){let s=r.node?.action?.getId()??null,a=r.node?.action?.type??null;return r.wait?.stackModels?{type:"link",actionType:a,action:s,stacks:r.wait.stackModels.map(c=>c.serialize()),stackWaitType:r.wait.type}:{type:"action",actionType:a,action:s}}return null},n=this.stack.map(t).filter(function(r){return r!==null});if(e&&this.waitingAction){let r=t(this.waitingAction);r&&n.push(r)}let i={items:n};return this.loopConfig&&(i.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}),i}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(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:c}=i;if(c==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:c,stackModels:a.map(l=>o.createStackModel(this.liveGame,l,t))}})}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let c=t.get(a);if(!c)throw new Error(`Loop body action not found: ${a}`);r.push(c)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let c=a.contentNode.getContent();Array.isArray(c)&&c.length>=2&&z.isLambda(c[1])&&(s=c[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()}push(...e){return this.stack.push(...e),this}};var He=class He{constructor(e){this.events=new X;this.story=null;this.gameLock=new ln;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new In,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new St(He.GameSpacesKey.game,He.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:_r,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(),s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(c=>c.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}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:c,asyncStackModels:l}}=e,[u,d]=this.constructMaps();this.initNamespaces(),this._storable.load(i),s.forEach(({id:p,data:h})=>{t.logger.debug("restore element",p);let m=d.get(p);if(!m)throw new Error("Element not found, id: "+p+`
36
- NarraLeaf cannot find the element with the id from the saved game`);m.reset(),m.fromData(h)}),this.currentSavedGame=e,t.loadData(r,d),this.stackModel.deserialize(c,u),l.forEach(p=>{let h=We.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()}undo(e){if(this.assertGameState(),!this.gameState.actionHistory.ableToUndo(this.gameState.gameHistory)){this.gameState.logger.warn("LiveGame.undo","No action to undo");return}let t=this.gameLock.register().lock();this.stackModel.abortStackTop();let n=e?this.gameState.actionHistory.undoUntil(e):this.gameState.actionHistory.undo(this.gameState.gameHistory);if(n){let[i]=this.constructMaps(),{rootStackSnapshot:r,stackModel:s}=n;n.action.type===cn.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(r,i),s===this.stackModel&&this.stackModel.push(We.fromAction(n.action)),this.gameLock.off(t.unlock()),this.gameState.logger.info("LiveGame.undo","Undo until",e,"action",n),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0)}else this.gameState.logger.warn("LiveGame.undo","No action found"),this.gameLock.off(t.unlock())}restoreToHistory(e){this.assertGameState();let t=this.gameState.gameHistory.getByToken(e);if(!t)return this.gameState.logger.warn("LiveGame.restoreToHistory","No history entry for token",e),!1;if(!t.snapshot)return this.gameState.logger.warn("LiveGame.restoreToHistory","History entry has no restore snapshot",e),!1;let n=this.gameState.gameHistory.serializeUntil(e),i={name:this.currentSavedGame?.name??"",meta:this.currentSavedGame?.meta??this.getNewSavedGame().meta,game:{...t.snapshot,history:n}};return this.deserialize(i),!0}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 Se({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??He.FastForwardStepTimeout,c=i!==null?{reachedTarget:!1}:{},l=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",...c};if(this.stackModel.isEmpty())return{reason:"end",...c};let d=this.stackModel.getWaitingAwaitable();if(d){if(!await He.settleSuspendedStep(t,d,a))return{reason:"stalled",...c}}else t.stage.next(),await Promise.resolve()}return{reason:"maxSteps",...c}}finally{t.setFastForwarding(!1),t.audioManager.setGlobalVolume(l)}}static settleSuspendedStep(e,t,n){return new Promise(i=>{let r=!1,s=null,a,c=d=>{r||(r=!0,s!==null&&(clearTimeout(s),s=null),a?.cancel?.(),i(d))};if(a=t.onSettled(()=>c(!0)),r){a?.cancel?.();return}let l=Date.now()+n,u=()=>{if(!r&&(e.events.emit(L.EventTypes["event:state.player.skip"],!0),!r)){if(Date.now()>=l){c(!1);return}s=setTimeout(u,He.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(He.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(He.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(He.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(We.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)},{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 We(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 We(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(He.EventTypes["event:action.current"])&&this.events.emit(He.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type});let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new De("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new We(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new De("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),[vt].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(re,q.jumpTo)){let[c]=i.action.contentNode.getContent(),l=e.getScene(c);if(!l)throw i.action._sceneNotFoundError(i.action.getSceneName(c));if(a.has(l)){i=null;continue}a.add(l),i=l.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(ee,_.do)){let[c]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=c[0]?.contentNode||null}i?.action&&r.push(i.action),i=i?.getChild()||null}return r}clearMainStack(){if(!this.stackModel)throw new De("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new De("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:jr(),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 I("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 I("Player Element Not Mounted")}};He.DefaultNamespaces={game:{}},He.GameSpacesKey={game:"game"},He.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},He.FastForwardStepTimeout=1e4,He.FastForwardSkipInterval=16;var bt=He;var Un=class Un{constructor(e){this.settings=e;this.events=new X;this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(Un.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(Un.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))}};Un.EventTypes={"event:game.preference.change":"event:game.preference.change"};var On=Un;import"client-only";import Qs,{useEffect as Ml,useRef as tr}from"react";import"client-only";import us,{useContext as ps,useState as _a}from"react";var Io=us.createContext(null);function ds({children:o,game:e}){"use client";let t=new ne({}),[n]=_a(e||t);return us.createElement(Io,{value:n},o)}function M(){let o=ps(Io);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function ms(){return ps(Io)}import ec,{createContext as tc,useContext as fs}from"react";var hs="/",Gi=class Gi{constructor(e,t=Gi.rootPath){this.events=new X;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,c]=s.split("=");a&&(i[decodeURIComponent(a)]=c?decodeURIComponent(c):"")}}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 c=a.slice(1);n[c]=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 I(`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 I(`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(),Qe(()=>{t()}))})}else Qe(()=>{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)}};Gi.rootPath=hs;var jt=Gi,Ro=tc(null);function gs({children:o}){let e=M();return ec.createElement(Ro,{value:{router:e.router}},o)}function xt(){if(!fs(Ro))throw new Error("useRouter must be used within a RouterProvider");return fs(Ro).router}import vs from"react";import cc from"clsx";import nc,{createContext as ic,useContext as oc,useLayoutEffect as rc,useReducer as sc,useState as ac}from"react";var Mt=class Mt{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new X().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(Mt.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(Mt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(Mt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(Mt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(Mt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(Mt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};Mt.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 Mo=Mt,No=ic(null);function ys({children:o}){"use client";let[e]=ac(()=>new Mo);return nc.createElement(No,{value:{ratio:e}},o)}function Te(){let o=oc(No),[,e]=sc(n=>n+1,0);if(!No||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return rc(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function At({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=Te(),s=r.getStyle();return vs.createElement("div",{className:cc("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},vs.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import lc,{useEffect as uc}from"react";function dt(o){let e=M(),[t,n]=lc.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return uc(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Go from"react";import Hi from"react";import Ss from"clsx";function Fi({children:o,className:e,style:t,...n}){let{ratio:i}=Te(),r=M();return Hi.createElement(At,{className:Ss("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},Hi.createElement("div",{className:"absolute inset-0 w-full h-full"},Hi.createElement("div",{className:"inset-0 w-full h-full"},Hi.createElement("div",{className:Ss("pointer-events-auto-rest",e),style:t},o))))}function pc({children:o,className:e,style:t}){return Go.createElement(Go.Fragment,null,Go.createElement(Fi,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import Ts from"clsx";import bs from"react";function Vi({className:o,children:e,...t}){let{ratio:n}=Te();return bs.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:Ts("w-full h-full")},bs.createElement("div",{className:Ts("z-20",o),...t},e))}import ct,{useState as Cs}from"react";import{motion as dc}from"motion/react";function Ui({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=M(),[l,u]=Cs(!1);if(!c.config.app.inspector)return ct.createElement(r,{...a,ref:s},o);let d={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:l?1e3:"auto"}};return ct.createElement(r,{...d,ref:s},n&&l&&ct.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function mc({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=M(),[a,c]=Cs(!1);if(!s.config.app.inspector)return ct.createElement(i,{...r});let l={...r,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),style:{...r.style||{},outline:`${o} ${n}px ${e}`,zIndex:a?1e3:"auto"}};return ct.createElement("div",null,ct.createElement(i,{...l}),t&&a&&ct.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function fc(o){return ct.createElement(Ui,{...o,as:"div"})}function hc(o){return ct.createElement(Ui,{...o,as:"span"})}function gc(o){return ct.createElement(mc,{...o,as:"img"})}function yc(o){return ct.createElement(Ui,{...o,as:"button"})}function vc(o){return ct.createElement(Ui,{...o,as:dc.div,ref:o.ref,layout:o.layout})}var Sc={Div:fc,Span:hc,Button:yc,Img:gc,mDiv:vc},nn=Sc;import $i from"clsx";import Fe,{useEffect as xn,useRef as Ps,useState as Ho}from"react";import{useEffect as Tc,useState as bc}from"react";function de(o){let[e,t]=bc(0);Tc(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import xs from"react";var on=xs.createContext(null);function mt(){let o=xs.useContext(on);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import Oi,{useCallback as Cc,useLayoutEffect as Kn,useMemo as As,useRef as ws}from"react";import{useIsPresent as xc}from"motion/react";var ft=class ft{constructor(e){this.events=new X;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.config=e,this._state="pending",this.autoForwardScheduler=new ai,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.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(ft.Events.complete):this.safeEmit(ft.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(ft.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(ft.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(ne.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(ft.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.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(ft.Events.onFlush),this}onFlush(e){return this.events.on(ft.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;!this._active||!e.getPreference(ne.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(ft.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(ne.Preferences.gameSpeed))}};ft.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ee=ft;function Wn({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=xc(),s=i&&r,a=ws(!1),c=ws(o),l=c.current!==o,u=As(()=>o.sentence?.evaluate(Ae.getCtx({gameState:n})),[o.sentence,n]),d=As(()=>new Ee({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:l}),[o,n,t,u]),p=n.game.config.dialog,h=Cc(m=>{!s||a.current||(a.current=!0,e?.(m))},[s,e]);return Kn(()=>{a.current=!1},[d]),Kn(()=>{c.current=o},[o]),Kn(()=>(d.setActive(s),()=>{d.setActive(!1)}),[d,s]),Kn(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",d),d.events.on(Ee.Events.complete,m=>{n.logger.log("NarraLeaf-React: Say","Complete",d.isIdle()),s&&(d.isIdle()||m?h(!1):d.setIdle(!0))}).cancel),[d,h,n,s]),Kn(()=>n.events.on(L.EventTypes["event:state.player.skip"],m=>{s&&(m?(d.setIdle(!0),d.forceSkip()):d.isIdle()?h(!0):d.forceSkip())}).cancel,[d,h,n,s]),Oi.createElement(Oi.Fragment,null,Oi.createElement(on,{value:d},Oi.createElement(p,null)))}import{useEffect as Ki,useState as kc}from"react";import{useEffect as Ac,useState as wc}from"react";function rn(o){let e=M(),[t,n]=wc(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return Ac(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var Cn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(Cn||{});function Wi({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=M(),[s]=rn("nextAction"),[a]=kc(()=>{let c=o.firedTextEvents??(o.firedTextEvents=new Set);return new Ee({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:c})});return Ki(()=>{if(!n)return;let c=()=>{e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()},l=()=>{e.requestNvlSkip(o.id)==="typing"&&a.forceSkip()},u=e.events.on(L.EventTypes["event:state.player.stageClick"],c),d=e.events.on(L.EventTypes["event:state.player.skip"],l);return()=>{u.cancel(),d.cancel()}},[a,o.id,e,n]),Ki(()=>{if(!n)return;let c=u=>{if(u.repeat||!r.keyMap.match("nextAction",u.key))return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()};if(r.config.useWindowListener){let u=r.getLiveGame().onWindowEvent("keydown",c);return()=>{u.cancel()}}let l=r.getLiveGame().onPlayerEvent("keydown",c);return()=>{l.cancel()}},[a,o.id,r,e,n,s]),Ki(()=>{let c=a.events.on(Ee.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Ki(()=>{let c=a.events.on(Ee.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function Ec(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&&(R.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function zi(o,e,t){e.has(o)||(e.add(o),Ec(o,t))}function ks(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),zi(r,e,t)}return n}function*Vo(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Ne.isPause(n.text)){yield Ne.from(n.text);continue}if(Ze.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
35
+ 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 I("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}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 De("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;let t=this.liveGame.executeAction(this.liveGame.getGameStateForce(),e.node.action,{stackModel:this}),n=i=>i?S.isAwaitable(i)?(this.liveGame.getGameStateForce().logger.debug("next action (executed awaitable)",i),this.stack.push(i),i):i.node?.action?(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=r=>{if(o.isCalledActionResult(r)){let s=r.node?.action?.getId()??null,a=r.node?.action?.type??null;return r.wait?.stackModels?{type:"link",actionType:a,action:s,stacks:r.wait.stackModels.map(c=>c.serialize()),stackWaitType:r.wait.type}:{type:"action",actionType:a,action:s}}return null},n=this.stack.map(t).filter(function(r){return r!==null});if(e&&this.waitingAction){let r=t(this.waitingAction);r&&n.push(r)}let i={items:n};return this.loopConfig&&(i.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}),i}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(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:c}=i;if(c==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:c,stackModels:a.map(l=>o.createStackModel(this.liveGame,l,t))}})}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let c=t.get(a);if(!c)throw new Error(`Loop body action not found: ${a}`);r.push(c)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let c=a.contentNode.getContent();Array.isArray(c)&&c.length>=2&&z.isLambda(c[1])&&(s=c[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()}push(...e){return this.stack.push(...e),this}};var He=class He{constructor(e){this.events=new X;this.story=null;this.gameLock=new un;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new In,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new St(He.GameSpacesKey.game,He.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:es,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(),s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(c=>c.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}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:c,asyncStackModels:l}}=e,[u,d]=this.constructMaps();this.initNamespaces(),this._storable.load(i),s.forEach(({id:p,data:h})=>{t.logger.debug("restore element",p);let m=d.get(p);if(!m)throw new Error("Element not found, id: "+p+`
36
+ NarraLeaf cannot find the element with the id from the saved game`);m.reset(),m.fromData(h)}),this.currentSavedGame=e,t.loadData(r,d),this.stackModel.deserialize(c,u),l.forEach(p=>{let h=We.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()}undo(e){if(this.assertGameState(),!this.gameState.actionHistory.ableToUndo(this.gameState.gameHistory)){this.gameState.logger.warn("LiveGame.undo","No action to undo");return}let t=this.gameLock.register().lock();this.stackModel.abortStackTop();let n=e?this.gameState.actionHistory.undoUntil(e):this.gameState.actionHistory.undo(this.gameState.gameHistory);if(n){let[i]=this.constructMaps(),{rootStackSnapshot:r,stackModel:s}=n;n.action.type===Vt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(r,i),s===this.stackModel&&this.stackModel.push(We.fromAction(n.action)),this.gameLock.off(t.unlock()),this.gameState.logger.info("LiveGame.undo","Undo until",e,"action",n),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0)}else this.gameState.logger.warn("LiveGame.undo","No action found"),this.gameLock.off(t.unlock())}restoreToHistory(e){this.assertGameState();let t=this.gameState.gameHistory.getByToken(e);if(!t)return this.gameState.logger.warn("LiveGame.restoreToHistory","No history entry for token",e),!1;if(!t.snapshot)return this.gameState.logger.warn("LiveGame.restoreToHistory","History entry has no restore snapshot",e),!1;let n=this.gameState.gameHistory.serializeUntil(e),i={name:this.currentSavedGame?.name??"",meta:this.currentSavedGame?.meta??this.getNewSavedGame().meta,game:{...t.snapshot,history:n}};return this.deserialize(i),!0}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 Se({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??He.FastForwardStepTimeout,c=i!==null?{reachedTarget:!1}:{},l=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",...c};if(this.stackModel.isEmpty())return{reason:"end",...c};let d=this.stackModel.getWaitingAwaitable();if(d){if(!await He.settleSuspendedStep(t,d,a))return{reason:"stalled",...c}}else t.stage.next(),await Promise.resolve()}return{reason:"maxSteps",...c}}finally{t.setFastForwarding(!1),t.audioManager.setGlobalVolume(l)}}static settleSuspendedStep(e,t,n){return new Promise(i=>{let r=!1,s=null,a,c=d=>{r||(r=!0,s!==null&&(clearTimeout(s),s=null),a?.cancel?.(),i(d))};if(a=t.onSettled(()=>c(!0)),r){a?.cancel?.();return}let l=Date.now()+n,u=()=>{if(!r&&(e.events.emit(L.EventTypes["event:state.player.skip"],!0),!r)){if(Date.now()>=l){c(!1);return}s=setTimeout(u,He.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(He.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(He.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(He.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(We.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)},{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 We(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 We(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(He.EventTypes["event:action.current"])&&this.events.emit(He.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type});let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new De("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new We(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new De("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),[vt].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(re,q.jumpTo)){let[c]=i.action.contentNode.getContent(),l=e.getScene(c);if(!l)throw i.action._sceneNotFoundError(i.action.getSceneName(c));if(a.has(l)){i=null;continue}a.add(l),i=l.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(ee,_.do)){let[c]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=c[0]?.contentNode||null}i?.action&&r.push(i.action),i=i?.getChild()||null}return r}clearMainStack(){if(!this.stackModel)throw new De("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new De("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:qr(),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 I("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 I("Player Element Not Mounted")}};He.DefaultNamespaces={game:{}},He.GameSpacesKey={game:"game"},He.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},He.FastForwardStepTimeout=1e4,He.FastForwardSkipInterval=16;var Tt=He;var Un=class Un{constructor(e){this.settings=e;this.events=new X;this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(Un.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(Un.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))}};Un.EventTypes={"event:game.preference.change":"event:game.preference.change"};var On=Un;import"client-only";import Ys,{useEffect as Hl,useRef as or}from"react";import"client-only";import ps,{useContext as ds,useState as ec}from"react";var Ro=ps.createContext(null);function ms({children:o,game:e}){"use client";let t=new ne({}),[n]=ec(e||t);return ps.createElement(Ro,{value:n},o)}function M(){let o=ds(Ro);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function fs(){return ds(Ro)}import tc,{createContext as nc,useContext as hs}from"react";var gs="/",Gi=class Gi{constructor(e,t=Gi.rootPath){this.events=new X;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,c]=s.split("=");a&&(i[decodeURIComponent(a)]=c?decodeURIComponent(c):"")}}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 c=a.slice(1);n[c]=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 I(`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 I(`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(),Qe(()=>{t()}))})}else Qe(()=>{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)}};Gi.rootPath=gs;var qt=Gi,Mo=nc(null);function ys({children:o}){let e=M();return tc.createElement(Mo,{value:{router:e.router}},o)}function xt(){if(!hs(Mo))throw new Error("useRouter must be used within a RouterProvider");return hs(Mo).router}import Ss from"react";import lc from"clsx";import ic,{createContext as oc,useContext as rc,useLayoutEffect as sc,useReducer as ac,useState as cc}from"react";var Mt=class Mt{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new X().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(Mt.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(Mt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(Mt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(Mt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(Mt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(Mt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};Mt.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 No=Mt,Go=oc(null);function vs({children:o}){"use client";let[e]=cc(()=>new No);return ic.createElement(Go,{value:{ratio:e}},o)}function Te(){let o=rc(Go),[,e]=ac(n=>n+1,0);if(!Go||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return sc(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function At({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=Te(),s=r.getStyle();return Ss.createElement("div",{className:lc("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},Ss.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import uc,{useEffect as pc}from"react";function dt(o){let e=M(),[t,n]=uc.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return pc(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Ho from"react";import Hi from"react";import Ts from"clsx";function Fi({children:o,className:e,style:t,...n}){let{ratio:i}=Te(),r=M();return Hi.createElement(At,{className:Ts("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},Hi.createElement("div",{className:"absolute inset-0 w-full h-full"},Hi.createElement("div",{className:"inset-0 w-full h-full"},Hi.createElement("div",{className:Ts("pointer-events-auto-rest",e),style:t},o))))}function dc({children:o,className:e,style:t}){return Ho.createElement(Ho.Fragment,null,Ho.createElement(Fi,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import bs from"clsx";import Cs from"react";function Vi({className:o,children:e,...t}){let{ratio:n}=Te();return Cs.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:bs("w-full h-full")},Cs.createElement("div",{className:bs("z-20",o),...t},e))}import lt,{useState as xs}from"react";import{motion as mc}from"motion/react";function Ui({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=M(),[l,u]=xs(!1);if(!c.config.app.inspector)return lt.createElement(r,{...a,ref:s},o);let d={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:l?1e3:"auto"}};return lt.createElement(r,{...d,ref:s},n&&l&&lt.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function fc({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=M(),[a,c]=xs(!1);if(!s.config.app.inspector)return lt.createElement(i,{...r});let l={...r,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),style:{...r.style||{},outline:`${o} ${n}px ${e}`,zIndex:a?1e3:"auto"}};return lt.createElement("div",null,lt.createElement(i,{...l}),t&&a&&lt.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function hc(o){return lt.createElement(Ui,{...o,as:"div"})}function gc(o){return lt.createElement(Ui,{...o,as:"span"})}function yc(o){return lt.createElement(fc,{...o,as:"img"})}function vc(o){return lt.createElement(Ui,{...o,as:"button"})}function Sc(o){return lt.createElement(Ui,{...o,as:mc.div,ref:o.ref,layout:o.layout})}var Tc={Div:hc,Span:gc,Button:vc,Img:yc,mDiv:Sc},rn=Tc;import $i from"clsx";import Fe,{useEffect as An,useRef as Ds,useState as Fo}from"react";import{useEffect as bc,useState as Cc}from"react";function de(o){let[e,t]=Cc(0);bc(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import As from"react";var sn=As.createContext(null);function mt(){let o=As.useContext(sn);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import Oi,{useCallback as xc,useLayoutEffect as Kn,useMemo as ws,useRef as ks}from"react";import{useIsPresent as Ac}from"motion/react";var ft=class ft{constructor(e){this.events=new X;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.config=e,this._state="pending",this.autoForwardScheduler=new ai,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.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(ft.Events.complete):this.safeEmit(ft.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(ft.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(ft.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(ne.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(ft.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.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(ft.Events.onFlush),this}onFlush(e){return this.events.on(ft.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;!this._active||!e.getPreference(ne.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(ft.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(ne.Preferences.gameSpeed))}};ft.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ee=ft;function Wn({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=Ac(),s=i&&r,a=ks(!1),c=ks(o),l=c.current!==o,u=ws(()=>o.sentence?.evaluate(Ae.getCtx({gameState:n})),[o.sentence,n]),d=ws(()=>new Ee({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:l}),[o,n,t,u]),p=n.game.config.dialog,h=xc(m=>{!s||a.current||(a.current=!0,e?.(m))},[s,e]);return Kn(()=>{a.current=!1},[d]),Kn(()=>{c.current=o},[o]),Kn(()=>(d.setActive(s),()=>{d.setActive(!1)}),[d,s]),Kn(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",d),d.events.on(Ee.Events.complete,m=>{n.logger.log("NarraLeaf-React: Say","Complete",d.isIdle()),s&&(d.isIdle()||m?h(!1):d.setIdle(!0))}).cancel),[d,h,n,s]),Kn(()=>n.events.on(L.EventTypes["event:state.player.skip"],m=>{s&&(m?(d.setIdle(!0),d.forceSkip()):d.isIdle()?h(!0):d.forceSkip())}).cancel,[d,h,n,s]),Oi.createElement(Oi.Fragment,null,Oi.createElement(sn,{value:d},Oi.createElement(p,null)))}import{useEffect as Ki,useState as Ec}from"react";import{useEffect as wc,useState as kc}from"react";function an(o){let e=M(),[t,n]=kc(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return wc(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var xn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(xn||{});function Wi({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=M(),[s]=an("nextAction"),[a]=Ec(()=>{let c=o.firedTextEvents??(o.firedTextEvents=new Set);return new Ee({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:c})});return Ki(()=>{if(!n)return;let c=()=>{e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()},l=()=>{e.requestNvlSkip(o.id)==="typing"&&a.forceSkip()},u=e.events.on(L.EventTypes["event:state.player.stageClick"],c),d=e.events.on(L.EventTypes["event:state.player.skip"],l);return()=>{u.cancel(),d.cancel()}},[a,o.id,e,n]),Ki(()=>{if(!n)return;let c=u=>{if(u.repeat||!r.keyMap.match("nextAction",u.key))return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()};if(r.config.useWindowListener){let u=r.getLiveGame().onWindowEvent("keydown",c);return()=>{u.cancel()}}let l=r.getLiveGame().onPlayerEvent("keydown",c);return()=>{l.cancel()}},[a,o.id,r,e,n,s]),Ki(()=>{let c=a.events.on(Ee.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Ki(()=>{let c=a.events.on(Ee.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function Pc(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&&(R.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function zi(o,e,t){e.has(o)||(e.add(o),Pc(o,t))}function Es(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),zi(r,e,t)}return n}function*Uo(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Re.isPause(n.text)){yield Re.from(n.text);continue}if(Ye.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
37
37
  `?yield`
38
- `:yield{text:r,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function Fo(o){let e=Vo(o),t=[];for(let n of e)Ne.isPause(n)||Ze.isTextEvent(n)||t.push(n);return t}function Ds(o,e){o(t=>{let n=t[t.length-1];return n&&n!==`
38
+ `:yield{text:r,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function Vo(o){let e=Uo(o),t=[];for(let n of e)Re.isPause(n)||Ye.isTextEvent(n)||t.push(n);return t}function Ls(o,e){o(t=>{let n=t[t.length-1];return n&&n!==`
39
39
  `&&e!==`
40
- `&&n.tag===e.tag?[...t.slice(0,-1),{...e,text:n.text+e.text,config:e.config}]:[...t,e]})}function Pc(o,e,t){return t||(o!==void 0?ve.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new Q(n.text,n.config)):[])}function Dc(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 Es(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Bi(o){return o===void 0?void 0:pn(o)}function Uo({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,...c}){let l=M(),u=l.getLiveGame().getGameState(),d=Ps(null),[p,h]=Ho(()=>n&&!n.config.useTypeEffect?Fo(n.config.evaluatedWords):[]),[m,y]=de();if(!n)throw new Error("Dialog state is required");xn(()=>{if(!(!n.config.action.sentence||d.current))return u.logger.info("Initializing the sentence",n,d.current),u.schedule(({onCleanup:b})=>{if(!n.config.useTypeEffect){ks(n.config.evaluatedWords,n.config.firedTextEvents??new Set,u),n.dispatchComplete();return}h([]),d.current=v(),m(),d.current.onComplete(()=>{n.dispatchComplete()}),b(()=>{d.current?.timeline?.abort()})},0)},[]),xn(()=>n.events.depends([n.events.on(Ee.Events.requestComplete,()=>{d.current?.interact()}),n.events.on(Ee.Events.forceSkip,()=>{n.isEnded()||d.current?.forceSkip()})]).cancel,[n,y]),xn(()=>l.preference.events.depends([l.preference.onPreferenceChange(ne.Preferences.gameSpeed,()=>{d.current?.update()}),l.preference.onPreferenceChange(ne.Preferences.autoForward,()=>{d.current?.update()}),l.preference.onPreferenceChange(ne.Preferences.cps,()=>{d.current?.update()})]).cancel,[]);function v(){let b=new S,x=new Pe(b).setGuard(u.guard),E=new Set,O=n.config.firedTextEvents??new Set,Z=new Set,ie=new Set,Oe=Vo(n.config.evaluatedWords),rt=null,je=[],be=[],K=()=>{je.forEach(k=>k()),je.length=0},se=()=>{if(be.length!==0)return{done:!1,value:be.shift()};let{done:k,value:H}=Oe.next();return{done:k,value:H}},te=k=>{let H=fe=>{k(fe),Z.delete(H)};return Z.add(H),{cancel:()=>{Z.delete(H)}}},ae=k=>{Ds(h,k)},F=(k=!1)=>{let H=!1;for(;!H;){let{done:fe,value:P}=se();if(fe){H=!0;break}if(Ne.isPause(P)){if(k)continue;H=!0,be.push(P);break}else Ze.isTextEvent(P)?zi(P,O,u):P===`
41
- `?h(he=>[...he,P]):typeof P=="object"&&"text"in P&&!E.has(P)&&(E.add(P),ae(P))}rt&&!rt.isSettled()?rt.abort():(ie.forEach(fe=>fe()),b.resolve())};return u.schedule(async k=>{let H=!1,fe=!1;for(;!H;){let{done:P,value:he}=se();if(P){H=fe=!0;break}if(Ze.isTextEvent(he)){zi(he,O,u);continue}let Lt=new S;if(u.timelines.attachTimeline(Lt),Lt.registerSkipController(new V(()=>{K(),H=!0,k.retry()})),Lt.onSettled(()=>{K()}),rt=Lt,Ne.isPause(he)){let ni=Ne.from(he),ii=l.preference.getPreference(ne.Preferences.gameSpeed);if(ni.config.duration){let oi=ni.config.duration/ii;await mi(oi)}else{let oi=l.preference.getPreference(ne.Preferences.autoForward),ri=S.race([S.create(Ha=>{let Fa=te(Va=>{Va(),Ha.resolve()});je.push(()=>Fa.cancel())}),...oi?[S.delay(l.config.autoForwardDefaultPause/ii)]:[]]);u.timelines.attachTimeline(ri),await S.wait(ri)}}else{if(he!==`
42
- `&&E.has(he))continue;E.add(he),ae(he);let{gameSpeed:ni,cps:ii}=l.preference.getPreferences(),ri=1e3/((typeof he=="object"&&"cps"in he&&he.cps!==void 0?he.cps:ii)*ni);await mi(ri)}}fe&&(ie.forEach(P=>P()),b.resolve())},0),{getToken:()=>b,interact:()=>{let k=!1;Z.forEach(H=>H(()=>k=!0)),!k&&F()},update:()=>{rt&&rt.abort()},forceSkip:()=>{F(!0)},timeline:x,onComplete:k=>(ie.add(k),{cancel:()=>{ie.delete(k)}})}}let C=n.config.action.sentence;if(!C)return null;let f=s??"bold",g={fontWeight:C.config.bold?f:r,fontSize:C.config.fontSize??i,color:Bi(C.config.color??o),fontFamily:C.config.fontFamily??a,fontStyle:C.config.italic?"italic":void 0},w=b=>({fontWeight:b.config.bold||C.config.bold?f:r,fontSize:b.config.fontSize??C.config.fontSize??i,color:Bi(b.config.color??C.config.color??o),fontFamily:b.config.fontFamily??C.config.fontFamily??a,fontStyle:b.config.italic??C.config.italic?"italic":void 0}),T=(b,x)=>b===`
43
- `?Fe.createElement("br",{key:x}):Fe.createElement(nn.Span,{tag:`say.word.${x}`,key:x,style:{...w(b),...fi(l.config.app.debug,{outline:"1px dashed red"})},className:$i("inline-block break-all",b.config.className)},b.config.ruby?Fe.createElement("ruby",{className:"align-bottom inline-block"},Fe.createElement("rt",{className:"block text-center"},b.config.ruby),b.text):b.text);return Fe.createElement("div",{...c,className:$i("whitespace-pre-wrap",e),style:{...g,...t}},p.map(T))}function Lc({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:c,defaultColor:l,className:u,style:d,fontSize:p,fontWeight:h,fontWeightBold:m,fontFamily:y,onCompleted:v,...C}){let f=ms(),[,g]=Ho(0),w=f?.config??ne.DefaultConfig,T=f?.preference.getPreferences()??ne.DefaultPreference,b=s??T.cps,x=a??T.gameSpeed,E=c??w.autoForwardDefaultPause,O=r??w.autoForwardDefaultPause,Z=Fe.useMemo(()=>Pc(o,e,t),[o,e,t]),ie=Fe.useMemo(()=>Dc(i,r,O),[i,r,O]),Oe=Ps(v),[rt,je]=Ho(()=>n?[]:Fo(Z));xn(()=>{if(f)return f.preference.onPreferenceChange(()=>{g(F=>F+1)}).cancel},[f]),xn(()=>{Oe.current=v},[v]),xn(()=>{let F=!1,me=[],ye=Math.max(.01,x),ce=H=>new Promise(fe=>{let P=setTimeout(fe,Math.max(0,H));me.push(P)}),$e=()=>{F||Oe.current?.()};return n?Z.length===0?(je([]),()=>{F=!0}):((async()=>{do{let H=Vo(Z);for(je([]);!F;){let{done:fe,value:P}=H.next();if(fe)break;if(Ne.isPause(P)){let he=Ne.from(P);await ce((he.config.duration??E)/ye)}else{if(Ze.isTextEvent(P))continue;Ds(je,P),P===`
44
- `?await ce(Es(b,x)):await ce(Es(P.cps??b,x))}}if(F)return;$e(),ie.enabled&&await ce(ie.delay)}while(!F&&ie.enabled)})(),()=>{F=!0,me.forEach(H=>clearTimeout(H))}):(je(Fo(Z)),$e(),()=>{F=!0})},[Z,n,ie,b,x,E]);let be=e?.config,K=m??"bold",se={fontWeight:be?.bold?K:h,fontSize:be?.fontSize??p,color:Bi(be?.color??l),fontFamily:be?.fontFamily??y,fontStyle:be?.italic?"italic":void 0},te=F=>({fontWeight:F.config.bold||be?.bold?K:h,fontSize:F.config.fontSize??be?.fontSize??p,color:Bi(F.config.color??be?.color??l),fontFamily:F.config.fontFamily??be?.fontFamily??y,fontStyle:F.config.italic??be?.italic?"italic":void 0}),ae=(F,me)=>F===`
45
- `?Fe.createElement("br",{key:me}):Fe.createElement("span",{key:me,style:te(F),className:$i("inline-block break-all",F.config.className)},F.config.ruby?Fe.createElement("ruby",{className:"align-bottom inline-block"},Fe.createElement("rt",{className:"block text-center"},F.config.ruby),F.text):F.text);return Fe.createElement("div",{...C,className:$i("whitespace-pre-wrap",u),style:{...se,...d}},rt.map(ae))}function Ls(o){return Fe.createElement(Uo,{...o,key:o.dialog?.config.action.id})}function Ic({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Wi({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Fe.createElement(Uo,{...r,dialog:s,key:s.config.action.id})}function Rc(o){let e=mt();return Fe.createElement(Uo,{...o,dialog:e,key:e.config.action.id})}function qt(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Fe.createElement(Ic,{...o}):Fe.createElement(Rc,{...o})}var Mc=qt;import qi,{useEffect as Nc,useLayoutEffect as Gc,useMemo as Rs,useRef as Hc,useState as Fc}from"react";import ji from"react";var Oo=ji.createContext(null);function Ko(){let o=ji.useContext(Oo);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var Wo=ji.createContext(null);function Is(){let o=ji.useContext(Wo);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Qi({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let c=Hc(null),{register:l,unregister:u,getIndex:d}=Is(),[p,h]=Fc(-1),{choose:m,evaluated:y,gameState:v}=Ko(),C=p===-1?null:y[p],f=Rs(()=>Ae.getCtx({gameState:v}),[v]),{hidden:g,disabled:w}=Rs(()=>{if(!C)return{hidden:!1,disabled:!1};let x=C.config.hidden?.evaluate(f)?.value??!1,E=!x&&(C.config.disabled?.evaluate(f)?.value??!1);return{hidden:x,disabled:E}},[C,f]);Gc(()=>{if(!c.current)return;let x=c;l(x);let E=d(x);return h(E),c.current.dataset.index=E.toString(),()=>u(x)},[l,u,d]),Nc(()=>{if(!t)return;let x=E=>{E.key.toLowerCase()===t.toLowerCase()&&!E.ctrlKey&&!E.metaKey&&(E.preventDefault(),E.stopPropagation(),T())};return window.addEventListener("keydown",x,!0),()=>{window.removeEventListener("keydown",x,!0)}},[t]);function T(){if(p===-1||!y[p]||g||w)return;let x=y[p];m({...x,evaluated:Q.getText(x.words||[])})}let b=C&&!g;return qi.createElement(qi.Fragment,null,qi.createElement("button",{className:o,style:{...e,display:b?e?.display??void 0:"none"},onClick:T,ref:c,disabled:w},b&&qi.createElement(Ls,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Ee({useTypeEffect:!1,action:{sentence:C.prompt,words:C.words,character:null},gameState:v,evaluatedWords:C.words})})))}import Xi from"react";import{AnimatePresence as Vc}from"motion/react";function Ji({children:o,...e}){let t=Vc;return Xi.createElement(Xi.Fragment,null,Xi.createElement("div",{...e},Xi.createElement(t,null,o)))}import Ms from"react";function Nt({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Ms.useContext(on),c=e??o?.character??a?.config.action.character??null,l=n??c?.config.color,u=i??t??c?.state.name;return Ms.createElement("div",{...s,style:{color:l?pn(l):void 0,...r}},u)}import Uc from"clsx";import Oc from"react";function Ns(){let o=mt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return zc(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?R.getSrcURL(s):null,c=s&&R.isTagSrc(s)?[...s.state.currentSrc]:null,l=as({character:n,sentence:i,portrait:s,currentSrc:a,tags:c,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=Wc(l.source);return{visible:!!u,src:u,character:l.character,portrait:l.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function Kc({className:o,style:e,alt:t,...n}){let i=Ns();return!i.visible||!i.src?null:Oc.createElement("img",{...n,"data-element-type":"dialog-avatar",className:Uc("dialog-avatar",o),src:i.src,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function Wc(o){return o?D.srcToURL(o):null}function zc(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var zo=Kc;import{useEffect as $c}from"react";function Bc(){let o=mt(),[e]=de(o.deps),t=Q.getText(o.config.evaluatedWords);return $c(()=>o.events.on(Ee.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 Yi,useEffect as $o,useMemo as jc,useRef as qc,useState as Gs}from"react";function Qc(){let o=mt(),[e]=de(o.deps),[t,n]=Gs(!0),[i,r]=Gs(!0),s=qc(null),a=o.config.gameState,c=o.config.action.sentence,l=c?.config.voiceId??null;$o(()=>o.events.on(Ee.Events.onFlush,()=>{e()}).cancel,[o]);let u=jc(()=>{if(!c)return null;try{return pt.getVoice(a,c)}catch{return null}},[a,c,l,c?.config.voice]);$o(()=>{s.current=null,r(!0)},[c]),$o(()=>{let y=!1,v=null,C=null,f=null;if(!u){n(!0);return}n(!1);let g=()=>{y||n(!0)};v=a.audioManager.getToken(u),v&&(v.isPlaying()||n(!0),C=()=>g(),f=()=>g(),v.once("ended",C),v.once("stop",f));let w=a.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{g()});return()=>{y=!0,w.cancel(),v&&C&&v.off("ended",C),v&&f&&v.off("stop",f)}},[a,u]);let d=Yi(async y=>{let v=y??u;if(!v)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let C=v instanceof URL?Se.voice(v.toString()):typeof v=="string"?Se.voice(v):v,f=await a.getLiveGame().playSound(C);s.current=f;let g=()=>{r(!0)};return f.once("ended",g),f.once("stop",g),f},[a,u]),p=Yi(()=>u,[u]),h=Yi(()=>l,[l]),m=Yi(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:d,getVoice:p,getVoiceId:h,getVoiceSrc:m}}import Bo,{createContext as sl,useContext as al,useEffect as Vs,useRef as cl}from"react";import{useState as Xc}from"react";function Zi(o){let[e]=Xc(o);return e}import{AnimatePresence as Jc}from"motion/react";var _i=Jc;import jn,{createContext as tl,useContext as nl,useEffect as il,useRef as ol}from"react";import{useEffect as zn,useLayoutEffect as Yc}from"react";function Zc(){let o=xt(),[e]=de();return zn(()=>o.onChange(e).cancel,[]),o.getPathname()}function _c(){let{router:o,path:e}=Bn(),[t]=de();return zn(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function el(){let o=xt(),[e]=de();return zn(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function eo(o,e){let t=xt();Yc(()=>t.onUpdate(()=>o(t)).cancel,e),zn(()=>{o(t)},[])}function $n(){let o=xt(),[e]=de();return zn(()=>o.onChange(e).cancel,[]),e}var Hs=tl(null);function qn({children:o,path:e,consumedBy:t}){let i={router:xt(),path:e,consumedBy:t};return jn.createElement(Hs,{value:i},o)}function Bn(){let o=nl(Hs);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new I(`Invalid useLayout call: Trying to access layout without a parent.
46
- This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function rl({children:o,name:e,propagate:t}){let n=M(),[i]=de(),{path:r,router:s,consumedBy:a}=Bn(),c=s.joinPath(r,e),l=Zi(()=>s.createToken(c+"@layout")),u=s.getCurrentPath(),d=ol(!1),p=m=>{d.current=m,i()},h=s.matchPath(u,c);if($n(),eo(m=>{let y=m.matchPath(m.getCurrentPath(),c);if(d.current&&!y){if(!o){p(!1);return}m.registerUnmountingPath(l)}y&&m.isPathsUnmounting()&&m.unregisterUnmountingPath(l),y&&!d.current&&!m.isTransitioning()&&p(!0)},[h,o]),il(()=>{if(!h)return;let m=s.mount(c);return()=>{m.cancel()}},[c,s,h]),a)throw new I("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return jn.createElement(qn,{path:c},jn.createElement(_i,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),p(!1)}},h&&d.current&&o))}function Fs({children:o}){return $n(),jn.createElement(qn,{path:jt.rootPath},jn.createElement(Fi,{"data-layout-path":jt.rootPath,key:jt.rootPath},o))}var jo=sl(null);function ll(){return al(jo)}function ul({children:o,name:e}){let[t]=de(),{path:n,router:i,consumedBy:r}=Bn(),s=ll(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,u=Zi(()=>i.createToken(l+"@page")),d=i.getCurrentPath(),p=!a,h=cl(!1),m=f=>{h.current=f,t()},y=p&&i.exactMatch(d,n)||i.exactMatch(d,l);if(r&&r!==c)throw new I("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");$n(),eo(f=>{let g=p&&f.exactMatch(f.getCurrentPath(),n)||f.exactMatch(f.getCurrentPath(),l);if(h.current&&!g){if(!o){m(!1);return}f.registerUnmountingPath(u)}g&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(u),g&&!h.current&&!f.isTransitioning()&&m(!0)},[y,o]),Vs(()=>{if(!y)return;let f=p?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{f.cancel()}},[l,y]),Vs(()=>()=>{i.unregisterUnmountingPath(u),m(!1)},[]);let v=Bo.createElement(qn,{path:n,consumedBy:c},Bo.createElement(_i,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),m(!1)}},y&&h.current&&o));return(f=>s?Bo.createElement(jo,{value:{name:null}},f):f)(v)}import qo,{useCallback as pl,useEffect as Qo,useImperativeHandle as dl,useMemo as Us,useRef as Xo,useState as ml}from"react";var fl=50,hl={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Os={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function gl(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Ks(o,e){return e==null?o:Math.max(o,e)}function yl(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 Ws=qo.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:c,dataAttributes:l,onUpdate:u,children:d},p){let h=Xo(null),[m,y]=ml({...Os,width:"0px",height:"0px"}),v=Xo(u),C=Xo(null);Qo(()=>{v.current=u},[u]);let f=pl(()=>{let T=h.current;if(!T)return;let b=T.clientWidth,x=T.clientHeight;if(b<=0||x<=0||e<=0)return;let E=yl(b,x,e),O=Ks(E.width,n),Z=Ks(E.height,i),ie=C.current;(!ie||ie.width!==O||ie.height!==Z)&&(C.current={width:O,height:Z},y({...Os,width:`${O}px`,height:`${Z}px`}));let Oe=t>0?O/t:1;v.current?.({width:O,height:Z,scale:Oe,containerWidth:b,containerHeight:x})},[e,t,n,i]),g=Us(()=>Or(f,typeof r=="number"?r:fl),[f,r]);Qo(()=>{f()},[f]),Qo(()=>{let T=new ResizeObserver(()=>{g()});h.current&&T.observe(h.current);let b=()=>{g()};return window.addEventListener("resize",b),()=>{T.disconnect(),window.removeEventListener("resize",b)}},[g]),dl(p,()=>({requestUpdate:f}),[f]);let w=Us(()=>gl(l),[l]);return qo.createElement("div",{id:c,ref:h,style:hl,...w},qo.createElement("div",{className:s,style:{...m,...a}},d))}),zs=Ws;function vl(){return M().getLiveGame()}import Zo from"react";import Sl,{createContext as Tl,useContext as bl,useEffect as Cl,useState as $s}from"react";var xl={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Bs=Tl({state:xl,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function wt(){return bl(Bs)}function Jo(){let{dialogs:o}=wt();return o}function Al(){let{isActive:o}=wt();return o}function wl(){let{isVisible:o}=wt();return o}function Yo({children:o}){let t=M().getLiveGame().getGameState(),[n,i]=$s(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=$s(null);Cl(()=>{let c=m=>({...m,dialogs:[...m.dialogs]}),l=t.events.on(L.EventTypes["event:state.nvl.enter"],(m,y)=>{i(c(t.getNvlState())),s(y?.showTransition||null)}),u=t.events.on(L.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState()))}),d=t.events.on(L.EventTypes["event:state.nvl.dialogAppend"],()=>{i(c(t.getNvlState()))}),p=t.events.on(L.EventTypes["event:state.nvl.visibilityChange"],(m,y)=>{i(c(t.getNvlState())),s(y||null)}),h=t.events.on(L.EventTypes["event:state.nvl.change"],m=>{i(c(m))});return()=>{l.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 Sl.createElement(Bs.Provider,{value:a},o)}import{AnimatePresence as kl,motion as El}from"motion/react";import Pl from"clsx";function _o({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=wt(),{ratio:r}=Te(),s=M(),a=i?.duration?i.duration/1e3:.3;return Zo.createElement(kl,null,n&&Zo.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},Zo.createElement(El.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:Pl("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 sn from"react";function er({renderDialogItem:o,dialogs:e}){return sn.createElement(_o,{className:"bg-black/80 text-white p-16 inset-8"},sn.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?sn.createElement(Nt,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=sn.createElement(qt,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return sn.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}):sn.createElement(sn.Fragment,null,r,s))})))}import ot,{useMemo as Dl}from"react";import js from"clsx";function Ll({children:o,className:e,style:t,renderDialogItem:n}){let i=Jo(),{state:r}=wt();return ot.createElement("div",{"data-element-type":"nvl-dialog-list",className:js("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>ot.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},ot.createElement(Il,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?ot.createElement(Nt,{className:"nvl-character-name font-bold mr-2"}):null,texts:ot.createElement(qt,{className:"nvl-dialog-text"})}):o?ot.Children.map(o,c=>ot.isValidElement(c)?ot.cloneElement(c,{entry:s,index:a}):c):ot.createElement(qs,{entry:s,index:a})))))}function qs({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??ot.createElement(qt,{className:"nvl-dialog-text"});return ot.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:js("nvl-dialog-item",t),style:n},r&&ot.createElement(Nt,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function Il({entry:o,children:e}){let n=M().getLiveGame().getGameState(),i=Dl(()=>o.sentence.evaluate(Ae.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=Wi({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return ot.createElement(on,{value:c},e)}function Xs({state:o}){let e=M(),t=xt(),n=tr(null),i=tr(null),r=tr(!1),[s]=dt(ne.Preferences.skipDelay),[a]=dt(ne.Preferences.skipInterval),[c]=rn("skipAction");return Ml(()=>{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 u=()=>{i.current&&(clearTimeout(i.current),i.current=null),n.current&&(clearInterval(n.current),n.current=null),r.current=!1},d=h=>{if(e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(ne.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let m=()=>{n.current=setInterval(()=>{o.events.emit(L.EventTypes["event:state.player.skip"],!1)},a)};u(),o.events.emit(L.EventTypes["event:state.player.skip"],!1),r.current=!0,s===0?m():i.current=setTimeout(m,s)}},p=h=>{e.keyMap.match("skipAction",h.key)&&u()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",d).cancel,m=e.getLiveGame().onWindowEvent("keyup",p).cancel;return()=>{u(),h(),m()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",d).cancel,m=e.getLiveGame().onPlayerEvent("keyup",p).cancel;return()=>{u(),h(),m()}}},[t,s,a,c]),Qs.createElement(Qs.Fragment,null)}import Js,{useEffect as Nl}from"react";function Gl(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Ys=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],Hl=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]'];function Fl(o,e){return!o||e&&Ys.some(t=>!!o.closest(t))?!1:[...Hl,...Ys].some(t=>!!o.closest(t))}function Zs(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 _s({state:o}){let e=M();return Nl(()=>{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)||!Zs(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!Zs(i,s))||Gl(r)||Fl(r,o.isNvlMode())||(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]),Js.createElement(Js.Fragment,null)}import{useEffect as Qn}from"react";function nr({gameState:o}){let e=o.audioManager,[t]=dt("voiceVolume"),[n]=dt("bgmVolume"),[i]=dt("soundVolume"),[r,s]=dt("globalVolume");return Qn(()=>{s(e.getGlobalVolume())},[]),Qn(()=>{e.setGroupVolume("voice",t)},[t]),Qn(()=>{e.setGroupVolume("bgm",n)},[n]),Qn(()=>{e.setGroupVolume("sound",i)},[i]),Qn(()=>{e.setGlobalVolume(r)},[r]),null}import{useEffect as no,useRef as Ol}from"react";import ir,{createContext as Vl,useContext as Ul,useState as ea}from"react";var an=class an{constructor(){this.preloaded=[];this.events=new X}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(an.EventTypes["event:preloaded.add"],e),this.events.emit(an.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(an.EventTypes["event:preloaded.remove"],e),this.events.emit(an.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return ke.getSrc(e)}};an.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 Ve=an;var to=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.src.clear(),this.decoded.clear()})}static getImage(e,t,n){return Wr(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}has(e){return this.src.has(e)}add(e,t){return this.src.set(e,t),this}remove(e){return 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.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,c=[],u={promise:o.getImage(i,a,r).then(async p=>{if(this.preloadTasks.delete(t),p){this.add(t,p);let h=await o.decodeImage(p);h&&n?.retainDecoded&&this.src.get(t)===p&&this.decoded.set(t,h)}}).catch(p=>{this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${p}`),c.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=>(c.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.src.delete(n),this.decoded.delete(n));for(let n of this.decoded.keys())t.has(n)||this.decoded.delete(n);return this}};var or=Vl(null);function ta({children:o}){let e=M(),[t]=ea(()=>new Ve),[n]=ea(()=>new to(e));return ir.createElement(ir.Fragment,null,ir.createElement(or,{value:{preloaded:t,cacheManager:n}},o))}function An(){if(!or)throw new Error("usePreloaded must be used within a PreloadedProvider");return Ul(or)}function na(o){let e=ke.catSrc(o.srcManager?.src||[]),t=ke.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=new Set;for(let s of e.image){let a=ke.getSrc(s);!a||r.has(a)||(r.add(a),n.push(a))}for(let s of t.image){let a=ke.getSrc(s);!a||r.has(a)||(r.add(a),i.push(a))}return{critical:n,lookAhead:i,all:[...n,...i],criticalAudio:e.audio}}function ia({state:o}){let{preloaded:e,cacheManager:t}=An(),n=M(),i=Ol(new Set),[r]=de(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),c=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,l=n.getLiveGame().story;function u(){o.logger.debug(s,"Preload unmounted"),e.events.emit(Ve.EventTypes["event:preloaded.unmount"])}return no(()=>o.events.on(L.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),no(()=>{if(typeof fetch>"u")return e.events.emit(Ve.EventTypes["event:preloaded.complete"]),e.events.emit(Ve.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(Ve.EventTypes["event:preloaded.complete"]),e.events.emit(Ve.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")),!l||!a)return l?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=na(a),h=new un(n.config.preloadConcurrency,0),m=new un(n.config.preloadConcurrency,n.config.preloadDelay),y=o.logger.group(s,!0),v=!1;o.logger.debug(s,"preloading:",p,a);let C=(f,g,w,T)=>{g.forEach((b,x)=>{if(t.has(b)||t.isPreloading(b)){o.logger.debug(s,`Image already loaded (${w} ${x+1}/${g.length})`,b);return}f.addTask(()=>new Promise(E=>{t.preload(o,b,{retainDecoded:T}).onFinished(()=>{o.logger.debug(s,`Image loaded (${w} ${x+1}/${g.length})`,b),E()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${w} ${x+1}/${g.length})`,b),E()})}))})};C(h,p.critical,"first scene",!0),C(m,p.lookAhead,"look-ahead",!1);for(let f of p.criticalAudio)o.audioManager.preload(f);return y.end(),h.start().then(async()=>{o.logger.info(s,"Image preload (first scene)",`loaded ${t.size()} images in ${performance.now()-d}ms`),e.events.emit(Ve.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(Ve.EventTypes["event:preloaded.ready"]),!v&&(await m.start(),!v&&(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(Ve.EventTypes["event:preloaded.ready"]),e.events.emit(Ve.EventTypes["event:preloaded.mount"]),()=>{v=!0,u()}},[a,l]),no(()=>{i.current.clear()},[a]),no(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!l){o.logger.weakWarn(s,"Story not found, skipping preload");return}let d=performance.now(),p=n.getLiveGame().getAllPredictableActions(l,c,n.config.maxPreloadActions).map(f=>ke.getPreloadableSrc(l,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 m=ke.catSrc([...i.current,...p]),y=new un(n.config.preloadConcurrency,n.config.preloadDelay),v=[],C=o.logger.group(s);o.logger.debug(s,"preloading:",m);for(let f of m.image){let g=ke.getSrc(f);if(g){if(v.push(g),t.has(g)||t.isPreloading(g)){o.logger.debug(s,`Image already loaded (${m.image.indexOf(f)+1}/${m.image.length})`,g);continue}y.addTask(()=>new Promise(w=>{t.preload(o,g).onFinished(()=>{o.logger.debug(s,`Image loaded (${m.image.indexOf(f)+1}/${m.image.length})`,g),w()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${m.image.indexOf(f)+1}/${m.image.length})`,g),w()})}))}}C.end(),y.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-d}ms`),t.filter(v)})},[c,l]),null}import ao from"react";import io from"react";import rr,{useEffect as sr,useLayoutEffect as ar,useRef as cr,useState as lr}from"react";function Qt({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c}){let[l,u]=lr(null),[d,p]=lr(null),h=rr.useRef(null),[m]=lr(()=>new ci("displayable.refGroup")),y=cr(m.next()),v=cr(je()),f=M().getLiveGame().getGameState(),g=typeof a=="function"?a(l):a,[w]=de([d,l,v]);sr(()=>f.events.depends([f.events.on(L.EventTypes["event:state.player.skip"],rt)]).cancel,[d,l,v]),ar(()=>{if(x(),!l)return;if(v.current.some(([me])=>!me.current))throw new I("Displayable: Trying to access transition groups before they are mounted");let{controller:K,task:se}=l,te=me=>{v.current.forEach(([ye],ce)=>{let $e=se.resolve[ce],k=typeof $e=="function"?$e:$e.resolver;if(!k)throw new I(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${ce}])`);let H=k(...me),fe=W(g[ce]||g[g.length-1]||{},H);O(ye,c?c(fe):fe)})},ae=K.onUpdate(te);te(se.animations.map(me=>me.start));let F=!1;return Promise.all(v.current.map(([me])=>{let ye=me.current;return ye?.waitForLoad?ye.waitForLoad():Promise.resolve()})).then(()=>{F||K.start()}),()=>{F=!0,ae.cancel()}},[l]),sr(()=>{if(!h.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),ar(()=>{let K=e.toStyle(f,i);Object.assign(h.current.style,K),f.logger.debug("Displayable","Initial style applied",h.current,K)},[]);let T=cr(()=>{});T.current=()=>{d||l||!h.current||(Object.assign(h.current.style,e.toStyle(f,i)),x())},ar(()=>{T.current()});let{ratio:b}=Te();sr(()=>b.onUpdate(()=>{T.current(),requestAnimationFrame(()=>T.current())}),[b]);function x(){let K=typeof a=="function"?a(l):a;if(!v.current||!v.current.length)throw new I("Displayable: Transition group refs are not initialized correctly");v.current.some(([se])=>!se.current)||v.current.forEach(([se],te)=>{O(se,K[te]||K[K.length-1]||{})})}function E(K){f.logger.debug("Displayable","Transform applied",e.toStyle(f,i),h.current),w(),r?.(K)}function O(K,se){if(!K.current)throw new I("Displayable: Trying to assign properties to unmounted element");let te=K.current,ae={},F={};Object.keys(se).forEach(ye=>{let ce=ye;ce==="style"&&se.style?Object.assign(ae,se.style):se[ce]!==void 0&&ce!=="key"&&(F[ce]=se[ce])}),Object.keys(ae).length>0&&Object.assign(te.style,ae);let me=c?c(F):F;for(let[ye,ce]of Object.entries(me))te.getAttribute(ye)!==ce&&te.setAttribute(ye,ce)}function Z(K,se){d&&(d.abort(),p(null));let te=K.animate(e,{gameState:f,ref:h,overwrites:i}),ae=new Pe(te);return f.timelines.attachTimeline(ae),te.onSkipControllerRegister(F=>{F.onAbort(()=>{ae.abort(),p(null)})}),p(te),te.then(()=>{p(null),E(K),se()}),ae}function ie(K,se){l&&l.controller.complete();let te=K.createTask(f),ae=K.requestAnimations(te.animations),F=new S().registerSkipController(new V(ae.cancel)),me=new Pe(F);F.skipController.onAbort(()=>{ae.cancel()}),ae.onCanceled(()=>{me.abort(),u(null),f.logger.debug("Displayable","Transition cancelled",K)}),ae.onComplete(()=>{be(),u(null),s?.(K),se(),F.resolve()}),f.timelines.attachTimeline(me),u({task:te,controller:ae,transition:K,resolve:se});let ye;if(v.current=te.resolve.map(ce=>{let $e=rr.createRef(),k=typeof ce=="function"?void 0:ce.key;if(!k)return[$e,m.next()];if(k==="target")return ye=m.next(),[$e,ye];if(k==="current")return[$e,y.current];throw new I("Displayable: Invalid key type")}),!ye)throw new I("Displayable: No target key found");return y.current=ye,me}function Oe(K){return f.logger.debug("initDisplayable",o),Z(J.immediate(e.get()),K)}function rt(){t&&d&&(d.abort(),p(null),f.logger.debug("transform skipped")),n&&l&&(l.controller.complete(),f.logger.debug("transition skipped"))}function je(){return[[rr.createRef(),y.current]]}function be(){v.current.forEach(([K])=>{K.current=null}),v.current=je()}return{transformRef:h,transitionRefs:v.current,transitionTask:l,initDisplayable:Oe,applyTransform:Z,applyTransition:ie,updateStyleSync:x,flush:w,deps:[d,l,v]}}import{useEffect as Kl}from"react";function kt(o,e,t=[]){let i=M().getLiveGame().getGameState();return Kl(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function ur({state:o,text:e}){let{ratio:t}=Te(),[n]=de(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyTransition:c,updateStyleSync:l,deps:u}=Qt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:d=>({width:"fit-content",transform:J.propToCSSTransform(o,d,{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 kt(e,{initDisplayable:s,applyTransform:a,applyTransition:c,flush:n,updateStyleSync:l},[...u]),io.createElement(nn.Div,{"data-element-type":"text"},io.createElement(nn.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([d,p])=>io.createElement("span",{key:p,ref:d,className:e.config.className},io.createElement("span",null,e.state.text)))))}import ht,{forwardRef as zl,useCallback as ra,useImperativeHandle as $l,useRef as so,useState as sa}from"react";import oo,{useEffect as pr,useRef as wn,forwardRef as Wl}from"react";var oa=Wl(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=wn(null),{ratio:a}=Te(),[c,l]=oo.useState(0),[u,d]=oo.useState(0),p=wn(null),h=wn(null),m=M(),y=wn(!1),v=wn(null),C=wn(null);oo.useImperativeHandle(r,()=>s.current,[]),pr(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>y.current,configurable:!0},waitForLoad:{value:()=>{let T=()=>{let b=s.current;return!b||typeof b.decode!="function"?Promise.resolve():b.decode().catch(()=>{})};return y.current?T():(v.current||(v.current=new Promise(b=>{C.current=b})),v.current.then(T))},configurable:!0}})},[]),pr(()=>(f(),a.onUpdate(f)),[o]),pr(()=>{let T=new MutationObserver(b=>{b.forEach(x=>{x.type==="attributes"&&x.attributeName==="src"&&s.current&&f()})});return s.current&&T.observe(s.current,{attributes:!0}),()=>{T.disconnect()}},[o]);function f(){if(s.current&&s.current.naturalWidth){let T,b,x;if(s.current.naturalWidth*s.current.naturalHeight===1)T=a.state.width,b=a.state.height,x=`${T} / ${b}`;else{let ie=t?m.config.width/s.current.naturalWidth:1;T=s.current.naturalWidth*a.state.scale*ie,b=s.current.naturalHeight*a.state.scale*ie,x="auto"}let E=p.current,O=!E||E.w!==T||E.h!==b||E.ar!==x,Z=!!o&&h.current!==o;if(!O&&!Z)return;O&&(p.current={w:T,h:b,ar:x},l(T),d(b),s.current.style.aspectRatio=x),o&&(h.current=o,o(T,b))}}function g(){f(),y.current=!0,C.current&&(C.current(),C.current=null,v.current=null),e&&e()}function w(){y.current=!0,C.current&&(C.current(),C.current=null,v.current=null)}return oo.createElement("img",{ref:s,onLoad:g,onError:w,width:c,height:u,alt:"",src:n,style:i})});oa.displayName="AspectScaleImage";var ro=oa;import aa from"clsx";import{motion as Bl}from"motion/react";var jl={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},ca=zl(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=so(null),a=so([]),c=o.findIndex(l=>l!==null);return $l(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(l=>!l?.isLoaded||l.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(l=>l?.waitForLoad?l.waitForLoad():Promise.resolve())).then(()=>{})}),[]),ht.createElement("div",{ref:s},o.map((l,u)=>l===null?null:ht.createElement(ro,{key:"layer-"+u,ref:d=>{a.current[u]=d},src:t(l),style:jl,autoFit:e,onSizeChanged:u===c?n:void 0,onLoad:u===c?i:void 0})))});ca.displayName="LayerStack";function ql(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 Ql(o){return R.isStaticSrc(o)?o.state.currentSrc:R.getSrcURL(o)??void 0}var Xl={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Jl({image:o,state:e}){let[t]=sa(()=>new X),[n,i]=sa([]),{cacheManager:r}=An(),s=so([]),a=so(null),c=R.isLayeredSrc(o)?R.getSrcURLs(o):null;function l(T){return!D.isDataURI(T)&&!r.has(T)&&!r.isPreloading(T)&&!s.current.includes(T)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${T}".
40
+ `&&n.tag===e.tag?[...t.slice(0,-1),{...e,text:n.text+e.text,config:e.config}]:[...t,e]})}function Dc(o,e,t){return t||(o!==void 0?ve.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new Q(n.text,n.config)):[])}function Lc(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 Ps(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Bi(o){return o===void 0?void 0:dn(o)}function Oo({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,...c}){let l=M(),u=l.getLiveGame().getGameState(),d=Ds(null),[p,h]=Fo(()=>n&&!n.config.useTypeEffect?Vo(n.config.evaluatedWords):[]),[m,y]=de();if(!n)throw new Error("Dialog state is required");An(()=>{if(!(!n.config.action.sentence||d.current))return u.logger.info("Initializing the sentence",n,d.current),u.schedule(({onCleanup:b})=>{if(!n.config.useTypeEffect){Es(n.config.evaluatedWords,n.config.firedTextEvents??new Set,u),n.dispatchComplete();return}h([]),d.current=v(),m(),d.current.onComplete(()=>{n.dispatchComplete()}),b(()=>{d.current?.timeline?.abort()})},0)},[]),An(()=>n.events.depends([n.events.on(Ee.Events.requestComplete,()=>{d.current?.interact()}),n.events.on(Ee.Events.forceSkip,()=>{n.isEnded()||d.current?.forceSkip()})]).cancel,[n,y]),An(()=>l.preference.events.depends([l.preference.onPreferenceChange(ne.Preferences.gameSpeed,()=>{d.current?.update()}),l.preference.onPreferenceChange(ne.Preferences.autoForward,()=>{d.current?.update()}),l.preference.onPreferenceChange(ne.Preferences.cps,()=>{d.current?.update()})]).cancel,[]);function v(){let b=new S,x=new Pe(b).setGuard(u.guard),P=new Set,O=n.config.firedTextEvents??new Set,Z=new Set,ie=new Set,Oe=Uo(n.config.evaluatedWords),st=null,je=[],be=[],K=()=>{je.forEach(E=>E()),je.length=0},se=()=>{if(be.length!==0)return{done:!1,value:be.shift()};let{done:E,value:H}=Oe.next();return{done:E,value:H}},te=E=>{let H=fe=>{E(fe),Z.delete(H)};return Z.add(H),{cancel:()=>{Z.delete(H)}}},ae=E=>{Ls(h,E)},F=(E=!1)=>{let H=!1;for(;!H;){let{done:fe,value:D}=se();if(fe){H=!0;break}if(Re.isPause(D)){if(E)continue;H=!0,be.push(D);break}else Ye.isTextEvent(D)?zi(D,O,u):D===`
41
+ `?h(he=>[...he,D]):typeof D=="object"&&"text"in D&&!P.has(D)&&(P.add(D),ae(D))}st&&!st.isSettled()?st.abort():(ie.forEach(fe=>fe()),b.resolve())};return u.schedule(async E=>{let H=!1,fe=!1;for(;!H;){let{done:D,value:he}=se();if(D){H=fe=!0;break}if(Ye.isTextEvent(he)){zi(he,O,u);continue}let Lt=new S;if(u.timelines.attachTimeline(Lt),Lt.registerSkipController(new V(()=>{K(),H=!0,E.retry()})),Lt.onSettled(()=>{K()}),st=Lt,Re.isPause(he)){let ni=Re.from(he),ii=l.preference.getPreference(ne.Preferences.gameSpeed);if(ni.config.duration){let oi=ni.config.duration/ii;await mi(oi)}else{let oi=l.preference.getPreference(ne.Preferences.autoForward),ri=S.race([S.create(Fa=>{let Va=te(Ua=>{Ua(),Fa.resolve()});je.push(()=>Va.cancel())}),...oi?[S.delay(l.config.autoForwardDefaultPause/ii)]:[]]);u.timelines.attachTimeline(ri),await S.wait(ri)}}else{if(he!==`
42
+ `&&P.has(he))continue;P.add(he),ae(he);let{gameSpeed:ni,cps:ii}=l.preference.getPreferences(),ri=1e3/((typeof he=="object"&&"cps"in he&&he.cps!==void 0?he.cps:ii)*ni);await mi(ri)}}fe&&(ie.forEach(D=>D()),b.resolve())},0),{getToken:()=>b,interact:()=>{let E=!1;Z.forEach(H=>H(()=>E=!0)),!E&&F()},update:()=>{st&&st.abort()},forceSkip:()=>{F(!0)},timeline:x,onComplete:E=>(ie.add(E),{cancel:()=>{ie.delete(E)}})}}let C=n.config.action.sentence;if(!C)return null;let f=s??"bold",g={fontWeight:C.config.bold?f:r,fontSize:C.config.fontSize??i,color:Bi(C.config.color??o),fontFamily:C.config.fontFamily??a,fontStyle:C.config.italic?"italic":void 0},w=b=>({fontWeight:b.config.bold||C.config.bold?f:r,fontSize:b.config.fontSize??C.config.fontSize??i,color:Bi(b.config.color??C.config.color??o),fontFamily:b.config.fontFamily??C.config.fontFamily??a,fontStyle:b.config.italic??C.config.italic?"italic":void 0}),T=(b,x)=>b===`
43
+ `?Fe.createElement("br",{key:x}):Fe.createElement(rn.Span,{tag:`say.word.${x}`,key:x,style:{...w(b),...fi(l.config.app.debug,{outline:"1px dashed red"})},className:$i("inline-block break-all",b.config.className)},b.config.ruby?Fe.createElement("ruby",{className:"align-bottom inline-block"},Fe.createElement("rt",{className:"block text-center"},b.config.ruby),b.text):b.text);return Fe.createElement("div",{...c,className:$i("whitespace-pre-wrap",e),style:{...g,...t}},p.map(T))}function Ic({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:c,defaultColor:l,className:u,style:d,fontSize:p,fontWeight:h,fontWeightBold:m,fontFamily:y,onCompleted:v,...C}){let f=fs(),[,g]=Fo(0),w=f?.config??ne.DefaultConfig,T=f?.preference.getPreferences()??ne.DefaultPreference,b=s??T.cps,x=a??T.gameSpeed,P=c??w.autoForwardDefaultPause,O=r??w.autoForwardDefaultPause,Z=Fe.useMemo(()=>Dc(o,e,t),[o,e,t]),ie=Fe.useMemo(()=>Lc(i,r,O),[i,r,O]),Oe=Ds(v),[st,je]=Fo(()=>n?[]:Vo(Z));An(()=>{if(f)return f.preference.onPreferenceChange(()=>{g(F=>F+1)}).cancel},[f]),An(()=>{Oe.current=v},[v]),An(()=>{let F=!1,me=[],ye=Math.max(.01,x),ce=H=>new Promise(fe=>{let D=setTimeout(fe,Math.max(0,H));me.push(D)}),$e=()=>{F||Oe.current?.()};return n?Z.length===0?(je([]),()=>{F=!0}):((async()=>{do{let H=Uo(Z);for(je([]);!F;){let{done:fe,value:D}=H.next();if(fe)break;if(Re.isPause(D)){let he=Re.from(D);await ce((he.config.duration??P)/ye)}else{if(Ye.isTextEvent(D))continue;Ls(je,D),D===`
44
+ `?await ce(Ps(b,x)):await ce(Ps(D.cps??b,x))}}if(F)return;$e(),ie.enabled&&await ce(ie.delay)}while(!F&&ie.enabled)})(),()=>{F=!0,me.forEach(H=>clearTimeout(H))}):(je(Vo(Z)),$e(),()=>{F=!0})},[Z,n,ie,b,x,P]);let be=e?.config,K=m??"bold",se={fontWeight:be?.bold?K:h,fontSize:be?.fontSize??p,color:Bi(be?.color??l),fontFamily:be?.fontFamily??y,fontStyle:be?.italic?"italic":void 0},te=F=>({fontWeight:F.config.bold||be?.bold?K:h,fontSize:F.config.fontSize??be?.fontSize??p,color:Bi(F.config.color??be?.color??l),fontFamily:F.config.fontFamily??be?.fontFamily??y,fontStyle:F.config.italic??be?.italic?"italic":void 0}),ae=(F,me)=>F===`
45
+ `?Fe.createElement("br",{key:me}):Fe.createElement("span",{key:me,style:te(F),className:$i("inline-block break-all",F.config.className)},F.config.ruby?Fe.createElement("ruby",{className:"align-bottom inline-block"},Fe.createElement("rt",{className:"block text-center"},F.config.ruby),F.text):F.text);return Fe.createElement("div",{...C,className:$i("whitespace-pre-wrap",u),style:{...se,...d}},st.map(ae))}function Is(o){return Fe.createElement(Oo,{...o,key:o.dialog?.config.action.id})}function Rc({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Wi({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Fe.createElement(Oo,{...r,dialog:s,key:s.config.action.id})}function Mc(o){let e=mt();return Fe.createElement(Oo,{...o,dialog:e,key:e.config.action.id})}function Qt(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Fe.createElement(Rc,{...o}):Fe.createElement(Mc,{...o})}var Nc=Qt;import qi,{useEffect as Gc,useLayoutEffect as Hc,useMemo as Ms,useRef as Fc,useState as Vc}from"react";import ji from"react";var Ko=ji.createContext(null);function Wo(){let o=ji.useContext(Ko);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var zo=ji.createContext(null);function Rs(){let o=ji.useContext(zo);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Qi({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let c=Fc(null),{register:l,unregister:u,getIndex:d}=Rs(),[p,h]=Vc(-1),{choose:m,evaluated:y,gameState:v}=Wo(),C=p===-1?null:y[p],f=Ms(()=>Ae.getCtx({gameState:v}),[v]),{hidden:g,disabled:w}=Ms(()=>{if(!C)return{hidden:!1,disabled:!1};let x=C.config.hidden?.evaluate(f)?.value??!1,P=!x&&(C.config.disabled?.evaluate(f)?.value??!1);return{hidden:x,disabled:P}},[C,f]);Hc(()=>{if(!c.current)return;let x=c;l(x);let P=d(x);return h(P),c.current.dataset.index=P.toString(),()=>u(x)},[l,u,d]),Gc(()=>{if(!t)return;let x=P=>{P.key.toLowerCase()===t.toLowerCase()&&!P.ctrlKey&&!P.metaKey&&(P.preventDefault(),P.stopPropagation(),T())};return window.addEventListener("keydown",x,!0),()=>{window.removeEventListener("keydown",x,!0)}},[t]);function T(){if(p===-1||!y[p]||g||w)return;let x=y[p];m({...x,evaluated:Q.getText(x.words||[])})}let b=C&&!g;return qi.createElement(qi.Fragment,null,qi.createElement("button",{className:o,style:{...e,display:b?e?.display??void 0:"none"},onClick:T,ref:c,disabled:w},b&&qi.createElement(Is,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Ee({useTypeEffect:!1,action:{sentence:C.prompt,words:C.words,character:null},gameState:v,evaluatedWords:C.words})})))}import Xi from"react";import{AnimatePresence as Uc}from"motion/react";function Ji({children:o,...e}){let t=Uc;return Xi.createElement(Xi.Fragment,null,Xi.createElement("div",{...e},Xi.createElement(t,null,o)))}import Ns from"react";function Nt({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Ns.useContext(sn),c=e??o?.character??a?.config.action.character??null,l=n??c?.config.color,u=i??t??c?.state.name;return Ns.createElement("div",{...s,style:{color:l?dn(l):void 0,...r}},u)}import Wc from"clsx";import zc from"react";import $o,{createContext as Oc,useContext as Kc,useState as Gs}from"react";var cn=class cn{constructor(){this.preloaded=[];this.events=new X}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(cn.EventTypes["event:preloaded.add"],e),this.events.emit(cn.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(cn.EventTypes["event:preloaded.remove"],e),this.events.emit(cn.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return ke.getSrc(e)}};cn.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 Ve=cn;var Yi=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.src.clear(),this.decoded.clear()})}static getImage(e,t,n){return zr(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}has(e){return this.src.has(e)}add(e,t){return this.src.set(e,t),this}remove(e){return 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.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,c=[],u={promise:o.getImage(i,a,r).then(async p=>{if(this.preloadTasks.delete(t),p){this.add(t,p);let h=await o.decodeImage(p);h&&n?.retainDecoded&&this.src.get(t)===p&&this.decoded.set(t,h)}}).catch(p=>{this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${p}`),c.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=>(c.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.src.delete(n),this.decoded.delete(n));for(let n of this.decoded.keys())t.has(n)||this.decoded.delete(n);return this}};var Bo=Oc(null);function Hs({children:o}){let e=M(),[t]=Gs(()=>new Ve),[n]=Gs(()=>new Yi(e));return $o.createElement($o.Fragment,null,$o.createElement(Bo,{value:{preloaded:t,cacheManager:n}},o))}function Xt(){if(!Bo)throw new Error("usePreloaded must be used within a PreloadedProvider");return Kc(Bo)}function Fs(){let o=mt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return jc(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?R.getSrcURL(s):null,c=s&&R.isTagSrc(s)?[...s.state.currentSrc]:null,l=is({character:n,sentence:i,portrait:s,currentSrc:a,tags:c,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=Bc(l.source);return{visible:!!u,src:u,character:l.character,portrait:l.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function $c({className:o,style:e,alt:t,...n}){let i=Fs(),{cacheManager:r}=Xt();if(!i.visible||!i.src)return null;let s=r.get(i.src)||i.src;return zc.createElement("img",{...n,"data-element-type":"dialog-avatar",className:Wc("dialog-avatar",o),src:s,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function Bc(o){return o?k.srcToURL(o):null}function jc(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var jo=$c;import{useEffect as qc}from"react";function Qc(){let o=mt(),[e]=de(o.deps),t=Q.getText(o.config.evaluatedWords);return qc(()=>o.events.on(Ee.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 Zi,useEffect as qo,useMemo as Xc,useRef as Jc,useState as Vs}from"react";function Yc(){let o=mt(),[e]=de(o.deps),[t,n]=Vs(!0),[i,r]=Vs(!0),s=Jc(null),a=o.config.gameState,c=o.config.action.sentence,l=c?.config.voiceId??null;qo(()=>o.events.on(Ee.Events.onFlush,()=>{e()}).cancel,[o]);let u=Xc(()=>{if(!c)return null;try{return it.getVoice(a,c)}catch{return null}},[a,c,l,c?.config.voice]);qo(()=>{s.current=null,r(!0)},[c]),qo(()=>{let y=!1,v=null,C=null,f=null;if(!u){n(!0);return}n(!1);let g=()=>{y||n(!0)};v=a.audioManager.getToken(u),v&&(v.isPlaying()||n(!0),C=()=>g(),f=()=>g(),v.once("ended",C),v.once("stop",f));let w=a.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{g()});return()=>{y=!0,w.cancel(),v&&C&&v.off("ended",C),v&&f&&v.off("stop",f)}},[a,u]);let d=Zi(async y=>{let v=y??u;if(!v)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let C=v instanceof URL?Se.voice(v.toString()):typeof v=="string"?Se.voice(v):v,f=await a.getLiveGame().playSound(C);s.current=f;let g=()=>{r(!0)};return f.once("ended",g),f.once("stop",g),f},[a,u]),p=Zi(()=>u,[u]),h=Zi(()=>l,[l]),m=Zi(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:d,getVoice:p,getVoiceId:h,getVoiceSrc:m}}import Qo,{createContext as ll,useContext as ul,useEffect as Ks,useRef as pl}from"react";import{useState as Zc}from"react";function _i(o){let[e]=Zc(o);return e}import{AnimatePresence as _c}from"motion/react";var eo=_c;import jn,{createContext as ol,useContext as rl,useEffect as sl,useRef as al}from"react";import{useEffect as zn,useLayoutEffect as el}from"react";function tl(){let o=xt(),[e]=de();return zn(()=>o.onChange(e).cancel,[]),o.getPathname()}function nl(){let{router:o,path:e}=Bn(),[t]=de();return zn(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function il(){let o=xt(),[e]=de();return zn(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function to(o,e){let t=xt();el(()=>t.onUpdate(()=>o(t)).cancel,e),zn(()=>{o(t)},[])}function $n(){let o=xt(),[e]=de();return zn(()=>o.onChange(e).cancel,[]),e}var Us=ol(null);function qn({children:o,path:e,consumedBy:t}){let i={router:xt(),path:e,consumedBy:t};return jn.createElement(Us,{value:i},o)}function Bn(){let o=rl(Us);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new I(`Invalid useLayout call: Trying to access layout without a parent.
46
+ This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function cl({children:o,name:e,propagate:t}){let n=M(),[i]=de(),{path:r,router:s,consumedBy:a}=Bn(),c=s.joinPath(r,e),l=_i(()=>s.createToken(c+"@layout")),u=s.getCurrentPath(),d=al(!1),p=m=>{d.current=m,i()},h=s.matchPath(u,c);if($n(),to(m=>{let y=m.matchPath(m.getCurrentPath(),c);if(d.current&&!y){if(!o){p(!1);return}m.registerUnmountingPath(l)}y&&m.isPathsUnmounting()&&m.unregisterUnmountingPath(l),y&&!d.current&&!m.isTransitioning()&&p(!0)},[h,o]),sl(()=>{if(!h)return;let m=s.mount(c);return()=>{m.cancel()}},[c,s,h]),a)throw new I("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return jn.createElement(qn,{path:c},jn.createElement(eo,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),p(!1)}},h&&d.current&&o))}function Os({children:o}){return $n(),jn.createElement(qn,{path:qt.rootPath},jn.createElement(Fi,{"data-layout-path":qt.rootPath,key:qt.rootPath},o))}var Xo=ll(null);function dl(){return ul(Xo)}function ml({children:o,name:e}){let[t]=de(),{path:n,router:i,consumedBy:r}=Bn(),s=dl(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,u=_i(()=>i.createToken(l+"@page")),d=i.getCurrentPath(),p=!a,h=pl(!1),m=f=>{h.current=f,t()},y=p&&i.exactMatch(d,n)||i.exactMatch(d,l);if(r&&r!==c)throw new I("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");$n(),to(f=>{let g=p&&f.exactMatch(f.getCurrentPath(),n)||f.exactMatch(f.getCurrentPath(),l);if(h.current&&!g){if(!o){m(!1);return}f.registerUnmountingPath(u)}g&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(u),g&&!h.current&&!f.isTransitioning()&&m(!0)},[y,o]),Ks(()=>{if(!y)return;let f=p?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{f.cancel()}},[l,y]),Ks(()=>()=>{i.unregisterUnmountingPath(u),m(!1)},[]);let v=Qo.createElement(qn,{path:n,consumedBy:c},Qo.createElement(eo,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),m(!1)}},y&&h.current&&o));return(f=>s?Qo.createElement(Xo,{value:{name:null}},f):f)(v)}import Jo,{useCallback as fl,useEffect as Yo,useImperativeHandle as hl,useMemo as Ws,useRef as Zo,useState as gl}from"react";var yl=50,vl={position:"relative",width:"100%",height:"100%",overflow:"hidden"},zs={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function Sl(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function $s(o,e){return e==null?o:Math.max(o,e)}function Tl(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 Bs=Jo.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:c,dataAttributes:l,onUpdate:u,children:d},p){let h=Zo(null),[m,y]=gl({...zs,width:"0px",height:"0px"}),v=Zo(u),C=Zo(null);Yo(()=>{v.current=u},[u]);let f=fl(()=>{let T=h.current;if(!T)return;let b=T.clientWidth,x=T.clientHeight;if(b<=0||x<=0||e<=0)return;let P=Tl(b,x,e),O=$s(P.width,n),Z=$s(P.height,i),ie=C.current;(!ie||ie.width!==O||ie.height!==Z)&&(C.current={width:O,height:Z},y({...zs,width:`${O}px`,height:`${Z}px`}));let Oe=t>0?O/t:1;v.current?.({width:O,height:Z,scale:Oe,containerWidth:b,containerHeight:x})},[e,t,n,i]),g=Ws(()=>Kr(f,typeof r=="number"?r:yl),[f,r]);Yo(()=>{f()},[f]),Yo(()=>{let T=new ResizeObserver(()=>{g()});h.current&&T.observe(h.current);let b=()=>{g()};return window.addEventListener("resize",b),()=>{T.disconnect(),window.removeEventListener("resize",b)}},[g]),hl(p,()=>({requestUpdate:f}),[f]);let w=Ws(()=>Sl(l),[l]);return Jo.createElement("div",{id:c,ref:h,style:vl,...w},Jo.createElement("div",{className:s,style:{...m,...a}},d))}),js=Bs;function bl(){return M().getLiveGame()}import tr from"react";import Cl,{createContext as xl,useContext as Al,useEffect as wl,useState as qs}from"react";var kl={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Qs=xl({state:kl,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function wt(){return Al(Qs)}function _o(){let{dialogs:o}=wt();return o}function El(){let{isActive:o}=wt();return o}function Pl(){let{isVisible:o}=wt();return o}function er({children:o}){let t=M().getLiveGame().getGameState(),[n,i]=qs(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=qs(null);wl(()=>{let c=m=>({...m,dialogs:[...m.dialogs]}),l=t.events.on(L.EventTypes["event:state.nvl.enter"],(m,y)=>{i(c(t.getNvlState())),s(y?.showTransition||null)}),u=t.events.on(L.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState()))}),d=t.events.on(L.EventTypes["event:state.nvl.dialogAppend"],()=>{i(c(t.getNvlState()))}),p=t.events.on(L.EventTypes["event:state.nvl.visibilityChange"],(m,y)=>{i(c(t.getNvlState())),s(y||null)}),h=t.events.on(L.EventTypes["event:state.nvl.change"],m=>{i(c(m))});return()=>{l.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 Cl.createElement(Qs.Provider,{value:a},o)}import{AnimatePresence as Dl,motion as Ll}from"motion/react";import Il from"clsx";function nr({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=wt(),{ratio:r}=Te(),s=M(),a=i?.duration?i.duration/1e3:.3;return tr.createElement(Dl,null,n&&tr.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},tr.createElement(Ll.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:Il("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 ln from"react";function ir({renderDialogItem:o,dialogs:e}){return ln.createElement(nr,{className:"bg-black/80 text-white p-16 inset-8"},ln.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?ln.createElement(Nt,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=ln.createElement(Qt,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return ln.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}):ln.createElement(ln.Fragment,null,r,s))})))}import rt,{useMemo as Rl}from"react";import Xs from"clsx";function Ml({children:o,className:e,style:t,renderDialogItem:n}){let i=_o(),{state:r}=wt();return rt.createElement("div",{"data-element-type":"nvl-dialog-list",className:Xs("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>rt.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},rt.createElement(Nl,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?rt.createElement(Nt,{className:"nvl-character-name font-bold mr-2"}):null,texts:rt.createElement(Qt,{className:"nvl-dialog-text"})}):o?rt.Children.map(o,c=>rt.isValidElement(c)?rt.cloneElement(c,{entry:s,index:a}):c):rt.createElement(Js,{entry:s,index:a})))))}function Js({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??rt.createElement(Qt,{className:"nvl-dialog-text"});return rt.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:Xs("nvl-dialog-item",t),style:n},r&&rt.createElement(Nt,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function Nl({entry:o,children:e}){let n=M().getLiveGame().getGameState(),i=Rl(()=>o.sentence.evaluate(Ae.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=Wi({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return rt.createElement(sn,{value:c},e)}function Zs({state:o}){let e=M(),t=xt(),n=or(null),i=or(null),r=or(!1),[s]=dt(ne.Preferences.skipDelay),[a]=dt(ne.Preferences.skipInterval),[c]=an("skipAction");return Hl(()=>{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 u=()=>{i.current&&(clearTimeout(i.current),i.current=null),n.current&&(clearInterval(n.current),n.current=null),r.current=!1},d=h=>{if(e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(ne.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let m=()=>{n.current=setInterval(()=>{o.events.emit(L.EventTypes["event:state.player.skip"],!1)},a)};u(),o.events.emit(L.EventTypes["event:state.player.skip"],!1),r.current=!0,s===0?m():i.current=setTimeout(m,s)}},p=h=>{e.keyMap.match("skipAction",h.key)&&u()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",d).cancel,m=e.getLiveGame().onWindowEvent("keyup",p).cancel;return()=>{u(),h(),m()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",d).cancel,m=e.getLiveGame().onPlayerEvent("keyup",p).cancel;return()=>{u(),h(),m()}}},[t,s,a,c]),Ys.createElement(Ys.Fragment,null)}import _s,{useEffect as Fl}from"react";function Vl(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var ea=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],Ul=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]'];function Ol(o,e){return!o||e&&ea.some(t=>!!o.closest(t))?!1:[...Ul,...ea].some(t=>!!o.closest(t))}function ta(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 na({state:o}){let e=M();return Fl(()=>{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)||!ta(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!ta(i,s))||Vl(r)||Ol(r,o.isNvlMode())||(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]),_s.createElement(_s.Fragment,null)}import{useEffect as Qn}from"react";function rr({gameState:o}){let e=o.audioManager,[t]=dt("voiceVolume"),[n]=dt("bgmVolume"),[i]=dt("soundVolume"),[r,s]=dt("globalVolume");return Qn(()=>{s(e.getGlobalVolume())},[]),Qn(()=>{e.setGroupVolume("voice",t)},[t]),Qn(()=>{e.setGroupVolume("bgm",n)},[n]),Qn(()=>{e.setGroupVolume("sound",i)},[i]),Qn(()=>{e.setGlobalVolume(r)},[r]),null}import{useEffect as no,useRef as Kl}from"react";function ia(o){let e=ke.catSrc(o.srcManager?.src||[]),t=ke.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=new Set;for(let s of e.image){let a=ke.getSrc(s);!a||r.has(a)||(r.add(a),n.push(a))}for(let s of t.image){let a=ke.getSrc(s);!a||r.has(a)||(r.add(a),i.push(a))}return{critical:n,lookAhead:i,all:[...n,...i],criticalAudio:e.audio}}function oa({state:o}){let{preloaded:e,cacheManager:t}=Xt(),n=M(),i=Kl(new Set),[r]=de(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),c=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,l=n.getLiveGame().story;function u(){o.logger.debug(s,"Preload unmounted"),e.events.emit(Ve.EventTypes["event:preloaded.unmount"])}return no(()=>o.events.on(L.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),no(()=>{if(typeof fetch>"u")return e.events.emit(Ve.EventTypes["event:preloaded.complete"]),e.events.emit(Ve.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(Ve.EventTypes["event:preloaded.complete"]),e.events.emit(Ve.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")),!l||!a)return l?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=ia(a),h=new pn(n.config.preloadConcurrency,0),m=new pn(n.config.preloadConcurrency,n.config.preloadDelay),y=o.logger.group(s,!0),v=!1;o.logger.debug(s,"preloading:",p,a);let C=(f,g,w,T)=>{g.forEach((b,x)=>{if(t.has(b)||t.isPreloading(b)){o.logger.debug(s,`Image already loaded (${w} ${x+1}/${g.length})`,b);return}f.addTask(()=>new Promise(P=>{t.preload(o,b,{retainDecoded:T}).onFinished(()=>{o.logger.debug(s,`Image loaded (${w} ${x+1}/${g.length})`,b),P()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${w} ${x+1}/${g.length})`,b),P()})}))})};C(h,p.critical,"first scene",!0),C(m,p.lookAhead,"look-ahead",!1);for(let f of p.criticalAudio)o.audioManager.preload(f);return y.end(),h.start().then(async()=>{o.logger.info(s,"Image preload (first scene)",`loaded ${t.size()} images in ${performance.now()-d}ms`),e.events.emit(Ve.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(Ve.EventTypes["event:preloaded.ready"]),!v&&(await m.start(),!v&&(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(Ve.EventTypes["event:preloaded.ready"]),e.events.emit(Ve.EventTypes["event:preloaded.mount"]),()=>{v=!0,u()}},[a,l]),no(()=>{i.current.clear()},[a]),no(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!l){o.logger.weakWarn(s,"Story not found, skipping preload");return}let d=performance.now(),p=n.getLiveGame().getAllPredictableActions(l,c,n.config.maxPreloadActions).map(f=>ke.getPreloadableSrc(l,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 m=ke.catSrc([...i.current,...p]),y=new pn(n.config.preloadConcurrency,n.config.preloadDelay),v=[],C=o.logger.group(s);o.logger.debug(s,"preloading:",m);for(let f of m.image){let g=ke.getSrc(f);if(g){if(v.push(g),t.has(g)||t.isPreloading(g)){o.logger.debug(s,`Image already loaded (${m.image.indexOf(f)+1}/${m.image.length})`,g);continue}y.addTask(()=>new Promise(w=>{t.preload(o,g).onFinished(()=>{o.logger.debug(s,`Image loaded (${m.image.indexOf(f)+1}/${m.image.length})`,g),w()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${m.image.indexOf(f)+1}/${m.image.length})`,g),w()})}))}}C.end(),y.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-d}ms`),t.filter(v)})},[c,l]),null}import ao from"react";import io from"react";import sr,{useEffect as ar,useLayoutEffect as cr,useRef as lr,useState as ur}from"react";function Jt({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c}){let[l,u]=ur(null),[d,p]=ur(null),h=sr.useRef(null),[m]=ur(()=>new ci("displayable.refGroup")),y=lr(m.next()),v=lr(je()),f=M().getLiveGame().getGameState(),g=typeof a=="function"?a(l):a,[w]=de([d,l,v]);ar(()=>f.events.depends([f.events.on(L.EventTypes["event:state.player.skip"],st)]).cancel,[d,l,v]),cr(()=>{if(x(),!l)return;if(v.current.some(([me])=>!me.current))throw new I("Displayable: Trying to access transition groups before they are mounted");let{controller:K,task:se}=l,te=me=>{v.current.forEach(([ye],ce)=>{let $e=se.resolve[ce],E=typeof $e=="function"?$e:$e.resolver;if(!E)throw new I(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${ce}])`);let H=E(...me),fe=W(g[ce]||g[g.length-1]||{},H);O(ye,c?c(fe):fe)})},ae=K.onUpdate(te);te(se.animations.map(me=>me.start));let F=!1;return Promise.all(v.current.map(([me])=>{let ye=me.current;return ye?.waitForLoad?ye.waitForLoad():Promise.resolve()})).then(()=>{F||K.start()}),()=>{F=!0,ae.cancel()}},[l]),ar(()=>{if(!h.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),cr(()=>{let K=e.toStyle(f,i);Object.assign(h.current.style,K),f.logger.debug("Displayable","Initial style applied",h.current,K)},[]);let T=lr(()=>{});T.current=()=>{d||l||!h.current||(Object.assign(h.current.style,e.toStyle(f,i)),x())},cr(()=>{T.current()});let{ratio:b}=Te();ar(()=>b.onUpdate(()=>{T.current(),requestAnimationFrame(()=>T.current())}),[b]);function x(){let K=typeof a=="function"?a(l):a;if(!v.current||!v.current.length)throw new I("Displayable: Transition group refs are not initialized correctly");v.current.some(([se])=>!se.current)||v.current.forEach(([se],te)=>{O(se,K[te]||K[K.length-1]||{})})}function P(K){f.logger.debug("Displayable","Transform applied",e.toStyle(f,i),h.current),w(),r?.(K)}function O(K,se){if(!K.current)throw new I("Displayable: Trying to assign properties to unmounted element");let te=K.current,ae={},F={};Object.keys(se).forEach(ye=>{let ce=ye;ce==="style"&&se.style?Object.assign(ae,se.style):se[ce]!==void 0&&ce!=="key"&&(F[ce]=se[ce])}),Object.keys(ae).length>0&&Object.assign(te.style,ae);let me=c?c(F):F;for(let[ye,ce]of Object.entries(me))te.getAttribute(ye)!==ce&&te.setAttribute(ye,ce)}function Z(K,se){d&&(d.abort(),p(null));let te=K.animate(e,{gameState:f,ref:h,overwrites:i}),ae=new Pe(te);return f.timelines.attachTimeline(ae),te.onSkipControllerRegister(F=>{F.onAbort(()=>{ae.abort(),p(null)})}),p(te),te.then(()=>{p(null),P(K),se()}),ae}function ie(K,se){l&&l.controller.complete();let te=K.createTask(f),ae=K.requestAnimations(te.animations),F=new S().registerSkipController(new V(ae.cancel)),me=new Pe(F);F.skipController.onAbort(()=>{ae.cancel()}),ae.onCanceled(()=>{me.abort(),u(null),f.logger.debug("Displayable","Transition cancelled",K)}),ae.onComplete(()=>{be(),u(null),s?.(K),se(),F.resolve()}),f.timelines.attachTimeline(me),u({task:te,controller:ae,transition:K,resolve:se});let ye;if(v.current=te.resolve.map(ce=>{let $e=sr.createRef(),E=typeof ce=="function"?void 0:ce.key;if(!E)return[$e,m.next()];if(E==="target")return ye=m.next(),[$e,ye];if(E==="current")return[$e,y.current];throw new I("Displayable: Invalid key type")}),!ye)throw new I("Displayable: No target key found");return y.current=ye,me}function Oe(K){return f.logger.debug("initDisplayable",o),Z(J.immediate(e.get()),K)}function st(){t&&d&&(d.abort(),p(null),f.logger.debug("transform skipped")),n&&l&&(l.controller.complete(),f.logger.debug("transition skipped"))}function je(){return[[sr.createRef(),y.current]]}function be(){v.current.forEach(([K])=>{K.current=null}),v.current=je()}return{transformRef:h,transitionRefs:v.current,transitionTask:l,initDisplayable:Oe,applyTransform:Z,applyTransition:ie,updateStyleSync:x,flush:w,deps:[d,l,v]}}import{useEffect as Wl}from"react";function kt(o,e,t=[]){let i=M().getLiveGame().getGameState();return Wl(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function pr({state:o,text:e}){let{ratio:t}=Te(),[n]=de(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyTransition:c,updateStyleSync:l,deps:u}=Jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:d=>({width:"fit-content",transform:J.propToCSSTransform(o,d,{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 kt(e,{initDisplayable:s,applyTransform:a,applyTransition:c,flush:n,updateStyleSync:l},[...u]),io.createElement(rn.Div,{"data-element-type":"text"},io.createElement(rn.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([d,p])=>io.createElement("span",{key:p,ref:d,className:e.config.className},io.createElement("span",null,e.state.text)))))}import ht,{forwardRef as $l,useCallback as sa,useImperativeHandle as Bl,useRef as so,useState as aa}from"react";import oo,{useEffect as dr,useRef as wn,forwardRef as zl}from"react";var ra=zl(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=wn(null),{ratio:a}=Te(),[c,l]=oo.useState(0),[u,d]=oo.useState(0),p=wn(null),h=wn(null),m=M(),y=wn(!1),v=wn(null),C=wn(null);oo.useImperativeHandle(r,()=>s.current,[]),dr(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>y.current,configurable:!0},waitForLoad:{value:()=>{let T=()=>{let b=s.current;return!b||typeof b.decode!="function"?Promise.resolve():b.decode().catch(()=>{})};return y.current?T():(v.current||(v.current=new Promise(b=>{C.current=b})),v.current.then(T))},configurable:!0}})},[]),dr(()=>(f(),a.onUpdate(f)),[o]),dr(()=>{let T=new MutationObserver(b=>{b.forEach(x=>{x.type==="attributes"&&x.attributeName==="src"&&s.current&&f()})});return s.current&&T.observe(s.current,{attributes:!0}),()=>{T.disconnect()}},[o]);function f(){if(s.current&&s.current.naturalWidth){let T,b,x;if(s.current.naturalWidth*s.current.naturalHeight===1)T=a.state.width,b=a.state.height,x=`${T} / ${b}`;else{let ie=t?m.config.width/s.current.naturalWidth:1;T=s.current.naturalWidth*a.state.scale*ie,b=s.current.naturalHeight*a.state.scale*ie,x="auto"}let P=p.current,O=!P||P.w!==T||P.h!==b||P.ar!==x,Z=!!o&&h.current!==o;if(!O&&!Z)return;O&&(p.current={w:T,h:b,ar:x},l(T),d(b),s.current.style.aspectRatio=x),o&&(h.current=o,o(T,b))}}function g(){f(),y.current=!0,C.current&&(C.current(),C.current=null,v.current=null),e&&e()}function w(){y.current=!0,C.current&&(C.current(),C.current=null,v.current=null)}return oo.createElement("img",{ref:s,onLoad:g,onError:w,width:c,height:u,alt:"",src:n,style:i})});ra.displayName="AspectScaleImage";var ro=ra;import ca from"clsx";import{motion as jl}from"motion/react";var ql={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},la=$l(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=so(null),a=so([]),c=o.findIndex(l=>l!==null);return Bl(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(l=>!l?.isLoaded||l.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(l=>l?.waitForLoad?l.waitForLoad():Promise.resolve())).then(()=>{})}),[]),ht.createElement("div",{ref:s},o.map((l,u)=>l===null?null:ht.createElement(ro,{key:"layer-"+u,ref:d=>{a.current[u]=d},src:t(l),style:ql,autoFit:e,onSizeChanged:u===c?n:void 0,onLoad:u===c?i:void 0})))});la.displayName="LayerStack";function Ql(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 Xl(o){return R.isStaticSrc(o)?o.state.currentSrc:R.getSrcURL(o)??void 0}var Jl={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Yl({image:o,state:e}){let[t]=aa(()=>new X),[n,i]=aa([]),{cacheManager:r}=Xt(),s=so([]),a=so(null),c=R.isLayeredSrc(o)?R.getSrcURLs(o):null;function l(T){return!k.isDataURI(T)&&!r.has(T)&&!r.isPreloading(T)&&!s.current.includes(T)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${T}".
47
47
  This may be caused by complicated image action behavior that cannot be predicted.
48
- To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(T)),r.get(T)||T}let{transformRef:u,transitionRefs:d,transitionTask:p,initDisplayable:h,applyTransition:m,applyTransform:y,updateStyleSync:v,flush:C,deps:f}=Qt({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:T=>{if(c)return(T?T.task.resolve:[null]).map(E=>E&&typeof E=="function"?{style:Xl}:{style:ql(o.state.darkness)});let b=T?T.transition._getCurrentSrc():Ql(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:D.isColor(b)?D.colorToString(b):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:D.isImageSrc(b)?D.srcToURL(b):R.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:T=>T.src?{...T,src:l(T.src)}:T});kt(o,{createWearable:T=>{i(b=>[...b,T])},disposeWearable:T=>{i(b=>b.filter(x=>x.getId()!==T.getId()))},initDisplayable:h,applyTransform:y,applyTransition:m,events:t,updateStyleSync:v,flush:C},[...f]);let g=ra((T,b)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${T}px`,height:`${b}px`}))},[t]),w=ra(()=>{t.emit("event:image.onLoad")},[t]);return ht.createElement(Bl.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},ht.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},c?d.map(([T,b],x)=>{let E=p?p.task.resolve[x]:null;if(E&&typeof E=="function")return ht.createElement(ro,{key:b,ref:T,autoFit:o.config.autoFit});let O=E?E.key==="target"?p.transition._getTargetLayers():p.transition._getPrevLayers():c;return ht.createElement(ca,{key:b,ref:T,src:O||c,autoFit:o.config.autoFit,resolveSrc:l,onSizeChanged:x===0?g:void 0,onLoad:x===0?w:void 0})}):d.map(([T,b],x)=>ht.createElement(ro,{key:b,ref:T,autoFit:o.config.autoFit,onSizeChanged:x===0?g:void 0,onLoad:x===0?w:void 0})),ht.createElement("div",{className:aa("w-full h-full top-0 left-0 absolute")},n.map(T=>ht.createElement("div",{className:aa("w-full h-full relative"),key:"wearable-"+T.getId()},ht.createElement(la,{image:T,state:e}))))))}var la=ht.memo(Jl),ua=la;function dr({state:o,displayable:e}){return ao.createElement(ao.Fragment,null,e.map(t=>{if(t instanceof Zt)return ao.createElement(ur,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof R)return ao.createElement(ua,{state:o,image:t,key:"image-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import co,{useEffect as Yl}from"react";import{motion as Zl}from"motion/react";function pa({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c,deps:l}=Qt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return kt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c},[...l]),Yl(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),co.createElement(co.Fragment,null,co.createElement(Zl.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([u,d])=>co.createElement("div",{className:"relative w-full h-full",ref:u,key:d},t))))}import _l from"clsx";import{useEffect as da}from"react";import mr from"react";function fr({state:o,className:e,elements:t}){let{scene:n,layers:i}=t;return da(()=>n.events.depends([n.events.on(it.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),da(()=>(n.events.emit(it.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(it.EventTypes["event:scene.unmount"]),o.events.emit(L.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),kt(n,{setBackgroundMusic(r,s){return new Promise(a=>{(async function(){n.state.backgroundMusic&&o.audioManager.isManaged(n.state.backgroundMusic)&&await o.audioManager.stop(n.state.backgroundMusic,s),r?(await o.audioManager.play(r,{end:r.state.volume,duration:s}),n.state.backgroundMusic=r):n.state.backgroundMusic=null,a()})()})}}),mr.createElement("div",{className:_l(e,"w-full h-full absolute")},[...i.entries()].sort(([r],[s])=>r.state.zIndex-s.state.zIndex).map(([r,s])=>mr.createElement(pa,{state:o,layer:r,key:r.getId()},mr.createElement(dr,{state:o,displayable:s}))))}import{AnimatePresence as iu}from"motion/react";import{useEffect as ou,useReducer as ru,useRef as Xn}from"react";import eu from"clsx";import Et,{useCallback as hr,useMemo as tu,useRef as nu}from"react";function gr({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=M(),a=nu([]),c=hr(m=>(a.current.push(m),a.current.indexOf(m)),[]),l=hr(m=>{let y=a.current.indexOf(m);y!==-1&&a.current.splice(y,1)},[]),u=hr(m=>a.current.indexOf(m),[]),d=s.config.menu,p=tu(()=>e.map(m=>({...m,words:m.prompt.evaluate(Ae.getCtx({gameState:n}))})),[]);function h(m){t(m)}return Et.createElement(Et.Fragment,null,Et.createElement(Oo,{value:{evaluated:p,choose:h,gameState:n}},Et.createElement(Wo,{value:{register:c,unregister:l,getIndex:u}},Et.createElement(At,{className:"absolute"},r&&o&&Et.createElement(Wn,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),Et.createElement(nn.Div,{color:"green",border:"dashed",className:eu("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},Et.createElement(d,{items:p.map((m,y)=>y)})))))}function ma({items:o}){return Et.createElement(Vi,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>Et.createElement(Qi,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import su from"clsx";import Jn from"react";var au=120;function yr({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=Xn(!1),a=Xn({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),c=Xn([]),l=Xn(null),u=Xn(null),[,d]=ru(y=>y+1,0),p=()=>{u.current&&(clearTimeout(u.current),u.current=null)},h=()=>{let y=l.current;if(!y)return;let v=a.current;y.forEach(({slot:C,presenceKey:f})=>{v.slotKeys.get(C)===f&&v.slotKeys.delete(C),v.exitingKeys.add(f)}),l.current=null,u.current=null,c.current=[],d()};ou(()=>()=>{p()},[]);let m=(()=>{let y=a.current,v=i.length>0?i.map(({action:g,onClick:w},T)=>({action:g,slot:T,useTypeEffect:!s.current,onFinished:b=>{b!==void 0&&(s.current=b),w(),o.events.emit(L.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((g,w)=>{if(!g.action.prompt||!g.action.words)return[];let T=y.menuPromptIds.get(g);return T||(T=`menu-prompt-${n.getId()}-${y.nextKey++}`,y.menuPromptIds.set(g,T)),[{action:{sentence:g.action.prompt,words:g.action.words,character:null,id:T},slot:w,useTypeEffect:!1}]});if(v.length===0)return!l.current&&c.current.length>0&&(l.current=c.current.map(g=>({...g,active:!1}))),l.current&&!u.current&&(u.current=setTimeout(h,au)),l.current??[];p(),l.current=null;let C=new Set(v.map(({slot:g})=>g));for(let[g,w]of Array.from(y.slotKeys))C.has(g)||(y.exitingKeys.add(w),y.slotKeys.delete(g));let f=v.map(({slot:g,...w})=>{let T=y.slotKeys.get(g);return(!T||y.exitingKeys.has(T))&&(T=`say-${n.getId()}-${y.nextKey++}`,y.slotKeys.set(g,T)),{...w,presenceKey:T,slot:g,active:!0}});return c.current=f,f})();return Jn.createElement("div",{className:su(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs"},Jn.createElement(iu,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{a.current.exitingKeys.clear()}},m.map(({action:y,onFinished:v,presenceKey:C,active:f,useTypeEffect:g})=>Jn.createElement(Wn,{gameState:o,key:C,action:y,active:f,onFinished:v,useTypeEffect:g}))),r.map(({action:y,onClick:v},C)=>Jn.createElement("div",{key:"menu-"+C,"data-element-type":"menu"},Jn.createElement(gr,{state:o,prompt:y.prompt,choices:y.choices,renderPrompt:!y.prompt,afterChoose:f=>{s.current=!1,v(f),o.stage.next()},words:y.words}))))}import fa,{useEffect as cu}from"react";import{motion as lu}from"motion/react";function ha({state:o,camera:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c,deps:l}=Qt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return kt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c},[...l]),cu(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),fa.createElement(lu.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"camera"},i.map(([u,d])=>fa.createElement("div",{className:"relative w-full h-full",ref:u,key:d},t)))}import uu from"react";import{useEffect as vr,useRef as pu}from"react";import{useCallback as ga}from"react";function ya(o){let e=ga(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=ga(()=>{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 Sr({gameState:o,video:e}){let t=pu(null),{show:n,hide:i}=ya(t);vr(()=>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,[]),vr(()=>{i(),e.state.display&&n()},[]),vr(()=>{if(!t.current)return;let s=t.current,a=!1,c=new Set,l=()=>new I(`Failed to add event listener, ref is not available
49
- at Video.tsx: useEffect`),u=h=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw l();n()},hide:()=>{if(!t.current)throw l();i()},play:()=>{if(!t.current)throw l();let m=t.current;return h||m.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(m.currentTime=0,new Promise(y=>{let v=!1,C=null,f=[],g=()=>{v||(v=!0,c.delete(g),C&&C(),f.forEach(w=>w()),y())};c.add(g),C=o.schedule(({retry:w})=>{if(v)return;if(m.readyState<3){let E=()=>{m.removeEventListener("loadeddata",E),w()};m.addEventListener("loadeddata",E),f.push(()=>m.removeEventListener("loadeddata",E));return}let T=()=>g(),b=()=>g(),x=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),g()};m.addEventListener("ended",T),m.addEventListener("stopped",b),m.addEventListener("error",x),f.push(()=>{m.removeEventListener("ended",T),m.removeEventListener("stopped",b),m.removeEventListener("error",x)}),m.play().catch(E=>{o.logger.error("Failed to play video: "+E),g()})},10)}))},pause:()=>{if(!t.current)throw l();t.current.pause()},resume:()=>{if(!t.current)throw l();return t.current.play().catch(m=>{o.logger.error("Failed to resume video: "+m)})},stop:()=>{if(!t.current)throw l();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:m=>{if(!t.current)throw l();t.current.currentTime=m}}))},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),c.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 uu.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 du,{useEffect as mu,useRef as fu}from"react";var va={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 hu(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&va[e]?va[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Tr({gameState:o,vfx:e}){let t=fu(null);return mu(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,c=new Set,l=new Set,u=[],d=w=>{n.style.transition="",n.style.opacity=String(w)},p=()=>{n.play().catch(w=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+w)})},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(w=>{let T=!1,b=()=>E(),x=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),E()},E=()=>{T||(T=!0,l.delete(E),n.removeEventListener("loadeddata",b),n.removeEventListener("error",x),w())};l.add(E),n.addEventListener("loadeddata",b),n.addEventListener("error",x),(n.readyState>=2||n.error)&&E()}),m=(w,T,b)=>{let x=T?.duration??0,E=++s;return b.instant||x<=0?(d(w),Promise.resolve()):new Promise(O=>{let Z=!1,ie=null,Oe=()=>{Z||(Z=!0,l.delete(Oe),ie!==null&&clearTimeout(ie),s===E&&t.current&&d(w),O())};l.add(Oe),n.style.transition=`opacity ${x}ms ${hu(o,T?.easing)}`,n.offsetWidth,n.style.opacity=String(w),ie=setTimeout(Oe,x)})},y=w=>{r||(r=!0,i=w,o.mountState(e,{show:async T=>{a=!0;let b={instant:!1};c.add(b);try{if(await h(),!t.current)return;e.state.paused||p(),await m(e.config.opacity,T,b)}finally{c.delete(b)}},hide:async T=>{a=!0;let b={instant:!1};c.add(b);try{await m(0,T,b),t.current&&n.pause()}finally{c.delete(b)}},pause:()=>{n.pause()},resume:()=>{p()},setRate:T=>{n.playbackRate=T}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&d(e.config.opacity)},0)))},v=()=>y(!1),C=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),y(!0)},f=o.events.on(L.EventTypes["event:state.player.skip"],()=>{c.size===0&&l.size===0||(c.forEach(w=>{w.instant=!0}),[...l].forEach(w=>w()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),g=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&p()};return document.addEventListener("visibilitychange",g),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",v),n.addEventListener("error",C),n.readyState>=3?y(!1):n.error&&C(),()=>{n.removeEventListener("canplay",v),n.removeEventListener("error",C),document.removeEventListener("visibilitychange",g),f.cancel(),u.forEach(w=>w()),[...l].forEach(w=>w()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),du.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,mixBlendMode:e.config.blendMode,pointerEvents:"none"}})}import gu from"clsx";import yu,{useCallback as vu,useEffect as lo,useRef as Su}from"react";function br({children:o,className:e,gameState:t}){let{ratio:n}=Te(),i=M(),[r]=de(),s=Su(null),a=i.config.minWidth,c=i.config.minHeight,l=vu(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,c),r()},[r,t.logger,c,a,n]);return lo(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),lo(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),lo(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),lo(()=>t.events.on(L.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),yu.createElement(zs,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:gu(e),onUpdate:l},o)}import Sa,{useEffect as Tu,useRef as bu,useState as Ta}from"react";function Cr({src:o,width:e,height:t}){let[n,i]=Ta({x:0,y:0}),[r,s]=Ta(!1),a=bu(null),{ratio:c}=Te();return Tu(()=>{let l=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",l),()=>{window.removeEventListener("mousemove",l)}},[r]),Sa.createElement(At,{ref:a,className:"overflow-hidden absolute"},Sa.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(${c.state.scale})`},alt:""}))}import ba from"react";import Gt from"react";function xr({error:o,errorInfo:e}){return M().config.app.debug?Gt.createElement("div",{className:"text-left"},Gt.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),Gt.createElement("p",{className:"text-red-700"},"Message: ",o.message),Gt.createElement("pre",null,"Error Stack: ",o?.stack),Gt.createElement("pre",null,"Component Stack: ",e?.componentStack),Gt.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):Gt.createElement("div",{className:"bg-white w-full h-full"},Gt.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),Gt.createElement("p",null,"Please contact the game developer for further assistance."))}var uo=class extends ba.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?ba.createElement(xr,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import Aa from"clsx";import U,{useEffect as Pt,useReducer as wa,useState as kn}from"react";import{flushSync as ka}from"react-dom";import{useRef as Cu}from"react";import{useEffect as xu}from"react";function Ca({gameState:o}){let e=Cu(null);return xu(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(L.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Yn,{useEffect as Au}from"react";function Ar({gameState:o}){let[e]=de(),{ratio:t}=Te(),n=o.notificationMgr;Au(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Yn.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"},Yn.createElement(i,{notifications:n.toArray()}))}function xa({notifications:o}){return Yn.createElement(Ji,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Yn.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Yn.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Ea({story:o=Fn.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:c,onError:l,children:u,active:d=!0}){let[p,h]=wa(k=>k+1,0),[m,y]=wa(k=>k+1,0),[v,C]=kn(0),f=M(),[g]=kn(()=>new L(f,{update:h,forceUpdate:()=>{g.logger.weakWarn("Player","force update"),ka(()=>{h()})},forceRemount:()=>{g.logger.weakWarn("Player","force remount"),ka(()=>{C(k=>k+1),h()})},next:ye})),w=U.createRef(),T=U.createRef(),[b,x]=kn(!1),E=U.useRef(!1),O=U.useRef(null),Z=U.useRef(null),{preloaded:ie}=An(),[Oe,rt]=kn(!1),je=U.useRef(!1),[be,K]=kn(!1),se=U.useRef(!1),te=U.useRef(null),ae=U.useRef(!1),[F]=kn(new Map);function me(k){return{game:f,gameState:g,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable(),scene:k}}function ye(){let k=()=>{F.forEach(P=>P.cancel())};if(g.rollLock.isLocked())return;k();let H=!1,fe=0;for(;!H;){if(fe++>f.config.maxStackModelLoop)throw new I("Max stack model loop reached");let P=f.getLiveGame().next();if(!P){if(f.getLiveGame().stackModel&&!f.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(P)){if(O.current===P)break;O.current=P,P.onSettled(()=>{P.isFailed()||(O.current===P&&(O.current=null),ye())}),P.onFailed(he=>{O.current===P&&(O.current=null),g.logger.error("Player",he)}),H=!0;break}if(P instanceof ln){if(Z.current===P)break;Z.current=P,P.nextUnlock().then(()=>{Z.current===P&&(Z.current=null),ye()}),H=!0;break}if(We.isCalledActionResult(P)&&P.wait&&We.isStackModelsAwaiting(P.wait.type,P.wait.stackModels)){if(O.current===P)break;if(O.current=P,P.wait){let he=We.executeStackModelGroup(P.wait.type,P.wait.stackModels);he.then(()=>{O.current===P&&(O.current=null),ye()}),he.onFailed(Lt=>{O.current===P&&(O.current=null),g.logger.error("Player",Lt)})}H=!0;break}g.handle(P)}g.stage.update()}Pt(()=>{g.audioManager.initialize()},[]),Pt(()=>(f.getLiveGame().setGameState(g),o&&!f.getLiveGame().isPlaying()&&f.getLiveGame().loadStory(o),o?.entryScene&&!g.getPreloadingScene()&&!g.getLastScene()&&g.preloadScene(o.entryScene),g.playerCurrent=w.current,g.mainContentNode=T.current,()=>{f.getLiveGame().setGameState(void 0),g.playerCurrent=null}),[f,o]),Pt(()=>Qe(()=>{x(!0);let k=g.getLastScene(),H=[];k?H.push(k.events.once("event:scene.mount",()=>{g.stage.next()}).cancel):g.stage.next();let fe=g.events.on(L.EventTypes["event:state.end"],()=>{c&&c({game:f,gameState:g,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable()})});return g.stage.update(),()=>{k&&H.forEach(P=>P()),fe.cancel()}}),[]),Pt(()=>Qe(()=>{b&&i&&!E.current&&(E.current=!0,g.stage.forceUpdate(),f.hooks.trigger("init",[]),i({game:f,gameState:g,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable()}))}),[b]),Pt(()=>Qe(()=>{if(Oe&&s&&!je.current){je.current=!0;let k=te.current||g.getLastScene()||g.getPreloadingScene(),H=me(k);s(H)}}),[Oe]),Pt(()=>Qe(()=>{if(be&&!se.current){se.current=!0;let k=te.current||g.getLastScene()||g.getPreloadingScene(),H=me(k);f.markPreloadComplete(H)&&r&&r(H)}}),[be]),Pt(()=>g.events.on(L.EventTypes["event:state.scene.mount"],k=>{te.current||(te.current=k,y())}).cancel,[]),Pt(()=>{if(!be||!d||ae.current||f.isFirstSceneReady())return;let k=te.current||g.getLastScene();if(!k)return;let H=null,fe=null,P=!1;ae.current=!0;let he=()=>{P=!0,ae.current=!1;let Lt=me(k);f.markFirstSceneReady(Lt)&&a&&a(Lt)};return typeof requestAnimationFrame=="function"?H=requestAnimationFrame(()=>{fe=setTimeout(he,0)}):fe=setTimeout(he,0),()=>{P||(ae.current=!1,H!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(H),fe!==null&&clearTimeout(fe))}},[d,m,p,be]),Pt(()=>ie.events.depends([ie.events.on(Ve.EventTypes["event:preloaded.ready"],()=>{rt(!0),g.stage.update(),o&&f.getLiveGame().isPlaying()&&ye()}),ie.events.on(Ve.EventTypes["event:preloaded.complete"],()=>{K(!0)})]).cancel,[]),Pt(()=>{g.flushDep=p},[p]);let ce=e||f.config.width,$e=t||f.config.height;return U.createElement(uo,{onError:l},U.createElement("div",{style:{width:typeof ce=="number"?`${ce}px`:ce,height:typeof $e=="number"?`${$e}px`:$e},className:Aa(n,"__narraleaf_content-player"),ref:w,tabIndex:0},U.createElement(br,{className:Aa("flex-grow overflow-auto"),gameState:g},U.createElement(nr,{gameState:g}),U.createElement(Ca,{gameState:g}),U.createElement(At,{className:"absolute",ref:T,style:{cursor:g.game.config.cursor?"none":"auto",overflow:g.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},f.config.cursor&&U.createElement(Cr,{src:f.config.cursor,width:f.config.cursorWidth,height:f.config.cursorHeight}),U.createElement(wu,{show:Oe&&d,key:v},U.createElement(Yo,null,U.createElement(Xs,{state:g}),U.createElement(_s,{state:g}),U.createElement(ku,{state:g},g.getSceneElements().map(k=>U.createElement(fr,{key:"scene-"+k.scene.getId(),state:g,elements:k})),g.getVideos().map((k,H)=>U.createElement("div",{className:"w-full h-full absolute",key:"video-"+H,"data-element-type":"video"},U.createElement(Sr,{gameState:g,video:k}))),g.getVfx().map(k=>U.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+k.getId(),"data-element-type":"vfx",style:{zIndex:k.config.zIndex}},U.createElement(Tr,{gameState:g,vfx:k})))),g.getSceneElements().map(k=>U.createElement(yr,{key:"scene-dialogs-"+k.scene.getId(),state:g,elements:k})),U.createElement(Eu,{NvlComponent:f.config.nvlDialog}))),U.createElement(ia,{state:g}),U.createElement(Fs,null,u),U.createElement(Ar,{gameState:g})))))}function wu({children:o,show:e}){return U.createElement(U.Fragment,null,e?o:null)}function ku({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?U.createElement(ha,{state:o,camera:t},e):U.createElement(U.Fragment,null,e)}function Eu({NvlComponent:o}){let{dialogs:e,state:t}=wt(),i=M().getLiveGame().getGameState(),r=U.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(Ae.getCtx({gameState:i})),l=t.activeDialogId===s.id,u=l&&t.phase==="typing";return{entry:s,index:a,isActive:l,gameState:i,words:c,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return U.createElement(o,{dialogs:r})}import"client-only";import En from"react";function Pa({children:o,game:e}){return En.createElement(En.Fragment,null,En.createElement(ys,null,En.createElement(ds,{game:e},En.createElement(ta,null,En.createElement(gs,null,o)))))}var Pu=(a=>(a.image="narraleaf:image",a.text="narraleaf:text",a.layer="narraleaf:layer",a.scene="narraleaf:scene",a.video="narraleaf:video",a.vfx="narraleaf:vfx",a.camera="narraleaf:camera",a))(Pu||{});import Du from"clsx";import Dt,{useEffect as Da,useRef as Lu}from"react";import{motion as Iu,useIsPresent as Ru}from"motion/react";var Mu={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function Nu({children:o,initial:e,transition:t,...n}){let i=M(),r=mt(),{ratio:s}=Te(),[a]=dt(ne.Preferences.showDialog),c=Lu(null),[l]=rn("nextAction"),u=Ru();function d(){r.requestComplete()}return Da(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
50
- at Say.tsx: onElementClick`);return}let p=m=>{m.repeat||i.keyMap.match("nextAction",m.key)&&r.requestComplete()};window.addEventListener("keydown",p);let h=r.events.on(Ee.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keydown",p),h.cancel()}},[r,l]),Da(()=>{let p=i.preference.onPreferenceChange(ne.Preferences.autoForward,h=>{h&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{p.cancel()}},[r]),Dt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},Dt.createElement("div",{className:Du("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:d,style:{...fi(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:c},Dt.createElement(Iu.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&u?{duration:0}:t},o)))}function La({children:o,...e}){let t=mt();return!t.config.action.sentence||!t.config.action.words?null:Dt.createElement(Nu,{...e},o)}var Rl=La;function Ia(){return Dt.createElement(La,null,Dt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},Dt.createElement(zo,null),Dt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},Dt.createElement(Nt,null),Dt.createElement(qt,{...Mu}))))}var Zn={say:Ia,menu:ma,notification:xa,nvlDialog:er};var po=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 _n=class{constructor(e={}){this.keyMap=e;this.events=new X}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 Ra=(e=>(e.game="game",e))(Ra||{}),ze=class ze{constructor(e){this.hooks=new ui;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new On(ze.DefaultPreference);this.keyMap=new _n({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new X;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=W(ze.DefaultConfig,e),this.plugins=new po(this),this.router=new jt(this)}configure(e){let[t,n]=qr(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=W(this.config,t),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}onPreloadComplete(e){return this.lifecycleEvents.on(ze.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(ze.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(ze.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(ze.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(ze.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(ze.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new bt(this)}};ze.defaultSettings={volume:1},ze.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:0,skipInterval:100},ze.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},ze.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,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,allowSkipBackgroundTransition:!1,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:Zn.notification,menu:Zn.menu,dialog:Zn.say,nvlDialog:Zn.nvlDialog,onError:e=>{console.error(e)},stage:null,maxStackModelLoop:1e3,maxActionHistory:100},ze.GameSettingsNamespace=Ra,ze.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var ne=ze;var mo=class mo extends j{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===_.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===_.doAsync){if(r.length===0)return super.executeAction(t,n);let s=mo.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===_.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===_.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===_.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===_.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let c=We.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:[c]}}}else if(this.type===_.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 c=We.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:[c]}}}else if(this.type===_.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===_.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 c=new S,l=new Pe(a);return t.timelines.attachTimeline(l),a.then(()=>{c.resolve({type:this.type,node:this.contentNode.getChild()})}),c.onSkipControllerRegister(u=>{u.onAbort(()=>{l.abort()})}),c}else if(this.type===_.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,c=new Pe(a);t.timelines.attachTimeline(c);let l=t.game.preference,u=l.getPreference(ne.Preferences.autoForward),d=l.getPreference(ne.Preferences.gameSpeed),p=u?t.game.config.autoForwardDelay/d:null,h=!1,m=null,y=null,v=null,C=()=>{y?.cancel(),v?.cancel(),m&&(clearTimeout(m),m=null)},f=()=>{h||(h=!0,C(),a.resolve())};return y=t.events.on(L.EventTypes["event:state.player.stageClick"],f),v=t.events.on(L.EventTypes["event:state.player.skip"],f),p!==null&&(m=setTimeout(f,p)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(g=>{g.onAbort(()=>{h||(h=!0,C(),c.abort())})}),s}else{if(this.type===_.label)return super.executeAction(t,n);if(this.type===_.jump){let s=this._jumpTarget;if(!s){let[l]=this.contentNode.getContent();throw new De(`Jump target label "${l}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),c=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},l=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(l,u)},[c]),a.clearMainStack().getStackModelForce().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===_.break||this.type===_.waitForClick||this.type===_.label||this.type===_.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===_.break)return super.stringifyWithContent("Control","break");if(this.type===_.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===_.label||this.type===_.jump){let[a]=this.contentNode.getContent(),c=this.type===_.label?"label":"jump";return super.stringifyWithContent("Control",`${c}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};mo.ActionTypes=_;var ee=mo;var Me=class o extends oe{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(ee.ActionTypes.do,t)}doAsync(t){return this.push(ee.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(ee.ActionTypes.any,t)}all(t){return this.pushUnchained(ee.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(ee.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(ee.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=z.from(t);return this.pushWithLambda(ee.ActionTypes.while,n,i)}breakLoop(){let t=new ee(this.chain(),ee.ActionTypes.break,new A().setContent([]));return this.chain(t)}sleep(t){return this.push(ee.ActionTypes.sleep,[],t)}waitForClick(){let t=new ee(this.chain(),ee.ActionTypes.waitForClick,new A().setContent([]));return this.chain(t)}label(t){let n=new ee(this.chain(),ee.ActionTypes.label,new A().setContent([t]));return this.chain(n)}jump(t){let n=new ee(this.chain(),ee.ActionTypes.jump,new A().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new ee(this.chain(),t,new A().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new ee(this.chain(),t,new A().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new ee(this.chain(),t,new A().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Rt.say(n).getActions():Ie.toActions([n]))}};var B=class B extends st{static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return D.isStaticImageData(t)?D.srcToURL(t):D.isColor(t)?t:D.isImageSrc(t)?D.srcToURL(t):B.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&&!D.isImageSrc(e)&&!D.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)&&(D.isImageSrc(t)||D.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:B.isLayeredSrc(e)?null:B.isTagSrc(e)&&e.config.src.resolve?B.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):B.isStaticSrc(e)?D.isStaticImageData(e.state.currentSrc)?D.srcToURL(e.state.currentSrc):D.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=>B.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(B.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new B({src:e})}constructor(e={}){super();let t=B.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 Me,n=>{if(D.isImageSrc(e)||D.isColor(e)){if(D.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 ge(n,ge.ActionTypes.setAppearance,new A().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Me,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 ue("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:B.StateSerializer.serialize(this.state),transformState:le.TransformStateSerializer.serialize(this.transformState.get())}}fromData(e){return this.state=B.StateSerializer.deserialize(e.state),this.transformState=le.deserialize(e.transformState),this}_applyTransition(e,t){return new Re(this.chain(),Le.applyTransition,new A().setContent([e,t]))}_init(e,t){return new Re(this.chain(),Le.init,new A().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new ge(this.chain(),ge.ActionTypes.initWearable,new A().setContent([e]))}_flush(){return new ge(this.chain(),ge.ActionTypes.flush,new A)}reset(){return this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig),this}resolveTags(e,t){if(!B.isTagSrc(this))throw new Error(`Tag not defined
51
- 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(c=>{let l=n.get(c);l&&i.set(l,c)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let c=i.get(a);if(!c)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(c)}),r}_setAppearanceSync(e){if(D.isImageSrc(e)||D.isColor(e)){if(D.isColor(e)&&!this.config.isBackground)throw new ue("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!B.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new ue(`Trying to mix src and tags
48
+ To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(T)),r.get(T)||T}let{transformRef:u,transitionRefs:d,transitionTask:p,initDisplayable:h,applyTransition:m,applyTransform:y,updateStyleSync:v,flush:C,deps:f}=Jt({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:T=>{if(c)return(T?T.task.resolve:[null]).map(P=>P&&typeof P=="function"?{style:Jl}:{style:Ql(o.state.darkness)});let b=T?T.transition._getCurrentSrc():Xl(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:k.isColor(b)?k.colorToString(b):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:k.isImageSrc(b)?k.srcToURL(b):R.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:T=>T.src?{...T,src:l(T.src)}:T});kt(o,{createWearable:T=>{i(b=>[...b,T])},disposeWearable:T=>{i(b=>b.filter(x=>x.getId()!==T.getId()))},initDisplayable:h,applyTransform:y,applyTransition:m,events:t,updateStyleSync:v,flush:C},[...f]);let g=sa((T,b)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${T}px`,height:`${b}px`}))},[t]),w=sa(()=>{t.emit("event:image.onLoad")},[t]);return ht.createElement(jl.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},ht.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},c?d.map(([T,b],x)=>{let P=p?p.task.resolve[x]:null;if(P&&typeof P=="function")return ht.createElement(ro,{key:b,ref:T,autoFit:o.config.autoFit});let O=P?P.key==="target"?p.transition._getTargetLayers():p.transition._getPrevLayers():c;return ht.createElement(la,{key:b,ref:T,src:O||c,autoFit:o.config.autoFit,resolveSrc:l,onSizeChanged:x===0?g:void 0,onLoad:x===0?w:void 0})}):d.map(([T,b],x)=>ht.createElement(ro,{key:b,ref:T,autoFit:o.config.autoFit,onSizeChanged:x===0?g:void 0,onLoad:x===0?w:void 0})),ht.createElement("div",{className:ca("w-full h-full top-0 left-0 absolute")},n.map(T=>ht.createElement("div",{className:ca("w-full h-full relative"),key:"wearable-"+T.getId()},ht.createElement(ua,{image:T,state:e}))))))}var ua=ht.memo(Yl),pa=ua;function mr({state:o,displayable:e}){return ao.createElement(ao.Fragment,null,e.map(t=>{if(t instanceof en)return ao.createElement(pr,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof R)return ao.createElement(pa,{state:o,image:t,key:"image-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import co,{useEffect as Zl}from"react";import{motion as _l}from"motion/react";function da({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c,deps:l}=Jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return kt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c},[...l]),Zl(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),co.createElement(co.Fragment,null,co.createElement(_l.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([u,d])=>co.createElement("div",{className:"relative w-full h-full",ref:u,key:d},t))))}import eu from"clsx";import{useEffect as ma}from"react";import fr from"react";function hr({state:o,className:e,elements:t}){let{scene:n,layers:i}=t;return ma(()=>n.events.depends([n.events.on(ot.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),ma(()=>(n.events.emit(ot.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(ot.EventTypes["event:scene.unmount"]),o.events.emit(L.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),kt(n,{setBackgroundMusic(r,s){return new Promise(a=>{(async function(){n.state.backgroundMusic&&o.audioManager.isManaged(n.state.backgroundMusic)&&await o.audioManager.stop(n.state.backgroundMusic,s),r?(await o.audioManager.play(r,{end:r.state.volume,duration:s}),n.state.backgroundMusic=r):n.state.backgroundMusic=null,a()})()})}}),fr.createElement("div",{className:eu(e,"w-full h-full absolute")},[...i.entries()].sort(([r],[s])=>r.state.zIndex-s.state.zIndex).map(([r,s])=>fr.createElement(da,{state:o,layer:r,key:r.getId()},fr.createElement(mr,{state:o,displayable:s}))))}import{AnimatePresence as ou}from"motion/react";import{useEffect as ru,useReducer as su,useRef as Xn}from"react";import tu from"clsx";import Et,{useCallback as gr,useMemo as nu,useRef as iu}from"react";function yr({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=M(),a=iu([]),c=gr(m=>(a.current.push(m),a.current.indexOf(m)),[]),l=gr(m=>{let y=a.current.indexOf(m);y!==-1&&a.current.splice(y,1)},[]),u=gr(m=>a.current.indexOf(m),[]),d=s.config.menu,p=nu(()=>e.map(m=>({...m,words:m.prompt.evaluate(Ae.getCtx({gameState:n}))})),[]);function h(m){t(m)}return Et.createElement(Et.Fragment,null,Et.createElement(Ko,{value:{evaluated:p,choose:h,gameState:n}},Et.createElement(zo,{value:{register:c,unregister:l,getIndex:u}},Et.createElement(At,{className:"absolute"},r&&o&&Et.createElement(Wn,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),Et.createElement(rn.Div,{color:"green",border:"dashed",className:tu("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},Et.createElement(d,{items:p.map((m,y)=>y)})))))}function fa({items:o}){return Et.createElement(Vi,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>Et.createElement(Qi,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import au from"clsx";import Jn from"react";var cu=120;function vr({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=Xn(!1),a=Xn({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),c=Xn([]),l=Xn(null),u=Xn(null),[,d]=su(y=>y+1,0),p=()=>{u.current&&(clearTimeout(u.current),u.current=null)},h=()=>{let y=l.current;if(!y)return;let v=a.current;y.forEach(({slot:C,presenceKey:f})=>{v.slotKeys.get(C)===f&&v.slotKeys.delete(C),v.exitingKeys.add(f)}),l.current=null,u.current=null,c.current=[],d()};ru(()=>()=>{p()},[]);let m=(()=>{let y=a.current,v=i.length>0?i.map(({action:g,onClick:w},T)=>({action:g,slot:T,useTypeEffect:!s.current,onFinished:b=>{b!==void 0&&(s.current=b),w(),o.events.emit(L.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((g,w)=>{if(!g.action.prompt||!g.action.words)return[];let T=y.menuPromptIds.get(g);return T||(T=`menu-prompt-${n.getId()}-${y.nextKey++}`,y.menuPromptIds.set(g,T)),[{action:{sentence:g.action.prompt,words:g.action.words,character:null,id:T},slot:w,useTypeEffect:!1}]});if(v.length===0)return!l.current&&c.current.length>0&&(l.current=c.current.map(g=>({...g,active:!1}))),l.current&&!u.current&&(u.current=setTimeout(h,cu)),l.current??[];p(),l.current=null;let C=new Set(v.map(({slot:g})=>g));for(let[g,w]of Array.from(y.slotKeys))C.has(g)||(y.exitingKeys.add(w),y.slotKeys.delete(g));let f=v.map(({slot:g,...w})=>{let T=y.slotKeys.get(g);return(!T||y.exitingKeys.has(T))&&(T=`say-${n.getId()}-${y.nextKey++}`,y.slotKeys.set(g,T)),{...w,presenceKey:T,slot:g,active:!0}});return c.current=f,f})();return Jn.createElement("div",{className:au(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs"},Jn.createElement(ou,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{a.current.exitingKeys.clear()}},m.map(({action:y,onFinished:v,presenceKey:C,active:f,useTypeEffect:g})=>Jn.createElement(Wn,{gameState:o,key:C,action:y,active:f,onFinished:v,useTypeEffect:g}))),r.map(({action:y,onClick:v},C)=>Jn.createElement("div",{key:"menu-"+C,"data-element-type":"menu"},Jn.createElement(yr,{state:o,prompt:y.prompt,choices:y.choices,renderPrompt:!y.prompt,afterChoose:f=>{s.current=!1,v(f),o.stage.next()},words:y.words}))))}import ha,{useEffect as lu}from"react";import{motion as uu}from"motion/react";function ga({state:o,camera:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c,deps:l}=Jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return kt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c},[...l]),lu(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),ha.createElement(uu.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"camera"},i.map(([u,d])=>ha.createElement("div",{className:"relative w-full h-full",ref:u,key:d},t)))}import pu from"react";import{useEffect as Sr,useRef as du}from"react";import{useCallback as ya}from"react";function va(o){let e=ya(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=ya(()=>{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 Tr({gameState:o,video:e}){let t=du(null),{show:n,hide:i}=va(t);Sr(()=>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,[]),Sr(()=>{i(),e.state.display&&n()},[]),Sr(()=>{if(!t.current)return;let s=t.current,a=!1,c=new Set,l=()=>new I(`Failed to add event listener, ref is not available
49
+ at Video.tsx: useEffect`),u=h=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw l();n()},hide:()=>{if(!t.current)throw l();i()},play:()=>{if(!t.current)throw l();let m=t.current;return h||m.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(m.currentTime=0,new Promise(y=>{let v=!1,C=null,f=[],g=()=>{v||(v=!0,c.delete(g),C&&C(),f.forEach(w=>w()),y())};c.add(g),C=o.schedule(({retry:w})=>{if(v)return;if(m.readyState<3){let P=()=>{m.removeEventListener("loadeddata",P),w()};m.addEventListener("loadeddata",P),f.push(()=>m.removeEventListener("loadeddata",P));return}let T=()=>g(),b=()=>g(),x=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),g()};m.addEventListener("ended",T),m.addEventListener("stopped",b),m.addEventListener("error",x),f.push(()=>{m.removeEventListener("ended",T),m.removeEventListener("stopped",b),m.removeEventListener("error",x)}),m.play().catch(P=>{o.logger.error("Failed to play video: "+P),g()})},10)}))},pause:()=>{if(!t.current)throw l();t.current.pause()},resume:()=>{if(!t.current)throw l();return t.current.play().catch(m=>{o.logger.error("Failed to resume video: "+m)})},stop:()=>{if(!t.current)throw l();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:m=>{if(!t.current)throw l();t.current.currentTime=m}}))},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),c.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 pu.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 mu,{useEffect as fu,useRef as hu}from"react";var Sa={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 gu(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&Sa[e]?Sa[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function br({gameState:o,vfx:e}){let t=hu(null);return fu(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,c=new Set,l=new Set,u=[],d=w=>{n.style.transition="",n.style.opacity=String(w)},p=()=>{n.play().catch(w=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+w)})},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(w=>{let T=!1,b=()=>P(),x=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),P()},P=()=>{T||(T=!0,l.delete(P),n.removeEventListener("loadeddata",b),n.removeEventListener("error",x),w())};l.add(P),n.addEventListener("loadeddata",b),n.addEventListener("error",x),(n.readyState>=2||n.error)&&P()}),m=(w,T,b)=>{let x=T?.duration??0,P=++s;return b.instant||x<=0?(d(w),Promise.resolve()):new Promise(O=>{let Z=!1,ie=null,Oe=()=>{Z||(Z=!0,l.delete(Oe),ie!==null&&clearTimeout(ie),s===P&&t.current&&d(w),O())};l.add(Oe),n.style.transition=`opacity ${x}ms ${gu(o,T?.easing)}`,n.offsetWidth,n.style.opacity=String(w),ie=setTimeout(Oe,x)})},y=w=>{r||(r=!0,i=w,o.mountState(e,{show:async T=>{a=!0;let b={instant:!1};c.add(b);try{if(await h(),!t.current)return;e.state.paused||p(),await m(e.config.opacity,T,b)}finally{c.delete(b)}},hide:async T=>{a=!0;let b={instant:!1};c.add(b);try{await m(0,T,b),t.current&&n.pause()}finally{c.delete(b)}},pause:()=>{n.pause()},resume:()=>{p()},setRate:T=>{n.playbackRate=T}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&d(e.config.opacity)},0)))},v=()=>y(!1),C=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),y(!0)},f=o.events.on(L.EventTypes["event:state.player.skip"],()=>{c.size===0&&l.size===0||(c.forEach(w=>{w.instant=!0}),[...l].forEach(w=>w()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),g=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&p()};return document.addEventListener("visibilitychange",g),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",v),n.addEventListener("error",C),n.readyState>=3?y(!1):n.error&&C(),()=>{n.removeEventListener("canplay",v),n.removeEventListener("error",C),document.removeEventListener("visibilitychange",g),f.cancel(),u.forEach(w=>w()),[...l].forEach(w=>w()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),mu.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,mixBlendMode:e.config.blendMode,pointerEvents:"none"}})}import yu from"clsx";import vu,{useCallback as Su,useEffect as lo,useRef as Tu}from"react";function Cr({children:o,className:e,gameState:t}){let{ratio:n}=Te(),i=M(),[r]=de(),s=Tu(null),a=i.config.minWidth,c=i.config.minHeight,l=Su(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,c),r()},[r,t.logger,c,a,n]);return lo(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),lo(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),lo(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),lo(()=>t.events.on(L.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),vu.createElement(js,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:yu(e),onUpdate:l},o)}import Ta,{useEffect as bu,useRef as Cu,useState as ba}from"react";function xr({src:o,width:e,height:t}){let[n,i]=ba({x:0,y:0}),[r,s]=ba(!1),a=Cu(null),{ratio:c}=Te();return bu(()=>{let l=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",l),()=>{window.removeEventListener("mousemove",l)}},[r]),Ta.createElement(At,{ref:a,className:"overflow-hidden absolute"},Ta.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(${c.state.scale})`},alt:""}))}import Ca from"react";import Gt from"react";function Ar({error:o,errorInfo:e}){return M().config.app.debug?Gt.createElement("div",{className:"text-left"},Gt.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),Gt.createElement("p",{className:"text-red-700"},"Message: ",o.message),Gt.createElement("pre",null,"Error Stack: ",o?.stack),Gt.createElement("pre",null,"Component Stack: ",e?.componentStack),Gt.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):Gt.createElement("div",{className:"bg-white w-full h-full"},Gt.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),Gt.createElement("p",null,"Please contact the game developer for further assistance."))}var uo=class extends Ca.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?Ca.createElement(Ar,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import wa from"clsx";import U,{useEffect as Pt,useReducer as ka,useState as kn}from"react";import{flushSync as Ea}from"react-dom";import{useRef as xu}from"react";import{useEffect as Au}from"react";function xa({gameState:o}){let e=xu(null);return Au(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(L.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Yn,{useEffect as wu}from"react";function wr({gameState:o}){let[e]=de(),{ratio:t}=Te(),n=o.notificationMgr;wu(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Yn.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"},Yn.createElement(i,{notifications:n.toArray()}))}function Aa({notifications:o}){return Yn.createElement(Ji,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Yn.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Yn.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Pa({story:o=Fn.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:c,onError:l,children:u,active:d=!0}){let[p,h]=ka(E=>E+1,0),[m,y]=ka(E=>E+1,0),[v,C]=kn(0),f=M(),[g]=kn(()=>new L(f,{update:h,forceUpdate:()=>{g.logger.weakWarn("Player","force update"),Ea(()=>{h()})},forceRemount:()=>{g.logger.weakWarn("Player","force remount"),Ea(()=>{C(E=>E+1),h()})},next:ye})),w=U.createRef(),T=U.createRef(),[b,x]=kn(!1),P=U.useRef(!1),O=U.useRef(null),Z=U.useRef(null),{preloaded:ie}=Xt(),[Oe,st]=kn(!1),je=U.useRef(!1),[be,K]=kn(!1),se=U.useRef(!1),te=U.useRef(null),ae=U.useRef(!1),[F]=kn(new Map);function me(E){return{game:f,gameState:g,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable(),scene:E}}function ye(){let E=()=>{F.forEach(D=>D.cancel())};if(g.rollLock.isLocked())return;E();let H=!1,fe=0;for(;!H;){if(fe++>f.config.maxStackModelLoop)throw new I("Max stack model loop reached");let D=f.getLiveGame().next();if(!D){if(f.getLiveGame().stackModel&&!f.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(D)){if(O.current===D)break;O.current=D,D.onSettled(()=>{D.isFailed()||(O.current===D&&(O.current=null),ye())}),D.onFailed(he=>{O.current===D&&(O.current=null),g.logger.error("Player",he)}),H=!0;break}if(D instanceof un){if(Z.current===D)break;Z.current=D,D.nextUnlock().then(()=>{Z.current===D&&(Z.current=null),ye()}),H=!0;break}if(We.isCalledActionResult(D)&&D.wait&&We.isStackModelsAwaiting(D.wait.type,D.wait.stackModels)){if(O.current===D)break;if(O.current=D,D.wait){let he=We.executeStackModelGroup(D.wait.type,D.wait.stackModels);he.then(()=>{O.current===D&&(O.current=null),ye()}),he.onFailed(Lt=>{O.current===D&&(O.current=null),g.logger.error("Player",Lt)})}H=!0;break}g.handle(D)}g.stage.update()}Pt(()=>{g.audioManager.initialize()},[]),Pt(()=>(f.getLiveGame().setGameState(g),o&&!f.getLiveGame().isPlaying()&&f.getLiveGame().loadStory(o),o?.entryScene&&!g.getPreloadingScene()&&!g.getLastScene()&&g.preloadScene(o.entryScene),g.playerCurrent=w.current,g.mainContentNode=T.current,()=>{f.getLiveGame().setGameState(void 0),g.playerCurrent=null}),[f,o]),Pt(()=>Qe(()=>{x(!0);let E=g.getLastScene(),H=[];E?H.push(E.events.once("event:scene.mount",()=>{g.stage.next()}).cancel):g.stage.next();let fe=g.events.on(L.EventTypes["event:state.end"],()=>{c&&c({game:f,gameState:g,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable()})});return g.stage.update(),()=>{E&&H.forEach(D=>D()),fe.cancel()}}),[]),Pt(()=>Qe(()=>{b&&i&&!P.current&&(P.current=!0,g.stage.forceUpdate(),f.hooks.trigger("init",[]),i({game:f,gameState:g,liveGame:f.getLiveGame(),storable:f.getLiveGame().getStorable()}))}),[b]),Pt(()=>Qe(()=>{if(Oe&&s&&!je.current){je.current=!0;let E=te.current||g.getLastScene()||g.getPreloadingScene(),H=me(E);s(H)}}),[Oe]),Pt(()=>Qe(()=>{if(be&&!se.current){se.current=!0;let E=te.current||g.getLastScene()||g.getPreloadingScene(),H=me(E);f.markPreloadComplete(H)&&r&&r(H)}}),[be]),Pt(()=>g.events.on(L.EventTypes["event:state.scene.mount"],E=>{te.current||(te.current=E,y())}).cancel,[]),Pt(()=>{if(!be||!d||ae.current||f.isFirstSceneReady())return;let E=te.current||g.getLastScene();if(!E)return;let H=null,fe=null,D=!1;ae.current=!0;let he=()=>{D=!0,ae.current=!1;let Lt=me(E);f.markFirstSceneReady(Lt)&&a&&a(Lt)};return typeof requestAnimationFrame=="function"?H=requestAnimationFrame(()=>{fe=setTimeout(he,0)}):fe=setTimeout(he,0),()=>{D||(ae.current=!1,H!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(H),fe!==null&&clearTimeout(fe))}},[d,m,p,be]),Pt(()=>ie.events.depends([ie.events.on(Ve.EventTypes["event:preloaded.ready"],()=>{st(!0),g.stage.update(),o&&f.getLiveGame().isPlaying()&&ye()}),ie.events.on(Ve.EventTypes["event:preloaded.complete"],()=>{K(!0)})]).cancel,[]),Pt(()=>{g.flushDep=p},[p]);let ce=e||f.config.width,$e=t||f.config.height;return U.createElement(uo,{onError:l},U.createElement("div",{style:{width:typeof ce=="number"?`${ce}px`:ce,height:typeof $e=="number"?`${$e}px`:$e},className:wa(n,"__narraleaf_content-player"),ref:w,tabIndex:0},U.createElement(Cr,{className:wa("flex-grow overflow-auto"),gameState:g},U.createElement(rr,{gameState:g}),U.createElement(xa,{gameState:g}),U.createElement(At,{className:"absolute",ref:T,style:{cursor:g.game.config.cursor?"none":"auto",overflow:g.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},f.config.cursor&&U.createElement(xr,{src:f.config.cursor,width:f.config.cursorWidth,height:f.config.cursorHeight}),U.createElement(ku,{show:Oe&&d,key:v},U.createElement(er,null,U.createElement(Zs,{state:g}),U.createElement(na,{state:g}),U.createElement(Eu,{state:g},g.getSceneElements().map(E=>U.createElement(hr,{key:"scene-"+E.scene.getId(),state:g,elements:E})),g.getVideos().map((E,H)=>U.createElement("div",{className:"w-full h-full absolute",key:"video-"+H,"data-element-type":"video"},U.createElement(Tr,{gameState:g,video:E}))),g.getVfx().map(E=>U.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+E.getId(),"data-element-type":"vfx",style:{zIndex:E.config.zIndex}},U.createElement(br,{gameState:g,vfx:E})))),g.getSceneElements().map(E=>U.createElement(vr,{key:"scene-dialogs-"+E.scene.getId(),state:g,elements:E})),U.createElement(Pu,{NvlComponent:f.config.nvlDialog}))),U.createElement(oa,{state:g}),U.createElement(Os,null,u),U.createElement(wr,{gameState:g})))))}function ku({children:o,show:e}){return U.createElement(U.Fragment,null,e?o:null)}function Eu({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?U.createElement(ga,{state:o,camera:t},e):U.createElement(U.Fragment,null,e)}function Pu({NvlComponent:o}){let{dialogs:e,state:t}=wt(),i=M().getLiveGame().getGameState(),r=U.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(Ae.getCtx({gameState:i})),l=t.activeDialogId===s.id,u=l&&t.phase==="typing";return{entry:s,index:a,isActive:l,gameState:i,words:c,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return U.createElement(o,{dialogs:r})}import"client-only";import En from"react";function Da({children:o,game:e}){return En.createElement(En.Fragment,null,En.createElement(vs,null,En.createElement(ms,{game:e},En.createElement(Hs,null,En.createElement(ys,null,o)))))}var Du=(a=>(a.image="narraleaf:image",a.text="narraleaf:text",a.layer="narraleaf:layer",a.scene="narraleaf:scene",a.video="narraleaf:video",a.vfx="narraleaf:vfx",a.camera="narraleaf:camera",a))(Du||{});import Lu from"clsx";import Dt,{useEffect as La,useRef as Iu}from"react";import{motion as Ru,useIsPresent as Mu}from"motion/react";var Nu={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function Gu({children:o,initial:e,transition:t,...n}){let i=M(),r=mt(),{ratio:s}=Te(),[a]=dt(ne.Preferences.showDialog),c=Iu(null),[l]=an("nextAction"),u=Mu();function d(){r.requestComplete()}return La(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
50
+ at Say.tsx: onElementClick`);return}let p=m=>{m.repeat||i.keyMap.match("nextAction",m.key)&&r.requestComplete()};window.addEventListener("keydown",p);let h=r.events.on(Ee.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keydown",p),h.cancel()}},[r,l]),La(()=>{let p=i.preference.onPreferenceChange(ne.Preferences.autoForward,h=>{h&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{p.cancel()}},[r]),Dt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},Dt.createElement("div",{className:Lu("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:d,style:{...fi(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:c},Dt.createElement(Ru.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&u?{duration:0}:t},o)))}function Ia({children:o,...e}){let t=mt();return!t.config.action.sentence||!t.config.action.words?null:Dt.createElement(Gu,{...e},o)}var Gl=Ia;function Ra(){return Dt.createElement(Ia,null,Dt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},Dt.createElement(jo,null),Dt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},Dt.createElement(Nt,null),Dt.createElement(Qt,{...Nu}))))}var Zn={say:Ra,menu:fa,notification:Aa,nvlDialog:ir};var po=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 _n=class{constructor(e={}){this.keyMap=e;this.events=new X}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 Ma=(e=>(e.game="game",e))(Ma||{}),ze=class ze{constructor(e){this.hooks=new ui;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new On(ze.DefaultPreference);this.keyMap=new _n({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new X;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=W(ze.DefaultConfig,e),this.plugins=new po(this),this.router=new qt(this)}configure(e){let[t,n]=Qr(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=W(this.config,t),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}onPreloadComplete(e){return this.lifecycleEvents.on(ze.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(ze.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(ze.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(ze.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(ze.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(ze.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new Tt(this)}};ze.defaultSettings={volume:1},ze.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:0,skipInterval:100},ze.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},ze.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,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,allowSkipBackgroundTransition:!1,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:Zn.notification,menu:Zn.menu,dialog:Zn.say,nvlDialog:Zn.nvlDialog,onError:e=>{console.error(e)},stage:null,maxStackModelLoop:1e3,maxActionHistory:100},ze.GameSettingsNamespace=Ma,ze.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var ne=ze;var mo=class mo extends j{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===_.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===_.doAsync){if(r.length===0)return super.executeAction(t,n);let s=mo.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===_.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===_.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===_.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===_.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let c=We.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:[c]}}}else if(this.type===_.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 c=We.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:[c]}}}else if(this.type===_.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===_.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 c=new S,l=new Pe(a);return t.timelines.attachTimeline(l),a.then(()=>{c.resolve({type:this.type,node:this.contentNode.getChild()})}),c.onSkipControllerRegister(u=>{u.onAbort(()=>{l.abort()})}),c}else if(this.type===_.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,c=new Pe(a);t.timelines.attachTimeline(c);let l=t.game.preference,u=l.getPreference(ne.Preferences.autoForward),d=l.getPreference(ne.Preferences.gameSpeed),p=u?t.game.config.autoForwardDelay/d:null,h=!1,m=null,y=null,v=null,C=()=>{y?.cancel(),v?.cancel(),m&&(clearTimeout(m),m=null)},f=()=>{h||(h=!0,C(),a.resolve())};return y=t.events.on(L.EventTypes["event:state.player.stageClick"],f),v=t.events.on(L.EventTypes["event:state.player.skip"],f),p!==null&&(m=setTimeout(f,p)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(g=>{g.onAbort(()=>{h||(h=!0,C(),c.abort())})}),s}else{if(this.type===_.label)return super.executeAction(t,n);if(this.type===_.jump){let s=this._jumpTarget;if(!s){let[l]=this.contentNode.getContent();throw new De(`Jump target label "${l}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),c=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},l=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(l,u)},[c]),a.clearMainStack().getStackModelForce().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===_.break||this.type===_.waitForClick||this.type===_.label||this.type===_.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===_.break)return super.stringifyWithContent("Control","break");if(this.type===_.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===_.label||this.type===_.jump){let[a]=this.contentNode.getContent(),c=this.type===_.label?"label":"jump";return super.stringifyWithContent("Control",`${c}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};mo.ActionTypes=_;var ee=mo;var Ge=class o extends oe{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(ee.ActionTypes.do,t)}doAsync(t){return this.push(ee.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(ee.ActionTypes.any,t)}all(t){return this.pushUnchained(ee.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(ee.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(ee.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=z.from(t);return this.pushWithLambda(ee.ActionTypes.while,n,i)}breakLoop(){let t=new ee(this.chain(),ee.ActionTypes.break,new A().setContent([]));return this.chain(t)}sleep(t){return this.push(ee.ActionTypes.sleep,[],t)}waitForClick(){let t=new ee(this.chain(),ee.ActionTypes.waitForClick,new A().setContent([]));return this.chain(t)}label(t){let n=new ee(this.chain(),ee.ActionTypes.label,new A().setContent([t]));return this.chain(n)}jump(t){let n=new ee(this.chain(),ee.ActionTypes.jump,new A().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new ee(this.chain(),t,new A().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new ee(this.chain(),t,new A().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new ee(this.chain(),t,new A().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Rt.say(n).getActions():Ie.toActions([n]))}};var B=class B extends at{static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return k.isStaticImageData(t)?k.srcToURL(t):k.isColor(t)?t:k.isImageSrc(t)?k.srcToURL(t):B.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&&!k.isImageSrc(e)&&!k.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)&&(k.isImageSrc(t)||k.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:B.isLayeredSrc(e)?null:B.isTagSrc(e)&&e.config.src.resolve?B.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):B.isStaticSrc(e)?k.isStaticImageData(e.state.currentSrc)?k.srcToURL(e.state.currentSrc):k.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=>B.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(B.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new B({src:e})}constructor(e={}){super();let t=B.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(k.isImageSrc(e)||k.isColor(e)){if(k.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 ge(n,ge.ActionTypes.setAppearance,new A().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 ue("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:B.StateSerializer.serialize(this.state),transformState:le.TransformStateSerializer.serialize(this.transformState.get())}}fromData(e){return this.state=B.StateSerializer.deserialize(e.state),this.transformState=le.deserialize(e.transformState),this}_applyTransition(e,t){return new Ne(this.chain(),Le.applyTransition,new A().setContent([e,t]))}_init(e,t){return new Ne(this.chain(),Le.init,new A().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new ge(this.chain(),ge.ActionTypes.initWearable,new A().setContent([e]))}_flush(){return new ge(this.chain(),ge.ActionTypes.flush,new A)}reset(){return this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig),this}resolveTags(e,t){if(!B.isTagSrc(this))throw new Error(`Tag not defined
51
+ 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(c=>{let l=n.get(c);l&&i.set(l,c)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let c=i.get(a);if(!c)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(c)}),r}_setAppearanceSync(e){if(k.isImageSrc(e)||k.isColor(e)){if(k.isColor(e)&&!this.config.isBackground)throw new ue("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!B.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new ue(`Trying to mix src and tags
52
52
  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
53
53
  Wearable must be an Image with isWearable set to true
54
54
  It seems like you are trying to add a non-wearable image to wearables
55
55
  Image below violates the rule:
56
56
  `+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?`
57
57
  Tag "${e}" belongs to more than one group.`:"")+(t?`
58
- 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(ge.resolveCurrentSrc(this))._setTargetSrc(t))),new ge(e,ge.ActionTypes.setSrc,new A().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?B.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc(B.getSrcFromTags(e.defaults,e.resolve)):D.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(D.srcToURL(this.state.currentSrc)),this}static collectLayerGroups(e){let t=[],n=new Set;for(let i of e){if(!B.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 B.isLayeredDefinition(e)?{groups:B.collectLayerGroups(e.layers),defaults:[...e.defaults],resolve:null,slots:e.layers}:B.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return B.DefaultImageConfig.create({...t,src:B.normalizeSrcDefinition(t.src)})}getInitialState(){return B.DefaultImageState.create().assign({currentSrc:B.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(le.DefaultTransformState.keys());return new le(le.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(B.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
58
+ 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(ge.resolveCurrentSrc(this))._setTargetSrc(t))),new ge(e,ge.ActionTypes.setSrc,new A().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?B.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc(B.getSrcFromTags(e.defaults,e.resolve)):k.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(k.srcToURL(this.state.currentSrc)),this}static collectLayerGroups(e){let t=[],n=new Set;for(let i of e){if(!B.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 B.isLayeredDefinition(e)?{groups:B.collectLayerGroups(e.layers),defaults:[...e.defaults],resolve:null,slots:e.layers}:B.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return B.DefaultImageConfig.create({...t,src:B.normalizeSrcDefinition(t.src)})}getInitialState(){return B.DefaultImageState.create().assign({currentSrc:B.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(le.DefaultTransformState.keys());return new le(le.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(B.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
59
59
  Tag "${r}" is conflicting with another tag
60
60
  Error found in config.tag.defaults`);if(!n.has(r))throw new Error(`Tag not found
61
61
  Tag "${r}" is not defined in tagDefinitions
62
62
  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 ue(`Layer has no default
63
- 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 ge(e,ge.ActionTypes.setDarkness,new A().setContent([t,n,i]))}};B.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",B.StateSerializer=new qe,B.DefaultUserConfig=new $({name:"(anonymous)",autoInit:!0,src:B.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...le.DefaultTransformState.getDefaultConfig()},{position:e=>N.tryParsePosition(e)}),B.DefaultImageConfig=new $({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),B.DefaultImageState=new $({currentSrc:B.DefaultImagePlaceholder,darkness:0});var R=B;var Ue=class extends Tt{_setPrevLayers(e){return this._prevLayers=e,this}_setTargetLayers(e){return this._targetLayers=e,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(e){return this._prevSrc=e,this}_setTargetSrc(e){return this._targetSrc=e,this}_setCurrentSrc(e){return this._currentSrc=e,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(e){let t=super.requestAnimations(e);return t.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),t}asPrev(e){return super.asPrev((...t)=>W(e(...t),this._srcToProps(this._prevSrc)))}asTarget(e){return super.asTarget((...t)=>W(e(...t),this._srcToProps(this._targetSrc)))}_srcToProps(e){if(this._isLayered())return{};if(D.isColor(e))return{src:R.DefaultImagePlaceholder,style:{backgroundColor:D.isRGBAColor(e)?D.RGBAColorToHex(e):e}};if(D.isImageSrc(e))return{src:D.srcToURL(e)};throw new ue("Image transition src cannot be identified, using: "+e)}};var ei=class o extends Ue{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:this.from,end:this.to,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(e=>({style:{filter:`brightness(${1-e})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o({from:this.from,to:this.to,duration:this.duration,easing:this.easing})}};var ti=class ti extends j{static resolveTagSrc(e,t){if(!R.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return R.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(R.isLayeredSrc(e))throw e._mixedSrcError();if(R.isStaticSrc(e))return D.isImageSrc(e.state.currentSrc)?D.srcToURL(e.state.currentSrc):e.state.currentSrc;if(R.isTagSrc(e)&&e.config.src.resolve)return R.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===et.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===et.setSrc){let n=this.contentNode.getContent()[0];if(D.isColor(n)&&!this.callee.config.isBackground)throw new ue("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===et.flush)return super.executeAction(e,t);if(this.type===et.setAppearance){let[n,i]=this.contentNode.getContent();if(!R.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],c=()=>{this.callee.state.currentSrc=a};if(R.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let d=new S(y=>y).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevLayers(R.getSrcURLs(this.callee))._setTargetLayers(R.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),m=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:m},c,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),e.stage.update(),e.getExposedState(this.callee)?.flush(),super.executeAction(e,t)}let l=this.callee.config.src.resolve;if(!l)throw this.callee._invalidSrcHandlerError();let u=R.getSrcFromTags(s,l);if(e.logger.debug("Image - Set Appearance",s,u),i){let d=new S(y=>y).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevSrc(ti.resolveCurrentSrc(this.callee))._setTargetSrc(u);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),m=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:m},c,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===et.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},c=e.getExposedStateForce(this.callee);if(i){let l=new S(h=>h),u=new ei({from:s,to:n,duration:i,easing:r});if(R.isLayeredSrc(this.callee)){let h=R.getSrcURLs(this.callee);u._setPrevLayers(h)._setTargetLayers(h)}else{let h=ti.resolveCurrentSrc(this.callee);u._setPrevSrc(h)._setTargetSrc(h)}let d=c.applyTransition(u,()=>{this.callee.state.darkness=n,l.resolve(super.executeAction(e,t))}),p=e.timelines.attachTimeline(l).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:p},()=>{l.isSettled()||l.abort(),d.abort(),a()}),l}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),c.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};ti.ActionTypes=et;var ge=ti;var Ht=class Ht extends j{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 Ht.initBackgroundMusic(e,r),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t){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 ue("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);t.addElement(r),n.local.getNamespace(t.getStorable()).load(e.local),e.state&&n.fromData(e.state),e.background&&n.background.fromData(e.background)}applyTransition(e,t,n){let i=new S().registerSkipController(new V(()=>(e.logger.info("Background Transition","Skipped"),super.executeAction(e,n))));return e.getExposedStateForce(this.callee.background).applyTransition(t,()=>{i.resolve(super.executeAction(e,n))}),e.timelines.attachTimeline(i),i}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}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(l=>l),c=null;return a.registerSkipController(new V(()=>(c&&(clearTimeout(c),c=null),s))),c=e.setTimeout(()=>{c=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===q.action)return super.executeAction(e,t);if(this.is(Ht,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{this.exit(e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return Ht.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===q.exit){let n=Ht.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),Ht.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),Ht.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===q.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();e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let[c]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(a,c)},[r]);let s=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:s}),null}else if(this.type===q.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},c=>{s.setBackgroundMusic(c,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===q.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===q.transitionToScene){let[n,i,r]=this.contentNode.getContent();return n._setPrevSrc(ge.resolveCurrentSrc(this.callee.background)),i?n._setTargetSrc(ge.resolveCurrentSrc(i.background)):r&&n._setTargetSrc(r),this.applyTransition(e,n,t)}else if(this.type===q.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===q.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===q.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===q.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===q.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===q.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 ue(`Scene with name ${e} not found
63
+ 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 ge(e,ge.ActionTypes.setDarkness,new A().setContent([t,n,i]))}};B.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",B.StateSerializer=new qe,B.DefaultUserConfig=new $({name:"(anonymous)",autoInit:!0,src:B.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...le.DefaultTransformState.getDefaultConfig()},{position:e=>N.tryParsePosition(e)}),B.DefaultImageConfig=new $({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),B.DefaultImageState=new $({currentSrc:B.DefaultImagePlaceholder,darkness:0});var R=B;var Ue=class extends bt{_setPrevLayers(e){return this._prevLayers=e,this}_setTargetLayers(e){return this._targetLayers=e,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(e){return this._prevSrc=e,this}_setTargetSrc(e){return this._targetSrc=e,this}_setCurrentSrc(e){return this._currentSrc=e,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(e){let t=super.requestAnimations(e);return t.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),t}asPrev(e){return super.asPrev((...t)=>W(e(...t),this._srcToProps(this._prevSrc)))}asTarget(e){return super.asTarget((...t)=>W(e(...t),this._srcToProps(this._targetSrc)))}_srcToProps(e){if(this._isLayered())return{};if(k.isColor(e))return{src:R.DefaultImagePlaceholder,style:{backgroundColor:k.isRGBAColor(e)?k.RGBAColorToHex(e):e}};if(k.isImageSrc(e))return{src:k.srcToURL(e)};throw new ue("Image transition src cannot be identified, using: "+e)}};var ei=class o extends Ue{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:this.from,end:this.to,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(e=>({style:{filter:`brightness(${1-e})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o({from:this.from,to:this.to,duration:this.duration,easing:this.easing})}};var ti=class ti extends j{static resolveTagSrc(e,t){if(!R.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return R.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(R.isLayeredSrc(e))throw e._mixedSrcError();if(R.isStaticSrc(e))return k.isImageSrc(e.state.currentSrc)?k.srcToURL(e.state.currentSrc):e.state.currentSrc;if(R.isTagSrc(e)&&e.config.src.resolve)return R.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===et.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===et.setSrc){let n=this.contentNode.getContent()[0];if(k.isColor(n)&&!this.callee.config.isBackground)throw new ue("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===et.flush)return super.executeAction(e,t);if(this.type===et.setAppearance){let[n,i]=this.contentNode.getContent();if(!R.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],c=()=>{this.callee.state.currentSrc=a};if(R.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let d=new S(y=>y).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevLayers(R.getSrcURLs(this.callee))._setTargetLayers(R.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),m=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:m},c,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),e.stage.update(),e.getExposedState(this.callee)?.flush(),super.executeAction(e,t)}let l=this.callee.config.src.resolve;if(!l)throw this.callee._invalidSrcHandlerError();let u=R.getSrcFromTags(s,l);if(e.logger.debug("Image - Set Appearance",s,u),i){let d=new S(y=>y).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevSrc(ti.resolveCurrentSrc(this.callee))._setTargetSrc(u);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),m=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:m},c,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===et.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},c=e.getExposedStateForce(this.callee);if(i){let l=new S(h=>h),u=new ei({from:s,to:n,duration:i,easing:r});if(R.isLayeredSrc(this.callee)){let h=R.getSrcURLs(this.callee);u._setPrevLayers(h)._setTargetLayers(h)}else{let h=ti.resolveCurrentSrc(this.callee);u._setPrevSrc(h)._setTargetSrc(h)}let d=c.applyTransition(u,()=>{this.callee.state.darkness=n,l.resolve(super.executeAction(e,t))}),p=e.timelines.attachTimeline(l).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:p},()=>{l.isSettled()||l.abort(),d.abort(),a()}),l}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),c.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};ti.ActionTypes=et;var ge=ti;var Ht=class Ht extends j{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 Ht.initBackgroundMusic(e,r),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t){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 ue("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);t.addElement(r),n.local.getNamespace(t.getStorable()).load(e.local),e.state&&n.fromData(e.state),e.background&&n.background.fromData(e.background)}applyTransition(e,t,n){let i=new S().registerSkipController(new V(()=>(e.logger.info("Background Transition","Skipped"),super.executeAction(e,n))));return e.getExposedStateForce(this.callee.background).applyTransition(t,()=>{i.resolve(super.executeAction(e,n))}),e.timelines.attachTimeline(i),i}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}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(l=>l),c=null;return a.registerSkipController(new V(()=>(c&&(clearTimeout(c),c=null),s))),c=e.setTimeout(()=>{c=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===q.action)return super.executeAction(e,t);if(this.is(Ht,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{this.exit(e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return Ht.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===q.exit){let n=Ht.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),Ht.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),Ht.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===q.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();e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let[c]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(a,c)},[r]);let s=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:s}),null}else if(this.type===q.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},c=>{s.setBackgroundMusic(c,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===q.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===q.transitionToScene){let[n,i,r]=this.contentNode.getContent();return n._setPrevSrc(ge.resolveCurrentSrc(this.callee.background)),i?n._setTargetSrc(ge.resolveCurrentSrc(i.background)):r&&n._setTargetSrc(r),this.applyTransition(e,n,t)}else if(this.type===q.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===q.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===q.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===q.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===q.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===q.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 ue(`Scene with name ${e} not found
64
64
  Make sure you have registered the scene using story.register
65
65
  Action: (id: ${this.getId()}) ${this.type}
66
- At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===q.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")}};Ht.ActionTypes=q;var re=Ht;var wr=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)}},gt=class gt{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)||gt.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return gt.isHexString(e)||gt.isNamedColor(e)||gt.isRGBAColor(e)}static isNamedColor(e){return $r(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(gt.isHexString(e))return e;if(gt.isNamedColor(e))return e;if(gt.isRGBAColor(e))return gt.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 offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,c=this.calc(i,s),l=this.calc(r,a),u=n.invertX?{right:c}:{left:c},d=n.invertY?{bottom:l}:{top:l};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)}};gt.RGBColor=wr;var D=gt,kr=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},xe=class o extends kr{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},Ii=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 c=a.contentNode.getChild();c&&c.action&&i.push(c.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof ge)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof re){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
66
+ At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===q.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")}};Ht.ActionTypes=q;var re=Ht;var kr=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)}},gt=class gt{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)||gt.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return gt.isHexString(e)||gt.isNamedColor(e)||gt.isRGBAColor(e)}static isNamedColor(e){return Br(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(gt.isHexString(e))return e;if(gt.isNamedColor(e))return e;if(gt.isRGBAColor(e))return gt.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 offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,c=this.calc(i,s),l=this.calc(r,a),u=n.invertX?{right:c}:{left:c},d=n.invertY?{bottom:l}:{top:l};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)}};gt.RGBColor=kr;var k=gt,Er=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},xe=class o extends Er{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},Ii=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 c=a.contentNode.getChild();c&&c.action&&i.push(c.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof ge)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof re){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
67
67
  Scene: ${s.config.name}
68
68
 
69
- At: ${t.__stack}`;throw new xe(a)}}else i.set(s.config.name,s);if(t.type===q.jumpTo){let a=t.contentNode.getContent()[0],c=e.getScene(a,!0);if(r.has(c))return;r.add(c)}}}checkImage(e,t){if(t.type===et.setSrc){let i=t.contentNode.getContent()[0];D.isImageURL(i)&&D.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},ue=class o extends Error{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("")}static getActionTrace(e){return`
69
+ At: ${t.__stack}`;throw new xe(a)}}else i.set(s.config.name,s);if(t.type===q.jumpTo){let a=t.contentNode.getContent()[0],c=e.getScene(a,!0);if(r.has(c))return;r.add(c)}}}checkImage(e,t){if(t.type===et.setSrc){let i=t.contentNode.getContent()[0];k.isImageURL(i)&&k.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},ue=class o extends Error{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("")}static getActionTrace(e){return`
70
70
  Using action (id: ${e.getId()})
71
- at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},I=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},De=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function Gu(o,e){return Q.color(o,e)}function Hu(o){return Q.bold(o)}function Fu(o){return Q.italic(o)}var Er=class o extends Ue{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 Pr=class o extends Ue{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})}};function Y(o){return o<0?0:o>1?1:o}function Ma(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function Dr(o){return{position:"absolute",top:"50%",left:"50%",width:"100%",height:"100%",transform:"translate(-50%, -50%)",backgroundColor:o}}function Na(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 Ga(o){return o==="vertical"?"to right":"to bottom"}var Lr=class o extends Ue{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-Y(t),filter:`blur(${e*Y(t)}px)`}})),this.asTarget(t=>({style:{opacity:Y(t),filter:`blur(${e*(1-Y(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var Ir=class o extends Ue{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*Y(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-Y(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};function G(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function fo(o,e,t){return o<e?e:o>t?t:o}var Ft=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${G(t)}deg`:Na(t);return{mask:(r,s)=>{let a=-n+(s?1-Y(r):Y(r))*(100+n);return s?`linear-gradient(${i}, transparent ${G(a)}%, #000 ${G(a+n)}%)`:`linear-gradient(${i}, #000 ${G(a)}%, transparent ${G(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${G(t)}deg`,`${G(t+180)}deg`]:t==="vertical"?["to bottom","to top"]:["to right","to left"];return{mask:(s,a)=>{let c=-n+Y(s)*(50+n);if(!a){let l=u=>`linear-gradient(${u}, #000 ${G(c)}%, transparent ${G(c+n)}%)`;return`${l(i)}, ${l(r)}`}if(c<0){let l=Y((c+n)/Math.max(n,1e-6));return`linear-gradient(${i}, transparent ${G(50-c-n)}%, rgba(0,0,0,${G(l)}) 50%, transparent ${G(50+c+n)}%)`}return`linear-gradient(${i}, transparent ${G(50-c-n)}%, #000 ${G(50-c)}%, #000 ${G(50+c)}%, transparent ${G(50+c+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 c=(1-Y(r))*150;return`radial-gradient(${i} at ${t}, transparent ${G(c-n)}%, #000 ${G(c)}%)`}let a=Y(r)*150;return`radial-gradient(${i} at ${t}, #000 ${G(a-n)}%, transparent ${G(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 c=r==="counterclockwise"!=!!a,l=-i+Y(s)*(360+i);if(c){let d=Math.max(0,360-l-i),p=Math.max(d,360-l);return`conic-gradient(from ${G(n)}deg at ${t}, transparent ${G(d)}deg, #000 ${G(p)}deg)`}let u=Math.max(0,l);return`conic-gradient(from ${G(n)}deg at ${t}, #000 ${G(u)}deg, transparent ${G(Math.max(u,l+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,c)=>{let l=-r+(c?1-Y(a):Y(a))*(s+r),u=fo(l,0,s),d=fo(l+r,0,s),p=`repeating-conic-gradient(from ${G(i)}deg at ${n}`;return c?`${p}, transparent 0deg, transparent ${G(u)}deg, #000 ${G(d)}deg, #000 ${G(s)}deg)`:`${p}, #000 0deg, #000 ${G(u)}deg, transparent ${G(d)}deg, transparent ${G(s)}deg)`}}}static blinds(e={}){let t=e.orientation??"horizontal",n=Math.max(1,e.slats??8),i=Math.max(0,e.feather??0),r=typeof t=="number"?`${G(t)}deg`:Ga(t),s=100/n;return{mask:(a,c)=>{let l=-i+(c?1-Y(a):Y(a))*(s+i),u=fo(l,0,s),d=fo(l+i,0,s);return c?`repeating-linear-gradient(${r}, transparent 0, transparent ${G(u)}%, #000 ${G(d)}%, #000 ${G(s)}%)`:`repeating-linear-gradient(${r}, #000 0, #000 ${G(u)}%, transparent ${G(d)}%, transparent ${G(s)}%)`}}}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=Y(e.stagger??0)*.5,a=(c,l,u)=>{let d=-i+Y(l)*(100+i);return u?`radial-gradient(circle farthest-corner at ${c}, transparent ${G(d)}%, #000 ${G(d+i)}%)`:`radial-gradient(circle farthest-corner at ${c}, #000 ${G(d)}%, transparent ${G(d+i)}%)`};return{size:`${G(100/n)}% ${G(100/t)}%`,repeat:"repeat",mask:(c,l)=>{let u=l?1-Y(c):Y(c);if(s<=0)return a("50% 50%",u,l);let d=Y(u/(1-s)),p=Y((u-s)/(1-s));return l?`${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 Ma(e.mask(t,n),e.size,e.repeat)}};var Rr=class o extends Ue{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold??.3,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{...Dr(this.color),opacity:Y(e)};let n={...Dr(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...Ft.toStyle(this.pattern,e,!this.inverted)}:{...n,...Ft.toStyle(this.uncover,e)}:{...n,...Ft.toStyle(this.pattern,e,this.inverted)}}createTask(){let t=(1-Y(this.hold))/2,n=1-t,i=.5,r=s=>s<=t?t<=0?1:s/t:s>=n?n>=1?1:(1-s)/(1-n):1;return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(s=>({style:{opacity:s<i?1:0}})),this.asTarget(s=>({style:{opacity:s<i?0:1}})),s=>({src:R.DefaultImagePlaceholder,style:this.coverStyle(r(s),s>=n)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var Mr=class o extends Ue{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:Ft.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var Nr=class extends Vn{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 z(()=>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 ho=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=Ie.isChained(e)?e.getActions():e;return Me.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static getLayerSrcs(e,t){return R.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 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),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}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()}}}};ho.DynamicPersistent=yn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
71
+ at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},I=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},De=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function Hu(o,e){return Q.color(o,e)}function Fu(o){return Q.bold(o)}function Vu(o){return Q.italic(o)}var Pr=class o extends Ue{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 Dr=class o extends Ue{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})}};function Y(o){return o<0?0:o>1?1:o}function Na(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function Lr(o){return{position:"absolute",top:"50%",left:"50%",width:"100%",height:"100%",transform:"translate(-50%, -50%)",backgroundColor:o}}function Ga(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 Ha(o){return o==="vertical"?"to right":"to bottom"}var Ir=class o extends Ue{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-Y(t),filter:`blur(${e*Y(t)}px)`}})),this.asTarget(t=>({style:{opacity:Y(t),filter:`blur(${e*(1-Y(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var Rr=class o extends Ue{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*Y(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-Y(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};function G(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function fo(o,e,t){return o<e?e:o>t?t:o}var Ft=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${G(t)}deg`:Ga(t);return{mask:(r,s)=>{let a=-n+(s?1-Y(r):Y(r))*(100+n);return s?`linear-gradient(${i}, transparent ${G(a)}%, #000 ${G(a+n)}%)`:`linear-gradient(${i}, #000 ${G(a)}%, transparent ${G(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${G(t)}deg`,`${G(t+180)}deg`]:t==="vertical"?["to bottom","to top"]:["to right","to left"];return{mask:(s,a)=>{let c=-n+Y(s)*(50+n);if(!a){let l=u=>`linear-gradient(${u}, #000 ${G(c)}%, transparent ${G(c+n)}%)`;return`${l(i)}, ${l(r)}`}if(c<0){let l=Y((c+n)/Math.max(n,1e-6));return`linear-gradient(${i}, transparent ${G(50-c-n)}%, rgba(0,0,0,${G(l)}) 50%, transparent ${G(50+c+n)}%)`}return`linear-gradient(${i}, transparent ${G(50-c-n)}%, #000 ${G(50-c)}%, #000 ${G(50+c)}%, transparent ${G(50+c+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 c=(1-Y(r))*150;return`radial-gradient(${i} at ${t}, transparent ${G(c-n)}%, #000 ${G(c)}%)`}let a=Y(r)*150;return`radial-gradient(${i} at ${t}, #000 ${G(a-n)}%, transparent ${G(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 c=r==="counterclockwise"!=!!a,l=-i+Y(s)*(360+i);if(c){let d=Math.max(0,360-l-i),p=Math.max(d,360-l);return`conic-gradient(from ${G(n)}deg at ${t}, transparent ${G(d)}deg, #000 ${G(p)}deg)`}let u=Math.max(0,l);return`conic-gradient(from ${G(n)}deg at ${t}, #000 ${G(u)}deg, transparent ${G(Math.max(u,l+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,c)=>{let l=-r+(c?1-Y(a):Y(a))*(s+r),u=fo(l,0,s),d=fo(l+r,0,s),p=`repeating-conic-gradient(from ${G(i)}deg at ${n}`;return c?`${p}, transparent 0deg, transparent ${G(u)}deg, #000 ${G(d)}deg, #000 ${G(s)}deg)`:`${p}, #000 0deg, #000 ${G(u)}deg, transparent ${G(d)}deg, transparent ${G(s)}deg)`}}}static blinds(e={}){let t=e.orientation??"horizontal",n=Math.max(1,e.slats??8),i=Math.max(0,e.feather??0),r=typeof t=="number"?`${G(t)}deg`:Ha(t),s=100/n;return{mask:(a,c)=>{let l=-i+(c?1-Y(a):Y(a))*(s+i),u=fo(l,0,s),d=fo(l+i,0,s);return c?`repeating-linear-gradient(${r}, transparent 0, transparent ${G(u)}%, #000 ${G(d)}%, #000 ${G(s)}%)`:`repeating-linear-gradient(${r}, #000 0, #000 ${G(u)}%, transparent ${G(d)}%, transparent ${G(s)}%)`}}}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=Y(e.stagger??0)*.5,a=(c,l,u)=>{let d=-i+Y(l)*(100+i);return u?`radial-gradient(circle farthest-corner at ${c}, transparent ${G(d)}%, #000 ${G(d+i)}%)`:`radial-gradient(circle farthest-corner at ${c}, #000 ${G(d)}%, transparent ${G(d+i)}%)`};return{size:`${G(100/n)}% ${G(100/t)}%`,repeat:"repeat",mask:(c,l)=>{let u=l?1-Y(c):Y(c);if(s<=0)return a("50% 50%",u,l);let d=Y(u/(1-s)),p=Y((u-s)/(1-s));return l?`${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 Na(e.mask(t,n),e.size,e.repeat)}};var Mr=class o extends Ue{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold??.3,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{...Lr(this.color),opacity:Y(e)};let n={...Lr(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...Ft.toStyle(this.pattern,e,!this.inverted)}:{...n,...Ft.toStyle(this.uncover,e)}:{...n,...Ft.toStyle(this.pattern,e,this.inverted)}}createTask(){let t=(1-Y(this.hold))/2,n=1-t,i=.5,r=s=>s<=t?t<=0?1:s/t:s>=n?n>=1?1:(1-s)/(1-n):1;return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(s=>({style:{opacity:s<i?1:0}})),this.asTarget(s=>({style:{opacity:s<i?0:1}})),s=>({src:R.DefaultImagePlaceholder,style:this.coverStyle(r(s),s>=n)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var Nr=class o extends Ue{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:Ft.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var Gr=class extends Vn{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 z(()=>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 ho=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=Ie.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 R.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 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),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}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()}}}};ho.DynamicPersistent=vn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
72
72
  @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-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,)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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}@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-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
73
- `,document.head.appendChild(o)}export{Jt as Align,zo as Avatar,Lr as BlurDissolve,Hn as Camera,xi as Character,Xe as CommonPosition,dn as CommonPositionType,Ao as Condition,Me as Control,nt as Coord2D,ei as Darkness,er as DefaultNvlContainer,qs as DefaultNvlDialogItem,ho as DevTools,Rl as Dialog,Er as Dissolve,Pu as ExposedStateType,Pr as FadeIn,Ws as FixedAspectRatioContainer,Nr as Gallery,ne as Game,Vi as GameMenu,Pa as GameProviders,L as GameState,R as Image,Ue as ImageTransition,At as Isolated,Qi as Item,Cn as KeyBindingType,_n as KeyMap,z as Lambda,Sn as Layer,rl as Layout,qn as LayoutRouterProvider,bt as LiveGame,Ft as Mask,wo as Menu,Gn as NVLToken,St as Namespace,Nt as Nametag,Rt as Narrator,Ji as Notifications,_o as NvlContainer,Ll as NvlDialogList,Yo as NvlProvider,ul as Page,jo as PageInjectContext,Ne as Pause,gn as Persistent,Ea as Player,On as Preference,Ir as Push,Mr as Reveal,hs as RootPath,it as Scene,Ae as Script,ve as Sentence,Vn as Service,Se as Sound,Ot as SoundType,pc as Stage,In as Storable,Fn as Story,Zt as Text,Ze as TextEvent,Rn as TextTransition,Mc as Texts,Lc as TextsPreview,Rr as ThroughColor,J as Transform,Tt as Transition,Do as Vfx,Po as Video,Q as Word,Hu as b,Gu as c,Fu as i,Ns as useAvatar,Bc as useDialog,M as useGame,Al as useIsNvlMode,wl as useIsNvlVisible,rn as useKeyBinding,vl as useLiveGame,wt as useNvl,Jo as useNvlDialogs,_c as useParams,Zc as usePathname,dt as usePreference,el as useQueryParams,xt as useRouter,Ko as useUIMenuContext,Qc as useVoiceState};
73
+ `,document.head.appendChild(o)}export{Zt as Align,jo as Avatar,Ir as BlurDissolve,Hn as Camera,xi as Character,Xe as CommonPosition,mn as CommonPositionType,ko as Condition,Ge as Control,nt as Coord2D,ei as Darkness,ir as DefaultNvlContainer,Js as DefaultNvlDialogItem,ho as DevTools,Gl as Dialog,Pr as Dissolve,Du as ExposedStateType,Dr as FadeIn,Bs as FixedAspectRatioContainer,Gr as Gallery,ne as Game,Vi as GameMenu,Da as GameProviders,L as GameState,R as Image,Ue as ImageTransition,At as Isolated,Qi as Item,xn as KeyBindingType,_n as KeyMap,z as Lambda,Tn as Layer,cl as Layout,qn as LayoutRouterProvider,Tt as LiveGame,Ft as Mask,Eo as Menu,Gn as NVLToken,St as Namespace,Nt as Nametag,Rt as Narrator,Ji as Notifications,nr as NvlContainer,Ml as NvlDialogList,er as NvlProvider,ml as Page,Xo as PageInjectContext,Re as Pause,yn as Persistent,Pa as Player,On as Preference,Rr as Push,Nr as Reveal,gs as RootPath,ot as Scene,Ae as Script,ve as Sentence,Vn as Service,Se as Sound,Kt as SoundType,dc as Stage,In as Storable,Fn as Story,en as Text,Ye as TextEvent,Rn as TextTransition,Nc as Texts,Ic as TextsPreview,Mr as ThroughColor,J as Transform,bt as Transition,Io as Vfx,Lo as Video,Q as Word,Fu as b,Hu as c,Vu as i,Fs as useAvatar,Qc as useDialog,M as useGame,El as useIsNvlMode,Pl as useIsNvlVisible,an as useKeyBinding,bl as useLiveGame,wt as useNvl,_o as useNvlDialogs,nl as useParams,tl as usePathname,dt as usePreference,il as useQueryParams,xt as useRouter,Wo as useUIMenuContext,Yc as useVoiceState};