narraleaf-react 0.38.0 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1,84 +1,90 @@
1
- var pe={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",applyLoop:"displayable:applyLoop",stopLoop:"displayable:stopLoop",init:"displayable:init",bringToFront:"displayable:bringToFront"},qt={say:"character:say",action:"character:action",setName:"character:setName"},J={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 ft={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},$s={action:"condition:action"},js={action:"script:action"},qs={action:"menu:action"},Gt={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute",seek:"sound:seek"},ne={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"},Fi={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},qn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},yn={action:"layer:action",setZIndex:"layer:setZIndex"},wt={action:"video:action",preload:"video:preload",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"},Yt={action:"vfx:action",preload:"vfx:preload",show:"vfx:show",hide:"vfx:hide",pause:"vfx:pause",resume:"vfx:resume",setRate:"vfx:setRate"},_e={action:"puppet:action",setMotion:"puppet:setMotion",setExpression:"puppet:setExpression",setSkin:"puppet:setSkin",setParam:"puppet:setParam",setSlot:"puppet:setSlot",command:"puppet:command"};var Ys=(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))(Ys||{}),or=(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});or.DataTypes=Ys;function j(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,l)=>or(a)===3&&or(l)===3?a.constructor!==Object||l.constructor!==Object?l||a:j(a,l):Array.isArray(a)&&Array.isArray(l)?l&&l.length>0?[...l]:[...a]:a===void 0&&Array.isArray(l)?[...l]:l===void 0?Array.isArray(a)?[...a]:a:Array.isArray(l)?[...l]:l;for(let s in o)n(o,s)&&(i[s]=r(s,o[s],e[s]));for(let s in e)n(e,s)&&!n(i,s)&&(typeof e[s]=="object"&&e[s]!==null?e[s].constructor===Object?i[s]=j({},e[s]):Array.isArray(e[s])?i[s]=[...e[s]]:i[s]=e[s]:i[s]=e[s]);if(t.length){let[s,...a]=t;return j(i,s,...a)}return i}var $e=class $e{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=rr()}static isAwaitable(e){return e instanceof $e}static fromPromise(e){let t=new $e;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new $e;return t.resolve(e),t}static delay(e){let t=new $e;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new $e;return e(t),t}static wait(e){let t=new $e;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new $e;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 $e().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 $e;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 $e;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>=$e.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>=$e.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()}}};$e.nothing=e=>e,$e.maxListeners=8;var S=$e;function Xs(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 Ln(o){return typeof o=="string"?o:`#${(o.r||0).toString(16).padStart(2,"0")}${(o.g||0).toString(16).padStart(2,"0")}${(o.b||0).toString(16).padStart(2,"0")}${o.a===void 0?"":o.a.toString(16).padStart(2,"0")}`}var Q=class{constructor(){this.events={};this.maxListeners=10}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),this.events[e].length>this.maxListeners&&console.warn(`NarraLeaf-React: Event ${e} has more than ${this.maxListeners} listeners (total: ${this.events[e].length}), this may cause performance issues.`),this.emit("event:EventDispatcher.register",e,t),{type:e,listener:t,cancel:()=>{this.off(e,t)}}}depends(e){return{cancel:()=>{e.forEach(t=>t.cancel())}}}off(e,t){this.events[e]&&(this.events[e]=this.events[e].filter(n=>n!==t))}emit(e,...t){if(!this.events[e])return 0;let n=this.events[e].length;return this.events[e].forEach(i=>{i(...t)}),n}once(e,t){let n=(...i)=>{t(...i),this.off(e,n)};return this.on(e,n)}async any(e,...t){if(this.events[e]||(this.events[e]=[]),this.events[e].length>0){await Promise.all(this.events[e].map(n=>n(...t)));return}return new Promise(n=>{let i="event:EventDispatcher.register",r=this.on(i,(s,a)=>{if(s===e){this.off(i,r);let l=a?.(...t);l!==null&&typeof l=="object"&&l.then?l.then(n):n(l)}}).listener})}setMaxListeners(e){return this.maxListeners=e,this}hasListeners(e){return this.events[e]?.length>0}clear(){this.events={}}};function rr(o=1){let e=new Error().stack;return e?e.split(`
1
+ var pe={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",applyLoop:"displayable:applyLoop",stopLoop:"displayable:stopLoop",init:"displayable:init",bringToFront:"displayable:bringToFront"},Yt={say:"character:say",action:"character:action",setName:"character:setName"},z={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",callTo:"scene:callTo",preSuspend:"scene:preSuspend",resume:"scene:resume",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var ht={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},js={action:"condition:action"},qs={action:"script:action"},Ys={action:"menu:action"},Ft={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute",seek:"sound:seek"},ie={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"},Oi={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},qn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},yn={action:"layer:action",setZIndex:"layer:setZIndex"},kt={action:"video:action",preload:"video:preload",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"},Xt={action:"vfx:action",preload:"vfx:preload",show:"vfx:show",hide:"vfx:hide",pause:"vfx:pause",resume:"vfx:resume",setRate:"vfx:setRate"},Ze={action:"puppet:action",setMotion:"puppet:setMotion",setExpression:"puppet:setExpression",setSkin:"puppet:setSkin",setParam:"puppet:setParam",setSlot:"puppet:setSlot",command:"puppet:command"};var Xs=(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))(Xs||{}),or=(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});or.DataTypes=Xs;function q(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,c)=>or(a)===3&&or(c)===3?a.constructor!==Object||c.constructor!==Object?c||a:q(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]=q({},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 q(i,s,...a)}return i}var je=class je{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=rr()}static isAwaitable(e){return e instanceof je}static fromPromise(e){let t=new je;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new je;return t.resolve(e),t}static delay(e){let t=new je;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new je;return e(t),t}static wait(e){let t=new je;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new je;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 je().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 je;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 je;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>=je.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>=je.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()}}};je.nothing=e=>e,je.maxListeners=8;var S=je;function Qs(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 Ln(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 _=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 rr(o=1){let e=new Error().stack;return e?e.split(`
2
2
  `).slice(o+1).join(`
3
- `).trim():""}function zi(o){return new Promise(e=>setTimeout(e,o))}var Bi=class Bi{constructor(e){this.abortHandler=e;this.events=new Q;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(Bi.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};Bi.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=Bi;var Yn=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}},En=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new Yn;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 Ki(o,e,t={}){return o?e:t}function Qs(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var Oi=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 Js(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 _s(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 Dn=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 zi(this.delay),await e())};await e()}};function at(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function Zs(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var je=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 ea(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 ta(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function Xn(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function sr(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"&&!sr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Hi=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function $i(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 na(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Vi=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 Wi=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 ia(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 oa(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,l=16777216,c=r*a>>>0,u=r*l+s*a>>>0,d=s*l+(u>>>0)>>>0;e=c,t=d}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var Qn=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=rr(),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]:[]}};Qn.ActionTypes={action:"action"};var Y=class extends Qn{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 Xt=class Xt extends Y{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await Xt.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 te("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)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new V(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),l=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{r.isSettled()||r.abort(),a.abort()}),r}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(c=>c),l=null;return a.registerSkipController(new V(()=>(l&&(clearTimeout(l),l=null),s))),l=e.setTimeout(()=>{l=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===J.action)return super.executeAction(e,t);if(this.is(Xt,"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 Xt.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===J.exit){let n=Xt.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),Xt.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),Xt.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===J.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[l]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(a,l)},[r]);let s=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:s}),null}else if(this.type===J.setBackgroundMusic){let[n,i]=this.contentNode.getContent(),r=this.callee,s=e.getExposedStateForce(r),a=r.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{s.setBackgroundMusic(l,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===J.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===J.transitionToScene){let[n,i]=this.contentNode.getContent();return this.applyStageTransition(e,n,i,t)}else if(this.type===J.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===J.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===J.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===J.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===J.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===J.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 te(`Scene with name ${e} not found
3
+ `).trim():""}function Ki(o){return new Promise(e=>setTimeout(e,o))}var zi=class zi{constructor(e){this.abortHandler=e;this.events=new _;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(zi.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};zi.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=zi;var Yn=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}},En=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new Yn;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 $i(o,e,t={}){return o?e:t}function _s(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var Hi=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 Js(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 Zs(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 Dn=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 Ki(this.delay),await e())};await e()}};function ct(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function ea(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 ta(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 na(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function Xn(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function sr(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"&&!sr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Vi=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function ji(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 ia(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Ui=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},Wi=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 Bi=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 oa(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 ra(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 Qn=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=rr(),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]:[]}};Qn.ActionTypes={action:"action"};var X=class extends Qn{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 De=class De extends X{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 De.initBackgroundMusic(e,r,n),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t,n){n?.isSceneSuspended(e)||e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new Z("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);t.addElement(r),n.local.getNamespace(t.getStorable()).load(e.local),e.state&&n.fromData(e.state),e.background&&n.background.fromData(e.background)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new V(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),c=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:c},()=>{r.isSettled()||r.abort(),a.abort()}),r}static unloadScene(e,t){t.getStorable().removeNamespace(e.local.getNamespaceName()),t.offSrcManager(e.srcManager).removeScene(e),e.state.backgroundImage.reset()}static unwindCallStack(e){let t=e.getSuspendedScenes(),n=t.map(i=>[i,De.createSceneSnapshot(i,e)]);return t.forEach(i=>{i.events.emit("event:scene.preUnmount"),De.unloadScene(i,e)}),n}static rewindCallStack(e,t){e.forEach(([n,i])=>{let r=new S(s=>s);t.timelines.attachTimeline(r),De.handleSceneInit(n,{type:z.callTo,node:null},t,r),De.restoreSceneSnapshot(i,t),t.setSceneSuspended(n,!0)})}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===z.action)return super.executeAction(e,t);if(this.is(De,"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 De.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===z.exit){let n=De.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),De.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),De.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===z.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize(),s=De.unwindCallStack(e);e.actionHistory.push({action:this,stackModel:t.stackModel},(c,l)=>{De.rewindCallStack(l,e);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(c,u)},[r,s]);let a=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:a}),null}else if(this.type===z.preSuspend){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));if(e.isSceneActive(i))throw new Z(`Cannot call scene ${this.getSceneName(n)}: it is already on stage.
4
+ A returnable jump suspends the scene it leaves rather than unloading it, so a scene cannot be called from itself or from anything it has called.
5
+ Action: (id: ${this.getId()}) ${this.type}
6
+ At: ${this.__stack}`);let r=e.getSuspendedScenes().length,s=e.game.config.maxSceneCallDepth;if(r>=s)throw new Z(`Scene call depth limit reached (${s}).
7
+ Each returnable jump keeps the scene it left mounted, so a chain of them holds every scene in the chain on the stage at once. Raise maxSceneCallDepth if the story really needs to go this deep.
8
+ Action: (id: ${this.getId()}) ${this.type}
9
+ At: ${this.__stack}`);let a=this.callee.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{a&&e.audioManager.isManaged(a)&&e.audioManager.resume(a,0)},[]),a&&e.audioManager.isManaged(a)&&e.audioManager.pause(a,this.callee.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===z.callTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=this.contentNode.getChild();if(!r?.action)throw new be("A scene call has no return address. `scene:callTo` is only ever built with a `scene:resume` chained behind it (see Scene._callScene).");let s=this.callee,a=e.getLiveGame().getStackModelForce().serialize();e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{e.setSceneSuspended(s,!1);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(l,u)},[a]),e.setSceneSuspended(s,!0);let c=i.getSceneRoot().contentNode;return[{type:this.type,node:r},{type:this.type,node:c}]}else if(this.type===z.resume){let n=this.contentNode.getContent()[0],i=this.callee,r=i.state.backgroundMusic,s=De.createSceneSnapshot(n,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let c=new S(l=>l);e.timelines.attachTimeline(c),De.handleSceneInit(n,{type:this.type,node:this.contentNode.getChild()},e,c),De.restoreSceneSnapshot(a,e),e.setSceneSuspended(i,!0),r&&e.audioManager.isManaged(r)&&e.audioManager.pause(r,0)},[s]),n.events.emit("event:scene.preUnmount"),De.unloadScene(n,e),e.setSceneSuspended(i,!1),r&&e.audioManager.isManaged(r)&&e.audioManager.resume(r,i.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===z.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===z.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===z.transitionToScene){let[n,i]=this.contentNode.getContent();return this.applyStageTransition(e,n,i,t)}else if(this.type===z.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===z.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===z.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===z.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===z.callTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=r.getSceneRoot()?.contentNode,a=this.contentNode.getChild()?.action;return[...s?.action?[s.action]:[],...a?[a]:[]]}if(this.type===z.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===z.nvlBlock){let[i]=this.contentNode.getContent(),r=super.getFutureActions(e,t);return[...i??[],...r]}let n=this.contentNode.getChild()?.action;return n?[n]:[]}_sceneNotFoundError(e){return new Z(`Scene with name ${e} not found
4
10
  Make sure you have registered the scene using story.register
5
11
  Action: (id: ${this.getId()}) ${this.type}
6
- At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===J.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")}};Xt.ActionTypes=J;var ie=Xt;var ar=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},k=class o extends ar{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 ji={center:"center",left:"left",right:"right"};import{animate as sa}from"motion/react";var Rn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(Rn||{}),ra={left:"33.33%",center:"50%",right:"66.66%"},ht=class ht{static isUnknown(e){return e===ht.Unknown}static D2PositionToCSS(e,t=!1,n=!1,i){let r=this.calc(e.y,e.yoffset,i?.height),s=this.calc(e.x,e.xoffset,i?.width),a=n?{bottom:r}:{top:r},l=t?{right:s}:{left:s};return this.wrap({...a,...l})}static calc(e,t,n){if(!e||ht.isUnknown(e))return"auto";let i=!(t===void 0||ht.isUnknown(t));if(typeof n=="number"&&n>0){let s=ht.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}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(lt.isCommonPositionType(e))return gt.fromCommonPosition(e);if(gt.isCoord2DPosition(e))return e;if(vn.isAlignPosition(e))return gt.fromAlignPosition(e);if(typeof e=="object"&&e!==null&&["x","y","xalign","yalign","xoffset","yoffset"].some(t=>t in e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static orUnknown(e){return ht.isUnknown(e)||e===void 0?ht.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return gt.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:ht.isUnknown(t.x)?0:t.x,y:ht.isUnknown(t.y)?0:t.y,xoffset:ht.isUnknown(t.xoffset)?0:t.xoffset,yoffset:ht.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(Rn).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 lt||e instanceof gt||e instanceof vn}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return gt.fromCommonPosition(new lt(e));if(this.isRawAlignPosition(e))return gt.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new gt(e);throw new Error("Invalid position type")}static tryParsePosition(e){if(this.isPosition(e))return e;if(this.isRawPosition(e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static wrap(e){return{left:"auto",top:"auto",right:"auto",bottom:"auto",...e}}};ht.Unknown=Symbol("Unknown");var G=ht,qi=class qi{static isCommonPositionType(e){return e instanceof qi}constructor(e){this.position=e}toCSS(){return{x:ra[this.position],y:"50%",xoffset:0,yoffset:0}}};qi.Positions=Rn;var lt=qi,gt=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:ra[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||G.isUnknown(n)?G.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:G.isUnknown(t.x)?e.x:t.x,y:G.isUnknown(t.y)?e.y:t.y,xoffset:G.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:G.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=G.orUnknown(e.x),this.y=G.orUnknown(e.y),this.xoffset=G.orUnknown(e.xoffset),this.yoffset=G.orUnknown(e.yoffset)):(this.x=G.orUnknown(e),this.y=G.orUnknown(t),this.xoffset=G.Unknown,this.yoffset=G.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}}},vn=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=G.orUnknown(e.xalign),this.yalign=G.orUnknown(e.yalign),this.xoffset=G.orUnknown(e.xoffset),this.yoffset=G.orUnknown(e.yoffset)):(this.xalign=G.orUnknown(e),this.yalign=G.orUnknown(t),this.xoffset=G.Unknown,this.yoffset=G.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:G.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:G.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var K=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new lr(this.mergeWithDefaultConfig(e))}copy(){return new o(j({},this.defaultConfig),this.handlers)}keys(){return Object.keys(this.defaultConfig)}getDefaultConfig(){return this.defaultConfig}mergeWithDefaultConfig(e){return Object.fromEntries(Object.entries(this.defaultConfig).map(([t,n])=>[t,this.mergeValue(t,n,e[t])]))}mergeValue(e,t,n){return this.isPlainObject(n)?j({},n):Array.isArray(t)?Array.isArray(n)&&n.length>0?[...n]:[...t]:n!==void 0?this.applyHandler(e,n):t}isPlainObject(e){return typeof e=="object"&&!Array.isArray(e)&&e!==null&&Object.getPrototypeOf(e)===Object.prototype}applyHandler(e,t){return typeof this.handlers[e]=="function"?this.handlers[e](t):t}},lr=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(j({},this.config))}join(e){let t=Zs(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 kc={[ji.left]:"25.33%",[ji.center]:"50%",[ji.right]:"75.66%"},kt=class kt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new kt(kt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?G.toCoord2D(G.tryParsePosition(e||t)):G.mergePosition(G.tryParsePosition(e),G.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=kt.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 Xn(_.constructStyle(e,this.state,t))}toStyle(e,t){return Xn(_.constructStyle(e,this.state,t))}serialize(){return kt.TransformStateSerializer.serialize(this.state)}clone(){return new kt(kt.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=kt.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}resetTo(e){return this.state=e,this.locked=null,this.frozen=!1,this}};kt.DefaultTransformState=new K({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new lt("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}),kt.TransformStateSerializer=new je({position:e=>G.serializePosition(G.tryParsePosition(e))},{position:e=>G.toCoord2D(e)});var Z=kt,Ee=class Ee{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Ee.defaultConfig,t||{});else{let[n,i]=[e,t||Ee.defaultOptions];this.sequences.push({props:n,options:i||Ee.defaultOptions}),this.config=Object.assign({},Ee.defaultConfig)}}static isPosition(e){return lt.isCommonPositionType(e)||gt.isCoord2DPosition(e)||vn.isAlignPosition(e)}static immediate(e){return new Ee(e,{duration:0,ease:"linear"})}static left(e,t){return new Ee({position:lt.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Ee({position:lt.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Ee({position:lt.Positions.Center},{duration:e,ease:t})}static create(e){return new Ee([],e)}static positionToCSS(e,t,n,i){return e?G.isRawPosition(e)?G.D2PositionToCSS(G.rawPositionToCoord2D(e),n,t,i):G.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?G.toCoord2D(G.tryParsePosition(e||t)):G.mergePosition(G.tryParsePosition(e),G.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...j(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,l=function(p,h,f){return typeof p>"u"?typeof f<"u"?h(f):"":h(p)},c=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${c}, ${u})`,l(t.rotation,p=>`rotate(${p}deg)`,0),l(t.scaleX,p=>`scaleX(${p*a})`,1),l(t.scaleY,p=>`scaleY(${p*a})`,1)].filter(Boolean).join(" ")}static constructStyle(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{overwrite:s}=n||{},a=e.game?.config,l=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...Ee.positionToCSS(t.position,i,r,l),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?Ln(t.fontColor):void 0,transform:Ee.propToCSSTransform(e,t),...Ee.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i,companionRefs:r}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:s,sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(m=>!!m.ref.current).map(({ref:m,project:v})=>({el:m.current,project:v}))});if(a.length||t.logger.warn("Transform","No sequences to animate."),l.repeat!==void 0&&!Number.isFinite(l.repeat))throw new te("A transform applied with `transform()` (or `show`, `hide`, `pos`, ...) has to end, but this one repeats forever.\nUse `element.loop(transform)` for a motion that runs until it is stopped - the line does not wait for it, and `element.stopLoop()` ends it.");let c=!1,u=e.lock(),d=sa(a,l),p=()=>{e.overwrite(u,s.get()).unlock(u),d.complete(),c=!0},h=new S().registerSkipController(new V(p)),f=()=>{c||e.overwrite(u,s.get()).unlock(u),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),h.resolve()};return d.then(f,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{f()}catch{h.resolve()}})),d.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:s,sequences:a,options:l},this),h}startLoop(e,{gameState:t,ref:n,overwrites:i,companionRefs:r},s){if(!n.current)throw new Error("No ref found when looping.");this.commit();let{sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(d=>!!d.ref.current).map(({ref:d,project:p})=>({el:d.current,project:p}))});a.length||t.logger.warn("Transform","No sequences to loop.");let c=[n.current,Xn(e.toFramesDefinition(t,i)),{duration:0}],u=sa([c,...a],{...l,repeat:1/0,repeatType:s?.repeatType??l.repeatType??"loop",repeatDelay:s?.repeatDelay!==void 0?this.toSeconds(s.repeatDelay,void 0):l.repeatDelay});return u.play(),t.logger.debug("Transform","Loop started.",{sequences:a,options:l},this),{stop:()=>{u.stop()}}}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...Ee.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i,companions:r}){let s=t.clone(),a=s.lock(),l=this.sequences.flatMap(({props:c,options:u})=>{let d=s.assign(a,c),p=d.toFramesDefinition(e,n),h=this.getOptions(u),f=[i,p,h];if(!r||!r.length)return[f];let m=d.get();return[f,...r.map(({el:v,project:A})=>[v,Xn(A(m)),{...h,at:"<"}])]});return{finalState:s.unlock(a).freeze(),sequences:l,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t,repeatType:n}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0),repeatType:n}}copy(){return new Ee(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}lens(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new te("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 te("Invalid number in at definition.");let l=a/1e3;return r==="+"?`+${l}`:`-${l}`}};Ee.defaultConfig={sync:!0},Ee.defaultOptions={duration:0,ease:"linear"},Ee.CommonImagePositionMap=kc;var _=Ee;var Yi=class{constructor(){this.id="";this._staticId=null;this._dirty=!1}setId(e){this.id=e}getId(){return this.id}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}markDirty(){return this._dirty=!0,this}isDirty(){return this._dirty}reset(){this._dirty=!1}fromData(e){return this}construct(e){for(let t=0;t<e.length;t++){let n=e[t];t!==0&&e[t-1]?.contentNode.setChild(n.contentNode)}return e}};var aa=Symbol("_Chained"),la;la=aa;var cr=class cr{constructor(e){this[la]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[aa]}static toActions(e){return e.flat(2).map(t=>cr.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()}},Ue=cr,In=class extends Yi{chain(e){let t=Ue.isChained(this)?this:this.proxy(this,new Ue(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 le=class extends In{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var Ft=class extends Y{executeAction(e,t){let n=this.callee.evaluate(this.contentNode.getContent(),{gameState:e});return n?.length?[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]:super.executeAction(e,t)}getFutureActions(e,t){return[...this.callee._getFutureActions(),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=s=>{let a=s.condition?n?s.condition.toString():"Lambda(unknown)":"null",l=s.action?s.action.map(c=>c.stringify(e,t,n)).join(";"):"null";return`(${a}) {${l}}`};return super.stringifyWithContent("Condition",`if ${r(i.If)} ${i.ElseIf.length>0?`else if ${i.ElseIf.map(r).join(";")} `:""}${i.Else?`else {${r(i.Else)}}`:""}`)}};Ft.ActionTypes=$s;var Jn=64;function ua(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function ur(o){return o.length?o.map(e=>typeof e=="number"?`[${e}]`:`.${e}`).join(""):"the value itself"}function Xi(o,e=0,t=new Set){if(e>Jn)return!1;if(typeof o=="number"||typeof o=="string"||typeof o=="boolean"||o==null||o instanceof Date)return!0;if(typeof o!="object"||t.has(o))return!1;t.add(o);try{return Array.isArray(o)?o.every(n=>Xi(n,e+1,t)):ua(o)?Object.values(o).every(n=>Xi(n,e+1,t)):!1}finally{t.delete(o)}}function pa(o,e){let t=[],n=[];return{data:pr(o,[],0,new Set,t,n,e),dates:t,undefineds:n}}function pr(o,e,t,n,i,r,s){if(t>Jn)throw new E(`A stored value nests deeper than ${Jn} levels and cannot be saved
12
+ At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===z.callTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`callTo {${i.stringify(e,t,n)}}`)}if(this.type===z.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")}};De.ActionTypes=z;var ee=De;var ar=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},x=class o extends ar{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 qi={center:"center",left:"left",right:"right"};import{animate as aa}from"motion/react";var Rn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(Rn||{}),sa={left:"33.33%",center:"50%",right:"66.66%"},gt=class gt{static isUnknown(e){return e===gt.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||gt.isUnknown(e))return"auto";let i=!(t===void 0||gt.isUnknown(t));if(typeof n=="number"&&n>0){let s=gt.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(lt.isCommonPositionType(e))return yt.fromCommonPosition(e);if(yt.isCoord2DPosition(e))return e;if(vn.isAlignPosition(e))return yt.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 gt.isUnknown(e)||e===void 0?gt.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return yt.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:gt.isUnknown(t.x)?0:t.x,y:gt.isUnknown(t.y)?0:t.y,xoffset:gt.isUnknown(t.xoffset)?0:t.xoffset,yoffset:gt.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(Rn).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 lt||e instanceof yt||e instanceof vn}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return yt.fromCommonPosition(new lt(e));if(this.isRawAlignPosition(e))return yt.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new yt(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}}};gt.Unknown=Symbol("Unknown");var G=gt,Yi=class Yi{static isCommonPositionType(e){return e instanceof Yi}constructor(e){this.position=e}toCSS(){return{x:sa[this.position],y:"50%",xoffset:0,yoffset:0}}};Yi.Positions=Rn;var lt=Yi,yt=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:sa[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||G.isUnknown(n)?G.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:G.isUnknown(t.x)?e.x:t.x,y:G.isUnknown(t.y)?e.y:t.y,xoffset:G.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:G.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=G.orUnknown(e.x),this.y=G.orUnknown(e.y),this.xoffset=G.orUnknown(e.xoffset),this.yoffset=G.orUnknown(e.yoffset)):(this.x=G.orUnknown(e),this.y=G.orUnknown(t),this.xoffset=G.Unknown,this.yoffset=G.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}}},vn=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=G.orUnknown(e.xalign),this.yalign=G.orUnknown(e.yalign),this.xoffset=G.orUnknown(e.xoffset),this.yoffset=G.orUnknown(e.yoffset)):(this.xalign=G.orUnknown(e),this.yalign=G.orUnknown(t),this.xoffset=G.Unknown,this.yoffset=G.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:G.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:G.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 cr(this.mergeWithDefaultConfig(e))}copy(){return new o(q({},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)?q({},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}},cr=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(q({},this.config))}join(e){let t=ea(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 Pl={[qi.left]:"25.33%",[qi.center]:"50%",[qi.right]:"75.66%"},Pt=class Pt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new Pt(Pt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?G.toCoord2D(G.tryParsePosition(e||t)):G.mergePosition(G.tryParsePosition(e),G.tryParsePosition(t))}static mergeState(e,t){if("position"in e&&"position"in t){let n=this.mergePosition(e.position,t.position);return{...Object.assign({},e,t),position:n}}return{...Object.assign({},e,t)}}get(){return this.state}freeze(){return this.frozen=!0,this}assign(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Pt.mergeState(this.state,t),this}lock(){if(this.locked)throw new Error("Transform state is already locked.");return this.locked=Symbol(),this.locked}isLocked(){return!!this.locked}canWrite(e){return this.locked===null||this.locked===e}unlock(e){return this.locked===e&&(this.locked=null),this}toFramesDefinition(e,t){return Xn(J.constructStyle(e,this.state,t))}toStyle(e,t){return Xn(J.constructStyle(e,this.state,t))}serialize(){return Pt.TransformStateSerializer.serialize(this.state)}clone(){return new Pt(Pt.mergeState({},this.state))}overwrite(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Pt.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}resetTo(e){return this.state=e,this.locked=null,this.frozen=!1,this}};Pt.DefaultTransformState=new $({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new lt("center"),opacity:0,alt:"",maskImage:void 0,maskSize:void 0,maskPosition:void 0,maskRepeat:void 0,maskMode:void 0,clipPath:void 0,filter:void 0,backdropFilter:void 0,mixBlendMode:void 0}),Pt.TransformStateSerializer=new qe({position:e=>G.serializePosition(G.tryParsePosition(e))},{position:e=>G.toCoord2D(e)});var te=Pt,Le=class Le{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Le.defaultConfig,t||{});else{let[n,i]=[e,t||Le.defaultOptions];this.sequences.push({props:n,options:i||Le.defaultOptions}),this.config=Object.assign({},Le.defaultConfig)}}static isPosition(e){return lt.isCommonPositionType(e)||yt.isCoord2DPosition(e)||vn.isAlignPosition(e)}static immediate(e){return new Le(e,{duration:0,ease:"linear"})}static left(e,t){return new Le({position:lt.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Le({position:lt.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Le({position:lt.Positions.Center},{duration:e,ease:t})}static create(e){return new Le([],e)}static positionToCSS(e,t,n,i){return e?G.isRawPosition(e)?G.D2PositionToCSS(G.rawPositionToCoord2D(e),n,t,i):G.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?G.toCoord2D(G.tryParsePosition(e||t)):G.mergePosition(G.tryParsePosition(e),G.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...q(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,f){return typeof p>"u"?typeof f<"u"?h(f):"":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{...Le.positionToCSS(t.position,i,r,c),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?Ln(t.fontColor):void 0,transform:Le.propToCSSTransform(e,t),...Le.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i,companionRefs:r}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:s,sequences:a,options:c}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(m=>!!m.ref.current).map(({ref:m,project:v})=>({el:m.current,project:v}))});if(a.length||t.logger.warn("Transform","No sequences to animate."),c.repeat!==void 0&&!Number.isFinite(c.repeat))throw new Z("A transform applied with `transform()` (or `show`, `hide`, `pos`, ...) has to end, but this one repeats forever.\nUse `element.loop(transform)` for a motion that runs until it is stopped - the line does not wait for it, and `element.stopLoop()` ends it.");let l=!1,u=e.lock(),d=aa(a,c),p=()=>{e.overwrite(u,s.get()).unlock(u),d.complete(),l=!0},h=new S().registerSkipController(new V(p)),f=()=>{l||e.overwrite(u,s.get()).unlock(u),l=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),h.resolve()};return d.then(f,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{f()}catch{h.resolve()}})),d.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:s,sequences:a,options:c},this),h}startLoop(e,{gameState:t,ref:n,overwrites:i,companionRefs:r},s){if(!n.current)throw new Error("No ref found when looping.");this.commit();let{sequences:a,options:c}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(d=>!!d.ref.current).map(({ref:d,project:p})=>({el:d.current,project:p}))});a.length||t.logger.warn("Transform","No sequences to loop.");let l=[n.current,Xn(e.toFramesDefinition(t,i)),{duration:0}],u=aa([l,...a],{...c,repeat:1/0,repeatType:s?.repeatType??c.repeatType??"loop",repeatDelay:s?.repeatDelay!==void 0?this.toSeconds(s.repeatDelay,void 0):c.repeatDelay});return u.play(),t.logger.debug("Transform","Loop started.",{sequences:a,options:c},this),{stop:()=>{u.stop()}}}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...Le.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i,companions:r}){let s=t.clone(),a=s.lock(),c=this.sequences.flatMap(({props:l,options:u})=>{let d=s.assign(a,l),p=d.toFramesDefinition(e,n),h=this.getOptions(u),f=[i,p,h];if(!r||!r.length)return[f];let m=d.get();return[f,...r.map(({el:v,project:A})=>[v,Xn(A(m)),{...h,at:"<"}])]});return{finalState:s.unlock(a).freeze(),sequences:c,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t,repeatType:n}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0),repeatType:n}}copy(){return new Le(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}lens(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new Z("Invalid at definition. At definition must be a number or a string in the format of `+n` or `-n`.");let[i,r,s]=n,a=Number(s);if(isNaN(a))throw new Z("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};Le.defaultConfig={sync:!0},Le.defaultOptions={duration:0,ease:"linear"},Le.CommonImagePositionMap=Pl;var J=Le;var Xi=class{constructor(){this.id="";this._staticId=null;this._dirty=!1}setId(e){this.id=e}getId(){return this.id}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}markDirty(){return this._dirty=!0,this}isDirty(){return this._dirty}reset(){this._dirty=!1}fromData(e){return this}construct(e){for(let t=0;t<e.length;t++){let n=e[t];t!==0&&e[t-1]?.contentNode.setChild(n.contentNode)}return e}};var ca=Symbol("_Chained"),la;la=ca;var lr=class lr{constructor(e){this[la]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[ca]}static toActions(e){return e.flat(2).map(t=>lr.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()}},Be=lr,In=class extends Xi{chain(e){let t=Be.isChained(this)?this:this.proxy(this,new Be(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 ce=class extends In{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var Ot=class extends X{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)}}`:""}`)}};Ot.ActionTypes=js;var _n=64;function pa(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function ur(o){return o.length?o.map(e=>typeof e=="number"?`[${e}]`:`.${e}`).join(""):"the value itself"}function Qi(o,e=0,t=new Set){if(e>_n)return!1;if(typeof o=="number"||typeof o=="string"||typeof o=="boolean"||o==null||o instanceof Date)return!0;if(typeof o!="object"||t.has(o))return!1;t.add(o);try{return Array.isArray(o)?o.every(n=>Qi(n,e+1,t)):pa(o)?Object.values(o).every(n=>Qi(n,e+1,t)):!1}finally{t.delete(o)}}function da(o,e){let t=[],n=[];return{data:pr(o,[],0,new Set,t,n,e),dates:t,undefineds:n}}function pr(o,e,t,n,i,r,s){if(t>_n)throw new E(`A stored value nests deeper than ${_n} levels and cannot be saved
7
13
  at ${s}, ${ur(e)}
8
14
  A saved game this deep is almost always a data-structure bug. Flatten the value,
9
15
  or keep the deep part outside the store and save an id for it.`);if(o===void 0)return r.push([...e]),null;if(o===null)return null;if(o instanceof Date)return i.push([...e]),o.toISOString();if(typeof o=="number"||typeof o=="string"||typeof o=="boolean")return o;if(typeof o=="object"){if(n.has(o))throw new E(`A stored value refers back to itself and cannot be saved
10
16
  at ${s}, ${ur(e)}
11
17
  A saved game is a tree. Cutting the back-edge would save a different object graph
12
18
  than the one you built, so this is refused rather than guessed at \u2014 break the
13
- reference, or store an id in place of the object.`);if(Array.isArray(o)||ua(o)){n.add(o);try{if(Array.isArray(o))return o.map((l,c)=>pr(l,[...e,c],t+1,n,i,r,s));let a={};return Object.entries(o).forEach(([l,c])=>{a[l]=pr(c,[...e,l],t+1,n,i,r,s)}),a}finally{n.delete(o)}}}return console.warn(`Value of type "${Pc(o)}" cannot be saved and was stored as null
14
- at ${s}, ${ur(e)}`),null}function Pc(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function da(o,e,t){let n=ca(o,e,dr);return n=ca(n,t,()=>{}),n}function ca(o,e,t){if(!Array.isArray(e)||!e.length)return o;let n=o;for(let i of e){if(!Array.isArray(i))continue;if(!i.length){n=t(n);continue}let r=n;for(let a=0;a<i.length-1&&r!==null&&typeof r=="object";a++)r=r[i[a]];if(r===null||typeof r!="object")continue;let s=i[i.length-1];r[s]=t(r[s])}return n}function dr(o){return o instanceof Date?o:typeof o=="string"||typeof o=="number"?new Date(o):new Date(NaN)}function ma(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function mr(o,e,t=0){if(Object.is(o,e))return!0;if(t>Jn)return!1;if(o instanceof Date||e instanceof Date)return o instanceof Date&&e instanceof Date&&o.getTime()===e.getTime();if(Array.isArray(o)||Array.isArray(e))return Array.isArray(o)&&Array.isArray(e)&&o.length===e.length&&o.every((n,i)=>mr(n,e[i],t+1));if(ma(o)&&ma(e)){let n=Object.keys(o);return n.length===Object.keys(e).length&&n.every(i=>Object.prototype.hasOwnProperty.call(e,i)&&mr(o[i],e[i],t+1))}return!1}var Ot=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=j({},t),this.defaultContent=t}static isSerializable(e){return Xi(e)}set(e,t){let n=this.content[e];return o.isSerializable(t)?(this.content[e]=t,this.reportChange(e,n,t),this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
15
- at namespace "${this.name}"`),this.content[e]=t,this.reportChange(e,n,t),this)}get(e){return this.content[e]}equals(e,t){return this.content[e]===t}assign(e){return Object.entries(e).forEach(([t,n])=>{this.set(t,n)}),this}has(e){return this.content[e]!==void 0}keys(){return Object.keys(this.content)}values(){return Object.values(this.content)}entries(){return Object.entries(this.content)}reset(){let e=this.content;return this.content=j({},this.defaultContent),new Set([...Object.keys(e),...Object.keys(this.content)]).forEach(n=>{this.reportChange(n,e[n],this.content[n])}),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n,t)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)}),this.owner?.reportRestore(this.key)}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e,t){let n=`namespace "${this.name}"`+(t===void 0?"":`, key "${t}"`),i={any:s=>{let a=pa(s,n),l={type:"any",data:a.data};return a.dates.length&&(l.dates=a.dates),a.undefineds.length&&(l.undefineds=a.undefineds),l},date:s=>({type:"date",data:s.toISOString()})},r=this.toTypeName(e);return i[r](e)}unwrap(e){let n={any:i=>da(i.data,i.dates,i.undefineds),date:i=>dr(i.data)}[e?.type];return n?n(e):(console.warn(`Unknown stored value type "${e?.type}", reading it as-is
16
- at namespace "${this.name}"`),e?.data)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||mr(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},rn=class rn{constructor(){this.events=new Q;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new Ot(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,e.attach(this),this}getNamespace(e){if(!this.namespaces[e])throw new E(`Namespace ${e} is not initialized, did you forget to register it?
17
- Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(rn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(rn.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 Ot(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(rn.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(rn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(rn.EventTypes["event:storable.restore"],{namespaces:[e]})}};rn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var _n=rn;var gf={};var Mn=class extends In{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let l=a.getFutureActions(e,i).filter(c=>!r.has(c));s.push(...l)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var Ze=class extends Y{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Gt.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===Gt.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===Gt.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=S.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,l=>{l&&this.callee.fromData(l)},[s]),a}else if(this.type===Gt.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===Gt.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===Gt.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===Gt.seek){let[i]=this.contentNode.getContent(),r=e.audioManager.getPosition(this.callee),s=S.forward(e.audioManager.seek(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{e.audioManager.seek(this.callee,a)},[r]),s}else if(this.type===Gt.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")}};Ze.ActionTypes=Gt;var et={bgm:"bgm",sound:"sound",voice:"voice"},Qi=8,sn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Nn(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ei=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=l=>{t.set(l.id,{id:l.id,parentId:l.parentId??null,volume:Nn(l.volume)})};Object.values(et).forEach(l=>n({id:l}));let i=new Set;e.forEach(l=>{let c=l?.id;if(typeof c!="string"||c.trim().length===0)throw new sn(`Audio bus id must be a non-empty string, got ${JSON.stringify(c)}.`);if(i.has(c))throw new sn(`Audio bus "${c}" is declared more than once.`);i.add(c),n(l)}),o.assertResolvable(t);let r=[],s=new Map,a=l=>{let c=s.get(l);if(c)return c;let u=t.get(l),d=u.parentId===null?null:a(u.parentId),p={id:u.id,parentId:u.parentId,volume:u.volume,depth:d?d.depth+1:1};return s.set(l,p),r.push(p),p};return t.forEach(l=>a(l.id)),new o(r,s)}static isSeeded(e){return Object.values(et).includes(e)}static assertResolvable(e){e.forEach(t=>{let n=[t.id],i=new Set([t.id]),r=t;for(;r.parentId!==null;){let s=e.get(r.parentId);if(!s)throw new sn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new sn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>Qi)throw new sn(`Audio bus "${t.id}" nests deeper than ${Qi}: ${n.join(" -> ")}.`);r=s}})}getNodes(){return this.nodes}get(e){return this.index.get(e)??null}has(e){return this.index.has(e)}isUnder(e,t){let n=this.index.get(e),i=0;for(;n&&i<=Qi;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},fr=ei.resolve();function Ec(o){fr=o}function hr(){return fr}function Ji(o,e){let t=fr;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var fa={[et.bgm]:"bgmVolume",[et.sound]:"soundVolume",[et.voice]:"voiceVolume"};function ha(o){let e={};return Object.entries(fa).forEach(([t,n])=>{e[t]={get:()=>Nn(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var Zn=class Zn{constructor(e,t={}){this.declarations=e;this.events=new Q;this.overrides=new Map;this.aliasTokens=[];this.tree=null;this.events.setMaxListeners(64),this.aliases=t,Object.entries(t).forEach(([n,i])=>{this.aliasTokens.push(i.subscribe(r=>{this.announce(n,Nn(r))}))})}dispose(){this.aliasTokens.forEach(e=>e.cancel()),this.aliasTokens.length=0}announce(e,t){let n=t;try{n=this.getEffectiveVolume(e)}catch{}this.events.emit(Zn.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ei.resolve(this.declarations()??[]),Ec(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Nn(t),i=this.aliases[e];return i?(i.set(n),this):(this.overrides.set(e,n),this.announce(e,n),this)}setVolumes(e){return Object.entries(e).forEach(([t,n])=>this.setVolume(t,n)),this}getVolume(e){let t=this.aliases[e];return t?Nn(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Nn(this.getDeclaredVolume(e)*this.getVolume(e))}list(){return this.getTree().getNodes().map(e=>({id:e.id,parentId:e.parentId,volume:this.getVolume(e.id),declaredVolume:e.volume,effectiveVolume:this.getEffectiveVolume(e.id)}))}getVolumes(){let e={};return this.list().forEach(t=>{e[t.id]=t.volume}),e}onVolumeChange(e){return this.events.on(Zn.EventTypes["event:audioBus.volumeChange"],e)}};Zn.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var ti=Zn;var ga=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(ga||{}),be=class be extends le{static toSound(e){return e==null?null:typeof e=="string"?new be({src:e}):e}static isSound(e){return e instanceof be}static voice(e){let t=typeof e=="string"?{src:e}:e;return new be({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new be({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new be({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=be.DefaultUserConfig.create(t),[i]=n.extract(be.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){return hr().isUnder(this.config.type,et.bgm)&&console.warn(`NarraLeaf-React [Sound] Playing a bgm-typed sound (src: ${this.config.src}) with \`play()\`. It will play on the music bus but is not the scene's background music, so leaving the scene will not stop it and it will not cross-fade. Use \`scene.setBackgroundMusic()\` if that is what you wanted.`),this.pushAction(Ze.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(Ze.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(Ze.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(Ze.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(Ze.ActionTypes.setRate,[e])}pause(e){return this.pushAction(Ze.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(Ze.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(Ze.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:be.StateSerializer.serialize(this.state)}}fromData(e){return this.state=be.StateSerializer.deserialize(e.state),this}copy(){return new be(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return be.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new Ze(this.chain(),e,new k().setContent(t)))}};be.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",be.DefaultUserConfig=new K({src:be.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),be.DefaultConfig=new K({src:be.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),be.DefaultState=new K({volume:1,rate:1,paused:!1,muted:!1}),be.StateSerializer=new je;var ge=be;var Sn=class Sn{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===Sn.SrcTypes.image?t.add(s):r===Sn.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 N?N.getSrcURL(e):e.type==="image"?N.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ie,J.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(P.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof ye){let n=t;if(t.is(ye,ft.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===ft.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===ft.setAppearance){let i=t.contentNode.getContent()[0];if(N.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(N.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:N.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof N||P.isStaticImageData(e)){if(e instanceof N){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(N.getSrcURL(e)))return this}else if(this.isSrcRegistered(P.srcToURL(e.src)))return this;this.src.push({type:"image",src:P.isStaticImageData(e)?P.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Sn.SrcTypes.audio?t===n.src.getSrc():n.type===Sn.SrcTypes.image?t===N.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)}};Sn.SrcTypes={image:"image",video:"video",audio:"audio"};var De=Sn;import*as Ia from"howler";var We=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 ct=class o{static isTextEvent(e){return e instanceof o}static expression(e,t,n={}){return new o({expression:{image:e,appearance:t},sound:n.sound})}static sound(e){return new o({sound:e})}constructor(e){this.config=e}};function ya(o,e){let{render:t,data:n,...i}=e,r=j(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var ve=class ve{static isWord(e){return e instanceof ve}static color(e,t){return ve.isWord(e)?e.copy().assign({color:t}):new ve(e,{color:t})}static bold(e){return ve.isWord(e)?e.copy().assign({bold:!0}):new ve(e,{bold:!0})}static italic(e){return ve.isWord(e)?e.copy().assign({italic:!0}):new ve(e,{italic:!0})}static emphasis(e,t={}){return ve.isWord(e)?e.copy().assign({emphasis:t}):new ve(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return ve.isWord(e)?e.copy().assign(i):new ve(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=ya(ve.defaultConfig,t)}evaluate(e){if(We.isPause(this.text))return[this];if(ct.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>ve.isWord(n)?n.inherit(this.config).evaluate(e):new ve(n,this.config)).flat():ve.isWord(t)?t.inherit(this.config).evaluate(e):[new ve(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=ya(this.config,e),this}copy(){return new ve(this.text,this.config)}isPause(){return We.isPause(this.text)}isTextEvent(){return ct.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};ve.defaultConfig={},ve.defaultColor="#000";var ee=ve;var ut=class ut{static isSentence(e){return e instanceof ut}static toSentence(e){return ut.isSentence(e)?e:new ut(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 ee.isWord(e)?e:new ee(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[ee.isWord(e)?e:new ee(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(ut.isSingleWord):ut.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||ee.isWord(e)||We.isPause(e)||ct.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=ut.format(e),this.config=j(ut.defaultConfig,{...t,voice:typeof t.voice=="string"?ge.voice(t.voice):ge.toSound(t.voice)}),this.state=Xs(ut.defaultState)}toData(){return null}fromData(e){return this.state=j(this.state,e),this}toString(){return this.text.map(e=>e.text).join("")}setCharacter(e){return this.config.character=e,this}evaluate(e){let t=[];for(let n=0;n<this.text.length;n++){let i=this.text[n].evaluate(e);t.push(...ut.formatStaticWord(i))}return t}copy(){return new ut([...this.text],this.config)}};ut.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},ut.defaultState={};var me=ut;var _i=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 an=class extends Y{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};an.ActionTypes=js;var Ae=class o extends le{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 an(t,an.ActionTypes.action,new k().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new an(this.chain(),an.ActionTypes.action,new k().setContent(e))]}};var Dc={volume:1,limit:1/0},Lc=class Sa{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={...Dc,...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 Sa(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}}},Ta=!1;function Rc(o){Ta=o}function ln(o,e){Ta||(e!==void 0?console.warn(o,e):console.warn(o))}var Ic=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){ln("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){ln("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){ln("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()}},va=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}},Mc=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 Ic(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){ln("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){ln("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 va(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new va(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}},Nc=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}},Gc=10*1024*1024,Fc=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 Nc(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}}},Oc={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},ba=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...Oc,...o},Rc(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Fc(this.audioContext),this.masterChannel=new Lc("__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=>{ln("Failed to resume AudioContext while unlocking.",t)})};this.unlockHandler=e,document.addEventListener("click",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",e)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let o=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",o),document.removeEventListener("touchstart",o),document.removeEventListener("keydown",o)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(o,e,t){this.ensureNotDestroyed(),this.ensureReady();let{volume:n=1,rate:i=1,startTime:r=0,endTime:s,load:a="auto",loop:l=!1}=e??{},c,u=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")c=this.createStreamSource(o);else{u=await this.audioCache.load(o),u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=u.raw(),c=p}else{u=o,u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=o.raw(),c=p}let d=new Mc(this.audioContext,c,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(c instanceof AudioBufferSourceNode?(c.loop=l,l&&s!==void 0&&(c.loopStart=r,c.loopEnd=s)):c instanceof HTMLAudioElement&&(c.loop=l),u){let p=!1,h=()=>{p||(p=!0,u.releaseRef?.())};d.once("ended",h),d.once("stop",h)}return d}async resolveLoadMode(o,e){if(e==="stream"||e==="full")return e;try{let t=await fetch(o,{method:"HEAD"});if(!t.ok)return"stream";let n=t.headers.get("Content-Length");if(!n)return"stream";let i=parseInt(n,10);return isNaN(i)?"stream":i<Gc?"full":"stream"}catch(t){return ln("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=>{ln("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var de=class de{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new ba({maxChannels:de.MaxChannels});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=de.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,de.BusRampTimeConstant),r.setValueAtTime(s,a+de.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${et.sound}" instead.`)),this.channels.get(et.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=de.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channelFor(e),r=await this.sound.load(e.config.src),s=de.clipRegionOf(e),a=await i.play(r,{volume:0,...de.playRegionOf(s,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,s);let l=e.state.muted??!1;a.mute(l),e.state.muted=l,this.state.set(e,{token:a,cachedAudio:r,originalVolume:t.end}),t.duration>0?await a.fade(0,t.end,t.duration).finished:a.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(c=>{a.once("ended",()=>c())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t=de.defaultFade(e)){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await this.sound.load(e.config.src),r=de.clipRegionOf(e),s=await n.play(i,{volume:0,...de.playRegionOf(r,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(s,r);let a=e.state.muted??!1;return s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:i,originalVolume:t.end}),t.duration>0?s.fade(0,t.end,t.duration):s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,s}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return 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}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=de.clampToRegion(t,de.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}static playRegionOf(e,t){return t||e.endTime===void 0?{startTime:e.startTime}:{startTime:e.startTime,endTime:e.endTime}}static applyLoopRegion(e,t){let{startTime:n,endTime:i}=t;if(i===void 0||!Number.isFinite(i)||i<=n||typeof AudioBufferSourceNode>"u")return;let r=e.sourceController;if(typeof r?.getSource!="function")return;let s=r.getSource();if(!(s instanceof AudioBufferSourceNode))return;let a=t.loopStart,l=a!==void 0&&Number.isFinite(a)?Math.min(Math.max(a,n),i):n;s.loop=!0,s.loopStart=l<i?l:n,s.loopEnd=i}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime()}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=await this.sound.load(e.config.src),r=de.clipRegionOf(e),s=r.endTime!==void 0&&e.config.loop,a=await n.play(i,{volume:e.state.volume,...de.playRegionOf(r,e.config.loop),startTime:s?r.startTime:t.position,loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,r),s&&Math.abs(t.position-r.startTime)>.01&&a.seek(de.clampToRegion(t.position,r)),this.state.set(e,{token:a,cachedAudio:i,originalVolume:e.state.volume});let l=e.state.muted??!1;a.mute(l),e.state.muted=l,e.state.paused?a.pause():t.isPlaying||a.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}preload(e){return this.ready.then(()=>this.sound.load(e.config.src)).then(()=>{}).catch(t=>{this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${e.config.src}")`,t)})}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};de.MaxChannels=1024,de.BusRampTimeConstant=.02,de.BusRampSettle=de.BusRampTimeConstant*5;var Zi=de;var eo=class{constructor(e){this.config=e;this.watching=null;this.warnings=[]}observe(e){return this.watching=e,this}warn(e,t){return this.warnings.push([e,t]),this.watching?.logger.warn(t),t}getWarnings(){return[...this.warnings]}};import*as Kc from"html-to-image";var Ce=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()}),at(()=>{this.preventAttach()})}static proxy(e){let t=new S,n=new S,i=new o(n);return i.onTimelineRegistered(()=>{n.resolve()}).onSettled(()=>{let[r,s]=i.catSettled();e(r,s)}),t.onSkipControllerRegister(r=>{r.onAbort(()=>{i.abort()})}),[t,i]}static any(e){if(e.length===0)throw new E("Cannot create an 'any' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=!1;for(let s of e)i.attachChild(s),s.then(a=>{r||(r=!0,t.resolve(a))});return t.onSkipControllerRegister(s=>{s.onAbort(()=>{i.abort()})}),[t,i]}static all(e){if(e.length===0)throw new E("Cannot create an 'all' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let l=e[a];i.attachChild(l),l.then(c=>{r[a]=c,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(l=>{a=l.onAbort(()=>{r.abort()})}),i.then(l=>{a?.cancel(),n=l,i=e(l),i?at(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?at(()=>s()):at(()=>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()?at(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
19
+ reference, or store an id in place of the object.`);if(Array.isArray(o)||pa(o)){n.add(o);try{if(Array.isArray(o))return o.map((c,l)=>pr(c,[...e,l],t+1,n,i,r,s));let a={};return Object.entries(o).forEach(([c,l])=>{a[c]=pr(l,[...e,c],t+1,n,i,r,s)}),a}finally{n.delete(o)}}}return console.warn(`Value of type "${El(o)}" cannot be saved and was stored as null
20
+ at ${s}, ${ur(e)}`),null}function El(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function ma(o,e,t){let n=ua(o,e,dr);return n=ua(n,t,()=>{}),n}function ua(o,e,t){if(!Array.isArray(e)||!e.length)return o;let n=o;for(let i of e){if(!Array.isArray(i))continue;if(!i.length){n=t(n);continue}let r=n;for(let a=0;a<i.length-1&&r!==null&&typeof r=="object";a++)r=r[i[a]];if(r===null||typeof r!="object")continue;let s=i[i.length-1];r[s]=t(r[s])}return n}function dr(o){return o instanceof Date?o:typeof o=="string"||typeof o=="number"?new Date(o):new Date(NaN)}function fa(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function mr(o,e,t=0){if(Object.is(o,e))return!0;if(t>_n)return!1;if(o instanceof Date||e instanceof Date)return o instanceof Date&&e instanceof Date&&o.getTime()===e.getTime();if(Array.isArray(o)||Array.isArray(e))return Array.isArray(o)&&Array.isArray(e)&&o.length===e.length&&o.every((n,i)=>mr(n,e[i],t+1));if(fa(o)&&fa(e)){let n=Object.keys(o);return n.length===Object.keys(e).length&&n.every(i=>Object.prototype.hasOwnProperty.call(e,i)&&mr(o[i],e[i],t+1))}return!1}var Ht=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=q({},t),this.defaultContent=t}static isSerializable(e){return Qi(e)}set(e,t){let n=this.content[e];return o.isSerializable(t)?(this.content[e]=t,this.reportChange(e,n,t),this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
21
+ 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=q({},this.defaultContent),new Set([...Object.keys(e),...Object.keys(this.content)]).forEach(n=>{this.reportChange(n,e[n],this.content[n])}),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n,t)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)}),this.owner?.reportRestore(this.key)}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e,t){let n=`namespace "${this.name}"`+(t===void 0?"":`, key "${t}"`),i={any:s=>{let a=da(s,n),c={type:"any",data:a.data};return a.dates.length&&(c.dates=a.dates),a.undefineds.length&&(c.undefineds=a.undefineds),c},date:s=>({type:"date",data:s.toISOString()})},r=this.toTypeName(e);return i[r](e)}unwrap(e){let n={any:i=>ma(i.data,i.dates,i.undefineds),date:i=>dr(i.data)}[e?.type];return n?n(e):(console.warn(`Unknown stored value type "${e?.type}", reading it as-is
22
+ at namespace "${this.name}"`),e?.data)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||mr(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},rn=class rn{constructor(){this.events=new _;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new Ht(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,e.attach(this),this}getNamespace(e){if(!this.namespaces[e])throw new E(`Namespace ${e} is not initialized, did you forget to register it?
23
+ Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(rn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(rn.EventTypes["event:storable.restore"],e)}toData(){return this.entries().reduce((e,[t,n])=>(e[t]=n.toData(),e),{})}load(e){if(!e){console.warn("No data to load");return}let t=this.restoreBatch=new Set;try{Object.entries(e).forEach(([n,i])=>{this.namespaces[n]||this.addNamespace(new Ht(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(rn.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(rn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(rn.EventTypes["event:storable.restore"],{namespaces:[e]})}};rn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var Jn=rn;var yf={};var Mn=class extends In{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 et=class extends X{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ft.play){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.play(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.stop){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.stop(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=S.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,c=>{c&&this.callee.fromData(c)},[s]),a}else if(this.type===Ft.setRate){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.setRate(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.pause){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.pause(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.resume){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.resume(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ft.seek){let[i]=this.contentNode.getContent(),r=e.audioManager.getPosition(this.callee),s=S.forward(e.audioManager.seek(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{e.audioManager.seek(this.callee,a)},[r]),s}else if(this.type===Ft.mute){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.mute(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("SoundAction")}};et.ActionTypes=Ft;var tt={bgm:"bgm",sound:"sound",voice:"voice"},_i=8,sn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Nn(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ei=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=c=>{t.set(c.id,{id:c.id,parentId:c.parentId??null,volume:Nn(c.volume)})};Object.values(tt).forEach(c=>n({id:c}));let i=new Set;e.forEach(c=>{let l=c?.id;if(typeof l!="string"||l.trim().length===0)throw new sn(`Audio bus id must be a non-empty string, got ${JSON.stringify(l)}.`);if(i.has(l))throw new sn(`Audio bus "${l}" is declared more than once.`);i.add(l),n(c)}),o.assertResolvable(t);let r=[],s=new Map,a=c=>{let l=s.get(c);if(l)return l;let u=t.get(c),d=u.parentId===null?null:a(u.parentId),p={id:u.id,parentId:u.parentId,volume:u.volume,depth:d?d.depth+1:1};return s.set(c,p),r.push(p),p};return t.forEach(c=>a(c.id)),new o(r,s)}static isSeeded(e){return Object.values(tt).includes(e)}static assertResolvable(e){e.forEach(t=>{let n=[t.id],i=new Set([t.id]),r=t;for(;r.parentId!==null;){let s=e.get(r.parentId);if(!s)throw new sn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new sn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>_i)throw new sn(`Audio bus "${t.id}" nests deeper than ${_i}: ${n.join(" -> ")}.`);r=s}})}getNodes(){return this.nodes}get(e){return this.index.get(e)??null}has(e){return this.index.has(e)}isUnder(e,t){let n=this.index.get(e),i=0;for(;n&&i<=_i;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},fr=ei.resolve();function Dl(o){fr=o}function hr(){return fr}function Ji(o,e){let t=fr;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var ha={[tt.bgm]:"bgmVolume",[tt.sound]:"soundVolume",[tt.voice]:"voiceVolume"};function ga(o){let e={};return Object.entries(ha).forEach(([t,n])=>{e[t]={get:()=>Nn(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var Zn=class Zn{constructor(e,t={}){this.declarations=e;this.events=new _;this.overrides=new Map;this.aliasTokens=[];this.tree=null;this.events.setMaxListeners(64),this.aliases=t,Object.entries(t).forEach(([n,i])=>{this.aliasTokens.push(i.subscribe(r=>{this.announce(n,Nn(r))}))})}dispose(){this.aliasTokens.forEach(e=>e.cancel()),this.aliasTokens.length=0}announce(e,t){let n=t;try{n=this.getEffectiveVolume(e)}catch{}this.events.emit(Zn.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ei.resolve(this.declarations()??[]),Dl(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Nn(t),i=this.aliases[e];return i?(i.set(n),this):(this.overrides.set(e,n),this.announce(e,n),this)}setVolumes(e){return Object.entries(e).forEach(([t,n])=>this.setVolume(t,n)),this}getVolume(e){let t=this.aliases[e];return t?Nn(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Nn(this.getDeclaredVolume(e)*this.getVolume(e))}list(){return this.getTree().getNodes().map(e=>({id:e.id,parentId:e.parentId,volume:this.getVolume(e.id),declaredVolume:e.volume,effectiveVolume:this.getEffectiveVolume(e.id)}))}getVolumes(){let e={};return this.list().forEach(t=>{e[t.id]=t.volume}),e}onVolumeChange(e){return this.events.on(Zn.EventTypes["event:audioBus.volumeChange"],e)}};Zn.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var ti=Zn;var ya=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(ya||{}),Ae=class Ae extends ce{static toSound(e){return e==null?null:typeof e=="string"?new Ae({src:e}):e}static isSound(e){return e instanceof Ae}static voice(e){let t=typeof e=="string"?{src:e}:e;return new Ae({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new Ae({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new Ae({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=Ae.DefaultUserConfig.create(t),[i]=n.extract(Ae.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){return hr().isUnder(this.config.type,tt.bgm)&&console.warn(`NarraLeaf-React [Sound] Playing a bgm-typed sound (src: ${this.config.src}) with \`play()\`. It will play on the music bus but is not the scene's background music, so leaving the scene will not stop it and it will not cross-fade. Use \`scene.setBackgroundMusic()\` if that is what you wanted.`),this.pushAction(et.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(et.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(et.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(et.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(et.ActionTypes.setRate,[e])}pause(e){return this.pushAction(et.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(et.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(et.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:Ae.StateSerializer.serialize(this.state)}}fromData(e){return this.state=Ae.StateSerializer.deserialize(e.state),this}copy(){return new Ae(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return Ae.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new et(this.chain(),e,new x().setContent(t)))}};Ae.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",Ae.DefaultUserConfig=new $({src:Ae.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),Ae.DefaultConfig=new $({src:Ae.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),Ae.DefaultState=new $({volume:1,rate:1,paused:!1,muted:!1}),Ae.StateSerializer=new qe;var ge=Ae;var Sn=class Sn{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===Sn.SrcTypes.image?t.add(s):r===Sn.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 N?N.getSrcURL(e):e.type==="image"?N.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ee,z.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(P.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof ye){let n=t;if(t.is(ye,ht.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===ht.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===ht.setAppearance){let i=t.contentNode.getContent()[0];if(N.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(N.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:N.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof N||P.isStaticImageData(e)){if(e instanceof N){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(N.getSrcURL(e)))return this}else if(this.isSrcRegistered(P.srcToURL(e.src)))return this;this.src.push({type:"image",src:P.isStaticImageData(e)?P.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Sn.SrcTypes.audio?t===n.src.getSrc():n.type===Sn.SrcTypes.image?t===N.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)}};Sn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Sn;import*as Ma from"howler";var ze=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 ut=class o{static isTextEvent(e){return e instanceof o}static expression(e,t,n={}){return new o({expression:{image:e,appearance:t},sound:n.sound})}static sound(e){return new o({sound:e})}constructor(e){this.config=e}};function va(o,e){let{render:t,data:n,...i}=e,r=q(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var ve=class ve{static isWord(e){return e instanceof ve}static color(e,t){return ve.isWord(e)?e.copy().assign({color:t}):new ve(e,{color:t})}static bold(e){return ve.isWord(e)?e.copy().assign({bold:!0}):new ve(e,{bold:!0})}static italic(e){return ve.isWord(e)?e.copy().assign({italic:!0}):new ve(e,{italic:!0})}static emphasis(e,t={}){return ve.isWord(e)?e.copy().assign({emphasis:t}):new ve(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return ve.isWord(e)?e.copy().assign(i):new ve(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=va(ve.defaultConfig,t)}evaluate(e){if(ze.isPause(this.text))return[this];if(ut.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>ve.isWord(n)?n.inherit(this.config).evaluate(e):new ve(n,this.config)).flat():ve.isWord(t)?t.inherit(this.config).evaluate(e):[new ve(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=va(this.config,e),this}copy(){return new ve(this.text,this.config)}isPause(){return ze.isPause(this.text)}isTextEvent(){return ut.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};ve.defaultConfig={},ve.defaultColor="#000";var ne=ve;var pt=class pt{static isSentence(e){return e instanceof pt}static toSentence(e){return pt.isSentence(e)?e:new pt(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 ne.isWord(e)?e:new ne(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[ne.isWord(e)?e:new ne(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(pt.isSingleWord):pt.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||ne.isWord(e)||ze.isPause(e)||ut.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=pt.format(e),this.config=q(pt.defaultConfig,{...t,voice:typeof t.voice=="string"?ge.voice(t.voice):ge.toSound(t.voice)}),this.state=Qs(pt.defaultState)}toData(){return null}fromData(e){return this.state=q(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(...pt.formatStaticWord(i))}return t}copy(){return new pt([...this.text],this.config)}};pt.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},pt.defaultState={};var me=pt;var Zi=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 an=class extends X{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")}};an.ActionTypes=qs;var Ce=class o extends ce{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 an(t,an.ActionTypes.action,new x().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new an(this.chain(),an.ActionTypes.action,new x().setContent(e))]}};var Ll={volume:1,limit:1/0},Rl=class Ta{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={...Ll,...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 Ta(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}}},ba=!1;function Il(o){ba=o}function cn(o,e){ba||(e!==void 0?console.warn(o,e):console.warn(o))}var Ml=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){cn("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){cn("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){cn("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()}},Sa=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}},Nl=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 Ml(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){cn("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){cn("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 Sa(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Sa(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}},Gl=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}},Fl=10*1024*1024,Ol=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 Gl(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}}},Hl={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},Aa=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...Hl,...o},Il(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Ol(this.audioContext),this.masterChannel=new Rl("__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=>{cn("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 Nl(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<Fl?"full":"stream"}catch(t){return cn("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=>{cn("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var de=class de{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new Aa({maxChannels:de.MaxChannels});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=de.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,de.BusRampTimeConstant),r.setValueAtTime(s,a+de.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${tt.sound}" instead.`)),this.channels.get(tt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=de.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channelFor(e),r=await this.sound.load(e.config.src),s=de.clipRegionOf(e),a=await i.play(r,{volume:0,...de.playRegionOf(s,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,s);let c=e.state.muted??!1;a.mute(c),e.state.muted=c,this.state.set(e,{token:a,cachedAudio:r,originalVolume:t.end}),t.duration>0?await a.fade(0,t.end,t.duration).finished:a.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(l=>{a.once("ended",()=>l())}),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=de.defaultFade(e)){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await this.sound.load(e.config.src),r=de.clipRegionOf(e),s=await n.play(i,{volume:0,...de.playRegionOf(r,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(s,r);let a=e.state.muted??!1;return s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:i,originalVolume:t.end}),t.duration>0?s.fade(0,t.end,t.duration):s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,s}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return 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 e.markDirty(),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 e.markDirty(),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}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=de.clampToRegion(t,de.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}static playRegionOf(e,t){return t||e.endTime===void 0?{startTime:e.startTime}:{startTime:e.startTime,endTime:e.endTime}}static applyLoopRegion(e,t){let{startTime:n,endTime:i}=t;if(i===void 0||!Number.isFinite(i)||i<=n||typeof AudioBufferSourceNode>"u")return;let r=e.sourceController;if(typeof r?.getSource!="function")return;let s=r.getSource();if(!(s instanceof AudioBufferSourceNode))return;let a=t.loopStart,c=a!==void 0&&Number.isFinite(a)?Math.min(Math.max(a,n),i):n;s.loop=!0,s.loopStart=c<i?c:n,s.loopEnd=i}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime(),...e.state.paused?{paused:!0}:{}}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=await this.sound.load(e.config.src),r=de.clipRegionOf(e),s=r.endTime!==void 0&&e.config.loop,a=await n.play(i,{volume:e.state.volume,...de.playRegionOf(r,e.config.loop),startTime:s?r.startTime:t.position,loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,r),s&&Math.abs(t.position-r.startTime)>.01&&a.seek(de.clampToRegion(t.position,r)),this.state.set(e,{token:a,cachedAudio:i,originalVolume:e.state.volume});let c=e.state.muted??!1;a.mute(c),e.state.muted=c;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?a.pause():t.isPlaying||a.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}preload(e){return this.ready.then(()=>this.sound.load(e.config.src)).then(()=>{}).catch(t=>{this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${e.config.src}")`,t)})}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};de.MaxChannels=1024,de.BusRampTimeConstant=.02,de.BusRampSettle=de.BusRampTimeConstant*5;var eo=de;var to=class{constructor(e){this.config=e;this.watching=null;this.warnings=[]}observe(e){return this.watching=e,this}warn(e,t){return this.warnings.push([e,t]),this.watching?.logger.warn(t),t}getWarnings(){return[...this.warnings]}};import*as Kl from"html-to-image";var xe=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()}),ct(()=>{this.preventAttach()})}static proxy(e){let t=new S,n=new S,i=new o(n);return i.onTimelineRegistered(()=>{n.resolve()}).onSettled(()=>{let[r,s]=i.catSettled();e(r,s)}),t.onSkipControllerRegister(r=>{r.onAbort(()=>{i.abort()})}),[t,i]}static any(e){if(e.length===0)throw new E("Cannot create an 'any' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=!1;for(let s of e)i.attachChild(s),s.then(a=>{r||(r=!0,t.resolve(a))});return t.onSkipControllerRegister(s=>{s.onAbort(()=>{i.abort()})}),[t,i]}static all(e){if(e.length===0)throw new E("Cannot create an 'all' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let 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?ct(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?ct(()=>s()):ct(()=>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()?ct(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
18
24
  Timeline attaching is only allowed synchronously after the timeline is created.
19
- 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())}},to=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof Ce?e:new Ce(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 no=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new Q}addNotification(e){this.notifications.push(e),this.flush()}removeNotification(e){this.notifications=this.notifications.filter(t=>t!==e),this.flush()}clearNotifications(){this.notifications=[],this.flush()}consume(e){let t=new S,n=new Ce(t);return t.registerSkipController(new V(()=>{this.removeNotification(e)})),this.addNotification(e),e.duration&&this.gameState.schedule(()=>{t.resolve(),this.removeNotification(e)},e.duration),this.gameState.timelines.attachTimeline(n),t}onFlush(e){return this.events.on("event:notifications.flush",e)}toArray(){return[...this.notifications]}flush(){this.events.emit("event:notifications.flush")}};function io(o,e,t){let n={},i={};Object.keys(e).forEach(s=>{let a=s;a==="style"&&e.style?Object.assign(n,e.style):e[a]!==void 0&&a!=="key"&&(i[a]=e[a])}),Object.keys(n).length>0&&Object.assign(o.style,n);let r=t?t(i):i;for(let[s,a]of Object.entries(r))o.getAttribute(s)!==a&&o.setAttribute(s,a)}var Hc=4e3,wa={zIndex:0,visibility:"visible"},Vc={...wa,zIndex:1},Ca={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function oo(){return{zIndex:"auto",visibility:"visible",opacity:1,transform:"none",translate:"none",filter:"none",clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat"}}function Uc(){return{...oo(),visibility:"hidden"}}var ro=class{constructor(e){this.gameState=e;this.sceneElements=new Map;this.overlayHost=null;this.running=null}registerScene(e,t){t?this.sceneElements.set(e.getId(),t):this.sceneElements.delete(e.getId())}registerOverlayHost(e){this.overlayHost=e}reset(){this.running?.controller.complete(),this.running=null}skip(){this.running&&(this.gameState.logger.debug("StageTransition","Transition skipped"),this.running.controller.complete())}apply(e,t,n){this.running?.controller.complete();let i=e;typeof i._setDetached=="function"&&i._setDetached(!0);let r=e.createTask(this.gameState),s=e.requestAnimations(r.animations),a=new S().registerSkipController(new V(s.cancel)),l=new Ce(a),c=[],u=r.resolve.map(h=>{if(typeof h=="function"){let m=this.createOverlay();return c.push(m),{kind:"overlay",element:m}}return{kind:"scene",sceneId:(h.key==="target"?t.to:t.from).getId(),role:h.key}}),d={task:r,controller:s,roles:t,targets:u,overlays:c,cancelLoadGate:()=>{},stale:!1};this.running=d,s.onUpdate(h=>this.applyFrame(d,h)),s.onComplete(()=>{this.settle(d,[[t.to,oo()],[t.from,Uc()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(d,[[t.from,oo()],[t.to,oo()]]),l.abort()}),this.applyFrame(d,r.animations.map(h=>h.start));let p=this.waitForSceneReady(t.to);return d.cancelLoadGate=p.cancel,p.promise.then(()=>{d.stale||s.start()}),l}applyFrame(e,t){e.task.resolve.forEach((n,i)=>{let r=e.targets[i],s=r.kind==="overlay"?r.element:this.sceneElements.get(r.sceneId)??null;if(!s)return;let a=typeof n=="function"?n:n.resolver,l=r.kind==="overlay"?Ca:r.role==="target"?Vc:wa,c=j({style:l},a(...t));io(s,c,Wc)})}settle(e,t){e.stale=!0,e.cancelLoadGate(),e.overlays.forEach(n=>n.remove()),e.overlays.length=0,t.forEach(([n,i])=>{let r=this.sceneElements.get(n.getId());r&&Object.assign(r.style,i)}),this.running===e&&(this.running=null)}createOverlay(){let e=document.createElement("div");return e.setAttribute("data-element-type","stage-transition-overlay"),Object.assign(e.style,Ca),this.overlayHost?.appendChild(e),e}waitForSceneReady(e){let t=this.sceneElements.get(e.getId());if(!t)return{promise:Promise.resolve(),cancel:()=>{}};let n=()=>{},i=new Promise(s=>{n=this.gameState.schedule(()=>{this.gameState.logger.weakWarn("StageTransition","Timed out waiting for the incoming scene to load"),s()},Hc)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(Bc)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},xa=["src","width","height"];function Wc(o){if(!xa.some(t=>t in o))return o;let e={...o};return xa.forEach(t=>delete e[t]),e}function Bc(o){return o.getAttribute("src")?typeof o.decode=="function"?o.decode().then(()=>{},()=>{}):o.complete?Promise.resolve():new Promise(e=>{let t=()=>{o.removeEventListener("load",t),o.removeEventListener("error",t),e()};o.addEventListener("load",t),o.addEventListener("error",t)}):Promise.resolve()}var so=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=$i(6),{action:r,timeline:s,stackModel:a}=e,l=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:l,stackModel:a}),this.history.length>this.maxHistorySize){let c=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(c))}return{id:i}}has(e){return this.history.some(t=>t.id===e)}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),this.liveGame.getGameStateForce?.().logger?.debug("ActionHistory","Undoing",this.history[r].action.type),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var ao=class o{constructor(e){this.history=[];this.cursor=-1;this.resumingAtCursor=!1;this.actionHistoryMgr=e,this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){let t=this.history[this.cursor];if(this.resumingAtCursor&&t&&t.action===e.action)return this.history[this.cursor]={...e,token:t.token},this.resumingAtCursor=!1,this;this.resumingAtCursor=!1;let n=this.history[this.cursor+1];return n&&n.action===e.action?this.history[this.cursor+1]={...e,token:n.token}:(this.history.length=this.cursor+1,this.history.push(e)),this.cursor++,this}getHistory(){return this.history.slice(0,this.cursor+1)}getFuture(){return this.history.slice(this.cursor+1)}getCursor(){return this.cursor}getAt(e){return this.history[e]??null}indexOfToken(e){return this.history.findIndex(t=>t.token===e)}setCursor(e){return this.cursor=Math.max(-1,Math.min(e,this.history.length-1)),this.resumingAtCursor=!0,this}canUndo(){return this.cursor>0}canRedo(){return this.cursor<this.history.length-1}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.slice(0,this.cursor+1).map(e=>o.toSerialized(e))}serializeAll(){return this.history.map(e=>o.toSerialized(e))}load(e,t){this.history=[];for(let n of e){let i=n.actionId!=null?t.get(n.actionId):void 0;i&&this.history.push({token:n.token??$i(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}this.cursor=this.history.length-1,this.resumingAtCursor=this.cursor>=0}reset(){this.history=[],this.cursor=-1,this.resumingAtCursor=!1}static toSerialized(e){return{token:e.token,actionId:e.action.getId(),element:e.element,isPending:e.isPending,snapshot:e.snapshot??null}}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(i=>i.id)),n=this.history.slice(0,this.cursor+1).filter(i=>t.has(i.token)).length;this.history=this.history.filter(i=>!t.has(i.token)),this.cursor=Math.max(-1,Math.min(this.cursor-n,this.history.length-1))}};var Qt=class Qt extends Y{executeAction(e,t){if(this.type===pe.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===pe.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===pe.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===pe.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===pe.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}else if(this.type===pe.bringToFront)return this.bringToFront(e,this.callee,t);throw this.unknownTypeError()}applyTransform(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},l=e.getExposedStateForce(t),c=t.transformState.clone(),u=t._getLoop(),d=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let p=l.applyTransform(n,a),h=e.timelines.attachTimeline(s).attachChild(p);return p.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:h},(f,m,v)=>{s.isSettled()||s.abort(),p.abort(),t.transformState.forceOverwrite(f.state),Qt.restoreLoop(e,t,m,v)},[c,u,d]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),l=i??{};t._setLoop(n,l,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,l),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,d)=>{Qt.restoreLoop(e,t,u,d)},[s,a]);let c=new S;return c.resolve(super.executeAction(e,r)),c}stopLoop(e,t,n,i){let r=t._getLoop(),s=t._getLoopActionId();t._setLoop(null,{},null),t.markDirty();let a=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Loop","Skipped"),super.executeAction(e,i)))),l=()=>{a.isSettled()||a.resolve(super.executeAction(e,i))},c=e.getExposedState(t);if(!c||!r)return e.actionHistory.push({action:this,stackModel:i.stackModel},(p,h)=>{Qt.restoreLoop(e,t,p,h)},[r,s]),l(),a;let u=c.stopLoop(n,l),d=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(l),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:d},(p,h)=>{a.isSettled()||a.abort(),u.abort(),Qt.restoreLoop(e,t,p,h)},[r,s]),a}static restoreLoop(e,t,n,i){if(!n&&!t._getLoop())return;t._setLoop(n?.transform??null,n?.options??{},i),t.markDirty();let r=e.getExposedState(t);r&&(n?r.applyLoop(n.transform,n.options):r.stopLoop(void 0,()=>{}))}applyTransition(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},c=e.getExposedStateForce(t).applyTransition(n,a),u=e.timelines.attachTimeline(s).attachChild(c);return c.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},()=>{s.isSettled()||s.abort(),c.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let c=e.findElementByDisplayable(this.callee,i);c&&e.disposeDisplayable(n,c.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new S().registerSkipController(new V(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,c=>{c.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let l=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:l},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}bringToFront(e,t,n){let i=e.findElementByDisplayable(t),r=i&&Qt.getLayerElements(i,t);if(!r)throw new E(`Displayable not found when bringing it to front. The element may not be on stage yet. (element: ${t.getId()})`);let s=r.indexOf(t);s!==r.length-1&&(r.splice(s,1),r.push(t),e.flush()),e.actionHistory.push({action:this,stackModel:n.stackModel},l=>{let c=e.findElementByDisplayable(t),u=c&&Qt.getLayerElements(c,t);if(!u)return;let d=u.indexOf(t);d!==l&&(u.splice(d,1),u.splice(l,0,t),e.flush())},[s]);let a=new S;return a.resolve(super.executeAction(e,n)),a}static getLayerElements(e,t){for(let n of e.layers.values())if(n.includes(t))return n;return null}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};Qt.ActionTypes=pe;var Se=Qt;var ze=class o extends le{constructor(){super(...arguments);this.srcManager=new De;this.loopTransform=null;this.loopOptions={};this.loopActionId=null}_getLoop(){return this.loopTransform?{transform:this.loopTransform,options:this.loopOptions}:null}_setLoop(t,n,i){return this.loopTransform=t,this.loopOptions=t?n:{},this.loopActionId=t?i:null,this}_getLoopActionId(){return this.loopActionId}_serializeLoop(){return this.loopActionId?{actionId:this.loopActionId,options:{...this.loopOptions}}:null}_deserializeLoop(t){return this.loopTransform=null,this.loopOptions=t?{...t.options}:{},this.loopActionId=t?t.actionId:null,this}_rebindLoop(t){if(!this.loopActionId||this.loopTransform)return this;let i=t.get(this.loopActionId)?.contentNode?.getContent(),r=Array.isArray(i)?i[0]:void 0;return r instanceof _?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}pos(t,n,i){return this.transform(new _({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new _({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new _({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new _({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new _({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 _({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new _({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new _(t,n))}mask(t,n={}){let i=P.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l,...c}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l},c)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Be,p=>p.transform(d).clearClip({duration:0})):this.transform(d)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Be,p=>p.transform(d).clearClip({duration:0})):this.transform(d)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...l}=t,c={duration:s,ease:a,...l},u=o.wipeClipPath(n,100),d=o.wipeClipPath(n,0),p=o.createClipPathTransform([[i?d:u,{duration:0}],[i?u:d,c]]);return r?this.combineActions(new Be,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 Se(n,pe.applyTransform,new k().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new Se(i,pe.applyLoop,new k().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new Se(n,pe.stopLoop,new k().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new Se(t,pe.bringToFront,new k().setContent([]));return t.chain(n)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new _(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 _?t.copy():new _({opacity:1},t),r=new Se(n,pe.applyTransform,new k().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof _?t.copy():new _({opacity:0},t),r=new Se(n,pe.applyTransform,new k().setContent([i]));return n.chain(r)}};var cn=class cn extends le{constructor(e,t={}){super(),this.config=j(cn.defaultConfig,t),this.authoredName=e||"",this.state=this.getInitialState();let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(l=>typeof l=="string")&&[t,...n].length>0&&[t,...n].every(l=>me.isSingleWord(l))){let l=e,c=me.format([t,...n]),u=new me(Js(l,c),{character:this}),d=new tt(this.chain(),tt.ActionTypes.say,new k().setContent(u));return this.chain(d)}let i=t||{},r=e,s=Array.isArray(r)?new me(r,{...i,character:this}):(me.isSentence(r)?r:new me(r,{...i,character:this})).copy();s.setCharacter(this);let a=new tt(this.chain(),tt.ActionTypes.say,new k().setContent(s));return this.chain(a)}setName(e){let t=new tt(this.chain(),tt.ActionTypes.setName,new k().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&&me.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):me.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:cn.StateSerializer.serialize(this.state)}}fromData(e){return this.state=cn.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};cn.defaultCharacterColor="#000",cn.defaultConfig={portraits:[]},cn.StateSerializer=new je;var lo=cn,Jt=new lo(null);var X=class o{static isLambda(e){return e instanceof o&&"handler"in e}static isLambdaHandler(e){return typeof e=="function"}static from(e){return o.isLambda(e)?e:new o(e)}static not(e){return new o(t=>!e.evaluate(t).value)}constructor(e){this.handler=e}evaluate({gameState:e}){return{value:this.handler(this.getCtx({gameState:e}))}}getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}toString(){return`Lambda(${this.handler.toString()})`}},gr=class o extends le{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 Ne(`ELSE condition already set
20
- You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:X.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new Ne(`ELSE condition already set
21
- 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(Ft,[this,Ft.ActionTypes.action,new k().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,l=r[s+1]?.contentNode;l&&a.setChild(l),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return Ue.toActions([this.conditions.If.action?.[0]||[],...this.conditions.ElseIf.flatMap(t=>t.action?.[0]||[]),this.conditions.Else.action?.[0]||[]])}createIfCondition(t,n){this.conditions.If.condition=X.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new Ft(i,Ft.ActionTypes.action,new k().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Jt.say(n).getActions():Ue.toActions([n]))}};var Tn=class extends Y{executeAction(e,t){let n=new S().registerSkipController(new V(()=>{l.cancel()})),i=e.timelines.attachTimeline(n),r=this.contentNode.getContent(),s=e.createPresentationSnapshot(),a=null,l=e.createMenu(r,u=>{let d=e.getLiveGame().createStackModel([{type:this.type,node:u.action[0]?.contentNode??null}]);n.resolve({type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[d]}}),a=()=>{d.reset()},e.gameHistory.updateByToken(c,p=>{p&&p.element.type==="menu"&&(p.element.selected=u.evaluated,p.isPending=!1)})}),{id:c}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{l.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:c,action:this,element:{type:"menu",text:l.prompt,selected:null},isPending:!0,snapshot:e.getLiveGame().captureGameState()}),n}getFutureActions(e,t){let n=this.contentNode.getContent();return[...this.callee._getFutureActions(n.choices),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=i.choices.map(s=>`{${s.action.map(l=>l.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};Tn.ActionTypes=qs;var bn=class bn extends le{constructor(t,n={}){super();this.choices=[];this.prompt=me.isSentence(t)?t:t===null?null:new me(t),this.config=j(bn.defaultConfig,n)}static prompt(t,n={}){return new bn(t!==void 0?t:null,n)}static choose(t,n){return new bn(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return me.isSentence(t)&&n?i.choices.push({prompt:me.toSentence(t),action:this.narrativeToActions(n),config:{}}):(ee.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:me.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:me.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?X.from(t.config.disabled):void 0,hidden:t.config?.hidden?X.from(t.config.hidden):void 0}}):console.warn("No valid choice added to menu, ",{arg0:t,arg1:n}),i}hideIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Ne("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.hideIf` before `menu.choose`");return n.config.hidden=X.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Ne("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.disableIf` before `menu.choose`");return n.config.disabled=X.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:X.not(X.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:X.not(X.from(t))}})}fromChained(t){return[new Tn(this.chain(),Tn.ActionTypes.action,new k().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"?Jt.say(n).getActions():Ue.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??{}}))}};bn.defaultConfig={},bn.targetAction=Tn;var yr=bn;var ni=class ni extends Y{executeAction(e,t){let n=this;if(n.is(ni,"persistent:set")){let[i,r]=n.contentNode.getContent(),s=e.getStorable().getNamespace(n.callee.getNamespaceName()),a=s.get(i);if(typeof r=="function"){let l=s.get(i);s.set(i,r(l))}else s.set(i,r);return e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{s.set(i,l)},[a]),super.executeAction(e,t)}else if(n.is(ni,"persistent:assign")){let[i]=n.contentNode.getContent(),r=e.getStorable().getNamespace(n.callee.getNamespaceName()),s={},a=typeof i=="function"?i(r.getContent()):i;return Object.keys(a).forEach(l=>{s[l]=r.get(l),r.set(l,a[l])}),e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{Object.keys(l).forEach(c=>{r.set(c,l[c])})},[s]),super.executeAction(e,t)}throw this.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("PersistentAction")}};ni.ActionTypes=qn;var co=ni;var uo=class uo extends le{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new Ot(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(qn.set,[e,t]))}assign(e){return this.chain(this.createAction(qn.assign,[e]))}equals(e,t){return new X(n=>{let i=n.storable.getNamespace(this.namespace),r=X.isLambda(t)||X.isLambdaHandler(t)?X.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new X(n=>{let i=n.storable.getNamespace(this.namespace),r=X.isLambda(t)||X.isLambdaHandler(t)?X.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new X(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new X(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new X(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new ee(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new ee(i=>X.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new X(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=uo.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new co(this.chain(),e,k.create(t))}};uo.NamespacePrefix="persistent";var Gn=uo,po=class po extends Gn{constructor(e){super(e,{}),this.namespace=this.prefix(e,po.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new Ot(this.namespace,this.defaultContent))}};po.LocalNamespacePrefix="local";var Fn=po;var yt={shutter:0,shutterColor:"#000",vignette:0,vignetteColor:"#000",vignetteInner:"44%",vignetteOuter:"78%"};function vr(o){return typeof o!="number"||!Number.isFinite(o)?0:Math.max(0,Math.min(1,o))}function ii(o,e){return typeof o=="string"&&o.length>0?o:e}function ka(o){let e=vr(o.shutter);return{backgroundColor:ii(o.shutterColor,yt.shutterColor),clipPath:`inset(0 0 ${100-50*e}% 0)`}}function Pa(o){let e=vr(o.shutter);return{backgroundColor:ii(o.shutterColor,yt.shutterColor),clipPath:`inset(${100-50*e}% 0 0 0)`}}function Ea(o){let e=ii(o.vignetteInner,yt.vignetteInner),t=ii(o.vignetteOuter,yt.vignetteOuter),n=`radial-gradient(circle at center, transparent ${e}, black ${t})`;return{backgroundColor:ii(o.vignetteColor,yt.vignetteColor),opacity:vr(o.vignette),maskImage:n,WebkitMaskImage:n,maskSize:"100% 100%",WebkitMaskSize:"100% 100%",maskPosition:"center",WebkitMaskPosition:"center",maskRepeat:"no-repeat",WebkitMaskRepeat:"no-repeat",maskMode:"alpha",WebkitMaskMode:"alpha"}}var pt=class pt extends ze{static get DefaultUserConfig(){return pt._defaultUserConfig??(pt._defaultUserConfig=new K({...Z.DefaultTransformState.getDefaultConfig(),opacity:1,...yt}))}constructor(e={}){super();let t=pt.DefaultUserConfig.create(e),n=pt.DefaultConfig.create();this.userConfig=t,this.config=n.get(),this.transformState=this.getInitialTransformState()}pan(e,t,n){return this.pos(e,t,n)}darken(e,t,n){let i=Math.max(0,Math.min(1,e));return this.filter(`brightness(${1-i})`,{duration:t,ease:n})}shutter(e,t,n){return this.lens({shutter:pt.clampLens(e)},{duration:t,ease:n})}vignette(e,t,n){return this.lens({vignette:pt.clampLens(e)},{duration:t,ease:n})}lens(e,t){return this.transform(new _(e,t))}resetCamera(e,t){return this.transform(new _([{props:{filter:"none"},options:{duration:0}},{props:{position:new lt("center"),scaleX:1,scaleY:1,zoom:1,rotation:0,opacity:1,shutter:yt.shutter,vignette:yt.vignette},options:{duration:e,ease:t}},{props:{shutterColor:yt.shutterColor,vignetteColor:yt.vignetteColor,vignetteInner:yt.vignetteInner,vignetteOuter:yt.vignetteOuter},options:{duration:0}}]))}static clampLens(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}bringToFront(){throw new E(`A camera cannot be brought to front. It is not an element inside a layer, it is what the layers are viewed through, so it has nothing to be in front of \u2014 waiting for it to be added to the stage will not help. Use a camera transform such as Camera.zoom or Camera.pan to change what is in view. (camera: ${this.config.name})`)}reset(){return super.reset(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.transformState.resetTo(Z.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new pt(this.userConfig.get())}getInitialTransformState(){let[e]=this.userConfig.extract(pt.DefaultUserConfig.keys());return new Z(pt.DefaultUserConfig.create(e.get()).get())}};pt._defaultUserConfig=null,pt.DefaultConfig=new K({name:"(camera)"});var oi=pt;var un=class un extends Mn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.elementBaseline=null;this.name=t;let{camera:i,...r}=n;this.config=j(un.defaultConfig,r),this._camera=i??new oi}static empty(){return new un("empty").entry(new nt("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 Ne(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){return oa(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 te(`Service ${i} serialize method should not return a promise`);if(!sr(r))throw new te(`Service ${i} serialize method should return a pure object.
25
+ 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())}},no=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof xe?e:new xe(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 io=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new _}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 xe(t);return t.registerSkipController(new V(()=>{this.removeNotification(e)})),this.addNotification(e),e.duration&&this.gameState.schedule(()=>{t.resolve(),this.removeNotification(e)},e.duration),this.gameState.timelines.attachTimeline(n),t}onFlush(e){return this.events.on("event:notifications.flush",e)}toArray(){return[...this.notifications]}flush(){this.events.emit("event:notifications.flush")}};function oo(o,e,t){let n={},i={};Object.keys(e).forEach(s=>{let a=s;a==="style"&&e.style?Object.assign(n,e.style):e[a]!==void 0&&a!=="key"&&(i[a]=e[a])}),Object.keys(n).length>0&&Object.assign(o.style,n);let r=t?t(i):i;for(let[s,a]of Object.entries(r))o.getAttribute(s)!==a&&o.setAttribute(s,a)}var Vl=4e3,ka={zIndex:0,visibility:"visible"},Ul={...ka,zIndex:1},xa={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function ni(){return{zIndex:"auto",visibility:"visible",opacity:1,transform:"none",translate:"none",filter:"none",clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat"}}function gr(){return{...ni(),visibility:"hidden"}}var ro=class{constructor(e){this.gameState=e;this.sceneElements=new Map;this.overlayHost=null;this.running=null}registerScene(e,t){t?(this.sceneElements.set(e.getId(),t),this.gameState.isSceneSuspended(e)&&Object.assign(t.style,gr())):this.sceneElements.delete(e.getId())}syncScenePose(e,t){if(this.running&&(this.running.roles.from===e||this.running.roles.to===e))return;let n=this.sceneElements.get(e.getId());n&&Object.assign(n.style,t?gr():ni())}registerOverlayHost(e){this.overlayHost=e}reset(){this.running?.controller.complete(),this.running=null}skip(){this.running&&(this.gameState.logger.debug("StageTransition","Transition skipped"),this.running.controller.complete())}apply(e,t,n){this.running?.controller.complete();let i=e;typeof i._setDetached=="function"&&i._setDetached(!0);let r=e.createTask(this.gameState),s=e.requestAnimations(r.animations),a=new S().registerSkipController(new V(s.cancel)),c=new xe(a),l=[],u=r.resolve.map(h=>{if(typeof h=="function"){let m=this.createOverlay();return l.push(m),{kind:"overlay",element:m}}return{kind:"scene",sceneId:(h.key==="target"?t.to:t.from).getId(),role:h.key}}),d={task:r,controller:s,roles:t,targets:u,overlays:l,cancelLoadGate:()=>{},stale:!1};this.running=d,s.onUpdate(h=>this.applyFrame(d,h)),s.onComplete(()=>{this.settle(d,[[t.to,ni()],[t.from,gr()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(d,[[t.from,ni()],[t.to,ni()]]),c.abort()}),this.applyFrame(d,r.animations.map(h=>h.start));let p=this.waitForSceneReady(t.to);return d.cancelLoadGate=p.cancel,p.promise.then(()=>{d.stale||s.start()}),c}applyFrame(e,t){e.task.resolve.forEach((n,i)=>{let r=e.targets[i],s=r.kind==="overlay"?r.element:this.sceneElements.get(r.sceneId)??null;if(!s)return;let a=typeof n=="function"?n:n.resolver,c=r.kind==="overlay"?xa:r.role==="target"?Ul:ka,l=q({style:c},a(...t));oo(s,l,Wl)})}settle(e,t){e.stale=!0,e.cancelLoadGate(),e.overlays.forEach(n=>n.remove()),e.overlays.length=0,t.forEach(([n,i])=>{let r=this.sceneElements.get(n.getId());r&&Object.assign(r.style,i)}),this.running===e&&(this.running=null)}createOverlay(){let e=document.createElement("div");return e.setAttribute("data-element-type","stage-transition-overlay"),Object.assign(e.style,xa),this.overlayHost?.appendChild(e),e}waitForSceneReady(e){let t=this.sceneElements.get(e.getId());if(!t)return{promise:Promise.resolve(),cancel:()=>{}};let n=()=>{},i=new Promise(s=>{n=this.gameState.schedule(()=>{this.gameState.logger.weakWarn("StageTransition","Timed out waiting for the incoming scene to load"),s()},Vl)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(Bl)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},wa=["src","width","height"];function Wl(o){if(!wa.some(t=>t in o))return o;let e={...o};return wa.forEach(t=>delete e[t]),e}function Bl(o){return o.getAttribute("src")?typeof o.decode=="function"?o.decode().then(()=>{},()=>{}):o.complete?Promise.resolve():new Promise(e=>{let t=()=>{o.removeEventListener("load",t),o.removeEventListener("error",t),e()};o.addEventListener("load",t),o.addEventListener("error",t)}):Promise.resolve()}var so=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=ji(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}}has(e){return this.history.some(t=>t.id===e)}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),this.liveGame.getGameStateForce?.().logger?.debug("ActionHistory","Undoing",this.history[r].action.type),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var ao=class o{constructor(e){this.history=[];this.cursor=-1;this.resumingAtCursor=!1;this.actionHistoryMgr=e,this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){let t=this.history[this.cursor];if(this.resumingAtCursor&&t&&t.action===e.action)return this.history[this.cursor]={...e,token:t.token},this.resumingAtCursor=!1,this;this.resumingAtCursor=!1;let n=this.history[this.cursor+1];return n&&n.action===e.action?this.history[this.cursor+1]={...e,token:n.token}:(this.history.length=this.cursor+1,this.history.push(e)),this.cursor++,this}getHistory(){return this.history.slice(0,this.cursor+1)}getFuture(){return this.history.slice(this.cursor+1)}getCursor(){return this.cursor}getAt(e){return this.history[e]??null}indexOfToken(e){return this.history.findIndex(t=>t.token===e)}setCursor(e){return this.cursor=Math.max(-1,Math.min(e,this.history.length-1)),this.resumingAtCursor=!0,this}canUndo(){return this.cursor>0}canRedo(){return this.cursor<this.history.length-1}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.slice(0,this.cursor+1).map(e=>o.toSerialized(e))}serializeAll(){return this.history.map(e=>o.toSerialized(e))}load(e,t){this.history=[];for(let n of e){let i=n.actionId!=null?t.get(n.actionId):void 0;i&&this.history.push({token:n.token??ji(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}this.cursor=this.history.length-1,this.resumingAtCursor=this.cursor>=0}reset(){this.history=[],this.cursor=-1,this.resumingAtCursor=!1}static toSerialized(e){return{token:e.token,actionId:e.action.getId(),element:e.element,isPending:e.isPending,snapshot:e.snapshot??null}}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(i=>i.id)),n=this.history.slice(0,this.cursor+1).filter(i=>t.has(i.token)).length;this.history=this.history.filter(i=>!t.has(i.token)),this.cursor=Math.max(-1,Math.min(this.cursor-n,this.history.length-1))}};var Qt=class Qt extends X{executeAction(e,t){if(this.type===pe.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===pe.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===pe.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===pe.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===pe.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}else if(this.type===pe.bringToFront)return this.bringToFront(e,this.callee,t);throw this.unknownTypeError()}applyTransform(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},c=e.getExposedStateForce(t),l=t.transformState.clone(),u=t._getLoop(),d=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let p=c.applyTransform(n,a),h=e.timelines.attachTimeline(s).attachChild(p);return p.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:h},(f,m,v)=>{s.isSettled()||s.abort(),p.abort(),t.transformState.forceOverwrite(f.state),Qt.restoreLoop(e,t,m,v)},[l,u,d]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),c=i??{};t._setLoop(n,c,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,c),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,d)=>{Qt.restoreLoop(e,t,u,d)},[s,a]);let l=new S;return l.resolve(super.executeAction(e,r)),l}stopLoop(e,t,n,i){let r=t._getLoop(),s=t._getLoopActionId();t._setLoop(null,{},null),t.markDirty();let a=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Loop","Skipped"),super.executeAction(e,i)))),c=()=>{a.isSettled()||a.resolve(super.executeAction(e,i))},l=e.getExposedState(t);if(!l||!r)return e.actionHistory.push({action:this,stackModel:i.stackModel},(p,h)=>{Qt.restoreLoop(e,t,p,h)},[r,s]),c(),a;let u=l.stopLoop(n,c),d=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(c),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:d},(p,h)=>{a.isSettled()||a.abort(),u.abort(),Qt.restoreLoop(e,t,p,h)},[r,s]),a}static restoreLoop(e,t,n,i){if(!n&&!t._getLoop())return;t._setLoop(n?.transform??null,n?.options??{},i),t.markDirty();let r=e.getExposedState(t);r&&(n?r.applyLoop(n.transform,n.options):r.stopLoop(void 0,()=>{}))}applyTransition(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},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}bringToFront(e,t,n){let i=e.findElementByDisplayable(t),r=i&&Qt.getLayerElements(i,t);if(!r)throw new E(`Displayable not found when bringing it to front. The element may not be on stage yet. (element: ${t.getId()})`);let s=r.indexOf(t);s!==r.length-1&&(r.splice(s,1),r.push(t),e.flush()),e.actionHistory.push({action:this,stackModel:n.stackModel},c=>{let l=e.findElementByDisplayable(t),u=l&&Qt.getLayerElements(l,t);if(!u)return;let d=u.indexOf(t);d!==c&&(u.splice(d,1),u.splice(c,0,t),e.flush())},[s]);let a=new S;return a.resolve(super.executeAction(e,n)),a}static getLayerElements(e,t){for(let n of e.layers.values())if(n.includes(t))return n;return null}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};Qt.ActionTypes=pe;var Se=Qt;var Ke=class o extends ce{constructor(){super(...arguments);this.srcManager=new Re;this.loopTransform=null;this.loopOptions={};this.loopActionId=null}_getLoop(){return this.loopTransform?{transform:this.loopTransform,options:this.loopOptions}:null}_setLoop(t,n,i){return this.loopTransform=t,this.loopOptions=t?n:{},this.loopActionId=t?i:null,this}_getLoopActionId(){return this.loopActionId}_serializeLoop(){return this.loopActionId?{actionId:this.loopActionId,options:{...this.loopOptions}}:null}_deserializeLoop(t){return this.loopTransform=null,this.loopOptions=t?{...t.options}:{},this.loopActionId=t?t.actionId:null,this}_rebindLoop(t){if(!this.loopActionId||this.loopTransform)return this;let i=t.get(this.loopActionId)?.contentNode?.getContent(),r=Array.isArray(i)?i[0]:void 0;return r instanceof J?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}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=P.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 Fe,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 Fe,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 Fe,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 Se(n,pe.applyTransform,new x().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new Se(i,pe.applyLoop,new x().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new Se(n,pe.stopLoop,new x().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new Se(t,pe.bringToFront,new x().setContent([]));return t.chain(n)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new 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 Se(n,pe.applyTransform,new x().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 Se(n,pe.applyTransform,new x().setContent([i]));return n.chain(r)}};var ln=class ln extends ce{constructor(e,t={}){super(),this.config=q(ln.defaultConfig,t),this.authoredName=e||"",this.state=this.getInitialState();let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(c=>typeof c=="string")&&[t,...n].length>0&&[t,...n].every(c=>me.isSingleWord(c))){let c=e,l=me.format([t,...n]),u=new me(Js(c,l),{character:this}),d=new nt(this.chain(),nt.ActionTypes.say,new x().setContent(u));return this.chain(d)}let i=t||{},r=e,s=Array.isArray(r)?new me(r,{...i,character:this}):(me.isSentence(r)?r:new me(r,{...i,character:this})).copy();s.setCharacter(this);let a=new nt(this.chain(),nt.ActionTypes.say,new x().setContent(s));return this.chain(a)}setName(e){let t=new nt(this.chain(),nt.ActionTypes.setName,new x().setContent([e]));return this.chain(t)}setAvatar(e){return this.config.avatar=e===null?null:e,this}addPortrait(e,t={}){return this.config.portraits.push({image:e,avatar:t.avatar}),this}setPortraits(e){return this.config.portraits=[...e],this}apply(e,t,...n){return this.say.apply(this,[e,t,...n])}call(e,t,...n){return Array.isArray(e)&&"raw"in e?t&&me.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):me.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:ln.StateSerializer.serialize(this.state)}}fromData(e){return this.state=ln.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};ln.defaultCharacterColor="#000",ln.defaultConfig={portraits:[]},ln.StateSerializer=new qe;var co=ln,_t=new co(null);var Q=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()})`}},yr=class o extends ce{constructor(){super();this.conditions={If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static getInitialState(){return{If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static If(t,n){return new o().createIfCondition(t,n)}ElseIf(t,n){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
26
+ You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:Q.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
27
+ You are trying to set multiple ELSE conditions for the same condition`);return this.conditions.Else.action=this.construct(Array.isArray(t)?t:[t]),this.chain()}evaluate(t,{gameState:n}){let i={gameState:n};if(t.If.condition?.evaluate(i)?.value)return t.If.action||null;for(let s of t.ElseIf)if(s.condition?.evaluate(i)?.value)return s.action||null;return t.Else.action||null}fromChained(t){return[Reflect.construct(Ot,[this,Ot.ActionTypes.action,new x().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,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 Be.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=Q.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new Ot(i,Ot.ActionTypes.action,new x().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?_t.say(n).getActions():Be.toActions([n]))}};var Tn=class extends X{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=Ys;var bn=class bn extends ce{constructor(t,n={}){super();this.choices=[];this.prompt=me.isSentence(t)?t:t===null?null:new me(t),this.config=q(bn.defaultConfig,n)}static prompt(t,n={}){return new bn(t!==void 0?t:null,n)}static choose(t,n){return new bn(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return me.isSentence(t)&&n?i.choices.push({prompt:me.toSentence(t),action:this.narrativeToActions(n),config:{}}):(ne.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:me.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:me.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?Q.from(t.config.disabled):void 0,hidden:t.config?.hidden?Q.from(t.config.hidden):void 0}}):console.warn("No valid choice added to menu, ",{arg0:t,arg1:n}),i}hideIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Oe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.hideIf` before `menu.choose`");return n.config.hidden=Q.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Oe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.disableIf` before `menu.choose`");return n.config.disabled=Q.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:Q.not(Q.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:Q.not(Q.from(t))}})}fromChained(t){return[new Tn(this.chain(),Tn.ActionTypes.action,new x().setContent({prompt:this.prompt,choices:t.constructChoices()}))]}_getFutureActions(t){return t.map(n=>n.action[0]||null).filter(n=>n!==null)}narrativeToActions(t){return this.constructNodes(t.flatMap(n=>typeof n=="string"?_t.say(n).getActions():Be.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??{}}))}};bn.defaultConfig={},bn.targetAction=Tn;var vr=bn;var ii=class ii extends X{executeAction(e,t){let n=this;if(n.is(ii,"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(ii,"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")}};ii.ActionTypes=qn;var lo=ii;var uo=class uo extends ce{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new Ht(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(qn.set,[e,t]))}assign(e){return this.chain(this.createAction(qn.assign,[e]))}equals(e,t){return new Q(n=>{let i=n.storable.getNamespace(this.namespace),r=Q.isLambda(t)||Q.isLambdaHandler(t)?Q.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new Q(n=>{let i=n.storable.getNamespace(this.namespace),r=Q.isLambda(t)||Q.isLambdaHandler(t)?Q.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new Q(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new Q(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new Q(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new ne(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new ne(i=>Q.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new Q(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=uo.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new lo(this.chain(),e,x.create(t))}};uo.NamespacePrefix="persistent";var Gn=uo,po=class po extends Gn{constructor(e){super(e,{}),this.namespace=this.prefix(e,po.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new Ht(this.namespace,this.defaultContent))}};po.LocalNamespacePrefix="local";var Fn=po;var vt={shutter:0,shutterColor:"#000",vignette:0,vignetteColor:"#000",vignetteInner:"44%",vignetteOuter:"78%"};function Sr(o){return typeof o!="number"||!Number.isFinite(o)?0:Math.max(0,Math.min(1,o))}function oi(o,e){return typeof o=="string"&&o.length>0?o:e}function Pa(o){let e=Sr(o.shutter);return{backgroundColor:oi(o.shutterColor,vt.shutterColor),clipPath:`inset(0 0 ${100-50*e}% 0)`}}function Ea(o){let e=Sr(o.shutter);return{backgroundColor:oi(o.shutterColor,vt.shutterColor),clipPath:`inset(${100-50*e}% 0 0 0)`}}function Da(o){let e=oi(o.vignetteInner,vt.vignetteInner),t=oi(o.vignetteOuter,vt.vignetteOuter),n=`radial-gradient(circle at center, transparent ${e}, black ${t})`;return{backgroundColor:oi(o.vignetteColor,vt.vignetteColor),opacity:Sr(o.vignette),maskImage:n,WebkitMaskImage:n,maskSize:"100% 100%",WebkitMaskSize:"100% 100%",maskPosition:"center",WebkitMaskPosition:"center",maskRepeat:"no-repeat",WebkitMaskRepeat:"no-repeat",maskMode:"alpha",WebkitMaskMode:"alpha"}}var dt=class dt extends Ke{static get DefaultUserConfig(){return dt._defaultUserConfig??(dt._defaultUserConfig=new $({...te.DefaultTransformState.getDefaultConfig(),opacity:1,...vt}))}constructor(e={}){super();let t=dt.DefaultUserConfig.create(e),n=dt.DefaultConfig.create();this.userConfig=t,this.config=n.get(),this.transformState=this.getInitialTransformState()}pan(e,t,n){return this.pos(e,t,n)}darken(e,t,n){let i=Math.max(0,Math.min(1,e));return this.filter(`brightness(${1-i})`,{duration:t,ease:n})}shutter(e,t,n){return this.lens({shutter:dt.clampLens(e)},{duration:t,ease:n})}vignette(e,t,n){return this.lens({vignette:dt.clampLens(e)},{duration:t,ease:n})}lens(e,t){return this.transform(new J(e,t))}resetCamera(e,t){return this.transform(new J([{props:{filter:"none"},options:{duration:0}},{props:{position:new lt("center"),scaleX:1,scaleY:1,zoom:1,rotation:0,opacity:1,shutter:vt.shutter,vignette:vt.vignette},options:{duration:e,ease:t}},{props:{shutterColor:vt.shutterColor,vignetteColor:vt.vignetteColor,vignetteInner:vt.vignetteInner,vignetteOuter:vt.vignetteOuter},options:{duration:0}}]))}static clampLens(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}bringToFront(){throw new E(`A camera cannot be brought to front. It is not an element inside a layer, it is what the layers are viewed through, so it has nothing to be in front of \u2014 waiting for it to be added to the stage will not help. Use a camera transform such as Camera.zoom or Camera.pan to change what is in view. (camera: ${this.config.name})`)}reset(){return super.reset(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.transformState.resetTo(te.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new dt(this.userConfig.get())}getInitialTransformState(){let[e]=this.userConfig.extract(dt.DefaultUserConfig.keys());return new te(dt.DefaultUserConfig.create(e.get()).get())}};dt._defaultUserConfig=null,dt.DefaultConfig=new $({name:"(camera)"});var ri=dt;var un=class un extends Mn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.elementBaseline=null;this.name=t;let{camera:i,...r}=n;this.config=q(un.defaultConfig,r),this._camera=i??new ri}static empty(){return new un("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 Oe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){return ra(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 Z(`Service ${i} serialize method should not return a promise`);if(!sr(r))throw new Z(`Service ${i} serialize method should return a pure object.
22
28
  A pure object should:
23
29
  1. be an object literal
24
30
  2. not have any prototype
25
31
  3. no circular reference
26
32
  4. sub objects should also be pure objects or serializable data
27
33
  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
28
- 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(nt.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||te,[`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.captureElementBaseline(),this}captureElementBaseline(){let t=new Map;this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).forEach(n=>{let i=n.toData();i&&t.set(n.getId(),JSON.stringify(i))}),this.elementBaseline=t}getAllElementStates(){let t=this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]),n=this.elementBaseline,i=[];for(let r of t){if(n&&!r.isDirty())continue;let s=r.toData();s&&(n&&JSON.stringify(s)===n.get(r.getId())||i.push({id:r.getId(),data:s}))}return i}findUnmarkedElements(){let t=this.elementBaseline;return t?this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).filter(n=>{if(n.isDirty())return!1;let i=n.toData();return!!i&&JSON.stringify(i)!==t.get(n.getId())}):[]}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>un.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${un.MAX_DEPTH})`);let s=i.shift();if(nt.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 mo(t).run(this)}};un.defaultConfig={origin:"bottom left"},un.MAX_DEPTH=32767;var ri=un;var pn=class extends Y{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Fi.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===Fi.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")}};pn.ActionTypes=Fi;var vt=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(vt||{});import{animate as zc}from"motion/react";var Ht=class{requestAnimations(e){let t=e.map(m=>m.start),n=[],i=0,r=!1,s=!1,a=!1,l=[],c=[],u=[],d=()=>{e.forEach((m,v)=>{t[v]=m.end}),i=e.length,l.forEach(m=>m(t)),c.forEach(m=>m())};return{onUpdate:m=>(l.push(m),{cancel:()=>{let v=l.indexOf(m);v!==-1&&l.splice(v,1)}}),onComplete:m=>(c.push(m),{cancel:()=>{let v=c.indexOf(m);v!==-1&&c.splice(v,1)}}),onCanceled:m=>(u.push(m),{cancel:()=>{let v=u.indexOf(m);v!==-1&&u.splice(v,1)}}),complete:()=>{if(!(i===e.length||s)){if(!r){a=!0;return}n.forEach(m=>m.complete())}},start:()=>{if(!(r||s||i===e.length)){if(r=!0,a){d();return}e.forEach((m,v)=>{n.push(this.requestMotion(m,{onComplete:()=>{t[v]=m.end,l.forEach(A=>A(t)),i++,i===e.length&&c.forEach(A=>A())},onUpdate:A=>{t[v]=A,l.forEach(g=>g(t))}}))})}},cancel:()=>{s=!0,n.forEach(m=>m.cancel()),u.forEach(m=>m())}}}toFinalStyle(e){return e.resolve.map(t=>typeof t=="function"?t(...e.animations.map(n=>n.end)):t.resolver(...e.animations.map(n=>n.end)))}asPrev(e){return{resolver:e,key:"current"}}asTarget(e){return{resolver:e,key:"target"}}requestMotion(e,t){return zc(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};Ht.AnimationType=vt;var si=class extends Ht{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new E(`Trying to access text state, but element is not set
29
- This should not happen, please report this issue to the developers`);return this._element.state}};var fo=class o extends si{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 xe=class xe extends ze{static get DefaultUserConfig(){return xe._defaultUserConfig??(xe._defaultUserConfig=new K({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:"",...Z.DefaultTransformState.getDefaultConfig()},{position:e=>G.tryParsePosition(e)}))}static get DefaultTextTransformState(){return xe._defaultTextTransformState??(xe._defaultTextTransformState=new K({fontColor:"#000000",...Z.DefaultTransformState.getDefaultConfig()}))}constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=xe.DefaultUserConfig.create(n),r=xe.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 pn(t,pn.ActionTypes.setText,new k().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new _({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Be,i=>{if(t){let s=new fo({fontSize:e,duration:t,easing:n});i.chain(this._applyTransition(i,s))}let r=new pn(i,pn.ActionTypes.setFontSize,new k().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:xe.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=xe.StateSerializer.deserialize(e.state),this.transformState.resetTo(Z.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_init(e){return new Se(this.chain(),pe.init,new k().setContent([e||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}getInitialTransformState(e){let[t]=e.extract(xe.DefaultTextTransformState.keys());return new Z(xe.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new Se(e,pe.applyTransition,new k().setContent([t,n=>n._setElement(this)]))}getInitialState(){return xe.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};xe._defaultUserConfig=null,xe.DefaultTextConfig=new K({alignX:"center",alignY:"center",className:"",layer:void 0}),xe.DefaultTextState=new K({fontSize:16,display:!1,text:""}),xe._defaultTextTransformState=null,xe.StateSerializer=new je;var An=xe;var ho=class extends Y{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 Sr=class extends le{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(ta(r)){let s=[],a=new S().registerSkipController(new V(()=>{for(let c of s)c?.()}));return r({...t,onAbort:c=>{s.push(c)}},...i).then(()=>a.resolve()),a}r({...t,onAbort:()=>{}},...i)}_registerActionHandler(t,n){this._handlers[t]=n}_createAction(t,n,i){return new ho(t,"service:action",new k().setContent([n,i]))}},Tr=class extends Sr{},ai=class extends Tr{};var On=class extends Y{executeAction(e,t){if(this.type===yn.action)return super.executeAction(e,t);if(this.type===yn.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")}};On.ActionTypes=yn;var it=class it extends ze{static get DefaultUserConfig(){return it._defaultUserConfig??(it._defaultUserConfig=new K({zIndex:0,...Z.DefaultTransformState.getDefaultConfig(),opacity:1}))}constructor(e,t={}){super();let n=it.DefaultUserConfig.create(t),i=it.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 On(this.chain(),yn.setZIndex,new k().setContent([e])))}bringToFront(){throw new E(`A layer cannot be brought to front. Layers are ordered by z-index, not by the order they were added in \u2014 use Layer.setZIndex to raise one. (layer: ${this.config.name})`)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{state:it.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=it.StateSerializer.deserialize(e.state),this.transformState.resetTo(Z.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new it(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new On(this.chain(),yn.action,new k),new Se(this.chain(),pe.init,new k().setContent([e,null,!1]))]}getInitialState(){return it.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(Z.DefaultTransformState.keys());return new Z(Z.DefaultTransformState.create(e.get()).get())}};it._defaultUserConfig=null,it.DefaultConfig=new K({name:"(anonymous)",zIndex:0}),it.StateSerializer=new je,it.DefaultState=new K({zIndex:0});var Hn=it;var Pt=class Pt extends Y{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Pt,"video:preload"))return e.isVideoAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVideo(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVideoAdded(i)&&(e.removeVideo(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(Pt,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(Pt,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(Pt,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(Pt,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(Pt,"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(Pt,"video:hide")){let s=i.state.display;return this.changeState(e,a=>{i.state.display=!1,e.actionHistory.push(r,l=>{i.state.display=l},[s]),a.hide(),e.removeVideo(i),e.stage.update()},t)}else if(n.is(Pt,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new E(`Video is being used before it is added to the game
30
- 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")}};Pt.ActionTypes=wt;var go=Pt;var Vn=class Vn extends le{constructor(e){super();let t=Vn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new te("Video must have a src")}preload(){return this.chain(this.createAction(wt.preload,[]))}show(){return this.chain(this.createAction(wt.show,[]))}hide(){return this.chain(this.createAction(wt.hide,[]))}play(){return this.chain(this.createAction(wt.play,[]))}pause(){return this.chain(this.createAction(wt.pause,[]))}resume(){return this.chain(this.createAction(wt.resume,[]))}stop(){return this.chain(this.createAction(wt.stop,[]))}seek(e){return this.chain(this.createAction(wt.seek,[e]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return Vn.DefaultVideoState.create().get()}createAction(e,t){return new go(this.chain(),e,k.create(t))}};Vn.DefaultVideoConfig=new K({src:"",muted:!1}),Vn.DefaultVideoState=new K({display:!1});var br=Vn;var _t=class _t extends Y{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(_t,"vfx:preload"))return e.isVfxAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVfx(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVfxAdded(i)&&(e.removeVfx(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(_t,"vfx:show")){let[s]=n.contentNode.getContent(),a=i.state.display;return e.isVfxAdded(i)||(e.addVfx(i),e.stage.update()),i.state.display=!0,e.actionHistory.push(r,l=>{i.state.display=l},[a]),this.changeStateAsync(e,l=>l.show(s),t)}else if(n.is(_t,"vfx:hide")){if(!e.isVfxAdded(i)||!i.state.display)return e.logger.weakWarn("NarraLeaf-React: Vfx","Hiding a Vfx that is not shown, ignored. (src: "+i.config.src+")"),S.resolve(super.executeAction(e,t));let[s]=n.contentNode.getContent(),a=i.state.display;return this.changeStateAsync(e,async l=>{await l.hide(s),i.state.display=!1,e.actionHistory.push(r,c=>{i.state.display=c},[a])},t)}else{if(n.is(_t,"vfx:pause"))return this.changeState(e,s=>{i.state.paused=!0,s.pause()},t);if(n.is(_t,"vfx:resume"))return this.changeState(e,s=>{i.state.paused=!1,s.resume()},t);if(n.is(_t,"vfx:setRate"))return this.changeState(e,s=>s.setRate(n.contentNode.getContent()[0]),t)}throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVfxAdded(this.callee))throw new E(`Vfx is being used before it is added to the game
31
- 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")}};_t.ActionTypes=Yt;var yo=_t;var Un=class Un extends le{constructor(e){super();let t=Un.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new te("Vfx must have a src")}preload(){return this.chain(this.createAction(Yt.preload,[]))}show(e){return this.chain(this.createAction(Yt.show,[e]))}hide(e){return this.chain(this.createAction(Yt.hide,[e]))}pause(){return this.chain(this.createAction(Yt.pause,[]))}resume(){return this.chain(this.createAction(Yt.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(Yt.setRate,[e]))}toData(){return{state:{display:this.state.display,paused:this.state.paused}}}fromData(e){let{state:t}=e;return this.state={display:t.display,paused:t.paused},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return Un.DefaultVfxState.create().get()}createAction(e,t){return new yo(this.chain(),e,k.create(t))}};Un.DefaultVfxConfig=new K({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),Un.DefaultVfxState=new K({display:!1,paused:!1});var Ar=Un;var li=class extends Y{executeAction(e,t){if(this.type===_e.setMotion){let[n]=this.contentNode.getContent();return this.patchState(e,t,{motion:n})}else if(this.type===_e.setExpression){let[n]=this.contentNode.getContent();return this.patchState(e,t,{expression:n})}else if(this.type===_e.setSkin){let[n]=this.contentNode.getContent();return this.patchState(e,t,{skin:n})}else if(this.type===_e.setParam){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{params:{[n]:i}})}else if(this.type===_e.setSlot){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{slots:{[n]:i}})}else if(this.type===_e.command){let[n,i,r]=this.contentNode.getContent();return this.runCommand(e,t,n,i,r?.await===!0)}throw super.unknownTypeError()}patchState(e,t,n){let i=this.callee,r=i._patchState(n);return this.pushState(e,i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.state=s,this.pushState(e,i)},[r]),super.executeAction(e,t)}pushState(e,t){t._applyState().catch(n=>{e.logger.error("Puppet",`Backend "${t.config.backend}" threw while applying state`,n)})}runCommand(e,t,n,i,r){let s=this.callee,a=()=>s._runCommand(n,i).then(u=>{u||e.logger.weakWarn("Puppet",`Command "${n}" was dropped: the puppet is not on stage. Show the element before commanding it.`)}).catch(u=>{e.logger.error("Puppet",`Backend "${s.config.backend}" threw while running "${n}"`,u)});if(!r)return a(),super.executeAction(e,t);let l=new S().registerSkipController(new V(()=>(e.logger.info("Puppet Command","Skipped"),super.executeAction(e,t))));a().then(()=>{l.isSettled()||l.resolve(super.executeAction(e,t))});let c=e.timelines.attachTimeline(l);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:c},()=>{l.isSettled()||l.abort()}),l}stringify(e,t,n){return super.stringifyWithName("PuppetAction")}};li.ActionTypes=_e;var Ge=class Ge extends ze{constructor(t){super();this.events=new Q;this.instance=null;this.status="unmounted";let n=Ge.DefaultUserConfig.create(t),i=Ge.DefaultPuppetConfig.create(n.get());if(this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(n),!this.config.backend)throw new te("Puppet must have a backend name");if(!this.config.src)throw new te("Puppet must have a src")}static get DefaultUserConfig(){return Ge._defaultUserConfig??(Ge._defaultUserConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0,motion:null,expression:null,skin:null,params:{},slots:{},...Z.DefaultTransformState.getDefaultConfig()},{position:t=>G.tryParsePosition(t)}))}static normalizeState(t){let n=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{...n,motion:typeof n.motion=="string"?n.motion:null,expression:typeof n.expression=="string"?n.expression:null,skin:typeof n.skin=="string"?n.skin:null,params:Ge.copyParams(n.params),slots:Ge.copySlots(n.slots)}}static mergeState(t,n){return Ge.normalizeState({...t,...n,params:{...t.params,...n.params||{}},slots:{...t.slots,...n.slots||{}}})}static copyParams(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))typeof r=="number"&&Number.isFinite(r)&&(n[i]=r);return n}static copySlots(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))(typeof r=="string"||r===null)&&(n[i]=r);return n}setMotion(t){return this.chain(this.createAction(_e.setMotion,[t]))}setExpression(t){return this.chain(this.createAction(_e.setExpression,[t]))}setSkin(t){return this.chain(this.createAction(_e.setSkin,[t]))}setParam(t,n){return this.chain(this.createAction(_e.setParam,[t,n]))}setSlot(t,n){return this.chain(this.createAction(_e.setSlot,[t,n]))}command(t,n,i){return this.chain(this.createAction(_e.command,[t,n,i]))}getStatus(){return this.status}onStatusChange(t){return this.events.on("event:puppet.statusChange",t)}useLayer(t){return this.userConfig.get().layer=t,Object.assign(this.config,{layer:t}),this}toData(){return{state:Ge.normalizeState(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(t){return this.state=Ge.normalizeState(t.state),this.transformState.resetTo(Z.deserialize(t.transformState).get()),this._deserializeLoop(t.loop),this}_init(t){return new Se(this.chain(),pe.init,new k().setContent([t||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}_resolveSize(t){let n=this.config.size;return n?{width:n.width,height:n.height}:{width:t.width,height:t.height}}_getStatus(){return this.getStatus()}_setStatus(t){this.status!==t&&(this.status=t,this.events.emit("event:puppet.statusChange",t))}_onStatusChange(t){return this.onStatusChange(t)}_attachInstance(t){this.instance=t}_getInstance(){return this.instance}_patchState(t){let n=Ge.normalizeState(this.state);return this.state=Ge.mergeState(this.state,t),n}async _applyState(){let t=this.instance;t&&await t.apply(Ge.normalizeState(this.state))}async _runCommand(t,n){let i=this.instance;return i?(await i.command(t,n),!0):!1}async _describe(){let t=this.instance;return!t||typeof t.describe!="function"?null:await t.describe()}createAction(t,n){return new li(this.chain(),t,k.create(n))}getInitialTransformState(t){let[n]=t.extract(Z.DefaultTransformState.keys());return new Z(Z.DefaultTransformState.create(n.get()).get())}getInitialState(){let t=this.userConfig.get();return Ge.normalizeState({motion:t.motion,expression:t.expression,skin:t.skin,params:t.params,slots:t.slots})}};Ge._defaultUserConfig=null,Ge.DefaultPuppetConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0});var Et=Ge;var ci=class extends le{constructor(e){super(),this.scene=e}show(e){let t=new ie(this.scene.chain(),J.nvlShow,new k().setContent([e]));return this.chain(t)}hide(e){let t=new ie(this.scene.chain(),J.nvlHide,new k().setContent([e]));return this.chain(t)}end(){let e=new ie(this.scene.chain(),J.nvlEnd,new k().setContent([]));return this.chain(e)}};function xr(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function La(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return Da(o);let i=Cr(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=Cr(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=Cr(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function Cr(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 Da(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}function Ra(o,e){let t=[],n=i=>{i&&typeof i!="function"&&P.isImageSrc(i)&&t.push(i)};n(e?.config.avatar),n(o.config.avatar);for(let i of o.config.portraits||[])n(xr(i).avatar);return t}var ce=class ce{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 Yn;this.htmlToImage=Kc;this.pageRouter=null;this.stageClickBuffer=null;this.advanceSuspensions=new Set;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new Q,this.logger=new _i(e,"NarraLeaf-React"),this.audioManager=new Zi(this),this.guard=new eo(e.config.app.guard).observe(this),this.timelines=new to(this.guard),this.notificationMgr=new no(this,[]),this.idManager=new Vi,this.actionHistory=new so(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new ao(this.actionHistory),this.stageTransition=new ro(this),this.events.on(ce.EventTypes["event:state.player.skip"],()=>{this.game.config.allowSkipSceneTransition&&this.stageTransition.skip()})}get deps(){return this.flushDep}addVideo(e){return this.state.videos.push(e),this}removeVideo(e){let t=this.state.videos.indexOf(e);return t===-1?(this.logger.weakWarn("Video not found when removing",e.getId()),this):(this.state.videos.splice(t,1),this)}isVideoAdded(e){return this.state.videos.includes(e)}getVideos(){return this.state.videos}addVfx(e){return this.state.vfx.push(e),this}removeVfx(e){let t=this.state.vfx.indexOf(e);return t===-1?(this.logger.weakWarn("Vfx not found when removing",e.getId()),this):(this.state.vfx.splice(t,1),this)}isVfxAdded(e){return this.state.vfx.includes(e)}getVfx(){return this.state.vfx}findElementByScene(e){return this.state.elements.find(t=>t.scene===e)||null}findElementByDisplayable(e,t=null){return this.state.elements.find(n=>{if(t)return n.layers.get(t)?.includes(e)||!1;for(let i of n.layers.values())if(i.includes(e))return!0;return!1})||null}getLiveGame(){return this.game.getLiveGame()}removeElement(e){let t=this.state.elements.indexOf(e);return t===-1?(this.logger.weakWarn("Element not found when removing",e.scene.getId()),this):(this.logger.debug("GameState","Removing element",e.scene.getId()),this.state.elements.splice(t,1),this)}preloadScene(e){let t=nt.isScene(e)?e:e.entryScene;if(!t)throw new E("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(ce.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(xr);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let l=s[a];for(let c=l.length-1;c>=0;c--){let u=l[c],d=r.get(u);if(d&&this.isDisplayableVisible(u))return d}}return null}sceneExists(e){return e?this.state.elements.some(t=>t.scene===e):!!this.getLastScene()}isSceneActive(e){for(let{scene:t}of this.state.elements)if(t===e)return!0;return!1}wait(e){return new Promise(t=>setTimeout(t,e))}schedule(e,t){let n=[],i=setTimeout(()=>{e({retry:()=>{this.schedule(e,0)},onCleanup:r=>{n.push(r)}})},t);return()=>{n.forEach(r=>r()),clearTimeout(i)}}notify(e){this.notificationMgr.addNotification(e)}handle(e){if(this.currentHandling===e)return this;switch(this.currentHandling=e,e.type){case"condition:action":break}return this}createDialog(e,t,n,i){let r=this.findElementByScene(this.getLastSceneIfNot(i))?.texts;if(!r)throw this.sceneNotFound();let s=t.evaluate(Ae.getCtx({gameState:this}));this.game.getLiveGame().events.emit(Vt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:ee.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1)},text:ee.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(Vt.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?ee.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(ce.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(ce.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(ce.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(ce.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(ce.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(ce.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(ce.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})=>ie.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(ce.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(ce.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(ce.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(ce.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{ie.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this.rebindLoops(),this}rebindLoops(){let[e,t]=this.getLiveGame().constructMaps();return t.forEach(n=>{n instanceof ze&&n._rebindLoop(e)}),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(ce.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(ce.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(ce.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(ce.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(ce.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}suspendAdvance(){let e=Symbol("advance-suspension");return this.advanceSuspensions.add(e),()=>{this.advanceSuspensions.delete(e)}}isAdvanceSuspended(){return this.advanceSuspensions.size>0}consumeStageClick(e=200){if(!this.stageClickBuffer)return!1;let{timestamp:t}=this.stageClickBuffer,n=Date.now()-t;return this.stageClickBuffer=null,n>=0&&n<=e}createDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i);if(!r)throw this.sceneNotFound();let s=r.layers.get(n||i.config.defaultDisplayableLayer);if(!s)throw this.layerNotFound();return s.push(e),this}disposeDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i)?.layers.get(n||i.config.defaultDisplayableLayer);if(!r)throw this.layerNotFound();let s=r.indexOf(e);if(s===-1)throw new E(`Displayables not found when disposing. (disposing: ${e.getId()})`);return r.splice(s,1),this}forceReset(){[...this.state.elements].forEach(({scene:t})=>{this.offSrcManager(t.srcManager),this.removeScene(t),t.events.clear()}),this.state.elements=[],this.state.srcManagers=[],this.state.videos=[],this.state.vfx=[],this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.audioManager.reset(),this.timelines.abortAll(),this.gameHistory.reset(),this.actionHistory.reset(),this.logger.debug("GameState","Force reset")}getHowl(){return Ia.Howl}registerSrcManager(e){return this.state.srcManagers.push(e),this}offSrcManager(e){return this.state.srcManagers=this.state.srcManagers.filter(t=>t!==e),this}getStorable(){return this.game.getLiveGame().getStorable()}getSceneByName(e){return this.game.getLiveGame().story?.getScene(e)||null}getStory(){if(!this.game.getLiveGame().story)throw new E("Story not loaded");return this.game.getLiveGame().story}setInterval(e,t){return setInterval(e,t)}clearInterval(e){clearInterval(e)}setTimeout(e,t){return setTimeout(e,t)}clearTimeout(e){clearTimeout(e)}forceAnimation(){let[e,t]=Ce.proxy(S.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof ze&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(_.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 Fe("State already mounted");if(!e)throw new Fe("Invalid state key");return this.exposedState.set(e,t),this.events.emit(ce.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new E("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=this.getExposedState(e);if(n)return{cancel:this.schedule(()=>{t(n)},0)};{let i=this.events.on(ce.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:l})=>{this.logger.debug("Loading scene: "+a);let c=t.get(a);if(!c)throw new E("Scene not found, id: "+a+`
32
- NarraLeaf cannot find the element with the id from the saved game`);let u={scene:c,layers:this.constructLayerMap(l.layers,t),menus:[],texts:[]};this.state.elements.push(u),this.registerSrcManager(c.srcManager),this.getExposedStateAsync(c,d=>{ie.initBackgroundMusic(c,d)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,l])=>{let c=t.get(a);if(!c)throw new E("Video not found, id: "+a+`
33
- NarraLeaf cannot find the element with the id from the saved game`);return c.fromData(l),c}),this.state.vfx=(e.vfx??[]).flatMap(([a,l])=>{let c=t.get(a);return c?(c.fromData(l),[c]):(this.logger.weakWarn("NarraLeaf-React: Vfx","Vfx not found when loading a saved game, skipped. (id: "+a+")"),[])}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(l=>{let c=l.characterId&&t.get(l.characterId)||null,u=l.text||"";return{id:l.id,actionId:l.actionId||l.id,character:c,sentence:new me(u,{character:c}),text:u}});this.nvlState={active:e.nvlState.active,visible:e.nvlState.visible,sessionId:e.nvlState.sessionId,dialogs:a,options:e.nvlState.options||null,activeDialogId:e.nvlState.activeDialogId||null,phase:e.nvlState.phase||(e.nvlState.activeDialogId?"awaitAdvance":"idle"),pendingAdvance:e.nvlState.pendingAdvance||!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active&&this.events.emit(ce.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(ce.EventTypes["event:state.nvl.visibilityChange"],!0,this.nvlState.options?.showTransition),this.emitNvlStateChange()}}getLastSceneIfNot(e){let t=e||this.getLastScene();if(!t||!this.sceneExists(t))throw new E('Scene not found, please call "scene.activate()" first.');return t}createElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(i=>[i,i.toData()])]))}}fromElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(([i,r])=>(i.fromData(r),i))])),texts:[],menus:[]}}removeElements(e){let t=this.state.elements.findIndex(n=>n.scene===e);return t===-1?(this.logger.weakWarn("Scene not found when removing elements",e.getId()),this):(this.resetLayers(this.state.elements[t].layers),this.state.elements.splice(t,1),this.logger.debug("GameState","Removing elements",e.getId()),this)}resetLayers(e){let t=this.getLiveGame().story?.camera??null;e.forEach((n,i)=>{i.reset(),n.forEach(r=>{t&&r===t||r.reset()})})}syncNvlDerivedState(){this.nvlState.isTyping=this.nvlState.phase==="typing",this.nvlState.activeDialogId||(this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.nvlState.isTyping=!1)}emitNvlStateChange(){this.syncNvlDerivedState(),this.events.emit(ce.EventTypes["event:state.nvl.change"],this.getNvlState()),this.stage.update()}resolveNvlAdvance(e){let t=this.nvlAdvanceWaiters.get(e);return t?(this.nvlAdvanceWaiters.delete(e),this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),t(),!0):!1}isDisplayableVisible(e){return(e.transformState.get().opacity??0)>0}createWaitableAction(e,t){return{action:e,onClick:(i=>{t&&t(i)})}}sceneNotFound(){return new E("Scene not found, target scene may not be activated. This is an internal error, please report this to the developer.")}layerNotFound(){return new E("Layer not found, target layer may not be activated. You may forget to add the layer to the scene config")}constructLayerMap(e,t){return new Map(Object.entries(e).map(([n,i])=>{let r=t.get(n);if(!r)throw new E("Layer not found, id: "+n+`
34
+ 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||Z,[`Scene with name ${t} not found`]);return r}constructStory(){let t=this.entryScene;if(!t)throw new Error("Story must have an entry scene");return this.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this.captureElementBaseline(),this}captureElementBaseline(){let t=new Map;this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).forEach(n=>{let i=n.toData();i&&t.set(n.getId(),JSON.stringify(i))}),this.elementBaseline=t}getAllElementStates(){let t=this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]),n=this.elementBaseline,i=[];for(let r of t){if(n&&!r.isDirty())continue;let s=r.toData();s&&(n&&JSON.stringify(s)===n.get(r.getId())||i.push({id:r.getId(),data:s}))}return i}findUnmarkedElements(){let t=this.elementBaseline;return t?this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).filter(n=>{if(n.isDirty())return!1;let i=n.toData();return!!i&&JSON.stringify(i)!==t.get(n.getId())}):[]}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>un.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${un.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 mo(t).run(this)}};un.defaultConfig={origin:"bottom left"},un.MAX_DEPTH=32767;var si=un;var pn=class extends X{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Oi.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===Oi.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")}};pn.ActionTypes=Oi;var St=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(St||{});import{animate as zl}from"motion/react";var Vt=class{requestAnimations(e){let t=e.map(m=>m.start),n=[],i=0,r=!1,s=!1,a=!1,c=[],l=[],u=[],d=()=>{e.forEach((m,v)=>{t[v]=m.end}),i=e.length,c.forEach(m=>m(t)),l.forEach(m=>m())};return{onUpdate:m=>(c.push(m),{cancel:()=>{let v=c.indexOf(m);v!==-1&&c.splice(v,1)}}),onComplete:m=>(l.push(m),{cancel:()=>{let v=l.indexOf(m);v!==-1&&l.splice(v,1)}}),onCanceled:m=>(u.push(m),{cancel:()=>{let v=u.indexOf(m);v!==-1&&u.splice(v,1)}}),complete:()=>{if(!(i===e.length||s)){if(!r){a=!0;return}n.forEach(m=>m.complete())}},start:()=>{if(!(r||s||i===e.length)){if(r=!0,a){d();return}e.forEach((m,v)=>{n.push(this.requestMotion(m,{onComplete:()=>{t[v]=m.end,c.forEach(A=>A(t)),i++,i===e.length&&l.forEach(A=>A())},onUpdate:A=>{t[v]=A,c.forEach(g=>g(t))}}))})}},cancel:()=>{s=!0,n.forEach(m=>m.cancel()),u.forEach(m=>m())}}}toFinalStyle(e){return e.resolve.map(t=>typeof t=="function"?t(...e.animations.map(n=>n.end)):t.resolver(...e.animations.map(n=>n.end)))}asPrev(e){return{resolver:e,key:"current"}}asTarget(e){return{resolver:e,key:"target"}}requestMotion(e,t){return zl(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};Vt.AnimationType=St;var ai=class extends Vt{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new E(`Trying to access text state, but element is not set
35
+ This should not happen, please report this issue to the developers`);return this._element.state}};var fo=class o extends ai{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 we=class we extends Ke{static get DefaultUserConfig(){return we._defaultUserConfig??(we._defaultUserConfig=new $({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:"",...te.DefaultTransformState.getDefaultConfig()},{position:e=>G.tryParsePosition(e)}))}static get DefaultTextTransformState(){return we._defaultTextTransformState??(we._defaultTextTransformState=new $({fontColor:"#000000",...te.DefaultTransformState.getDefaultConfig()}))}constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=we.DefaultUserConfig.create(n),r=we.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 pn(t,pn.ActionTypes.setText,new x().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 Fe,i=>{if(t){let s=new fo({fontSize:e,duration:t,easing:n});i.chain(this._applyTransition(i,s))}let r=new pn(i,pn.ActionTypes.setFontSize,new x().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:we.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=we.StateSerializer.deserialize(e.state),this.transformState.resetTo(te.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_init(e){return new Se(this.chain(),pe.init,new x().setContent([e||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}getInitialTransformState(e){let[t]=e.extract(we.DefaultTextTransformState.keys());return new te(we.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new Se(e,pe.applyTransition,new x().setContent([t,n=>n._setElement(this)]))}getInitialState(){return we.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};we._defaultUserConfig=null,we.DefaultTextConfig=new $({alignX:"center",alignY:"center",className:"",layer:void 0}),we.DefaultTextState=new $({fontSize:16,display:!1,text:""}),we._defaultTextTransformState=null,we.StateSerializer=new qe;var An=we;var ho=class extends X{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(Ce.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 Tr=class extends ce{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(na(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 ho(t,"service:action",new x().setContent([n,i]))}},br=class extends Tr{},ci=class extends br{};var On=class extends X{executeAction(e,t){if(this.type===yn.action)return super.executeAction(e,t);if(this.type===yn.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")}};On.ActionTypes=yn;var ot=class ot extends Ke{static get DefaultUserConfig(){return ot._defaultUserConfig??(ot._defaultUserConfig=new $({zIndex:0,...te.DefaultTransformState.getDefaultConfig(),opacity:1}))}constructor(e,t={}){super();let n=ot.DefaultUserConfig.create(t),i=ot.DefaultConfig.create({...n.get(),name:e});this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState()}include(e){return(Array.isArray(e)?e:[e]).forEach(n=>{n.useLayer(this)}),this}setZIndex(e){return this.chain(new On(this.chain(),yn.setZIndex,new x().setContent([e])))}bringToFront(){throw new E(`A layer cannot be brought to front. Layers are ordered by z-index, not by the order they were added in \u2014 use Layer.setZIndex to raise one. (layer: ${this.config.name})`)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{state:ot.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=ot.StateSerializer.deserialize(e.state),this.transformState.resetTo(te.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new ot(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new On(this.chain(),yn.action,new x),new Se(this.chain(),pe.init,new x().setContent([e,null,!1]))]}getInitialState(){return ot.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(te.DefaultTransformState.keys());return new te(te.DefaultTransformState.create(e.get()).get())}};ot._defaultUserConfig=null,ot.DefaultConfig=new $({name:"(anonymous)",zIndex:0}),ot.StateSerializer=new qe,ot.DefaultState=new $({zIndex:0});var Hn=ot;var Et=class Et extends X{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Et,"video:preload"))return e.isVideoAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVideo(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVideoAdded(i)&&(e.removeVideo(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(Et,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(Et,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(Et,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(Et,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(Et,"video:show")){let s=i.state.display;return e.isVideoAdded(i)||(e.addVideo(i),e.stage.update()),i.state.display=!0,e.actionHistory.push(r,a=>{i.state.display=a},[s]),this.changeState(e,a=>a.show(),t)}else if(n.is(Et,"video:hide")){let s=i.state.display;return this.changeState(e,a=>{i.state.display=!1,e.actionHistory.push(r,c=>{i.state.display=c},[s]),a.hide(),e.removeVideo(i),e.stage.update()},t)}else if(n.is(Et,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new E(`Video is being used before it is added to the game
36
+ Use video.show() to add the video to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Video Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new V(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VideoAction")}};Et.ActionTypes=kt;var go=Et;var Vn=class Vn extends ce{constructor(e){super();let t=Vn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new Z("Video must have a src")}preload(){return this.chain(this.createAction(kt.preload,[]))}show(){return this.chain(this.createAction(kt.show,[]))}hide(){return this.chain(this.createAction(kt.hide,[]))}play(){return this.chain(this.createAction(kt.play,[]))}pause(){return this.chain(this.createAction(kt.pause,[]))}resume(){return this.chain(this.createAction(kt.resume,[]))}stop(){return this.chain(this.createAction(kt.stop,[]))}seek(e){return this.chain(this.createAction(kt.seek,[e]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return Vn.DefaultVideoState.create().get()}createAction(e,t){return new go(this.chain(),e,x.create(t))}};Vn.DefaultVideoConfig=new $({src:"",muted:!1}),Vn.DefaultVideoState=new $({display:!1});var Ar=Vn;var Jt=class Jt extends X{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Jt,"vfx:preload"))return e.isVfxAdded(i)?S.resolve(super.executeAction(e,t)):(e.addVfx(i),e.stage.update(),e.actionHistory.push(r,()=>{e.isVfxAdded(i)&&(e.removeVfx(i),e.stage.update())}),S.resolve(super.executeAction(e,t)));if(n.is(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)||!i.state.display)return e.logger.weakWarn("NarraLeaf-React: Vfx","Hiding a Vfx that is not shown, ignored. (src: "+i.config.src+")"),S.resolve(super.executeAction(e,t));let[s]=n.contentNode.getContent(),a=i.state.display;return this.changeStateAsync(e,async c=>{await c.hide(s),i.state.display=!1,e.actionHistory.push(r,l=>{i.state.display=l},[a])},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 E(`Vfx is being used before it is added to the game
37
+ 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=Xt;var yo=Jt;var Un=class Un extends ce{constructor(e){super();let t=Un.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new Z("Vfx must have a src")}preload(){return this.chain(this.createAction(Xt.preload,[]))}show(e){return this.chain(this.createAction(Xt.show,[e]))}hide(e){return this.chain(this.createAction(Xt.hide,[e]))}pause(){return this.chain(this.createAction(Xt.pause,[]))}resume(){return this.chain(this.createAction(Xt.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(Xt.setRate,[e]))}toData(){return{state:{display:this.state.display,paused:this.state.paused}}}fromData(e){let{state:t}=e;return this.state={display:t.display,paused:t.paused},this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return Un.DefaultVfxState.create().get()}createAction(e,t){return new yo(this.chain(),e,x.create(t))}};Un.DefaultVfxConfig=new $({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),Un.DefaultVfxState=new $({display:!1,paused:!1});var Cr=Un;var li=class extends X{executeAction(e,t){if(this.type===Ze.setMotion){let[n]=this.contentNode.getContent();return this.patchState(e,t,{motion:n})}else if(this.type===Ze.setExpression){let[n]=this.contentNode.getContent();return this.patchState(e,t,{expression:n})}else if(this.type===Ze.setSkin){let[n]=this.contentNode.getContent();return this.patchState(e,t,{skin:n})}else if(this.type===Ze.setParam){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{params:{[n]:i}})}else if(this.type===Ze.setSlot){let[n,i]=this.contentNode.getContent();return this.patchState(e,t,{slots:{[n]:i}})}else if(this.type===Ze.command){let[n,i,r]=this.contentNode.getContent();return this.runCommand(e,t,n,i,r?.await===!0)}throw super.unknownTypeError()}patchState(e,t,n){let i=this.callee,r=i._patchState(n);return this.pushState(e,i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.state=s,this.pushState(e,i)},[r]),super.executeAction(e,t)}pushState(e,t){t._applyState().catch(n=>{e.logger.error("Puppet",`Backend "${t.config.backend}" threw while applying state`,n)})}runCommand(e,t,n,i,r){let s=this.callee,a=()=>s._runCommand(n,i).then(u=>{u||e.logger.weakWarn("Puppet",`Command "${n}" was dropped: the puppet is not on stage. Show the element before commanding it.`)}).catch(u=>{e.logger.error("Puppet",`Backend "${s.config.backend}" threw while running "${n}"`,u)});if(!r)return a(),super.executeAction(e,t);let c=new S().registerSkipController(new V(()=>(e.logger.info("Puppet Command","Skipped"),super.executeAction(e,t))));a().then(()=>{c.isSettled()||c.resolve(super.executeAction(e,t))});let l=e.timelines.attachTimeline(c);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:l},()=>{c.isSettled()||c.abort()}),c}stringify(e,t,n){return super.stringifyWithName("PuppetAction")}};li.ActionTypes=Ze;var He=class He extends Ke{constructor(t){super();this.events=new _;this.instance=null;this.status="unmounted";let n=He.DefaultUserConfig.create(t),i=He.DefaultPuppetConfig.create(n.get());if(this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(n),!this.config.backend)throw new Z("Puppet must have a backend name");if(!this.config.src)throw new Z("Puppet must have a src")}static get DefaultUserConfig(){return He._defaultUserConfig??(He._defaultUserConfig=new $({backend:"",src:"",options:{},size:null,className:"",layer:void 0,motion:null,expression:null,skin:null,params:{},slots:{},...te.DefaultTransformState.getDefaultConfig()},{position:t=>G.tryParsePosition(t)}))}static normalizeState(t){let n=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{...n,motion:typeof n.motion=="string"?n.motion:null,expression:typeof n.expression=="string"?n.expression:null,skin:typeof n.skin=="string"?n.skin:null,params:He.copyParams(n.params),slots:He.copySlots(n.slots)}}static mergeState(t,n){return He.normalizeState({...t,...n,params:{...t.params,...n.params||{}},slots:{...t.slots,...n.slots||{}}})}static copyParams(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))typeof r=="number"&&Number.isFinite(r)&&(n[i]=r);return n}static copySlots(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))(typeof r=="string"||r===null)&&(n[i]=r);return n}setMotion(t){return this.chain(this.createAction(Ze.setMotion,[t]))}setExpression(t){return this.chain(this.createAction(Ze.setExpression,[t]))}setSkin(t){return this.chain(this.createAction(Ze.setSkin,[t]))}setParam(t,n){return this.chain(this.createAction(Ze.setParam,[t,n]))}setSlot(t,n){return this.chain(this.createAction(Ze.setSlot,[t,n]))}command(t,n,i){return this.chain(this.createAction(Ze.command,[t,n,i]))}getStatus(){return this.status}onStatusChange(t){return this.events.on("event:puppet.statusChange",t)}useLayer(t){return this.userConfig.get().layer=t,Object.assign(this.config,{layer:t}),this}toData(){return{state:He.normalizeState(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(t){return this.state=He.normalizeState(t.state),this.transformState.resetTo(te.deserialize(t.transformState).get()),this._deserializeLoop(t.loop),this}_init(t){return new Se(this.chain(),pe.init,new x().setContent([t||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}_resolveSize(t){let n=this.config.size;return n?{width:n.width,height:n.height}:{width:t.width,height:t.height}}_getStatus(){return this.getStatus()}_setStatus(t){this.status!==t&&(this.status=t,this.events.emit("event:puppet.statusChange",t))}_onStatusChange(t){return this.onStatusChange(t)}_attachInstance(t){this.instance=t}_getInstance(){return this.instance}_patchState(t){let n=He.normalizeState(this.state);return this.state=He.mergeState(this.state,t),n}async _applyState(){let t=this.instance;t&&await t.apply(He.normalizeState(this.state))}async _runCommand(t,n){let i=this.instance;return i?(await i.command(t,n),!0):!1}async _describe(){let t=this.instance;return!t||typeof t.describe!="function"?null:await t.describe()}createAction(t,n){return new li(this.chain(),t,x.create(n))}getInitialTransformState(t){let[n]=t.extract(te.DefaultTransformState.keys());return new te(te.DefaultTransformState.create(n.get()).get())}getInitialState(){let t=this.userConfig.get();return He.normalizeState({motion:t.motion,expression:t.expression,skin:t.skin,params:t.params,slots:t.slots})}};He._defaultUserConfig=null,He.DefaultPuppetConfig=new $({backend:"",src:"",options:{},size:null,className:"",layer:void 0});var Dt=He;var ui=class extends ce{constructor(e){super(),this.scene=e}show(e){let t=new ee(this.scene.chain(),z.nvlShow,new x().setContent([e]));return this.chain(t)}hide(e){let t=new ee(this.scene.chain(),z.nvlHide,new x().setContent([e]));return this.chain(t)}end(){let e=new ee(this.scene.chain(),z.nvlEnd,new x().setContent([]));return this.chain(e)}};function wr(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Ra(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return La(o);let i=xr(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=xr(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=xr(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function xr(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 La(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}function Ia(o,e){let t=[],n=i=>{i&&typeof i!="function"&&P.isImageSrc(i)&&t.push(i)};n(e?.config.avatar),n(o.config.avatar);for(let i of o.config.portraits||[])n(wr(i).avatar);return t}var le=class le{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 Yn;this.htmlToImage=Kl;this.pageRouter=null;this.stageClickBuffer=null;this.advanceSuspensions=new Set;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new _,this.logger=new Zi(e,"NarraLeaf-React"),this.audioManager=new eo(this),this.guard=new to(e.config.app.guard).observe(this),this.timelines=new no(this.guard),this.notificationMgr=new io(this,[]),this.idManager=new Ui,this.actionHistory=new so(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new ao(this.actionHistory),this.stageTransition=new ro(this),this.events.on(le.EventTypes["event:state.player.skip"],()=>{this.game.config.allowSkipSceneTransition&&this.stageTransition.skip()})}get deps(){return this.flushDep}addVideo(e){return this.state.videos.push(e),this}removeVideo(e){let t=this.state.videos.indexOf(e);return t===-1?(this.logger.weakWarn("Video not found when removing",e.getId()),this):(this.state.videos.splice(t,1),this)}isVideoAdded(e){return this.state.videos.includes(e)}getVideos(){return this.state.videos}addVfx(e){return this.state.vfx.push(e),this}removeVfx(e){let t=this.state.vfx.indexOf(e);return t===-1?(this.logger.weakWarn("Vfx not found when removing",e.getId()),this):(this.state.vfx.splice(t,1),this)}isVfxAdded(e){return this.state.vfx.includes(e)}getVfx(){return this.state.vfx}findElementByScene(e){return this.state.elements.find(t=>t.scene===e)||null}findElementByDisplayable(e,t=null){return this.state.elements.find(n=>{if(t)return n.layers.get(t)?.includes(e)||!1;for(let i of n.layers.values())if(i.includes(e))return!0;return!1})||null}getLiveGame(){return this.game.getLiveGame()}removeElement(e){let t=this.state.elements.indexOf(e);return t===-1?(this.logger.weakWarn("Element not found when removing",e.scene.getId()),this):(this.logger.debug("GameState","Removing element",e.scene.getId()),this.state.elements.splice(t,1),this)}preloadScene(e){let t=it.isScene(e)?e:e.entryScene;if(!t)throw new E("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(le.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(){for(let e=this.state.elements.length-1;e>=0;e--){let t=this.state.elements[e];if(!t.suspended)return t.scene}return null}setSceneSuspended(e,t){let n=this.findElementByScene(e);return n?(n.suspended=t,this.stageTransition.syncScenePose(e,t),this.logger.debug("GameState",t?"Suspending scene":"Resuming scene",e.getId()),this.stage.update(),this):(this.logger.weakWarn("Scene not found when suspending",e.getId()),this)}isSceneSuspended(e){return this.findElementByScene(e)?.suspended===!0}getSuspendedScenes(){return this.state.elements.filter(e=>e.suspended).map(e=>e.scene)}getCurrentScene(){return this.state.elements[0]?.scene||null}isFastForwarding(){return this._fastForwarding}setFastForwarding(e){this._fastForwarding=e}hasActiveMenu(){let e=this.getLastScene();return e?(this.findElementByScene(e)?.menus.length??0)>0:!1}findCurrentPortraitForCharacter(e){let t=(e.config.portraits||[]).map(wr);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(Ce.getCtx({gameState:this}));this.game.getLiveGame().events.emit(Ut.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:ne.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:ne.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(Ce.getCtx({gameState:this}))||null,s=this.createWaitableAction({...e,words:r},a=>{i.splice(i.indexOf(s),1),t&&t(a),this.game.getLiveGame().events.emit(Ut.EventTypes["event:menu.choose"],{sentence:a.prompt,text:a.evaluated})});return i.push(s),{cancel:()=>{let a=i.indexOf(s);a!==-1&&i.splice(a,1)},prompt:r?ne.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(le.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(le.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(le.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(le.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(le.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(le.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(le.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})=>ee.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(le.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(le.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(le.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(le.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{ee.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this.rebindLoops(),this}rebindLoops(){let[e,t]=this.getLiveGame().constructMaps();return t.forEach(n=>{n instanceof Ke&&n._rebindLoop(e)}),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(le.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(le.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(le.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(le.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(le.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}suspendAdvance(){let e=Symbol("advance-suspension");return this.advanceSuspensions.add(e),()=>{this.advanceSuspensions.delete(e)}}isAdvanceSuspended(){return this.advanceSuspensions.size>0}consumeStageClick(e=200){if(!this.stageClickBuffer)return!1;let{timestamp:t}=this.stageClickBuffer,n=Date.now()-t;return this.stageClickBuffer=null,n>=0&&n<=e}createDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i);if(!r)throw this.sceneNotFound();let s=r.layers.get(n||i.config.defaultDisplayableLayer);if(!s)throw this.layerNotFound();return s.push(e),this}disposeDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i)?.layers.get(n||i.config.defaultDisplayableLayer);if(!r)throw this.layerNotFound();let s=r.indexOf(e);if(s===-1)throw new E(`Displayables not found when disposing. (disposing: ${e.getId()})`);return r.splice(s,1),this}forceReset(){[...this.state.elements].forEach(({scene:t})=>{this.offSrcManager(t.srcManager),this.removeScene(t),t.events.clear()}),this.state.elements=[],this.state.srcManagers=[],this.state.videos=[],this.state.vfx=[],this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.audioManager.reset(),this.timelines.abortAll(),this.gameHistory.reset(),this.actionHistory.reset(),this.logger.debug("GameState","Force reset")}getHowl(){return Ma.Howl}registerSrcManager(e){return this.state.srcManagers.push(e),this}offSrcManager(e){return this.state.srcManagers=this.state.srcManagers.filter(t=>t!==e),this}getStorable(){return this.game.getLiveGame().getStorable()}getSceneByName(e){return this.game.getLiveGame().story?.getScene(e)||null}getStory(){if(!this.game.getLiveGame().story)throw new E("Story not loaded");return this.game.getLiveGame().story}setInterval(e,t){return setInterval(e,t)}clearInterval(e){clearInterval(e)}setTimeout(e,t){return setTimeout(e,t)}clearTimeout(e){clearTimeout(e)}forceAnimation(){let[e,t]=xe.proxy(S.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof Ke&&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 be("State already mounted");if(!e)throw new be("Invalid state key");return this.exposedState.set(e,t),this.events.emit(le.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new E("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=this.getExposedState(e);if(n)return{cancel:this.schedule(()=>{t(n)},0)};{let i=this.events.on(le.EventTypes["event.state.onExpose"],(r,s)=>{r===e&&(t(s),i.cancel())});return i}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),...e.suspended?{suspended:!0}:{},elements:{layers:Object.fromEntries(Array.from(e.layers.entries()).map(([t,n])=>[t.getId(),n.map(i=>i.getId())]))}})),audio:this.audioManager.toData(),videos:this.state.videos.map(e=>[e.getId(),e.toData()]),vfx:this.state.vfx.map(e=>[e.getId(),e.toData()]),nvlState:{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,dialogIds:this.nvlState.dialogs.map(e=>e.id),dialogs:this.nvlState.dialogs.map(e=>({id:e.id,actionId:e.actionId,text:e.text,characterId:e.character?e.character.getId():null}))}}}loadData(e,t){if(this.state.elements=[],!this.game.getLiveGame().story)throw new Error("No story loaded");let{scenes:i,audio:r,videos:s}=e;if(i.forEach(({sceneId:a,elements:c,suspended:l})=>{this.logger.debug("Loading scene: "+a);let u=t.get(a);if(!u)throw new E("Scene not found, id: "+a+`
38
+ NarraLeaf cannot find the element with the id from the saved game`);let d={scene:u,layers:this.constructLayerMap(c.layers,t),menus:[],texts:[],suspended:l===!0};this.state.elements.push(d),this.registerSrcManager(u.srcManager),d.suspended||this.getExposedStateAsync(u,p=>{ee.initBackgroundMusic(u,p,this)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,c])=>{let l=t.get(a);if(!l)throw new E("Video not found, id: "+a+`
39
+ NarraLeaf cannot find the element with the id from the saved game`);return l.fromData(c),l}),this.state.vfx=(e.vfx??[]).flatMap(([a,c])=>{let l=t.get(a);return l?(l.fromData(c),[l]):(this.logger.weakWarn("NarraLeaf-React: Vfx","Vfx not found when loading a saved game, skipped. (id: "+a+")"),[])}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(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 me(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(le.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(le.EventTypes["event:state.nvl.visibilityChange"],!0,this.nvlState.options?.showTransition),this.emitNvlStateChange()}}getLastSceneIfNot(e){let t=e||this.getLastScene();if(!t||!this.sceneExists(t))throw new E('Scene not found, please call "scene.activate()" first.');return t}createElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(i=>[i,i.toData()])]))}}fromElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(([i,r])=>(i.fromData(r),i))])),texts:[],menus:[]}}removeElements(e){let t=this.state.elements.findIndex(n=>n.scene===e);return t===-1?(this.logger.weakWarn("Scene not found when removing elements",e.getId()),this):(this.resetLayers(this.state.elements[t].layers),this.state.elements.splice(t,1),this.logger.debug("GameState","Removing elements",e.getId()),this)}resetLayers(e){let t=this.getLiveGame().story?.camera??null;e.forEach((n,i)=>{i.reset(),n.forEach(r=>{t&&r===t||r.reset()})})}syncNvlDerivedState(){this.nvlState.isTyping=this.nvlState.phase==="typing",this.nvlState.activeDialogId||(this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.nvlState.isTyping=!1)}emitNvlStateChange(){this.syncNvlDerivedState(),this.events.emit(le.EventTypes["event:state.nvl.change"],this.getNvlState()),this.stage.update()}resolveNvlAdvance(e){let t=this.nvlAdvanceWaiters.get(e);return t?(this.nvlAdvanceWaiters.delete(e),this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),t(),!0):!1}isDisplayableVisible(e){return(e.transformState.get().opacity??0)>0}createWaitableAction(e,t){return{action:e,onClick:(i=>{t&&t(i)})}}sceneNotFound(){return new E("Scene not found, target scene may not be activated. This is an internal error, please report this to the developer.")}layerNotFound(){return new E("Layer not found, target layer may not be activated. You may forget to add the layer to the scene config")}constructLayerMap(e,t){return new Map(Object.entries(e).map(([n,i])=>{let r=t.get(n);if(!r)throw new E("Layer not found, id: "+n+`
34
40
  NarraLeaf cannot find the element with the id from the saved game`);return[r,i.map(s=>{if(!t.has(s))throw new E("Displayable not found, id: "+s+`
35
41
  NarraLeaf cannot find the element with the id from the saved game
36
- This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};ce.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=ce;var Dt=class Dt extends Y{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:ge.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}static cutTrailingVoice(e,t){let n=Dt.trailingVoice.get(e);n&&n!==t&&e.audioManager.isPlaying(n)&&e.timelines.attachTimeline(e.audioManager.stop(n,0)),t?Dt.trailingVoice.set(e,t):Dt.trailingVoice.delete(e)}executeAction(e,t){if(this.type===qt.say){let n=null,i="",r=null,s=new S(v=>v).registerSkipController(new V(()=>{n?.()})),a=new Ce(s),l=this.contentNode.getContent(),c=e.isNvlMode(),u=e.getLiveGame(),d=e.createPresentationSnapshot(),p=u.lastDialog?{sentence:u.lastDialog.sentence,speaker:u.lastDialog.speaker}:null,h=Dt.getVoice(e,l);if(h){Dt.cutTrailingVoice(e,h);let v=e.audioManager.play(h);a.attachChild(v)}let f=h?e.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{let v=Dt.endVoiceWithPreference(e,h);v&&e.timelines.attachTimeline(v),f?.cancel()}):null;if(c){let v=this.getId(),g=(e.getActiveNvlDialogForAction(v)||e.getLatestNvlDialogForAction(v))?.id||e.allocateNvlDialogId(v),y=l.evaluate(Ae.getCtx({gameState:e}));i=ee.getText(y),u.events.emit(Vt.EventTypes["event:character.prompt"],{character:l.config.character,sentence:l,text:i});let b=!1,C=()=>{b||(b=!0,e.events.emit(L.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:x}=e.ensureNvlDialog({id:g,actionId:v,character:this.callee,sentence:l,text:i});r=g;let T=e.consumeNvlTypingSuppression(),w=x&&!T?"typing":"awaitAdvance";e.activateNvlDialog(g,w,!x);let O=e.waitForNvlAdvance(g,()=>{e.settleNvlDialog(g),C()});n=()=>{O.cancel()}}else{let v=e.idManager.generateId(),A=e.createDialog(v,l,()=>{e.settleAdvDialog(v),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(v,this.getId()),i=A.text,n=()=>{e.settleAdvDialog(v),A.cancel()}}u.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:m}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(f?.cancel(),h&&e.audioManager.isPlaying(h)){let v=Dt.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:m,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,voiceId:l.config.voiceId??null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===qt.setName){let n=this.callee.state.name;return this.callee.state.name=this.contentNode.getContent()[0],e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{this.callee.state.name=i},[n]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("CharacterAction")}};Dt.ActionTypes=qt,Dt.trailingVoice=new WeakMap;var tt=Dt;var we=class we extends Mn{constructor(t,n){super();this.srcManager=new De;this.events=new Q;this.actions=[];this.voiceCache=new Map;this._futureActions_=[];this.labelMap=new Map;let i=we.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=we.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=we.DefaultUserConfig.create(n),a=we.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 Fn(t)}static get DefaultSceneConfig(){return we._defaultSceneConfig??(we._defaultSceneConfig=new K({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new Hn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new Hn("[[Displayable Layer]]",{zIndex:0})},{voices:t=>{let n=r=>typeof r=="object"&&r!==null,i=r=>typeof r=="function";if(!t)return null;if(n(t)&&Object.values(t).forEach(r=>{ge.isSound(r)&&we.validateVoice(r)}),i(t))return t;throw new Ne(`Invalid voices config: ${t}`)}}))}static validateVoice(t){if(!Ji(t.config.type,[et.voice,et.sound]))throw new Ne(`Voice must be a voice, but got ${t.config.type}.
37
- To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof we}static getOwnedSounds(t){let n=[],i=t.callee;if(we.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof ie&&t.type===J.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t){return new je({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(Be.do([this.background.char(t,n)]))}jumpTo(t,n={}){return this.combineActions(new Be({allowFutureScene:!1}),i=>{let s=j({},n instanceof Ht?{transition:n}:n);return i.chain(new ie(i,"scene:preUnmount",new k().setContent([]))).chain(this._initScene(t))._transitionToScene(s.transition,t).chain(this._exit()),i})._jumpTo(t)}setBackgroundMusic(t,n){return this.chain(new ie(this.chain(),J.setBackgroundMusic,new k().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new ci(this),a=typeof r=="function"?r(s):r,l=this.narrativeToActions(a),c={showTransition:i,hideTransition:i},u=new ie(this.chain(),J.nvlEnd,new k().setContent([c])),d=[...l,u];super.constructNodes(d);let p=new ie(this.chain(),J.nvlBlock,new k().setContent([d,c]));return this.chain(p)}action(t){return this.actions=t,this}preloadImage(t){if(!P.isImageSrc(t))throw new Error("Invalid image source: "+t);return(Array.isArray(t)?t:[t]).forEach(i=>{this.srcManager.register({type:"image",src:i})}),this}toData(){return{state:we.getStateSerializer(this).serialize(this.state)}}fromData(t){return this.state=we.getStateSerializer(this).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new ie(this.chain(),"scene:action",new k);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>Ue.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[],l=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{Ue.isChained(m)||(m instanceof N?s.push(m):m instanceof An?a.push(m):m instanceof Et&&l.push(m))});let c=[],u=[],d=new Map;s.forEach(m=>{m.config.isWearable?u.push(m):m.config.autoInit&&c.push(m);for(let v of m.config.wearables){if(d.get(v)&&d.get(v)!==m)throw new Error(`Wearable image cannot be used multiple times
42
+ This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};le.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=le;var Lt=class Lt extends X{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:ge.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}static cutTrailingVoice(e,t){let n=Lt.trailingVoice.get(e);n&&n!==t&&e.audioManager.isPlaying(n)&&e.timelines.attachTimeline(e.audioManager.stop(n,0)),t?Lt.trailingVoice.set(e,t):Lt.trailingVoice.delete(e)}executeAction(e,t){if(this.type===Yt.say){let n=null,i="",r=null,s=new S(v=>v).registerSkipController(new V(()=>{n?.()})),a=new xe(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=Lt.getVoice(e,c);if(h){Lt.cutTrailingVoice(e,h);let v=e.audioManager.play(h);a.attachChild(v)}let f=h?e.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{let v=Lt.endVoiceWithPreference(e,h);v&&e.timelines.attachTimeline(v),f?.cancel()}):null;if(l){let v=this.getId(),g=(e.getActiveNvlDialogForAction(v)||e.getLatestNvlDialogForAction(v))?.id||e.allocateNvlDialogId(v),y=c.evaluate(Ce.getCtx({gameState:e}));i=ne.getText(y),u.events.emit(Ut.EventTypes["event:character.prompt"],{character:c.config.character,sentence:c,text:i});let b=!1,C=()=>{b||(b=!0,e.events.emit(L.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:w}=e.ensureNvlDialog({id:g,actionId:v,character:this.callee,sentence:c,text:i});r=g;let T=e.consumeNvlTypingSuppression(),k=w&&!T?"typing":"awaitAdvance";e.activateNvlDialog(g,k,!w);let O=e.waitForNvlAdvance(g,()=>{e.settleNvlDialog(g),C()});n=()=>{O.cancel()}}else{let v=e.idManager.generateId(),A=e.createDialog(v,c,()=>{e.settleAdvDialog(v),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(v,this.getId()),i=A.text,n=()=>{e.settleAdvDialog(v),A.cancel()}}u.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:m}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(f?.cancel(),h&&e.audioManager.isPlaying(h)){let v=Lt.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:m,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,voiceId:c.config.voiceId??null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===Yt.setName){let n=this.callee.state.name;return this.callee.state.name=this.contentNode.getContent()[0],e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{this.callee.state.name=i},[n]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("CharacterAction")}};Lt.ActionTypes=Yt,Lt.trailingVoice=new WeakMap;var nt=Lt;var ke=class ke extends Mn{constructor(t,n){super();this.srcManager=new Re;this.events=new _;this.actions=[];this.voiceCache=new Map;this._futureActions_=[];this.labelMap=new Map;let i=ke.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=ke.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=ke.DefaultUserConfig.create(n),a=ke.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 Fn(t)}static get DefaultSceneConfig(){return ke._defaultSceneConfig??(ke._defaultSceneConfig=new $({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new Hn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new Hn("[[Displayable Layer]]",{zIndex:0})},{voices:t=>{let n=r=>typeof r=="object"&&r!==null,i=r=>typeof r=="function";if(!t)return null;if(n(t)&&Object.values(t).forEach(r=>{ge.isSound(r)&&ke.validateVoice(r)}),i(t))return t;throw new Oe(`Invalid voices config: ${t}`)}}))}static validateVoice(t){if(!Ji(t.config.type,[tt.voice,tt.sound]))throw new Oe(`Voice must be a voice, but got ${t.config.type}.
43
+ To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof ke}static getOwnedSounds(t){let n=[],i=t.callee;if(ke.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof ee&&t.type===z.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t){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(Fe.do([this.background.char(t,n)]))}jumpTo(t,n={}){let i=q({},n instanceof Vt?{transition:n}:n);return i.returnable?this._callScene(t,i.transition):this.combineActions(new Fe({allowFutureScene:!1}),r=>(r.chain(new ee(r,"scene:preUnmount",new x().setContent([]))).chain(this._initScene(t))._transitionToScene(i.transition,t).chain(this._exit()),r))._jumpTo(t)}_callScene(t,n){return this.combineActions(new Fe({allowFutureScene:!1}),i=>(i.chain(this._preSuspend(t)).chain(this._initScene(t))._transitionToScene(n,t),i))._callTo(t)._resume(t)}setBackgroundMusic(t,n){return this.chain(new ee(this.chain(),z.setBackgroundMusic,new x().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new ui(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},u=new ee(this.chain(),z.nvlEnd,new x().setContent([l])),d=[...c,u];super.constructNodes(d);let p=new ee(this.chain(),z.nvlBlock,new x().setContent([d,l]));return this.chain(p)}action(t){return this.actions=t,this}preloadImage(t){if(!P.isImageSrc(t))throw new Error("Invalid image source: "+t);return(Array.isArray(t)?t:[t]).forEach(i=>{this.srcManager.register({type:"image",src:i})}),this}toData(){return{state:ke.getStateSerializer(this).serialize(this.state)}}fromData(t){return this.state=ke.getStateSerializer(this).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new ee(this.chain(),"scene:action",new x);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>Be.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[],c=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{Be.isChained(m)||(m instanceof N?s.push(m):m instanceof An?a.push(m):m instanceof Dt&&c.push(m))});let l=[],u=[],d=new Map;s.forEach(m=>{m.config.isWearable?u.push(m):m.config.autoInit&&l.push(m);for(let v of m.config.wearables){if(d.get(v)&&d.get(v)!==m)throw new Error(`Wearable image cannot be used multiple times
38
44
  Maybe you bind the same wearable image to multiple parent images
39
45
  Parent Conflict (src: `+d.get(v)?.state.currentSrc+`)
40
- Current Parent (src: `+m.state.currentSrc+")");d.set(v,m)}});let p=[...this._initScene(this),...c.map(m=>m._init(this)),...u.map(m=>{if(!d.has(m))throw new Error("Wearable image must have a parent image");return d.get(m)._initWearable(m)}),...a.map(m=>m._init()),...l.map(m=>m._init()),...r],h=super.constructNodes(p),f=new k(this.sceneRoot,void 0,h||void 0).setContent(this);return h?.setParent(f),this.sceneRoot?.setContentNode(f),this._futureActions_=p,this.constructLabels(t),this}constructLabels(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!1}),i=new Map;for(let r of n)if(r instanceof oe&&r.type===ne.label){let[s]=r.contentNode.getContent();if(i.has(s))throw new Ne(`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 oe&&r.type===ne.jump){let[s]=r.contentNode.getContent(),a=i.get(s);if(!a)throw new Ne(`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"?Jt.say(n).getActions():Ue.toActions([n]))}isSceneRootConstructed(){return!!this.sceneRoot}registerSrc(t,n=new Set){if(!this.sceneRoot)return;let i=new Set,r=new Set,s=[this.sceneRoot],a=new Set;for(;s.length;){let l=s.shift();if(!i.has(l)){if(i.add(l),l instanceof ie){let c=l.callee;if(P.isImageSrc(c.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:P.srcToURL(c.state.backgroundImage.state.currentSrc)}),l.type===J.jumpTo){let u=l,d=we.getScene(t,u.contentNode.getContent()[0]);if(!d)throw l._sceneNotFoundError(l.getSceneName(u.contentNode.getContent()[0]));let p=De.getPreloadableSrc(t,l);if(p&&this.srcManager.register(p),r.has(u)||n.has(d))continue;r.add(u),a.add(d),n.add(d)}}else if(l instanceof ye){let c=De.getPreloadableSrc(t,l);c&&this.srcManager.register(c)}else if(l instanceof Ze)this.srcManager.register(l.callee);else if(l instanceof tt){let c=l.type===qt.say?l.contentNode.getContent():null;for(let u of Ra(l.callee,c))this.srcManager.register({type:"image",src:P.srcToURL(u)})}else if(l instanceof oe){let u=l.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else l instanceof Se&&this.srcManager.register(l.callee.srcManager.getSrc());s.push(...l.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(l=>{l.registerSrc(t,n),this.srcManager.registerFuture(l.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let l=a.getStaticId();if(l){if(i.has(l))throw new Ne(`Duplicate static action id: ${l}`);i.add(l)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let l=a.getStaticId();a.resolveId(l||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((s,a)=>{s.resolveId(`e-${a}`)});let i=new Set;this.getAllChildren(t,this.sceneRoot||[]).forEach(s=>{we.getOwnedSounds(s).forEach(a=>i.add(a))});let r=0;i.forEach(s=>{s.getId()||s.resolveId(`s-${r}`),r++})}getVoice(t){if(!t)return null;let n=this.config.voices;if(n){if(typeof n=="function"){let r=n(t);return typeof r=="string"?this.voiceOfSrc(r):(we.validateVoice(r),r)}let i=n[t];return typeof i=="string"?this.voiceOfSrc(i):i||null}return null}voiceOfSrc(t){let n=this.voiceCache.get(t);if(n)return n;let i=ge.voice(t);return this.voiceCache.set(t,i),i}getSceneRoot(){if(!this.sceneRoot)throw new Error("Scene root is not constructed");return this.sceneRoot}stringify(t,n,i){return super.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}).map(r=>r.stringify(t,n,i)).join(";")}reset(){super.reset(),this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&!Ji(t.backgroundMusic.config.type,[et.bgm]))throw new Ne(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
41
- To prevent unintended behavior and unexpected results, the sound have to be on the music bus (or any bus beneath it). Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new N({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 ie(this.chain(),"scene:jumpTo",new k().setContent([t])))}_exit(){return new ie(this.chain(),"scene:exit",new k().setContent([]))}_transitionToScene(t,n){let i=this.chain();return t?i.chain(new ie(i,J.transitionToScene,new k().setContent([t,n]))):i}_init(t){return new ie(this.chain(),"scene:init",new k().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)]}};we.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"},we.DefaultUserConfig=new K({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),we._defaultSceneConfig=null;var nt=we;var Ma=3;var Na=32767,$c=1e3,qe=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 Wi().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new Fe("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new Fe("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(S.isAwaitable(i)&&!i.isSettled())throw new Fe("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!S.isAwaitable(n))throw new Fe("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%Na===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=Na&&t<$c){let i=new E(`[NarraLeaf] Potential infinite loop detected!
46
+ Current Parent (src: `+m.state.currentSrc+")");d.set(v,m)}});let p=[...this._initScene(this),...l.map(m=>m._init(this)),...u.map(m=>{if(!d.has(m))throw new Error("Wearable image must have a parent image");return d.get(m)._initWearable(m)}),...a.map(m=>m._init()),...c.map(m=>m._init()),...r],h=super.constructNodes(p),f=new x(this.sceneRoot,void 0,h||void 0).setContent(this);return h?.setParent(f),this.sceneRoot?.setContentNode(f),this._futureActions_=p,this.constructLabels(t),this}constructLabels(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!1}),i=new Map;for(let r of n)if(r instanceof oe&&r.type===ie.label){let[s]=r.contentNode.getContent();if(i.has(s))throw new Oe(`Duplicate label "${s}" in scene "${this.config.name}". Label names must be unique within a scene.`);i.set(s,r)}this.labelMap=i;for(let r of n)if(r instanceof oe&&r.type===ie.jump){let[s]=r.contentNode.getContent(),a=i.get(s);if(!a)throw new Oe(`Jump target label "${s}" not found in scene "${this.config.name}". Control.jump can only jump to a Control.label declared in the same scene.`);r.setJumpTarget(a)}}getLabel(t){return this.labelMap.get(t)||null}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?_t.say(n).getActions():Be.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 ee){let l=c.callee;if(P.isImageSrc(l.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:P.srcToURL(l.state.backgroundImage.state.currentSrc)}),c.type===z.jumpTo||c.type===z.callTo){let d=c,p=d.contentNode.getContent()[0],h=ke.getScene(t,p);if(!h)throw c._sceneNotFoundError(c.getSceneName(p));let f=Re.getPreloadableSrc(t,c);if(f&&this.srcManager.register(f),!r.has(d)&&!n.has(h))r.add(d),a.add(h),n.add(h);else if(c.type===z.jumpTo)continue}}else if(c instanceof ye){let l=Re.getPreloadableSrc(t,c);l&&this.srcManager.register(l)}else if(c instanceof et)this.srcManager.register(c.callee);else if(c instanceof nt){let l=c.type===Yt.say?c.contentNode.getContent():null;for(let u of Ia(c.callee,l))this.srcManager.register({type:"image",src:P.srcToURL(u)})}else if(c instanceof oe){let u=c.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else c instanceof Se&&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 Oe(`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((s,a)=>{s.resolveId(`e-${a}`)});let i=new Set;this.getAllChildren(t,this.sceneRoot||[]).forEach(s=>{ke.getOwnedSounds(s).forEach(a=>i.add(a))});let r=0;i.forEach(s=>{s.getId()||s.resolveId(`s-${r}`),r++})}getVoice(t){if(!t)return null;let n=this.config.voices;if(n){if(typeof n=="function"){let r=n(t);return typeof r=="string"?this.voiceOfSrc(r):(ke.validateVoice(r),r)}let i=n[t];return typeof i=="string"?this.voiceOfSrc(i):i||null}return null}voiceOfSrc(t){let n=this.voiceCache.get(t);if(n)return n;let i=ge.voice(t);return this.voiceCache.set(t,i),i}getSceneRoot(){if(!this.sceneRoot)throw new Error("Scene root is not constructed");return this.sceneRoot}stringify(t,n,i){return super.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}).map(r=>r.stringify(t,n,i)).join(";")}reset(){super.reset(),this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&!Ji(t.backgroundMusic.config.type,[tt.bgm]))throw new Oe(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
47
+ To prevent unintended behavior and unexpected results, the sound have to be on the music bus (or any bus beneath it). Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new N({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 ee(this.chain(),"scene:jumpTo",new x().setContent([t])))}_callTo(t){return this.chain(new ee(this.chain(),"scene:callTo",new x().setContent([t])))}_resume(t){return this.chain(new ee(this.chain(),"scene:resume",new x().setContent([t])))}_preSuspend(t){return new ee(this.chain(),"scene:preSuspend",new x().setContent([t]))}_exit(){return new ee(this.chain(),"scene:exit",new x().setContent([]))}_transitionToScene(t,n){let i=this.chain();return t?i.chain(new ee(i,z.transitionToScene,new x().setContent([t,n]))):i}_init(t){return new ee(this.chain(),"scene:init",new x().setContent([t]))}_initScene(t){return[t._init(t),...t.config.layers.flatMap(n=>n._init(t)),...t._initBackground(t,t.config.defaultBackgroundLayer)]}_initBackground(t,n){return[t.state.backgroundImage._init(t,n)]}};ke.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"},ke.DefaultUserConfig=new $({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),ke._defaultSceneConfig=null;var it=ke;var Na=3;var $l="scene:resume",Ga=32767,jl=1e3,Ye=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 Bi().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new be("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new be("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(S.isAwaitable(i)&&!i.isSettled())throw new be("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!S.isAwaitable(n))throw new be("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%Ga===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=Ga&&t<jl){let i=new E(`[NarraLeaf] Potential infinite loop detected!
42
48
  Loop has executed ${e} iterations in ${t}ms.
43
49
  This is likely a bug in your game script. Check your loop conditions.
44
- Loop type: ${this.loopConfig.type}, broken: ${this.loopConfig.broken}`);throw this.liveGame.getGameStateForce().logger.error("StackModel",i.message),i}this.loopDebugCheckpoint=e,this.loopStartTime=Date.now()}}breakLoop(){if(!this.loopConfig)throw new E("Cannot break: StackModel is not a loop");this.loopConfig.broken=!0,this.stack.clear()}isLoop(){return this.loopConfig!==null}rollNext(){if(this.stack.isEmpty())return null;let e=this.stack.peek();if(S.isAwaitable(e)&&!e.isSettled())return e;if(o.isCalledActionResult(e)&&e.wait){let n=e.wait.stackModels;if(!n.length)throw new Error("StackModel: Waiting action contains empty stackModels.");if(o.isStackModelsAwaiting(e.wait.type,n))return n.forEach(i=>i.rollNext()),e}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 Fe("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(l=>l.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:l}=i;if(l==null)throw new Error(`Missing stackWaitType for link action: ${s}`);this.stack.push({type:r,node:s?t.get(s)?.contentNode??null:null,wait:{type:l,stackModels:a.map(c=>o.createStackModel(this.liveGame,c,t))}})}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let l=t.get(a);if(!l)throw new Error(`Loop body action not found: ${a}`);r.push(l)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let l=a.contentNode.getContent();Array.isArray(l)&&l.length>=2&&X.isLambda(l[1])&&(s=l[1])}}this.loopConfig={type:i.type,counter:i.counter,limit:i.limit,conditionActionId:i.conditionActionId,bodyActionIds:i.bodyActionIds,broken:i.broken},this.loopBodyActions=r,this.loopCondition=s,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=i.counter}return this}isEmpty(){return this.stack.isEmpty()}push(...e){return this.stack.push(...e),this}};var Le=class Le{constructor(e){this.events=new Q;this.story=null;this.gameLock=new En;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.elementAuditCountdown=0;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new _n,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new Ot(Le.GameSpacesKey.game,Le.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:Ma,created:this.currentSavedGame.meta.created,updated:Date.now(),id:this.currentSavedGame.meta.id,lastSentence:this.lastDialog?.sentence||null,lastSpeaker:this.lastDialog?.speaker||null,storyHash:e.hash()},game:{...this.serializeGameState(),history:this.gameState.gameHistory.serialize()}}}serializeGameState(){this.assertGameState();let e=this.gameState,t=this.story;if(!t)throw new Error("No story loaded");let n=this._storable.toData(),i=e.toData(),r=t.getAllElementStates();this.auditElementDirtyMarks(t);let s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(l=>l.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}auditElementDirtyMarks(e){if(!this.game.config.app.debug||this.elementAuditCountdown-- >0)return;this.elementAuditCountdown=Le.ElementAuditInterval;let t=e.findUnmarkedElements();t.length&&(t.forEach(n=>n.markDirty()),this.gameState?.logger.warn("LiveGame.auditElementDirtyMarks",`${t.length} element(s) had state that no longer matches the script but were never marked dirty, so the save just written left them out. They have been marked, so the next save will carry them - but something is writing element state outside the action dispatch: ${t.map(n=>n.getId()).join(", ")}`))}captureGameState(){try{return this.serializeGameState()}catch(e){return this.gameState?.logger.warn("LiveGame.captureGameState",e),null}}deserialize(e){if(!e)throw new Error("No saved game provided when trying to deserialize game state");this.assertGameState();let t=this.gameState,n=this.story;if(!n)throw new Error("No story loaded");this.game.hooks.trigger("beforeRestore",[]),t.rollLock.lock(),this.reset(),t.stage.forceRemount();let{game:{store:i,stage:r,elementStates:s,services:a,stackModel:l,asyncStackModels:c}}=e,[u,d]=this.constructMaps();this.initNamespaces(),this._storable.load(i),d.forEach(p=>p.reset()),s.forEach(({id:p,data:h})=>{t.logger.debug("restore element",p);let f=d.get(p);if(!f)throw new Error("Element not found, id: "+p+`
45
- NarraLeaf cannot find the element with the id from the saved game`);f.fromData(h),f.markDirty()}),d.forEach(p=>{p instanceof ze&&p._rebindLoop(u)}),this.currentSavedGame=e,t.loadData(r,d),this.stackModel.deserialize(l,u),c.forEach(p=>{let h=qe.createStackModel(this,p,u);this.asyncStackModels.add(h),t.timelines.attachTimeline(this.executeAsyncStackModel(h))}),n.deserializeServices(a),t.gameHistory.load(e.game.history??[],u),this.game.hooks.trigger("afterRestore",[]),t.events.once(L.EventTypes["event:state.onRender"],()=>{t.schedule(()=>{t.rollLock.unlock(),t.stage.next()},0)}),t.stage.forceUpdate()}getHistory(){return this.assertGameState(),this.gameState.gameHistory.getHistory()}getFuture(){return this.assertGameState(),this.gameState.gameHistory.getFuture()}canUndo(){return this.assertGameState(),this.gameState.gameHistory.canUndo()}canRedo(){return this.assertGameState(),this.gameState.gameHistory.canRedo()}undo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canUndo()?this.restoreToIndex(e.getCursor()-1,"LiveGame.undo"):(this.gameState.logger.warn("LiveGame.undo","No line to step back to"),!1)}redo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canRedo()?this.restoreToIndex(e.getCursor()+1,"LiveGame.redo"):(this.gameState.logger.warn("LiveGame.redo","No line to step forward to"),!1)}restoreToHistory(e){this.assertGameState();let t=this.gameState.gameHistory.indexOfToken(e);return t<0?(this.gameState.logger.warn("LiveGame.restoreToHistory","No history entry for token",e),!1):this.restoreToIndex(t,"LiveGame.restoreToHistory")}restoreToIndex(e,t){this.assertGameState();let n=this.gameState.gameHistory,i=n.getAt(e);if(!i)return this.gameState.logger.warn(t,"No history entry at",e),!1;if(e<n.getCursor()&&this.gameState.actionHistory.has(i.token)){let a=n.getCursor();if(n.setCursor(e),this.undoInPlace(i,t))return this.auditRestoredLine(i,t),!0;n.setCursor(a)}if(!i.snapshot)return this.gameState.logger.warn(t,"History entry has no restore snapshot",i.token),!1;let r=i.token,s={name:this.currentSavedGame?.name??"",meta:this.currentSavedGame?.meta??this.getNewSavedGame().meta,game:{...i.snapshot,history:n.serializeAll()}};return this.deserialize(s),this.gameState.gameHistory.setCursor(this.gameState.gameHistory.indexOfToken(r)),i.action.type===qt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),!0}undoInPlace(e,t){this.assertGameState();let n=this.gameState.actionHistory;if(!n.has(e.token))return!1;let i=this.gameLock.register().lock();this.stackModel.abortStackTop();let r=n.undoUntil(e.token);if(!r)return this.gameLock.off(i.unlock()),!1;let[s]=this.constructMaps(),{rootStackSnapshot:a,stackModel:l}=r;return r.action.type===qt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(a,s),l===this.stackModel&&this.stackModel.push(qe.fromAction(r.action)),this.gameLock.off(i.unlock()),this.gameState.logger.debug(t,"Stepped back in place to",e.token),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0),!0}auditRestoredLine(e,t){if(!this.game.config.app.debug||!e.snapshot)return;let n=JSON.stringify([...e.snapshot.elementStates].sort((r,s)=>r.id.localeCompare(s.id))),i=JSON.stringify([...this.serializeGameState().elementStates].sort((r,s)=>r.id.localeCompare(s.id)));n!==i&&this.gameState?.logger.warn(t,`Stepping back in place did not reproduce the state this line's snapshot describes, so an action's undo does not fully reverse it. Restoring the snapshot would have been correct; this path was not.
50
+ Loop type: ${this.loopConfig.type}, broken: ${this.loopConfig.broken}`);throw this.liveGame.getGameStateForce().logger.error("StackModel",i.message),i}this.loopDebugCheckpoint=e,this.loopStartTime=Date.now()}}breakLoop(){if(!this.loopConfig)throw new E("Cannot break: StackModel is not a loop");this.loopConfig.broken=!0,this.stack.clear()}isLoop(){return this.loopConfig!==null}rollNext(){if(this.stack.isEmpty())return null;let e=this.stack.peek();if(S.isAwaitable(e)&&!e.isSettled())return e;if(o.isCalledActionResult(e)&&e.wait){let n=e.wait.stackModels;if(!n.length)throw new Error("StackModel: Waiting action contains empty stackModels.");if(o.isStackModelsAwaiting(e.wait.type,n))return n.forEach(i=>i.rollNext()),e}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 be("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&&Q.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()}clearAboveCallFrame(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t)&&t.node?.action?.type===$l){for(;this.stack.size()>e+1;){let n=this.stack.pop();S.isAwaitable(n)?n.abort():o.isCalledActionResult(n)&&n.wait?.stackModels.forEach(i=>i.reset())}return this.waitingAction=null,this}}return this.reset(),this}push(...e){return this.stack.push(...e),this}};var Ie=class Ie{constructor(e){this.events=new _;this.story=null;this.gameLock=new En;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.elementAuditCountdown=0;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new Jn,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new Ht(Ie.GameSpacesKey.game,Ie.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:Na,created:this.currentSavedGame.meta.created,updated:Date.now(),id:this.currentSavedGame.meta.id,lastSentence:this.lastDialog?.sentence||null,lastSpeaker:this.lastDialog?.speaker||null,storyHash:e.hash()},game:{...this.serializeGameState(),history:this.gameState.gameHistory.serialize()}}}serializeGameState(){this.assertGameState();let e=this.gameState,t=this.story;if(!t)throw new Error("No story loaded");let n=this._storable.toData(),i=e.toData(),r=t.getAllElementStates();this.auditElementDirtyMarks(t);let s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(c=>c.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}auditElementDirtyMarks(e){if(!this.game.config.app.debug||this.elementAuditCountdown-- >0)return;this.elementAuditCountdown=Ie.ElementAuditInterval;let t=e.findUnmarkedElements();t.length&&(t.forEach(n=>n.markDirty()),this.gameState?.logger.warn("LiveGame.auditElementDirtyMarks",`${t.length} element(s) had state that no longer matches the script but were never marked dirty, so the save just written left them out. They have been marked, so the next save will carry them - but something is writing element state outside the action dispatch: ${t.map(n=>n.getId()).join(", ")}`))}captureGameState(){try{return this.serializeGameState()}catch(e){return this.gameState?.logger.warn("LiveGame.captureGameState",e),null}}deserialize(e){if(!e)throw new Error("No saved game provided when trying to deserialize game state");this.assertGameState();let t=this.gameState,n=this.story;if(!n)throw new Error("No story loaded");this.game.hooks.trigger("beforeRestore",[]),t.rollLock.lock(),this.reset(),t.stage.forceRemount();let{game:{store:i,stage:r,elementStates:s,services:a,stackModel:c,asyncStackModels:l}}=e,[u,d]=this.constructMaps();this.initNamespaces(),this._storable.load(i),d.forEach(p=>p.reset()),s.forEach(({id:p,data:h})=>{t.logger.debug("restore element",p);let f=d.get(p);if(!f)throw new Error("Element not found, id: "+p+`
51
+ NarraLeaf cannot find the element with the id from the saved game`);f.fromData(h),f.markDirty()}),d.forEach(p=>{p instanceof Ke&&p._rebindLoop(u)}),this.currentSavedGame=e,t.loadData(r,d),this.stackModel.deserialize(c,u),l.forEach(p=>{let h=Ye.createStackModel(this,p,u);this.asyncStackModels.add(h),t.timelines.attachTimeline(this.executeAsyncStackModel(h))}),n.deserializeServices(a),t.gameHistory.load(e.game.history??[],u),this.game.hooks.trigger("afterRestore",[]),t.events.once(L.EventTypes["event:state.onRender"],()=>{t.schedule(()=>{t.rollLock.unlock(),t.stage.next()},0)}),t.stage.forceUpdate()}getHistory(){return this.assertGameState(),this.gameState.gameHistory.getHistory()}getFuture(){return this.assertGameState(),this.gameState.gameHistory.getFuture()}canUndo(){return this.assertGameState(),this.gameState.gameHistory.canUndo()}canRedo(){return this.assertGameState(),this.gameState.gameHistory.canRedo()}undo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canUndo()?this.restoreToIndex(e.getCursor()-1,"LiveGame.undo"):(this.gameState.logger.warn("LiveGame.undo","No line to step back to"),!1)}redo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canRedo()?this.restoreToIndex(e.getCursor()+1,"LiveGame.redo"):(this.gameState.logger.warn("LiveGame.redo","No line to step forward to"),!1)}restoreToHistory(e){this.assertGameState();let t=this.gameState.gameHistory.indexOfToken(e);return t<0?(this.gameState.logger.warn("LiveGame.restoreToHistory","No history entry for token",e),!1):this.restoreToIndex(t,"LiveGame.restoreToHistory")}restoreToIndex(e,t){this.assertGameState();let n=this.gameState.gameHistory,i=n.getAt(e);if(!i)return this.gameState.logger.warn(t,"No history entry at",e),!1;if(e<n.getCursor()&&this.gameState.actionHistory.has(i.token)){let a=n.getCursor();if(n.setCursor(e),this.undoInPlace(i,t))return this.auditRestoredLine(i,t),!0;n.setCursor(a)}if(!i.snapshot)return this.gameState.logger.warn(t,"History entry has no restore snapshot",i.token),!1;let r=i.token,s={name:this.currentSavedGame?.name??"",meta:this.currentSavedGame?.meta??this.getNewSavedGame().meta,game:{...i.snapshot,history:n.serializeAll()}};return this.deserialize(s),this.gameState.gameHistory.setCursor(this.gameState.gameHistory.indexOfToken(r)),i.action.type===Yt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),!0}undoInPlace(e,t){this.assertGameState();let n=this.gameState.actionHistory;if(!n.has(e.token))return!1;let i=this.gameLock.register().lock();this.stackModel.abortStackTop();let r=n.undoUntil(e.token);if(!r)return this.gameLock.off(i.unlock()),!1;let[s]=this.constructMaps(),{rootStackSnapshot:a,stackModel:c}=r;return r.action.type===Yt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(a,s),c===this.stackModel&&this.stackModel.push(Ye.fromAction(r.action)),this.gameLock.off(i.unlock()),this.gameState.logger.debug(t,"Stepped back in place to",e.token),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0),!0}auditRestoredLine(e,t){if(!this.game.config.app.debug||!e.snapshot)return;let n=JSON.stringify([...e.snapshot.elementStates].sort((r,s)=>r.id.localeCompare(s.id))),i=JSON.stringify([...this.serializeGameState().elementStates].sort((r,s)=>r.id.localeCompare(s.id)));n!==i&&this.gameState?.logger.warn(t,`Stepping back in place did not reproduce the state this line's snapshot describes, so an action's undo does not fully reverse it. Restoring the snapshot would have been correct; this path was not.
46
52
  expected: ${n}
47
- actual: ${i}`)}dispose(){this.events.clear(),this.gameState?.dispose()}notify(e,t=3e3){this.assertGameState();let n=this.gameState.idManager.generateId(),i=this.gameState.notificationMgr.consume({id:n,message:e,duration:t}),r=S.toPromiseForce(i);return{cancel:()=>{i.abort()},promise:r}}playSound(e){this.assertGameState();let t=e instanceof URL?e.toString():e,n=typeof t=="string"?new ge({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(L.EventTypes["event:state.player.skip"],!0)}async fastForward(e={}){this.assertGameState();let t=this.gameState,n=e.until??"menu",i=typeof n=="object"?n.actionId:null,r=n==="menu"||i!==null,s=e.maxSteps??t.game.config.maxStackModelLoop,a=e.stepTimeout??Le.FastForwardStepTimeout,l=i!==null?{reachedTarget:!1}:{},c=t.audioManager.getGlobalVolume();t.audioManager.setGlobalVolume(0),t.setFastForwarding(!0);try{let u=0;for(;u++<s;){if(i!==null&&this.stackModel.peekExecutingActionId()===i)return{reason:"action",reachedTarget:!0};if(r&&t.hasActiveMenu())return{reason:"menu",...l};if(this.stackModel.isEmpty())return{reason:"end",...l};let d=this.stackModel.getWaitingAwaitable();if(d){if(!await Le.settleSuspendedStep(t,d,a))return{reason:"stalled",...l}}else t.stage.next(),await Promise.resolve()}return{reason:"maxSteps",...l}}finally{t.setFastForwarding(!1),t.audioManager.setGlobalVolume(c)}}static settleSuspendedStep(e,t,n){return new Promise(i=>{let r=!1,s=null,a,l=d=>{r||(r=!0,s!==null&&(clearTimeout(s),s=null),a?.cancel?.(),i(d))};if(a=t.onSettled(()=>l(!0)),r){a?.cancel?.();return}let c=Date.now()+n,u=()=>{if(!r&&(e.events.emit(L.EventTypes["event:state.player.skip"],!0),!r)){if(Date.now()>=c){l(!1);return}s=setTimeout(u,Le.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(Le.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Le.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(Le.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(qe.fromAction(i)):e.logger.warn("No scene root found");let r=this.story?.getAllElementMap(this.story,this.story?.entryScene?.getSceneRoot()||[]);return r?r.forEach(s=>{e.logger.debug("reset element",s),s.reset()}):e.logger.warn("No elements found"),e.stage.forceUpdate(),e.stage.next(),t.end(),this}waitForRouterExit(){let e=null;return{promise:new Promise(t=>{e=this.game.router.onceExitComplete(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}waitForPageMount(){let e=null;return{promise:new Promise(t=>{e=this.game.router.oncePageMount(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}requestFullScreen(e){this.assertGameState();let t="LiveGame.requestFullScreen";try{let n=this.gameState.playerCurrent;if(!n){this.gameState.logger.warn(t,"No player element found");return}if(n.requestFullscreen)return n.requestFullscreen(e);this.gameState.logger.warn(t,"Fullscreen is not supported")}catch(n){this.gameState.logger.error(t,n)}}exitFullScreen(){this.assertGameState();let e="LiveGame.exitFullScreen";try{if(document.exitFullscreen)return document.exitFullscreen();this.gameState.logger.warn(e,"Fullscreen is not supported")}catch(t){this.gameState.logger.error(e,t)}}constructMaps(){let e=this.story;if(!e)throw new Error("No story loaded");if(this.mapCache)return this.mapCache;let t=new Map,n=new Map;return e.forEachChild(e,e.entryScene?.getSceneRoot()||[],i=>{t.set(i.getId(),i),n.set(i.callee.getId(),i.callee);for(let r of nt.getOwnedSounds(i)){let s=r.getId();s&&n.set(s,r)}},{allowFutureScene:!0}),this.mapCache=[t,n],this.mapCache}getScreenshotOptions(){return{quality:this.game.config.screenshotQuality}}onPlayerEvent(e,t,n){this.assertPlayerElement();let i=this.gameState.playerCurrent;return i?(i.addEventListener(e,t,n),{cancel:()=>i.removeEventListener(e,t,n)}):(this.gameState.logger.warn("LiveGame.onEvent","No player element found"),{cancel:()=>{}})}onWindowEvent(e,t,n){return window.addEventListener(e,t,n),{cancel:()=>window.removeEventListener(e,t,n)}}reset(){this.assertGameState();let e=this.gameState;this.resetStackModels(),this.stackModel.reset(),this.currentSavedGame=null,this.lastDialog=null,e.forceReset()}next(){this.assertGameState();let e=this.gameState;if(this.gameLock.isLocked())return this.gameLock;if(!this.story)throw new Error("No story loaded");return this.stackModel.isEmpty()?(e.logger.weakWarn("Game Actions","Action stack is empty"),this.currentSavedGame?e.events.emit("event:state.end"):this.currentSavedGame=null,null):this.stackModel.rollNext()}setLastDialog(e,t){this.lastDialog={sentence:e,speaker:t}}requestAsyncStackModel(e){this.assertGameState();let t=new qe(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 qe(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(Le.EventTypes["event:action.current"])&&this.events.emit(Le.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type}),t.callee?.markDirty();let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new Fe("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new qe(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Fe("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),[Ft].some(l=>i?.action&&i.action instanceof l)){i=null;continue}if(i.action&&i.action.is(ie,J.jumpTo)){let[l]=i.action.contentNode.getContent(),c=e.getScene(l);if(!c)throw i.action._sceneNotFoundError(i.action.getSceneName(l));if(a.has(c)){i=null;continue}a.add(c),i=c.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(oe,ne.do)){let[l]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=l[0]?.contentNode||null}i?.action&&r.push(i.action),i=i?.getChild()||null}return r}clearMainStack(){if(!this.stackModel)throw new Fe("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Fe("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:na(),lastSentence:null,lastSpeaker:null,storyHash:this.story?.hash()||""},game:{store:{},stage:{scenes:[],audio:{sounds:[],groups:[]},videos:[]},elementStates:[],services:{},stackModel:{items:[]},asyncStackModels:[]}}}assertGameState(){if(!this.gameState)throw new E("No game state found, make sure you call this method in effect hooks or event handlers")}assertPlayerElement(){if(this.assertGameState(),!this.gameState.playerCurrent)throw new E("Player Element Not Mounted")}};Le.DefaultNamespaces={game:{}},Le.GameSpacesKey={game:"game"},Le.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},Le.ElementAuditInterval=50,Le.FastForwardStepTimeout=1e4,Le.FastForwardSkipInterval=16;var Vt=Le;var ui=class ui{constructor(e){this.events=new Q;this.settings={...e},this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(ui.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(ui.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))}};ui.EventTypes={"event:game.preference.change":"event:game.preference.change"};var pi=ui;import"client-only";import Nl,{useEffect as $p,useRef as as}from"react";import"client-only";import Ga,{useContext as Fa,useState as jc}from"react";var wr=Ga.createContext(null);function Oa({children:o,game:e}){"use client";let t=new re({}),[n]=jc(e||t);return Ga.createElement(wr,{value:n},o)}function R(){let o=Fa(wr);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function Ha(){return Fa(wr)}import qc,{createContext as Yc,useContext as Va}from"react";var Ua="/",vo=class vo{constructor(e,t=vo.rootPath){this.events=new Q;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,l]=s.split("=");a&&(i[decodeURIComponent(a)]=l?decodeURIComponent(l):"")}}return{path:t||"/",query:i}}buildUrl(e,t){if(Object.keys(t).length===0)return e;let n=Object.entries(t).map(([i,r])=>`${encodeURIComponent(i)}=${encodeURIComponent(r)}`).join("&");return`${e}?${n}`}getQueryParam(e){return this.currentQuery[e]}setQueryParam(e,t){return this.currentQuery[e]=t,this.updateHistory(),this.emitOnChange(),this}setQueryParams(e){return Object.assign(this.currentQuery,e),this.updateHistory(),this.emitOnChange(),this}removeQueryParam(e){return delete this.currentQuery[e],this.updateHistory(),this.emitOnChange(),this}clearQueryParams(){return this.currentQuery={},this.updateHistory(),this.emitOnChange(),this}hasQueryParam(e){return e in this.currentQuery}getQueryParamKeys(){return Object.keys(this.currentQuery)}getQueryParamCount(){return Object.keys(this.currentQuery).length}getHistory(){return[...this.history]}getHistoryIndex(){return this.historyIndex}canGoBack(){return this.historyIndex>0}canGoForward(){return this.historyIndex<this.history.length-1}navigate(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};if(this.currentPath===r)return this.currentQuery=s,this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(r,s)),this.emitOnChange(),this;this.historyIndex<this.history.length-1&&(this.history.length=this.historyIndex+1);let a=this.buildUrl(r,s);return this.history.push(a),this.history.length>this.game.config.maxRouterHistory&&(this.history.shift(),this.historyIndex--),this.historyIndex++,this.currentPath=r,this.currentQuery=s,this.emitOnChange(),this.requestPageTransition(),this}back(){if(this.canGoBack()){this.historyIndex--;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}forward(){if(this.canGoForward()){this.historyIndex++;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}replace(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};return this.currentPath=r,this.currentQuery=s,this.historyIndex>=0?this.history[this.historyIndex]=this.buildUrl(r,s):(this.history.push(this.buildUrl(r,s)),this.historyIndex=0),this.emitOnChange(),this}clear(){return this.currentPath="",this.currentQuery={},this.history=[],this.historyIndex=-1,this.emitOnChange(),this.requestPageTransition(),this}cleanHistory(){return this.history=this.currentPath?[this.buildUrl(this.currentPath,this.currentQuery)]:[],this.historyIndex=this.currentPath?0:-1,this}parsePath(e){return e.split("/").filter(t=>t.length>0)}buildPath(e){return"/"+e.join("/")}getParentPath(e){let t=this.parsePath(e);return t.length<=1?"":this.buildPath(t.slice(0,-1))}matchPath(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length<i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}exactMatch(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length!==i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}extractParams(e,t){let n={},i=this.parsePath(e),r=this.parsePath(t);if(i.length!==r.length)return n;for(let s=0;s<r.length;s++){let a=r[s];if(a.startsWith(":")){let l=a.slice(1);n[l]=i[s]}}return n}onExitComplete(e){return this.events.on("event:router.onExitComplete",e)}onceExitComplete(e){return this.events.once("event:router.onExitComplete",e)}onPageMount(e){return this.events.on("event:router.onPageMount",e)}oncePageMount(e){return this.events.once("event:router.onPageMount",e)}onUpdate(e){return this.updateSyncHooks.add(e),{cancel:()=>{this.updateSyncHooks.delete(e)}}}emitUpdateSync(){this.updateSyncHooks.forEach(e=>e())}mount(e){if(this.mountedPaths.has(e))throw new E(`Path ${e} is already mounted. This may be caused by multiple capture segments in the same path.`);return this.mountedPaths.add(e),{cancel:()=>{this.unmount(e)}}}unmount(e){this.mountedPaths.delete(e)}mountDefaultHandler(e){if(this.defaultHandlerPaths.has(e))throw new E(`Default handler path ${e} is already mounted.`);return this.defaultHandlerPaths.add(e),{cancel:()=>{this.unmountDefaultHandler(e)}}}unmountDefaultHandler(e){this.defaultHandlerPaths.delete(e)}emitOnPageMount(){this.events.emit("event:router.onPageMount")}onRootExitComplete(e){return this.events.on("event:router.onExitComplete",e)}isActive(){return this.currentPath!==""}onChange(e){return this.events.on("event:router.onChange",e)}emitOnChange(){this.events.emit("event:router.onChange")}resolvePath(e){let t=e.split("?")[0];if(t.startsWith("/"))return t;if(t==="")return this.currentPath;let n=this.parsePath(this.currentPath),i=t.split("/"),r=[];r.push(...n);for(let s=0;s<i.length;s++){let a=i[s];a===""||a==="."||(a===".."?r.length>0&&r.pop():r.push(a))}return this.buildPath(r)}normalizePath(e){let t=e.replace(/\/\/+/g,"/").replace(/\/$/,"");return t===""?"/":(t.startsWith("/"),t)}joinPath(e,...t){let n=this.normalizePath(e),s=[n.startsWith("/")?n:"/"+n,...t.filter(a=>a.length>0)].join("/");return this.normalizePath(s)}updateHistory(){this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(this.currentPath,this.currentQuery))}requestPageTransition(){let e=()=>{this.transitioning=!0,this.emitUpdateSync(),this.emitOnChange()},t=()=>{this.events.emit("event:router.onTransitionEnd"),this.transitioning=!1,this.emitUpdateSync(),this.emitOnChange(),this.events.emit("event:router.onExitComplete")};if(e(),this.isPathsUnmounting()){let n=this.events.on("event:router.onPathUnmount",()=>{this.isPathsUnmounting()||(n.cancel(),at(()=>{t()}))})}else at(()=>{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)}};vo.rootPath=Ua;var dn=vo,kr=Yc(null);function Wa({children:o}){let e=R();return qc.createElement(kr,{value:{router:e.router}},o)}function Ut(){if(!Va(kr))throw new Error("useRouter must be used within a RouterProvider");return Va(kr).router}import za from"react";import tu from"clsx";import Xc,{createContext as Qc,useContext as Jc,useLayoutEffect as _c,useReducer as Zc,useState as eu}from"react";var Zt=class Zt{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new Q().setMaxListeners(1/0);this.lockers=[];this.updater=null}update(e,t,n){this.state.width=e,this.state.height=t,this.state.scale=n,this.events.emit(Zt.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(Zt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(Zt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(Zt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(Zt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(Zt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};Zt.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 Pr=Zt,Er=Qc(null);function Ba({children:o}){"use client";let[e]=eu(()=>new Pr);return Xc.createElement(Er,{value:{ratio:e}},o)}function fe(){let o=Jc(Er),[,e]=Zc(n=>n+1,0);if(!Er||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return _c(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function Wt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=fe(),s=r.getStyle();return za.createElement("div",{className:tu("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},za.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import nu,{useEffect as iu}from"react";function mn(o){let e=R(),[t,n]=nu.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return iu(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Dr from"react";import So from"react";import Ka from"clsx";function To({children:o,className:e,style:t,...n}){let{ratio:i}=fe(),r=R();return So.createElement(Wt,{className:Ka("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},So.createElement("div",{className:"absolute inset-0 w-full h-full"},So.createElement("div",{className:"inset-0 w-full h-full"},So.createElement("div",{className:Ka("pointer-events-auto-rest",e),style:t},o))))}function ou({children:o,className:e,style:t}){return Dr.createElement(Dr.Fragment,null,Dr.createElement(To,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import $a from"clsx";import ja from"react";function bo({className:o,children:e,...t}){let{ratio:n}=fe();return ja.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:$a("w-full h-full")},ja.createElement("div",{className:$a("z-20",o),...t},e))}import At,{useState as qa}from"react";import{motion as ru}from"motion/react";function Ao({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let l=R(),[c,u]=qa(!1);if(!l.config.app.inspector)return At.createElement(r,{...a,ref:s},o);let d={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:c?1e3:"auto"}};return At.createElement(r,{...d,ref:s},n&&c&&At.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function su({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=R(),[a,l]=qa(!1);if(!s.config.app.inspector)return At.createElement(i,{...r});let c={...r,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),style:{...r.style||{},outline:`${o} ${n}px ${e}`,zIndex:a?1e3:"auto"}};return At.createElement("div",null,At.createElement(i,{...c}),t&&a&&At.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function au(o){return At.createElement(Ao,{...o,as:"div"})}function lu(o){return At.createElement(Ao,{...o,as:"span"})}function cu(o){return At.createElement(su,{...o,as:"img"})}function uu(o){return At.createElement(Ao,{...o,as:"button"})}function pu(o){return At.createElement(Ao,{...o,as:ru.div,ref:o.ref,layout:o.layout})}var du={Div:au,Span:lu,Button:uu,Img:cu,mDiv:pu},Bt=du;import Eo from"clsx";import Oe,{useEffect as wn,useMemo as Ru,useRef as ul,useState as Vr}from"react";import{useEffect as mu,useState as fu}from"react";function se(o){let[e,t]=fu(0);mu(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import Ya from"react";var Cn=Ya.createContext(null);function Lt(){let o=Ya.useContext(Cn);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import Co,{useCallback as hu,useLayoutEffect as di,useMemo as Xa,useRef as Qa}from"react";import{useIsPresent as gu}from"motion/react";var Rt=class Rt{constructor(e){this.events=new Q;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.voiceWaitDisposer=null;this.config=e,this._state="pending",this.autoForwardScheduler=new Oi,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(Rt.Events.complete):this.safeEmit(Rt.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(Rt.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(Rt.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(re.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(Rt.Events.complete),this.emitFlush(),this}isEnded(){return this.state==="ended"}setPause(e){this.isEnded()||(e?this._state="paused":this._state="pending")}isForceSkipped(){return this._forceSkipped}tryScheduleAutoForward(){this.isEnded()&&this.scheduleAutoForward()}cancelAutoForward(){this.releaseVoiceWait(),this.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(Rt.Events.onFlush),this}onFlush(e){return this.events.on(Rt.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;if(!this._active||!e.getPreference(re.Preferences.autoForward)||this.state!=="ended")return;this.releaseVoiceWait();let t=this.getPlayingVoiceToken();if(!t){this.scheduleAutoForwardDelay();return}let n=()=>{this.releaseVoiceWait(),this.scheduleAutoForwardDelay()};t.once("ended",n),t.once("stop",n),this.voiceWaitDisposer=()=>{t.off("ended",n),t.off("stop",n)}}scheduleAutoForwardDelay(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(re.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(Rt.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(re.Preferences.gameSpeed))}getPlayingVoiceToken(){let e=this.config.action.sentence;if(!e)return null;try{let t=tt.getVoice(this.config.gameState,e);if(!t)return null;let n=this.config.gameState.audioManager.getToken(t);return n&&n.isPlaying()?n:null}catch{return null}}releaseVoiceWait(){let e=this.voiceWaitDisposer;this.voiceWaitDisposer=null,e?.()}};Rt.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Re=Rt;function mi({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=gu(),s=i&&r,a=Qa(!1),l=Qa(o),c=l.current!==o,u=Xa(()=>o.sentence?.evaluate(Ae.getCtx({gameState:n})),[o.sentence,n]),d=Xa(()=>new Re({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:c}),[o,n,t,u]),p=n.game.config.dialog,h=hu(f=>{!s||a.current||(a.current=!0,e?.(f))},[s,e]);return di(()=>{a.current=!1},[d]),di(()=>{l.current=o},[o]),di(()=>(d.setActive(s),()=>{d.setActive(!1)}),[d,s]),di(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",d),d.events.on(Re.Events.complete,f=>{n.logger.log("NarraLeaf-React: Say","Complete",d.isIdle()),s&&(d.isIdle()||f?h(!1):d.setIdle(!0))}).cancel),[d,h,n,s]),di(()=>{let f=A=>{s&&(A?(d.setIdle(!0),d.forceSkip()):d.isIdle()?h(!0):d.forceSkip())},m=n.events.on(L.EventTypes["event:state.player.skip"],f),v=n.events.on(L.EventTypes["event:state.player.stageClick"],()=>f(!1));return()=>{m.cancel(),v.cancel()}},[d,h,n,s]),Co.createElement(Co.Fragment,null,Co.createElement(Cn,{value:d},Co.createElement(p,null)))}import{useEffect as xo,useState as Su}from"react";import{useEffect as yu,useState as vu}from"react";function xn(o){let e=R(),[t,n]=vu(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return yu(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var Wn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(Wn||{});function wo({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=R(),[s]=xn("nextAction"),[a]=Su(()=>{let l=o.firedTextEvents??(o.firedTextEvents=new Set);return new Re({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:l})});return xo(()=>{if(!n)return;let l=()=>{e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()},c=()=>{e.requestNvlSkip(o.id)==="typing"&&a.forceSkip()},u=e.events.on(L.EventTypes["event:state.player.stageClick"],l),d=e.events.on(L.EventTypes["event:state.player.skip"],c);return()=>{u.cancel(),d.cancel()}},[a,o.id,e,n]),xo(()=>{if(!n)return;let l=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",l);return()=>{u.cancel()}}let c=r.getLiveGame().onPlayerEvent("keydown",l);return()=>{c.cancel()}},[a,o.id,r,e,n,s]),xo(()=>{let l=a.events.on(Re.Events.complete,c=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!c&&a.setIdle(!0))});return()=>{l.cancel()}},[a,o.id,e,n]),xo(()=>{let l=a.events.on(Re.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{l.cancel()}},[a,n]),a}function Tu(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&&(N.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function ko(o,e,t){e.has(o)||(e.add(o),Tu(o,t))}function Ja(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),ko(r,e,t)}return n}var Bn=new Map,Lr=new Set;function bu(o,e){return Bn.set(o,e),Lr.delete(o),()=>{Bn.get(o)===e&&Bn.delete(o)}}function Au(o){Bn.delete(o)}function Cu(o){return Bn.get(o)??null}function Rr(o){if(!o)return null;if(typeof o!="string")return o;let e=Bn.get(o);return e||(Lr.has(o)||(Lr.add(o),console.warn(`NarraLeaf-React: no word renderer is registered as "${o}"; the word is rendered as plain text. Call registerWordRenderer before the line plays.`)),null)}import{useCallback as xu,useLayoutEffect as _a,useRef as Ir,useState as wu}from"react";var Za=.5,ku=.005,Pu=12,el=.05,nl=12,Po="--nl-text-scale",il=`var(${Po}, 1)`;function fi(o){return o==null||o===""?void 0:`calc(${typeof o=="number"?`${o}px`:String(o)} * ${il})`}function ol(){return`calc(1em * ${il})`}function tl(o,e){let t=getComputedStyle(o);return e?o.clientWidth-parseFloat(t.paddingLeft||"0")-parseFloat(t.paddingRight||"0"):o.clientHeight-parseFloat(t.paddingTop||"0")-parseFloat(t.paddingBottom||"0")}function rl({enabled:o,minFontSize:e,vertical:t,revealed:n}){let i=Ir(null),[r,s]=wu(1),a=Ir(1),l=Ir(0);a.current=r;let c=xu(u=>{let d=i.current,p=d?.parentElement;if(!d||!p)return;let h=tl(p,t);if(!Number.isFinite(h)||h<=0)return;l.current=h;let f=()=>t?d.offsetWidth:d.offsetHeight,m=b=>{d.style.setProperty(Po,String(b))},v=b=>(m(b),f()<=h+Za);if(v(u)){u!==a.current&&s(u);return}m(1);let A=parseFloat(getComputedStyle(d).fontSize)||0,g=A>0?Math.min(1,Math.max(el,e/A)):el,y;if(g>=u||!v(g))y=g;else{let b=g,C=u;for(let x=0;x<Pu&&C-b>ku;x++){let T=(b+C)/2;v(T)?b=T:C=T}y=b}m(y),s(y)},[e,t]);return _a(()=>{if(!o){a.current!==1&&s(1);return}c(a.current)},[o,c,n]),_a(()=>{let u=i.current?.parentElement;if(!o||!u||typeof ResizeObserver>"u")return;let d=new ResizeObserver(()=>{Math.abs(tl(u,t)-l.current)>Za&&c(1)});d.observe(u);let p=!1;return document.fonts?.ready.then(()=>{p||c(a.current)}),()=>{p=!0,d.disconnect()}},[o,c,t]),{containerRef:i,scale:r}}function sl(o,e){return o.fontSize!==void 0?fi(o.fontSize):o.fontScale!==void 0?ll(o.fontScale):fi(e)}function al(o,e){return o.fontSize!==void 0?o.fontSize:o.fontScale!==void 0?ll(o.fontScale):e}function ll(o){return`${o}em`}function Mr(o){return o?{textEmphasis:`${o.fill??"filled"} ${o.mark??"dot"}`,textEmphasisPosition:`${o.position??"over"} right`}:{}}import Nr from"react";var Eu=2;function hi(o){return o==="vertical-rl"||o==="vertical-lr"}function Du(o){return o===!1?0:typeof o=="number"?Number.isFinite(o)?Math.max(0,Math.round(o)):0:Eu}function Fr(o,e){return hi(o)?{writingMode:o,textOrientation:e??"mixed"}:o?{writingMode:o}:{}}var Gr=/[0-9A-Za-z]+(?:[.:\-/][0-9A-Za-z]+)*/g;function Lu(o,e){if(e<=0)return[{text:o,combineUpright:!1}];let t=[],n=0;Gr.lastIndex=0;for(let i=Gr.exec(o);i;i=Gr.exec(o))i[0].length>e||(i.index>n&&t.push({text:o.slice(n,i.index),combineUpright:!1}),t.push({text:i[0],combineUpright:!0}),n=i.index+i[0].length);return(n<o.length||t.length===0)&&t.push({text:o.slice(n),combineUpright:!1}),t}function Or(){return{wordBreak:"normal",lineBreak:"strict",overflowWrap:"break-word"}}function Hr(o,e,t){if(!e)return o;let n=Du(t);if(n<=0)return o;let i=Lu(o,n);return i.some(r=>r.combineUpright)?i.map((r,s)=>r.combineUpright?Nr.createElement("span",{key:s,style:{textCombineUpright:"all"}},r.text):Nr.createElement(Nr.Fragment,{key:s},r.text)):o}function*Wr(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(We.isPause(n.text)){yield We.from(n.text);continue}if(ct.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
53
+ actual: ${i}`)}dispose(){this.events.clear(),this.gameState?.dispose()}notify(e,t=3e3){this.assertGameState();let n=this.gameState.idManager.generateId(),i=this.gameState.notificationMgr.consume({id:n,message:e,duration:t}),r=S.toPromiseForce(i);return{cancel:()=>{i.abort()},promise:r}}playSound(e){this.assertGameState();let t=e instanceof URL?e.toString():e,n=typeof t=="string"?new ge({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(L.EventTypes["event:state.player.skip"],!0)}async fastForward(e={}){this.assertGameState();let t=this.gameState,n=e.until??"menu",i=typeof n=="object"?n.actionId:null,r=n==="menu"||i!==null,s=e.maxSteps??t.game.config.maxStackModelLoop,a=e.stepTimeout??Ie.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 Ie.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,Ie.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(Ie.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Ie.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(Ie.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(Ye.fromAction(i)):e.logger.warn("No scene root found");let r=this.story?.getAllElementMap(this.story,this.story?.entryScene?.getSceneRoot()||[]);return r?r.forEach(s=>{e.logger.debug("reset element",s),s.reset()}):e.logger.warn("No elements found"),e.stage.forceUpdate(),e.stage.next(),t.end(),this}waitForRouterExit(){let e=null;return{promise:new Promise(t=>{e=this.game.router.onceExitComplete(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}waitForPageMount(){let e=null;return{promise:new Promise(t=>{e=this.game.router.oncePageMount(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}requestFullScreen(e){this.assertGameState();let t="LiveGame.requestFullScreen";try{let n=this.gameState.playerCurrent;if(!n){this.gameState.logger.warn(t,"No player element found");return}if(n.requestFullscreen)return n.requestFullscreen(e);this.gameState.logger.warn(t,"Fullscreen is not supported")}catch(n){this.gameState.logger.error(t,n)}}exitFullScreen(){this.assertGameState();let e="LiveGame.exitFullScreen";try{if(document.exitFullscreen)return document.exitFullscreen();this.gameState.logger.warn(e,"Fullscreen is not supported")}catch(t){this.gameState.logger.error(e,t)}}constructMaps(){let e=this.story;if(!e)throw new Error("No story loaded");if(this.mapCache)return this.mapCache;let t=new Map,n=new Map;return e.forEachChild(e,e.entryScene?.getSceneRoot()||[],i=>{t.set(i.getId(),i),n.set(i.callee.getId(),i.callee);for(let r of it.getOwnedSounds(i)){let s=r.getId();s&&n.set(s,r)}},{allowFutureScene:!0}),this.mapCache=[t,n],this.mapCache}getScreenshotOptions(){return{quality:this.game.config.screenshotQuality}}onPlayerEvent(e,t,n){this.assertPlayerElement();let i=this.gameState.playerCurrent;return i?(i.addEventListener(e,t,n),{cancel:()=>i.removeEventListener(e,t,n)}):(this.gameState.logger.warn("LiveGame.onEvent","No player element found"),{cancel:()=>{}})}onWindowEvent(e,t,n){return window.addEventListener(e,t,n),{cancel:()=>window.removeEventListener(e,t,n)}}reset(){this.assertGameState();let e=this.gameState;this.resetStackModels(),this.stackModel.reset(),this.currentSavedGame=null,this.lastDialog=null,e.forceReset()}next(){this.assertGameState();let e=this.gameState;if(this.gameLock.isLocked())return this.gameLock;if(!this.story)throw new Error("No story loaded");return this.stackModel.isEmpty()?(e.logger.weakWarn("Game Actions","Action stack is empty"),this.currentSavedGame?e.events.emit("event:state.end"):this.currentSavedGame=null,null):this.stackModel.rollNext()}setLastDialog(e,t){this.lastDialog={sentence:e,speaker:t}}requestAsyncStackModel(e){this.assertGameState();let t=new Ye(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 Ye(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(Ie.EventTypes["event:action.current"])&&this.events.emit(Ie.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type}),t.callee?.markDirty();let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new be("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Ye(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new be("GameState not set");return this.gameState}getAllPredictableActions(e,t,n){let i=t?.contentNode||null,r=[],s=[],a=new Set;for(;(i||s.length)&&!(n&&r.length>=n);){if(i||(i=s.pop().contentNode),[Ot].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(ee,z.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(oe,ie.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 be("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new be("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:ia(),lastSentence:null,lastSpeaker:null,storyHash:this.story?.hash()||""},game:{store:{},stage:{scenes:[],audio:{sounds:[],groups:[]},videos:[]},elementStates:[],services:{},stackModel:{items:[]},asyncStackModels:[]}}}assertGameState(){if(!this.gameState)throw new E("No game state found, make sure you call this method in effect hooks or event handlers")}assertPlayerElement(){if(this.assertGameState(),!this.gameState.playerCurrent)throw new E("Player Element Not Mounted")}};Ie.DefaultNamespaces={game:{}},Ie.GameSpacesKey={game:"game"},Ie.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},Ie.ElementAuditInterval=50,Ie.FastForwardStepTimeout=1e4,Ie.FastForwardSkipInterval=16;var Ut=Ie;var pi=class pi{constructor(e){this.events=new _;this.settings={...e},this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(pi.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(pi.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))}};pi.EventTypes={"event:game.preference.change":"event:game.preference.change"};var di=pi;import"client-only";import Gc,{useEffect as jp,useRef as cs}from"react";import"client-only";import Fa,{useContext as Oa,useState as ql}from"react";var kr=Fa.createContext(null);function Ha({children:o,game:e}){"use client";let t=new re({}),[n]=ql(e||t);return Fa.createElement(kr,{value:n},o)}function R(){let o=Oa(kr);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function Va(){return Oa(kr)}import Yl,{createContext as Xl,useContext as Ua}from"react";var Wa="/",vo=class vo{constructor(e,t=vo.rootPath){this.events=new _;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 E(`Path ${e} is already mounted. This may be caused by multiple capture segments in the same path.`);return this.mountedPaths.add(e),{cancel:()=>{this.unmount(e)}}}unmount(e){this.mountedPaths.delete(e)}mountDefaultHandler(e){if(this.defaultHandlerPaths.has(e))throw new E(`Default handler path ${e} is already mounted.`);return this.defaultHandlerPaths.add(e),{cancel:()=>{this.unmountDefaultHandler(e)}}}unmountDefaultHandler(e){this.defaultHandlerPaths.delete(e)}emitOnPageMount(){this.events.emit("event:router.onPageMount")}onRootExitComplete(e){return this.events.on("event:router.onExitComplete",e)}isActive(){return this.currentPath!==""}onChange(e){return this.events.on("event:router.onChange",e)}emitOnChange(){this.events.emit("event:router.onChange")}resolvePath(e){let t=e.split("?")[0];if(t.startsWith("/"))return t;if(t==="")return this.currentPath;let n=this.parsePath(this.currentPath),i=t.split("/"),r=[];r.push(...n);for(let s=0;s<i.length;s++){let a=i[s];a===""||a==="."||(a===".."?r.length>0&&r.pop():r.push(a))}return this.buildPath(r)}normalizePath(e){let t=e.replace(/\/\/+/g,"/").replace(/\/$/,"");return t===""?"/":(t.startsWith("/"),t)}joinPath(e,...t){let n=this.normalizePath(e),s=[n.startsWith("/")?n:"/"+n,...t.filter(a=>a.length>0)].join("/");return this.normalizePath(s)}updateHistory(){this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(this.currentPath,this.currentQuery))}requestPageTransition(){let e=()=>{this.transitioning=!0,this.emitUpdateSync(),this.emitOnChange()},t=()=>{this.events.emit("event:router.onTransitionEnd"),this.transitioning=!1,this.emitUpdateSync(),this.emitOnChange(),this.events.emit("event:router.onExitComplete")};if(e(),this.isPathsUnmounting()){let n=this.events.on("event:router.onPathUnmount",()=>{this.isPathsUnmounting()||(n.cancel(),ct(()=>{t()}))})}else ct(()=>{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)}};vo.rootPath=Wa;var dn=vo,Pr=Xl(null);function Ba({children:o}){let e=R();return Yl.createElement(Pr,{value:{router:e.router}},o)}function Wt(){if(!Ua(Pr))throw new Error("useRouter must be used within a RouterProvider");return Ua(Pr).router}import Ka from"react";import nu from"clsx";import Ql,{createContext as _l,useContext as Jl,useLayoutEffect as Zl,useReducer as eu,useState as tu}from"react";var Zt=class Zt{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new _().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(Zt.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(Zt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(Zt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(Zt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(Zt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(Zt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};Zt.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 Er=Zt,Dr=_l(null);function za({children:o}){"use client";let[e]=tu(()=>new Er);return Ql.createElement(Dr,{value:{ratio:e}},o)}function fe(){let o=Jl(Dr),[,e]=eu(n=>n+1,0);if(!Dr||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return Zl(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function Bt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=fe(),s=r.getStyle();return Ka.createElement("div",{className:nu("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},Ka.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import iu,{useEffect as ou}from"react";function mn(o){let e=R(),[t,n]=iu.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return ou(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Lr from"react";import So from"react";import $a from"clsx";function To({children:o,className:e,style:t,...n}){let{ratio:i}=fe(),r=R();return So.createElement(Bt,{className:$a("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},So.createElement("div",{className:"absolute inset-0 w-full h-full"},So.createElement("div",{className:"inset-0 w-full h-full"},So.createElement("div",{className:$a("pointer-events-auto-rest",e),style:t},o))))}function ru({children:o,className:e,style:t}){return Lr.createElement(Lr.Fragment,null,Lr.createElement(To,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import ja from"clsx";import qa from"react";function bo({className:o,children:e,...t}){let{ratio:n}=fe();return qa.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:ja("w-full h-full")},qa.createElement("div",{className:ja("z-20",o),...t},e))}import Ct,{useState as Ya}from"react";import{motion as su}from"motion/react";function Ao({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=R(),[l,u]=Ya(!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 au({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=R(),[a,c]=Ya(!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 cu(o){return Ct.createElement(Ao,{...o,as:"div"})}function lu(o){return Ct.createElement(Ao,{...o,as:"span"})}function uu(o){return Ct.createElement(au,{...o,as:"img"})}function pu(o){return Ct.createElement(Ao,{...o,as:"button"})}function du(o){return Ct.createElement(Ao,{...o,as:su.div,ref:o.ref,layout:o.layout})}var mu={Div:cu,Span:lu,Button:pu,Img:uu,mDiv:du},zt=mu;import Eo from"clsx";import Ve,{useEffect as wn,useMemo as Iu,useRef as pc,useState as Ur}from"react";import{useEffect as fu,useState as hu}from"react";function se(o){let[e,t]=hu(0);fu(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import Xa from"react";var Cn=Xa.createContext(null);function Rt(){let o=Xa.useContext(Cn);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import Co,{useCallback as gu,useLayoutEffect as mi,useMemo as Qa,useRef as _a}from"react";import{useIsPresent as yu}from"motion/react";var It=class It{constructor(e){this.events=new _;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.voiceWaitDisposer=null;this.config=e,this._state="pending",this.autoForwardScheduler=new Hi,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(It.Events.complete):this.safeEmit(It.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(It.Events.forceSkip)))}dispatchComplete(){if(this.state==="ended"){this.config.gameState.logger.weakWarn("DialogState","Dialog is already ended. Cannot dispatch complete.");return}if(!this.events.hasListeners(It.Events.complete)){this.config.gameState.logger.weakWarn("DialogState","No listener for complete event. Cannot dispatch complete.");return}let e=this.config.gameState.game.preference;return this._state="ended",this.config.gameState.completeAdvDialogTyping(this.config.action.id),e.getPreference(re.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(It.Events.complete),this.emitFlush(),this}isEnded(){return this.state==="ended"}setPause(e){this.isEnded()||(e?this._state="paused":this._state="pending")}isForceSkipped(){return this._forceSkipped}tryScheduleAutoForward(){this.isEnded()&&this.scheduleAutoForward()}cancelAutoForward(){this.releaseVoiceWait(),this.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(It.Events.onFlush),this}onFlush(e){return this.events.on(It.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;if(!this._active||!e.getPreference(re.Preferences.autoForward)||this.state!=="ended")return;this.releaseVoiceWait();let t=this.getPlayingVoiceToken();if(!t){this.scheduleAutoForwardDelay();return}let n=()=>{this.releaseVoiceWait(),this.scheduleAutoForwardDelay()};t.once("ended",n),t.once("stop",n),this.voiceWaitDisposer=()=>{t.off("ended",n),t.off("stop",n)}}scheduleAutoForwardDelay(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(re.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(It.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(re.Preferences.gameSpeed))}getPlayingVoiceToken(){let e=this.config.action.sentence;if(!e)return null;try{let t=nt.getVoice(this.config.gameState,e);if(!t)return null;let n=this.config.gameState.audioManager.getToken(t);return n&&n.isPlaying()?n:null}catch{return null}}releaseVoiceWait(){let e=this.voiceWaitDisposer;this.voiceWaitDisposer=null,e?.()}};It.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Me=It;function fi({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=yu(),s=i&&r,a=_a(!1),c=_a(o),l=c.current!==o,u=Qa(()=>o.sentence?.evaluate(Ce.getCtx({gameState:n})),[o.sentence,n]),d=Qa(()=>new Me({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:l}),[o,n,t,u]),p=n.game.config.dialog,h=gu(f=>{!s||a.current||(a.current=!0,e?.(f))},[s,e]);return mi(()=>{a.current=!1},[d]),mi(()=>{c.current=o},[o]),mi(()=>(d.setActive(s),()=>{d.setActive(!1)}),[d,s]),mi(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",d),d.events.on(Me.Events.complete,f=>{n.logger.log("NarraLeaf-React: Say","Complete",d.isIdle()),s&&(d.isIdle()||f?h(!1):d.setIdle(!0))}).cancel),[d,h,n,s]),mi(()=>{let f=A=>{s&&(A?(d.setIdle(!0),d.forceSkip()):d.isIdle()?h(!0):d.forceSkip())},m=n.events.on(L.EventTypes["event:state.player.skip"],f),v=n.events.on(L.EventTypes["event:state.player.stageClick"],()=>f(!1));return()=>{m.cancel(),v.cancel()}},[d,h,n,s]),Co.createElement(Co.Fragment,null,Co.createElement(Cn,{value:d},Co.createElement(p,null)))}import{useEffect as xo,useState as Tu}from"react";import{useEffect as vu,useState as Su}from"react";function xn(o){let e=R(),[t,n]=Su(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return vu(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var Wn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(Wn||{});function wo({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=R(),[s]=xn("nextAction"),[a]=Tu(()=>{let c=o.firedTextEvents??(o.firedTextEvents=new Set);return new Me({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:c})});return xo(()=>{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]),xo(()=>{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]),xo(()=>{let c=a.events.on(Me.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),xo(()=>{let c=a.events.on(Me.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function bu(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&&(N.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function ko(o,e,t){e.has(o)||(e.add(o),bu(o,t))}function Ja(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),ko(r,e,t)}return n}var Bn=new Map,Rr=new Set;function Au(o,e){return Bn.set(o,e),Rr.delete(o),()=>{Bn.get(o)===e&&Bn.delete(o)}}function Cu(o){Bn.delete(o)}function xu(o){return Bn.get(o)??null}function Ir(o){if(!o)return null;if(typeof o!="string")return o;let e=Bn.get(o);return e||(Rr.has(o)||(Rr.add(o),console.warn(`NarraLeaf-React: no word renderer is registered as "${o}"; the word is rendered as plain text. Call registerWordRenderer before the line plays.`)),null)}import{useCallback as wu,useLayoutEffect as Za,useRef as Mr,useState as ku}from"react";var ec=.5,Pu=.005,Eu=12,tc=.05,ic=12,Po="--nl-text-scale",oc=`var(${Po}, 1)`;function hi(o){return o==null||o===""?void 0:`calc(${typeof o=="number"?`${o}px`:String(o)} * ${oc})`}function rc(){return`calc(1em * ${oc})`}function nc(o,e){let t=getComputedStyle(o);return e?o.clientWidth-parseFloat(t.paddingLeft||"0")-parseFloat(t.paddingRight||"0"):o.clientHeight-parseFloat(t.paddingTop||"0")-parseFloat(t.paddingBottom||"0")}function sc({enabled:o,minFontSize:e,vertical:t,revealed:n}){let i=Mr(null),[r,s]=ku(1),a=Mr(1),c=Mr(0);a.current=r;let l=wu(u=>{let d=i.current,p=d?.parentElement;if(!d||!p)return;let h=nc(p,t);if(!Number.isFinite(h)||h<=0)return;c.current=h;let f=()=>t?d.offsetWidth:d.offsetHeight,m=b=>{d.style.setProperty(Po,String(b))},v=b=>(m(b),f()<=h+ec);if(v(u)){u!==a.current&&s(u);return}m(1);let A=parseFloat(getComputedStyle(d).fontSize)||0,g=A>0?Math.min(1,Math.max(tc,e/A)):tc,y;if(g>=u||!v(g))y=g;else{let b=g,C=u;for(let w=0;w<Eu&&C-b>Pu;w++){let T=(b+C)/2;v(T)?b=T:C=T}y=b}m(y),s(y)},[e,t]);return Za(()=>{if(!o){a.current!==1&&s(1);return}l(a.current)},[o,l,n]),Za(()=>{let u=i.current?.parentElement;if(!o||!u||typeof ResizeObserver>"u")return;let d=new ResizeObserver(()=>{Math.abs(nc(u,t)-c.current)>ec&&l(1)});d.observe(u);let p=!1;return document.fonts?.ready.then(()=>{p||l(a.current)}),()=>{p=!0,d.disconnect()}},[o,l,t]),{containerRef:i,scale:r}}function ac(o,e){return o.fontSize!==void 0?hi(o.fontSize):o.fontScale!==void 0?lc(o.fontScale):hi(e)}function cc(o,e){return o.fontSize!==void 0?o.fontSize:o.fontScale!==void 0?lc(o.fontScale):e}function lc(o){return`${o}em`}function Nr(o){return o?{textEmphasis:`${o.fill??"filled"} ${o.mark??"dot"}`,textEmphasisPosition:`${o.position??"over"} right`}:{}}import Gr from"react";var Du=2;function gi(o){return o==="vertical-rl"||o==="vertical-lr"}function Lu(o){return o===!1?0:typeof o=="number"?Number.isFinite(o)?Math.max(0,Math.round(o)):0:Du}function Or(o,e){return gi(o)?{writingMode:o,textOrientation:e??"mixed"}:o?{writingMode:o}:{}}var Fr=/[0-9A-Za-z]+(?:[.:\-/][0-9A-Za-z]+)*/g;function Ru(o,e){if(e<=0)return[{text:o,combineUpright:!1}];let t=[],n=0;Fr.lastIndex=0;for(let i=Fr.exec(o);i;i=Fr.exec(o))i[0].length>e||(i.index>n&&t.push({text:o.slice(n,i.index),combineUpright:!1}),t.push({text:i[0],combineUpright:!0}),n=i.index+i[0].length);return(n<o.length||t.length===0)&&t.push({text:o.slice(n),combineUpright:!1}),t}function Hr(){return{wordBreak:"normal",lineBreak:"strict",overflowWrap:"break-word"}}function Vr(o,e,t){if(!e)return o;let n=Lu(t);if(n<=0)return o;let i=Ru(o,n);return i.some(r=>r.combineUpright)?i.map((r,s)=>r.combineUpright?Gr.createElement("span",{key:s,style:{textCombineUpright:"all"}},r.text):Gr.createElement(Gr.Fragment,{key:s},r.text)):o}function*Br(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(ze.isPause(n.text)){yield ze.from(n.text);continue}if(ut.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
48
54
  `?yield`
49
- `:yield{text:r,full:n.text,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function Ur(o){let e=Wr(o),t=[];for(let n of e){if(We.isPause(n)||ct.isTextEvent(n))continue;let i=t[t.length-1];if(i&&i!==`
55
+ `:yield{text:r,full:n.text,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function Wr(o){let e=Br(o),t=[];for(let n of e){if(ze.isPause(n)||ut.isTextEvent(n))continue;let i=t[t.length-1];if(i&&i!==`
50
56
  `&&n!==`
51
- `&&i.tag===n.tag){t[t.length-1]={...n,text:i.text+n.text,config:n.config};continue}t.push(n)}return t}function pl(o,e){o(t=>{let n=t[t.length-1];return n&&n!==`
57
+ `&&i.tag===n.tag){t[t.length-1]={...n,text:i.text+n.text,config:n.config};continue}t.push(n)}return t}function dc(o,e){o(t=>{let n=t[t.length-1];return n&&n!==`
52
58
  `&&e!==`
53
- `&&n.tag===e.tag?[...t.slice(0,-1),{...e,text:n.text+e.text,config:e.config}]:[...t,e]})}function Iu(o,e,t){return t||(o!==void 0?me.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new ee(n.text,n.config)):[])}function Mu(o,e,t){let n=Math.max(0,e??t);return typeof o=="object"?{enabled:o.enabled??!0,delay:Math.max(0,o.delay??n)}:{enabled:o??!0,delay:n}}function cl(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Do(o){return o===void 0?void 0:Ln(o)}function dl(o){return typeof o.tag2=="number"?o.tag2>=o.full.length-1:o.text.length>=o.full.length}function ml({word:o,vertical:e,tateChuYoko:t,done:n,style:i,renderer:r}){let s=o.config.ruby?Oe.createElement("ruby",{className:"align-bottom inline-block"},Oe.createElement("rt",{className:"block text-center"},o.config.ruby),Hr(o.text,e,t)):Hr(o.text,e,t);return r?Oe.createElement(r,{text:o.text,fullText:o.full,revealed:dl(o),done:n,style:i,config:o.config,data:o.config.data},s):s}function Nu(o,e){return!!e&&dl(o)}function Br({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,writingMode:l,textOrientation:c,tateChuYoko:u,autoFit:d,autoFitMinFontSize:p,...h}){let f=R(),m=f.getLiveGame().getGameState(),v=ul(null),[A,g]=Vr(()=>n&&!n.config.useTypeEffect?Ur(n.config.evaluatedWords):[]),[y,b]=se();if(!n)throw new Error("Dialog state is required");wn(()=>{if(!(!n.config.action.sentence||v.current))return m.logger.info("Initializing the sentence",n,v.current),m.schedule(({onCleanup:B})=>{if(!n.config.useTypeEffect){Ja(n.config.evaluatedWords,n.config.firedTextEvents??new Set,m),n.dispatchComplete();return}g([]),v.current=O(),y(),v.current.onComplete(()=>{n.dispatchComplete()}),B(()=>{v.current?.timeline?.abort()})},0)},[]),wn(()=>n.events.depends([n.events.on(Re.Events.requestComplete,()=>{v.current?.interact()}),n.events.on(Re.Events.forceSkip,()=>{n.isEnded()||v.current?.forceSkip()})]).cancel,[n,b]),wn(()=>n.onFlush(()=>{y()}).cancel,[n]),wn(()=>f.preference.events.depends([f.preference.onPreferenceChange(re.Preferences.gameSpeed,()=>{v.current?.update()}),f.preference.onPreferenceChange(re.Preferences.autoForward,()=>{v.current?.update()}),f.preference.onPreferenceChange(re.Preferences.cps,()=>{v.current?.update()})]).cancel,[]);let C=(d??!0)&&!f.config.disableTextScaling,x=Ru(()=>A.reduce((B,ke)=>B+(ke===`
54
- `?1:ke.text.length),0),[A]),{containerRef:T,scale:w}=rl({enabled:C,minFontSize:p??nl,vertical:hi(l),revealed:x});function O(){let B=new S,ke=new Ce(B).setGuard(m.guard),mt=new Set,ot=n.config.firedTextEvents??new Set,He=new Set,I=new Set,F=Wr(n.config.evaluatedWords),D=null,z=[],ae=[],M=()=>{z.forEach(Ve=>Ve()),z.length=0},he=()=>{if(ae.length!==0)return{done:!1,value:ae.shift()};let{done:Ve,value:Qe}=F.next();return{done:Ve,value:Qe}},Pe=Ve=>{let Qe=on=>{Ve(on),He.delete(Qe)};return He.add(Qe),{cancel:()=>{He.delete(Qe)}}},rt=Ve=>{pl(g,Ve)},Me=(Ve=!1)=>{let Qe=!1;for(;!Qe;){let{done:on,value:Je}=he();if(on){Qe=!0;break}if(We.isPause(Je)){if(Ve)continue;Qe=!0,ae.push(Je);break}else ct.isTextEvent(Je)?ko(Je,ot,m):Je===`
55
- `?g(st=>[...st,Je]):typeof Je=="object"&&"text"in Je&&!mt.has(Je)&&(mt.add(Je),rt(Je))}D&&!D.isSettled()?D.abort():(I.forEach(on=>on()),B.resolve())};return m.schedule(async Ve=>{let Qe=!1,on=!1;for(;!Qe;){let{done:Je,value:st}=he();if(Je){Qe=on=!0;break}if(ct.isTextEvent(st)){ko(st,ot,m);continue}let Ri=new S;if(m.timelines.attachTimeline(Ri),Ri.registerSkipController(new V(()=>{M(),Qe=!0,Ve.retry()})),Ri.onSettled(()=>{M()}),D=Ri,We.isPause(st)){let Ii=We.from(st),Mi=f.preference.getPreference(re.Preferences.gameSpeed);if(Ii.config.duration){let Ni=Ii.config.duration/Mi;await zi(Ni)}else{let Ni=f.preference.getPreference(re.Preferences.autoForward),Gi=S.race([S.create(Cc=>{let xc=Pe(wc=>{wc(),Cc.resolve()});z.push(()=>xc.cancel())}),...Ni?[S.delay(f.config.autoForwardDefaultPause/Mi)]:[]]);m.timelines.attachTimeline(Gi),await S.wait(Gi)}}else{if(st!==`
56
- `&&mt.has(st))continue;mt.add(st),rt(st);let{gameSpeed:Ii,cps:Mi}=f.preference.getPreferences(),Gi=1e3/((typeof st=="object"&&"cps"in st&&st.cps!==void 0?st.cps:Mi)*Ii);await zi(Gi)}}on&&(I.forEach(Je=>Je()),B.resolve())},0),{getToken:()=>B,interact:()=>{let Ve=!1;He.forEach(Qe=>Qe(()=>Ve=!0)),!Ve&&Me()},update:()=>{D&&D.abort()},forceSkip:()=>{Me(!0)},timeline:ke,onComplete:Ve=>(I.add(Ve),{cancel:()=>{I.delete(Ve)}})}}let U=n.config.action.sentence;if(!U)return null;let ue=s??"bold",Ie=U.config.fontSize??i,Xe={fontWeight:U.config.bold?ue:r,fontSize:fi(Ie)??ol(),color:Do(U.config.color??o),fontFamily:U.config.fontFamily??a,fontStyle:U.config.italic?"italic":void 0},Tt=B=>({fontWeight:B.config.bold||U.config.bold?ue:r,fontSize:sl(B.config,Ie),color:Do(B.config.color??U.config.color??o),fontFamily:B.config.fontFamily??U.config.fontFamily??a,fontStyle:B.config.italic??U.config.italic?"italic":void 0,...Mr(B.config.emphasis)}),bt=hi(l),gn=n.isEnded(),dt=(B,ke)=>{if(B===`
57
- `)return Oe.createElement("br",{key:ke});let mt=Tt(B),ot=Rr(B.config.render),He=Nu(B,ot);return Oe.createElement(Bt.Span,{tag:`say.word.${ke}`,key:ke,"data-element-type":He?"interactive-word":void 0,onClick:He?I=>I.stopPropagation():void 0,style:{...mt,...Or(),...Ki(f.config.app.debug,{outline:"1px dashed red"})},className:Eo("inline-block",B.config.className)},Oe.createElement(ml,{word:B,vertical:bt,tateChuYoko:u,done:gn,style:mt,renderer:ot}))};return Oe.createElement("div",{...h,ref:T,className:Eo("whitespace-pre-wrap",e),style:{[Po]:w,...Xe,...Fr(l,c),...t}},A.map(dt))}function Gu({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:l,defaultColor:c,className:u,style:d,fontSize:p,fontWeight:h,fontWeightBold:f,fontFamily:m,writingMode:v,textOrientation:A,tateChuYoko:g,onCompleted:y,...b}){let C=Ha(),[,x]=Vr(0),T=C?.config??re.DefaultConfig,w=C?.preference.getPreferences()??re.DefaultPreference,O=s??w.cps,U=a??w.gameSpeed,ue=l??T.autoForwardDefaultPause,Ie=r??T.autoForwardDefaultPause,Xe=Oe.useMemo(()=>Iu(o,e,t),[o,e,t]),Tt=Oe.useMemo(()=>Mu(i,r,Ie),[i,r,Ie]),bt=ul(y),[gn,dt]=Vr(()=>n?[]:Ur(Xe));wn(()=>{if(C)return C.preference.onPreferenceChange(()=>{x(F=>F+1)}).cancel},[C]),wn(()=>{bt.current=y},[y]),wn(()=>{let F=!1,D=[],z=Math.max(.01,U),ae=Pe=>new Promise(rt=>{let Me=setTimeout(rt,Math.max(0,Pe));D.push(Me)}),M=()=>{F||bt.current?.()};return n?Xe.length===0?(dt([]),()=>{F=!0}):((async()=>{do{let Pe=Wr(Xe);for(dt([]);!F;){let{done:rt,value:Me}=Pe.next();if(rt)break;if(We.isPause(Me)){let Li=We.from(Me);await ae((Li.config.duration??ue)/z)}else{if(ct.isTextEvent(Me))continue;pl(dt,Me),Me===`
58
- `?await ae(cl(O,U)):await ae(cl(Me.cps??O,U))}}if(F)return;M(),Tt.enabled&&await ae(Tt.delay)}while(!F&&Tt.enabled)})(),()=>{F=!0,D.forEach(Pe=>clearTimeout(Pe))}):(dt(Ur(Xe)),M(),()=>{F=!0})},[Xe,n,Tt,O,U,ue]);let B=e?.config,ke=f??"bold",mt={fontWeight:B?.bold?ke:h,fontSize:B?.fontSize??p,color:Do(B?.color??c),fontFamily:B?.fontFamily??m,fontStyle:B?.italic?"italic":void 0},ot=F=>({fontWeight:F.config.bold||B?.bold?ke:h,fontSize:al(F.config,B?.fontSize??p),color:Do(F.config.color??B?.color??c),fontFamily:F.config.fontFamily??B?.fontFamily??m,fontStyle:F.config.italic??B?.italic?"italic":void 0,...Mr(F.config.emphasis)}),He=hi(v),I=(F,D)=>{if(F===`
59
- `)return Oe.createElement("br",{key:D});let z=ot(F);return Oe.createElement("span",{key:D,style:{...z,...Or()},className:Eo("inline-block",F.config.className)},Oe.createElement(ml,{word:F,vertical:He,tateChuYoko:g,done:!1,style:z,renderer:Rr(F.config.render)}))};return Oe.createElement("div",{...b,className:Eo("whitespace-pre-wrap",u),style:{...mt,...Fr(v,A),...d}},gn.map(I))}function fl(o){return Oe.createElement(Br,{...o,key:o.dialog?.config.action.id})}function Fu({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=wo({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Oe.createElement(Br,{...r,dialog:s,key:s.config.action.id})}function Ou(o){let e=Lt();return Oe.createElement(Br,{...o,dialog:e,key:e.config.action.id})}function fn(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Oe.createElement(Fu,{...o}):Oe.createElement(Ou,{...o})}var Hu=fn;import Ro,{useEffect as Vu,useLayoutEffect as Uu,useMemo as gl,useRef as Wu,useState as Bu}from"react";import Lo from"react";var zr=Lo.createContext(null);function Kr(){let o=Lo.useContext(zr);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var $r=Lo.createContext(null);function hl(){let o=Lo.useContext($r);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Io({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let l=Wu(null),{register:c,unregister:u,getIndex:d}=hl(),[p,h]=Bu(-1),{choose:f,evaluated:m,gameState:v}=Kr(),A=p===-1?null:m[p],g=gl(()=>Ae.getCtx({gameState:v}),[v]),{hidden:y,disabled:b}=gl(()=>{if(!A)return{hidden:!1,disabled:!1};let T=A.config.hidden?.evaluate(g)?.value??!1,w=!T&&(A.config.disabled?.evaluate(g)?.value??!1);return{hidden:T,disabled:w}},[A,g]);Uu(()=>{if(!l.current)return;let T=l;c(T);let w=d(T);return h(w),l.current.dataset.index=w.toString(),()=>u(T)},[c,u,d]),Vu(()=>{if(!t)return;let T=w=>{w.key.toLowerCase()===t.toLowerCase()&&!w.ctrlKey&&!w.metaKey&&(w.preventDefault(),w.stopPropagation(),C())};return window.addEventListener("keydown",T,!0),()=>{window.removeEventListener("keydown",T,!0)}},[t]);function C(){if(p===-1||!m[p]||y||b)return;let T=m[p];f({...T,evaluated:ee.getText(T.words||[])})}let x=A&&!y;return Ro.createElement(Ro.Fragment,null,Ro.createElement("button",{className:o,style:{...e,display:x?e?.display??void 0:"none"},onClick:C,ref:l,disabled:b},x&&Ro.createElement(fl,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Re({useTypeEffect:!1,action:{sentence:A.prompt,words:A.words,character:null},gameState:v,evaluatedWords:A.words})})))}import Mo from"react";import{AnimatePresence as zu}from"motion/react";function No({children:o,...e}){let t=zu;return Mo.createElement(Mo.Fragment,null,Mo.createElement("div",{...e},Mo.createElement(t,null,o)))}import yl from"react";function en({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=yl.useContext(Cn),l=e??o?.character??a?.config.action.character??null,c=n??l?.config.color,u=i??t??l?.state.name;return yl.createElement("div",{...s,style:{color:c?Ln(c):void 0,...r}},u)}import ju from"clsx";import qu from"react";import jr,{createContext as Ku,useContext as $u,useState as vl}from"react";var kn=class kn{constructor(){this.preloaded=[];this.events=new Q}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(kn.EventTypes["event:preloaded.add"],e),this.events.emit(kn.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(kn.EventTypes["event:preloaded.remove"],e),this.events.emit(kn.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return De.getSrc(e)}};kn.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 Ke=kn;var Go=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 _s(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,l=[],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}`),l.forEach(h=>h(p))}),controller:s};this.preloadTasks.set(t,u);let d={abort:()=>{s.abort(),this.preloadTasks.delete(t)},onFinished:p=>(u.promise.then(p),d),onErrored:p=>(l.push(p),d)};return d}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.src.values())}filter(e){let t=new Set(e);for(let n of this.src.keys())t.has(n)||(this.src.delete(n),this.decoded.delete(n));for(let n of this.decoded.keys())t.has(n)||this.decoded.delete(n);return this}};var qr=Ku(null);function Sl({children:o}){let e=R(),[t]=vl(()=>new Ke),[n]=vl(()=>new Go(e));return jr.createElement(jr.Fragment,null,jr.createElement(qr,{value:{preloaded:t,cacheManager:n}},o))}function zt(){if(!qr)throw new Error("usePreloaded must be used within a PreloadedProvider");return $u(qr)}function Tl(){let o=Lt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return Qu(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?N.getSrcURL(s):null,l=s&&N.isTagSrc(s)?[...s.state.currentSrc]:null,c=La({character:n,sentence:i,portrait:s,currentSrc:a,tags:l,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=Xu(c.source);return{visible:!!u,src:u,character:c.character,portrait:c.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function Yu({className:o,style:e,alt:t,...n}){let i=Tl(),{cacheManager:r}=zt();if(!i.visible||!i.src)return null;let s=r.get(i.src)||i.src;return qu.createElement("img",{...n,"data-element-type":"dialog-avatar",className:ju("dialog-avatar",o),src:s,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function Xu(o){return o?P.srcToURL(o):null}function Qu(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var Yr=Yu;import{useEffect as Ju}from"react";function _u(){let o=Lt(),[e]=se(o.deps),t=ee.getText(o.config.evaluatedWords);return Ju(()=>o.events.on(Re.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 Fo,useEffect as Xr,useMemo as Zu,useRef as ep,useState as bl}from"react";function tp(){let o=Lt(),[e]=se(o.deps),[t,n]=bl(!0),[i,r]=bl(!0),s=ep(null),a=o.config.gameState,l=o.config.action.sentence,c=l?.config.voiceId??null;Xr(()=>o.events.on(Re.Events.onFlush,()=>{e()}).cancel,[o]);let u=Zu(()=>{if(!l)return null;try{return tt.getVoice(a,l)}catch{return null}},[a,l,c,l?.config.voice]);Xr(()=>{s.current=null,r(!0)},[l]),Xr(()=>{let m=!1,v=null,A=null,g=null;if(!u){n(!0);return}n(!1);let y=()=>{m||n(!0)};v=a.audioManager.getToken(u),v&&(v.isPlaying()||n(!0),A=()=>y(),g=()=>y(),v.once("ended",A),v.once("stop",g));let b=a.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{y()});return()=>{m=!0,b.cancel(),v&&A&&v.off("ended",A),v&&g&&v.off("stop",g)}},[a,u]);let d=Fo(async m=>{let v=m??u;if(!v)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let A=v instanceof URL?ge.voice(v.toString()):typeof v=="string"?ge.voice(v):v,g=await a.getLiveGame().playSound(A);s.current=g;let y=()=>{r(!0)};return g.once("ended",y),g.once("stop",y),g},[a,u]),p=Fo(()=>u,[u]),h=Fo(()=>c,[c]),f=Fo(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:d,getVoice:p,getVoiceId:h,getVoiceSrc:f}}import Qr,{createContext as mp,useContext as fp,useEffect as xl,useRef as hp}from"react";import{useState as np}from"react";function Oo(o){let[e]=np(o);return e}import{AnimatePresence as ip}from"motion/react";var Ho=ip;import Si,{createContext as lp,useContext as cp,useEffect as up,useRef as pp}from"react";import{useEffect as gi,useLayoutEffect as op}from"react";function rp(){let o=Ut(),[e]=se();return gi(()=>o.onChange(e).cancel,[]),o.getPathname()}function sp(){let{router:o,path:e}=vi(),[t]=se();return gi(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function ap(){let o=Ut(),[e]=se();return gi(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function Vo(o,e){let t=Ut();op(()=>t.onUpdate(()=>o(t)).cancel,e),gi(()=>{o(t)},[])}function yi(){let o=Ut(),[e]=se();return gi(()=>o.onChange(e).cancel,[]),e}var Al=lp(null);function Ti({children:o,path:e,consumedBy:t}){let i={router:Ut(),path:e,consumedBy:t};return Si.createElement(Al,{value:i},o)}function vi(){let o=cp(Al);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new E(`Invalid useLayout call: Trying to access layout without a parent.
60
- This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function dp({children:o,name:e,propagate:t}){let n=R(),[i]=se(),{path:r,router:s,consumedBy:a}=vi(),l=s.joinPath(r,e),c=Oo(()=>s.createToken(l+"@layout")),u=s.getCurrentPath(),d=pp(!1),p=f=>{d.current=f,i()},h=s.matchPath(u,l);if(yi(),Vo(f=>{let m=f.matchPath(f.getCurrentPath(),l);if(d.current&&!m){if(!o){p(!1);return}f.registerUnmountingPath(c)}m&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(c),m&&!d.current&&!f.isTransitioning()&&p(!0)},[h,o]),up(()=>{if(!h)return;let f=s.mount(l);return()=>{f.cancel()}},[l,s,h]),a)throw new E("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Si.createElement(Ti,{path:l},Si.createElement(Ho,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(c),p(!1)}},h&&d.current&&o))}function Cl({children:o}){return yi(),Si.createElement(Ti,{path:dn.rootPath},Si.createElement(To,{"data-layout-path":dn.rootPath,key:dn.rootPath},o))}var Jr=mp(null);function gp(){return fp(Jr)}function yp({children:o,name:e}){let[t]=se(),{path:n,router:i,consumedBy:r}=vi(),s=gp(),a=s?.name??e,l=a??n+"@default",c=a?i.joinPath(n,a):n,u=Oo(()=>i.createToken(c+"@page")),d=i.getCurrentPath(),p=!a,h=hp(!1),f=g=>{h.current=g,t()},m=p&&i.exactMatch(d,n)||i.exactMatch(d,c);if(r&&r!==l)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");yi(),Vo(g=>{let y=p&&g.exactMatch(g.getCurrentPath(),n)||g.exactMatch(g.getCurrentPath(),c);if(h.current&&!y){if(!o){f(!1);return}g.registerUnmountingPath(u)}y&&g.isPathsUnmounting()&&g.unregisterUnmountingPath(u),y&&!h.current&&!g.isTransitioning()&&f(!0)},[m,o]),xl(()=>{if(!m)return;let g=p?i.mountDefaultHandler(c):i.mount(c);return i.emitOnPageMount(),()=>{g.cancel()}},[c,m]),xl(()=>()=>{i.unregisterUnmountingPath(u),f(!1)},[]);let v=Qr.createElement(Ti,{path:n,consumedBy:l},Qr.createElement(Ho,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),f(!1)}},m&&h.current&&o));return(g=>s?Qr.createElement(Jr,{value:{name:null}},g):g)(v)}import _r,{useCallback as vp,useEffect as Zr,useImperativeHandle as Sp,useMemo as wl,useRef as es,useState as Tp}from"react";var bp=50,Ap={position:"relative",width:"100%",height:"100%",overflow:"hidden"},kl={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function Cp(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Pl(o,e){return e==null?o:Math.max(o,e)}function xp(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 El=_r.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:l,dataAttributes:c,onUpdate:u,children:d},p){let h=es(null),[f,m]=Tp({...kl,width:"0px",height:"0px"}),v=es(u),A=es(null);Zr(()=>{v.current=u},[u]);let g=vp(()=>{let C=h.current;if(!C)return;let x=C.clientWidth,T=C.clientHeight;if(x<=0||T<=0||e<=0)return;let w=xp(x,T,e),O=Pl(w.width,n),U=Pl(w.height,i),ue=A.current;(!ue||ue.width!==O||ue.height!==U)&&(A.current={width:O,height:U},m({...kl,width:`${O}px`,height:`${U}px`}));let Ie=t>0?O/t:1;v.current?.({width:O,height:U,scale:Ie,containerWidth:x,containerHeight:T})},[e,t,n,i]),y=wl(()=>Qs(g,typeof r=="number"?r:bp),[g,r]);Zr(()=>{g()},[g]),Zr(()=>{let C=new ResizeObserver(()=>{y()});h.current&&C.observe(h.current);let x=()=>{y()};return window.addEventListener("resize",x),()=>{C.disconnect(),window.removeEventListener("resize",x)}},[y]),Sp(p,()=>({requestUpdate:g}),[g]);let b=wl(()=>Cp(c),[c]);return _r.createElement("div",{id:l,ref:h,style:Ap,...b},_r.createElement("div",{className:s,style:{...f,...a}},d))}),Dl=El;function wp(){return R().getLiveGame()}import is from"react";import kp,{createContext as Pp,useContext as Ep,useEffect as Dp,useState as Ll}from"react";var Lp={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Rl=Pp({state:Lp,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function Kt(){return Ep(Rl)}function ts(){let{dialogs:o}=Kt();return o}function Rp(){let{isActive:o}=Kt();return o}function Ip(){let{isVisible:o}=Kt();return o}function ns({children:o}){let t=R().getLiveGame().getGameState(),[n,i]=Ll(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=Ll(null);Dp(()=>{let l=f=>({...f,dialogs:[...f.dialogs]}),c=t.events.on(L.EventTypes["event:state.nvl.enter"],(f,m)=>{i(l(t.getNvlState())),s(m?.showTransition||null)}),u=t.events.on(L.EventTypes["event:state.nvl.exit"],()=>{i(l(t.getNvlState()))}),d=t.events.on(L.EventTypes["event:state.nvl.dialogAppend"],()=>{i(l(t.getNvlState()))}),p=t.events.on(L.EventTypes["event:state.nvl.visibilityChange"],(f,m)=>{i(l(t.getNvlState())),s(m||null)}),h=t.events.on(L.EventTypes["event:state.nvl.change"],f=>{i(l(f))});return()=>{c.cancel(),u.cancel(),d.cancel(),p.cancel(),h.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return kp.createElement(Rl.Provider,{value:a},o)}import{AnimatePresence as Mp,motion as Np}from"motion/react";import Gp from"clsx";function os({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=Kt(),{ratio:r}=fe(),s=R(),a=i?.duration?i.duration/1e3:.3;return is.createElement(Mp,null,n&&is.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},is.createElement(Np.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:Gp("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 Pn from"react";function rs({renderDialogItem:o,dialogs:e}){return Pn.createElement(os,{className:"bg-black/80 text-white p-16 inset-8"},Pn.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?Pn.createElement(en,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Pn.createElement(fn,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Pn.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}):Pn.createElement(Pn.Fragment,null,r,s))})))}import St,{useMemo as Fp}from"react";import Il from"clsx";function Op({children:o,className:e,style:t,renderDialogItem:n}){let i=ts(),{state:r}=Kt();return St.createElement("div",{"data-element-type":"nvl-dialog-list",className:Il("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>St.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},St.createElement(Hp,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?St.createElement(en,{className:"nvl-character-name font-bold mr-2"}):null,texts:St.createElement(fn,{className:"nvl-dialog-text"})}):o?St.Children.map(o,l=>St.isValidElement(l)?St.cloneElement(l,{entry:s,index:a}):l):St.createElement(Ml,{entry:s,index:a})))))}function Ml({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??St.createElement(fn,{className:"nvl-dialog-text"});return St.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:Il("nvl-dialog-item",t),style:n},r&&St.createElement(en,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function Hp({entry:o,children:e}){let n=R().getLiveGame().getGameState(),i=Fp(()=>o.sentence.evaluate(Ae.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",l=wo({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return St.createElement(Cn,{value:l},e)}import Uo from"react";import{createPortal as Vp}from"react-dom";var ss=Uo.createContext(null),Up={Portal:()=>null,measure:()=>null,container:null};function Wp(){let o=Uo.useContext(ss);return Uo.useMemo(()=>{if(!o)return Up;let e=t=>{let n=o.offsetWidth;return!n||!t.width?1:t.width/n};return{container:o,Portal:({children:t})=>Vp(Uo.createElement("div",{style:{position:"absolute",left:0,top:0,pointerEvents:"auto"}},t),o),measure:t=>{if(!t)return null;let n=o.getBoundingClientRect(),i=e(n),r=t.getBoundingClientRect(),s=(r.left-n.left)/i,a=(r.top-n.top)/i,l=r.width/i,c=r.height/i;return{left:s,top:a,width:l,height:c,right:s+l,bottom:a+c}}}},[o])}import{useEffect as Bp}from"react";function zp(o){let e=R();Bp(()=>{if(!o)return;let t=e.getLiveGame().getGameState();if(t)return t.suspendAdvance()},[o,e])}function Gl({state:o}){let e=R(),t=Ut(),n=as(null),i=as(null),r=as(!1),[s]=mn(re.Preferences.skipDelay),[a]=mn(re.Preferences.skipInterval),[l]=xn("skipAction");return $p(()=>{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(!o.isAdvanceSuspended()&&e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(re.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let f=()=>{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?f():i.current=setTimeout(f,s)}},p=h=>{e.keyMap.match("skipAction",h.key)&&u()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",d).cancel,f=e.getLiveGame().onWindowEvent("keyup",p).cancel;return()=>{u(),h(),f()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",d).cancel,f=e.getLiveGame().onPlayerEvent("keyup",p).cancel;return()=>{u(),h(),f()}}},[t,s,a,l]),Nl.createElement(Nl.Fragment,null)}import Fl,{useEffect as jp}from"react";function qp(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Ol=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],Yp=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]','[data-element-type="interactive-word"]','[data-element-type="dialog-overlay"]'];function Xp(o,e){return!o||e&&Ol.some(t=>!!o.closest(t))?!1:[...Yp,...Ol].some(t=>!!o.closest(t))}function Hl(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 Vl({state:o}){let e=R();return jp(()=>{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)||!Hl(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!Hl(i,s))||qp(r)||Xp(r,o.isNvlMode())||o.isAdvanceSuspended()||(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]),Fl.createElement(Fl.Fragment,null)}import{useEffect as Ul}from"react";function ls({gameState:o}){let e=o.audioManager,[t,n]=mn("globalVolume");return Ul(()=>{n(e.getGlobalVolume())},[]),Ul(()=>{e.setGlobalVolume(t)},[t]),null}import{useEffect as Wo,useRef as Qp}from"react";function Wl(o){let e=De.catSrc(o.srcManager?.src||[]),t=De.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=new Set;for(let s of e.image){let a=De.getSrc(s);!a||r.has(a)||(r.add(a),n.push(a))}for(let s of t.image){let a=De.getSrc(s);!a||r.has(a)||(r.add(a),i.push(a))}return{critical:n,lookAhead:i,all:[...n,...i],criticalAudio:e.audio}}function Bl({state:o}){let{preloaded:e,cacheManager:t}=zt(),n=R(),i=Qp(new Set),[r]=se(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),l=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,c=n.getLiveGame().story;function u(){o.logger.debug(s,"Preload unmounted"),e.events.emit(Ke.EventTypes["event:preloaded.unmount"])}return Wo(()=>o.events.on(L.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Wo(()=>{if(typeof fetch>"u")return e.events.emit(Ke.EventTypes["event:preloaded.complete"]),e.events.emit(Ke.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(Ke.EventTypes["event:preloaded.complete"]),e.events.emit(Ke.EventTypes["event:preloaded.ready"]),o.logger.debug(s,"Preload all images is disabled, skipping preload"),u;if(n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(s,"Cache cleared")),!c||!a)return c?o.logger.debug(s,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(s,"Story not found, skipping preload"),u;let d=performance.now(),p=Wl(a),h=new Dn(n.config.preloadConcurrency,0),f=new Dn(n.config.preloadConcurrency,n.config.preloadDelay),m=o.logger.group(s,!0),v=!1;o.logger.debug(s,"preloading:",p,a);let A=(g,y,b,C)=>{y.forEach((x,T)=>{if(t.has(x)||t.isPreloading(x)){o.logger.debug(s,`Image already loaded (${b} ${T+1}/${y.length})`,x);return}g.addTask(()=>new Promise(w=>{t.preload(o,x,{retainDecoded:C}).onFinished(()=>{o.logger.debug(s,`Image loaded (${b} ${T+1}/${y.length})`,x),w()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${b} ${T+1}/${y.length})`,x),w()})}))})};A(h,p.critical,"first scene",!0),A(f,p.lookAhead,"look-ahead",!1);for(let g of p.criticalAudio)o.audioManager.preload(g);return m.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(Ke.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(Ke.EventTypes["event:preloaded.ready"]),!v&&(await f.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(Ke.EventTypes["event:preloaded.ready"]),e.events.emit(Ke.EventTypes["event:preloaded.mount"]),()=>{v=!0,u()}},[a,c]),Wo(()=>{i.current.clear()},[a]),Wo(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!c){o.logger.weakWarn(s,"Story not found, skipping preload");return}let d=performance.now(),p=n.getLiveGame().getAllPredictableActions(c,l,n.config.maxPreloadActions).map(g=>De.getPreloadableSrc(c,g)).filter(function(g){return g!==null});p.filter(function(g){return g?.activeType==="scene"}).forEach(g=>{i.current.has(g)||i.current.add(g)});let f=De.catSrc([...i.current,...p]),m=new Dn(n.config.preloadConcurrency,n.config.preloadDelay),v=[],A=o.logger.group(s);o.logger.debug(s,"preloading:",f);for(let g of f.image){let y=De.getSrc(g);if(y){if(v.push(y),t.has(y)||t.isPreloading(y)){o.logger.debug(s,`Image already loaded (${f.image.indexOf(g)+1}/${f.image.length})`,y);continue}m.addTask(()=>new Promise(b=>{t.preload(o,y).onFinished(()=>{o.logger.debug(s,`Image loaded (${f.image.indexOf(g)+1}/${f.image.length})`,y),b()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${f.image.indexOf(g)+1}/${f.image.length})`,y),b()})}))}}A.end(),m.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-d}ms`),t.filter(v)})},[l,c]),null}import bi from"react";import zo from"react";import cs,{useEffect as us,useLayoutEffect as ps,useRef as Bo,useState as ds}from"react";function $t({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:l,companionRefs:c}){let[u,d]=ds(null),[p,h]=ds(null),f=Bo(null),m=cs.useRef(null),[v]=ds(()=>new Hi("displayable.refGroup")),A=Bo(v.next()),g=Bo(ot()),b=R().getLiveGame().getGameState(),C=typeof a=="function"?a(u):a,[x]=se([p,u,g]);us(()=>b.events.depends([b.events.on(L.EventTypes["event:state.player.skip"],mt)]).cancel,[p,u,g]),ps(()=>{if(U(),!u)return;if(g.current.some(([M])=>!M.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:I,task:F}=u,D=M=>{g.current.forEach(([he],Pe)=>{let rt=F.resolve[Pe],Me=typeof rt=="function"?rt:rt.resolver;if(!Me)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${Pe}])`);let Li=Me(...M),ir=j(C[Pe]||C[C.length-1]||{},Li);Ie(he,l?l(ir):ir)})},z=I.onUpdate(D);D(F.animations.map(M=>M.start));let ae=!1;return Promise.all(g.current.map(([M])=>{let he=M.current;return he?.waitForLoad?he.waitForLoad():Promise.resolve()})).then(()=>{ae||I.start()}),()=>{ae=!0,z.cancel()}},[u]),us(()=>{if(!m.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),ps(()=>{let I=e.toStyle(b,i);return Object.assign(m.current.style,I),O(),b.logger.debug("Displayable","Initial style applied",m.current,I),Tt(),()=>{Xe()}},[]);let T=Bo(()=>{});T.current=()=>{u||!m.current||(U(),!(p||f.current)&&(Object.assign(m.current.style,e.toStyle(b,i)),O()))},ps(()=>{f.current&&!o._getLoop()&&Xe(),T.current()});let{ratio:w}=fe();us(()=>w.onUpdate(()=>{T.current(),requestAnimationFrame(()=>T.current())}),[w]);function O(){if(c)for(let{ref:I,project:F}of c)I.current&&Object.assign(I.current.style,F(e.get()))}function U(){let I=typeof a=="function"?a(u):a;if(!g.current||!g.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");g.current.some(([F])=>!F.current)||g.current.forEach(([F],D)=>{Ie(F,I[D]||I[I.length-1]||{})})}function ue(I){b.logger.debug("Displayable","Transform applied",e.toStyle(b,i),m.current),x(),r?.(I)}function Ie(I,F){if(!I.current)throw new E("Displayable: Trying to assign properties to unmounted element");io(I.current,F,l)}function Xe(){f.current&&(f.current.stop(),f.current=null,b.logger.debug("Displayable","Loop stopped",o))}function Tt(){let I=o._getLoop();if(!I){Xe();return}f.current||bt(I.transform,I.options)}function bt(I,F){p&&(p.abort(),h(null)),Xe(),m.current&&(f.current=I.startLoop(e,{gameState:b,ref:m,overwrites:i,companionRefs:c},F))}function gn(I,F){return dt(new _({},{duration:I?.duration??0,ease:I?.ease??"linear"}),F)}function dt(I,F){p&&(p.abort(),h(null)),Xe();let D=I.animate(e,{gameState:b,ref:m,overwrites:i,companionRefs:c}),z=new Ce(D);return b.timelines.attachTimeline(z),D.onSkipControllerRegister(ae=>{ae.onAbort(()=>{z.abort(),h(null)})}),h(D),D.then(()=>{h(null),ue(I),F(),Tt()}),z}function B(I,F){u&&u.controller.complete();let D=I.createTask(b),z=I.requestAnimations(D.animations),ae=new S().registerSkipController(new V(z.cancel)),M=new Ce(ae);ae.skipController.onAbort(()=>{z.cancel()}),z.onCanceled(()=>{M.abort(),d(null),b.logger.debug("Displayable","Transition cancelled",I)}),z.onComplete(()=>{He(),d(null),s?.(I),F(),ae.resolve()}),b.timelines.attachTimeline(M),d({task:D,controller:z,transition:I,resolve:F});let he;if(g.current=D.resolve.map(Pe=>{let rt=cs.createRef(),Me=typeof Pe=="function"?void 0:Pe.key;if(!Me)return[rt,v.next()];if(Me==="target")return he=v.next(),[rt,he];if(Me==="current")return[rt,A.current];throw new E("Displayable: Invalid key type")}),!he)throw new E("Displayable: No target key found");return A.current=he,M}function ke(I){return b.logger.debug("initDisplayable",o),dt(_.immediate(e.get()),I)}function mt(){t&&p&&(p.abort(),h(null),b.logger.debug("transform skipped")),n&&u&&(u.controller.complete(),b.logger.debug("transition skipped"))}function ot(){return[[cs.createRef(),A.current]]}function He(){g.current.forEach(([I])=>{I.current=null}),g.current=ot()}return{transformRef:m,transitionRefs:g.current,transitionTask:u,initDisplayable:ke,applyTransform:dt,applyTransition:B,applyLoop:bt,stopLoop:gn,updateStyleSync:U,flush:x,deps:[p,u,g]}}import{useEffect as Jp}from"react";function Ct(o,e,t=[]){let i=R().getLiveGame().getGameState();return Jp(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function ms({state:o,text:e}){let{ratio:t}=fe(),[n]=se(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,updateStyleSync:d,deps:p}=$t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:h=>({width:"fit-content",transform:_.propToCSSTransform(o,h,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return Ct(e,{initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,flush:n,updateStyleSync:d},[...p]),zo.createElement(Bt.Div,{"data-element-type":"text"},zo.createElement(Bt.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([h,f])=>zo.createElement("span",{key:f,ref:h,className:e.config.className},zo.createElement("span",null,e.state.text)))))}import It,{forwardRef as Zp,useCallback as Kl,useImperativeHandle as ed,useRef as jo,useState as $l}from"react";import Ko,{useEffect as fs,useRef as zn,forwardRef as _p}from"react";var zl=_p(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=zn(null),{ratio:a}=fe(),[l,c]=Ko.useState(0),[u,d]=Ko.useState(0),p=zn(null),h=zn(null),f=R(),m=zn(!1),v=zn(null),A=zn(null);Ko.useImperativeHandle(r,()=>s.current,[]),fs(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>{let C=()=>{let x=s.current;return!x||typeof x.decode!="function"?Promise.resolve():x.decode().catch(()=>{})};return m.current?C():(v.current||(v.current=new Promise(x=>{A.current=x})),v.current.then(C))},configurable:!0}})},[]),fs(()=>(g(),a.onUpdate(g)),[o]),fs(()=>{let C=new MutationObserver(x=>{x.forEach(T=>{T.type==="attributes"&&T.attributeName==="src"&&s.current&&g()})});return s.current&&C.observe(s.current,{attributes:!0}),()=>{C.disconnect()}},[o]);function g(){if(s.current&&s.current.naturalWidth){let C,x,T;if(s.current.naturalWidth*s.current.naturalHeight===1)C=a.state.width,x=a.state.height,T=`${C} / ${x}`;else{let ue=t?f.config.width/s.current.naturalWidth:1;C=s.current.naturalWidth*a.state.scale*ue,x=s.current.naturalHeight*a.state.scale*ue,T="auto"}let w=p.current,O=!w||w.w!==C||w.h!==x||w.ar!==T,U=!!o&&h.current!==o;if(!O&&!U)return;O&&(p.current={w:C,h:x,ar:T},c(C),d(x),s.current.style.aspectRatio=T),o&&(h.current=o,o(C,x))}}function y(){g(),m.current=!0,A.current&&(A.current(),A.current=null,v.current=null),e&&e()}function b(){m.current=!0,A.current&&(A.current(),A.current=null,v.current=null)}return Ko.createElement("img",{ref:s,onLoad:y,onError:b,width:l,height:u,alt:"",src:n,style:i})});zl.displayName="AspectScaleImage";var $o=zl;import jl from"clsx";import{motion as td}from"motion/react";var nd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},ql=Zp(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=jo(null),a=jo([]),l=o.findIndex(c=>c!==null);return ed(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(c=>!c?.isLoaded||c.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(c=>c?.waitForLoad?c.waitForLoad():Promise.resolve())).then(()=>{})}),[]),It.createElement("div",{ref:s},o.map((c,u)=>c===null?null:It.createElement($o,{key:"layer-"+u,ref:d=>{a.current[u]=d},src:t(c),style:nd,autoFit:e,onSizeChanged:u===l?n:void 0,onLoad:u===l?i:void 0})))});ql.displayName="LayerStack";function id(o){return{willChange:"filter, opacity",position:"absolute",top:0,left:0,right:0,bottom:0,transform:"none",translate:"none",opacity:1,clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat",filter:`brightness(${1-o})`}}function od(o){return N.isStaticSrc(o)?o.state.currentSrc:N.getSrcURL(o)??void 0}var rd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function sd({image:o,state:e}){let[t]=$l(()=>new Q),[n,i]=$l([]),{cacheManager:r}=zt(),s=jo([]),a=jo(null),l=N.isLayeredSrc(o)?N.getSrcURLs(o):null;function c(T){return!P.isDataURI(T)&&!r.has(T)&&!r.isPreloading(T)&&!s.current.includes(T)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${T}".
59
+ `&&n.tag===e.tag?[...t.slice(0,-1),{...e,text:n.text+e.text,config:e.config}]:[...t,e]})}function Mu(o,e,t){return t||(o!==void 0?me.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new ne(n.text,n.config)):[])}function Nu(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 uc(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Do(o){return o===void 0?void 0:Ln(o)}function mc(o){return typeof o.tag2=="number"?o.tag2>=o.full.length-1:o.text.length>=o.full.length}function fc({word:o,vertical:e,tateChuYoko:t,done:n,style:i,renderer:r}){let s=o.config.ruby?Ve.createElement("ruby",{className:"align-bottom inline-block"},Ve.createElement("rt",{className:"block text-center"},o.config.ruby),Vr(o.text,e,t)):Vr(o.text,e,t);return r?Ve.createElement(r,{text:o.text,fullText:o.full,revealed:mc(o),done:n,style:i,config:o.config,data:o.config.data},s):s}function Gu(o,e){return!!e&&mc(o)}function zr({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,writingMode:c,textOrientation:l,tateChuYoko:u,autoFit:d,autoFitMinFontSize:p,...h}){let f=R(),m=f.getLiveGame().getGameState(),v=pc(null),[A,g]=Ur(()=>n&&!n.config.useTypeEffect?Wr(n.config.evaluatedWords):[]),[y,b]=se();if(!n)throw new Error("Dialog state is required");wn(()=>{if(!(!n.config.action.sentence||v.current))return m.logger.info("Initializing the sentence",n,v.current),m.schedule(({onCleanup:B})=>{if(!n.config.useTypeEffect){Ja(n.config.evaluatedWords,n.config.firedTextEvents??new Set,m),n.dispatchComplete();return}g([]),v.current=O(),y(),v.current.onComplete(()=>{n.dispatchComplete()}),B(()=>{v.current?.timeline?.abort()})},0)},[]),wn(()=>n.events.depends([n.events.on(Me.Events.requestComplete,()=>{v.current?.interact()}),n.events.on(Me.Events.forceSkip,()=>{n.isEnded()||v.current?.forceSkip()})]).cancel,[n,b]),wn(()=>n.onFlush(()=>{y()}).cancel,[n]),wn(()=>f.preference.events.depends([f.preference.onPreferenceChange(re.Preferences.gameSpeed,()=>{v.current?.update()}),f.preference.onPreferenceChange(re.Preferences.autoForward,()=>{v.current?.update()}),f.preference.onPreferenceChange(re.Preferences.cps,()=>{v.current?.update()})]).cancel,[]);let C=(d??!0)&&!f.config.disableTextScaling,w=Iu(()=>A.reduce((B,Pe)=>B+(Pe===`
60
+ `?1:Pe.text.length),0),[A]),{containerRef:T,scale:k}=sc({enabled:C,minFontSize:p??ic,vertical:gi(c),revealed:w});function O(){let B=new S,Pe=new xe(B).setGuard(m.guard),ft=new Set,rt=n.config.firedTextEvents??new Set,Ue=new Set,I=new Set,F=Br(n.config.evaluatedWords),D=null,K=[],ae=[],M=()=>{K.forEach(We=>We()),K.length=0},he=()=>{if(ae.length!==0)return{done:!1,value:ae.shift()};let{done:We,value:_e}=F.next();return{done:We,value:_e}},Ee=We=>{let _e=on=>{We(on),Ue.delete(_e)};return Ue.add(_e),{cancel:()=>{Ue.delete(_e)}}},st=We=>{dc(g,We)},Ge=(We=!1)=>{let _e=!1;for(;!_e;){let{done:on,value:Je}=he();if(on){_e=!0;break}if(ze.isPause(Je)){if(We)continue;_e=!0,ae.push(Je);break}else ut.isTextEvent(Je)?ko(Je,rt,m):Je===`
61
+ `?g(at=>[...at,Je]):typeof Je=="object"&&"text"in Je&&!ft.has(Je)&&(ft.add(Je),st(Je))}D&&!D.isSettled()?D.abort():(I.forEach(on=>on()),B.resolve())};return m.schedule(async We=>{let _e=!1,on=!1;for(;!_e;){let{done:Je,value:at}=he();if(Je){_e=on=!0;break}if(ut.isTextEvent(at)){ko(at,rt,m);continue}let Ii=new S;if(m.timelines.attachTimeline(Ii),Ii.registerSkipController(new V(()=>{M(),_e=!0,We.retry()})),Ii.onSettled(()=>{M()}),D=Ii,ze.isPause(at)){let Mi=ze.from(at),Ni=f.preference.getPreference(re.Preferences.gameSpeed);if(Mi.config.duration){let Gi=Mi.config.duration/Ni;await Ki(Gi)}else{let Gi=f.preference.getPreference(re.Preferences.autoForward),Fi=S.race([S.create(xl=>{let wl=Ee(kl=>{kl(),xl.resolve()});K.push(()=>wl.cancel())}),...Gi?[S.delay(f.config.autoForwardDefaultPause/Ni)]:[]]);m.timelines.attachTimeline(Fi),await S.wait(Fi)}}else{if(at!==`
62
+ `&&ft.has(at))continue;ft.add(at),st(at);let{gameSpeed:Mi,cps:Ni}=f.preference.getPreferences(),Fi=1e3/((typeof at=="object"&&"cps"in at&&at.cps!==void 0?at.cps:Ni)*Mi);await Ki(Fi)}}on&&(I.forEach(Je=>Je()),B.resolve())},0),{getToken:()=>B,interact:()=>{let We=!1;Ue.forEach(_e=>_e(()=>We=!0)),!We&&Ge()},update:()=>{D&&D.abort()},forceSkip:()=>{Ge(!0)},timeline:Pe,onComplete:We=>(I.add(We),{cancel:()=>{I.delete(We)}})}}let U=n.config.action.sentence;if(!U)return null;let ue=s??"bold",Ne=U.config.fontSize??i,Qe={fontWeight:U.config.bold?ue:r,fontSize:hi(Ne)??rc(),color:Do(U.config.color??o),fontFamily:U.config.fontFamily??a,fontStyle:U.config.italic?"italic":void 0},bt=B=>({fontWeight:B.config.bold||U.config.bold?ue:r,fontSize:ac(B.config,Ne),color:Do(B.config.color??U.config.color??o),fontFamily:B.config.fontFamily??U.config.fontFamily??a,fontStyle:B.config.italic??U.config.italic?"italic":void 0,...Nr(B.config.emphasis)}),At=gi(c),gn=n.isEnded(),mt=(B,Pe)=>{if(B===`
63
+ `)return Ve.createElement("br",{key:Pe});let ft=bt(B),rt=Ir(B.config.render),Ue=Gu(B,rt);return Ve.createElement(zt.Span,{tag:`say.word.${Pe}`,key:Pe,"data-element-type":Ue?"interactive-word":void 0,onClick:Ue?I=>I.stopPropagation():void 0,style:{...ft,...Hr(),...$i(f.config.app.debug,{outline:"1px dashed red"})},className:Eo("inline-block",B.config.className)},Ve.createElement(fc,{word:B,vertical:At,tateChuYoko:u,done:gn,style:ft,renderer:rt}))};return Ve.createElement("div",{...h,ref:T,className:Eo("whitespace-pre-wrap",e),style:{[Po]:k,...Qe,...Or(c,l),...t}},A.map(mt))}function Fu({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:f,fontFamily:m,writingMode:v,textOrientation:A,tateChuYoko:g,onCompleted:y,...b}){let C=Va(),[,w]=Ur(0),T=C?.config??re.DefaultConfig,k=C?.preference.getPreferences()??re.DefaultPreference,O=s??k.cps,U=a??k.gameSpeed,ue=c??T.autoForwardDefaultPause,Ne=r??T.autoForwardDefaultPause,Qe=Ve.useMemo(()=>Mu(o,e,t),[o,e,t]),bt=Ve.useMemo(()=>Nu(i,r,Ne),[i,r,Ne]),At=pc(y),[gn,mt]=Ur(()=>n?[]:Wr(Qe));wn(()=>{if(C)return C.preference.onPreferenceChange(()=>{w(F=>F+1)}).cancel},[C]),wn(()=>{At.current=y},[y]),wn(()=>{let F=!1,D=[],K=Math.max(.01,U),ae=Ee=>new Promise(st=>{let Ge=setTimeout(st,Math.max(0,Ee));D.push(Ge)}),M=()=>{F||At.current?.()};return n?Qe.length===0?(mt([]),()=>{F=!0}):((async()=>{do{let Ee=Br(Qe);for(mt([]);!F;){let{done:st,value:Ge}=Ee.next();if(st)break;if(ze.isPause(Ge)){let Ri=ze.from(Ge);await ae((Ri.config.duration??ue)/K)}else{if(ut.isTextEvent(Ge))continue;dc(mt,Ge),Ge===`
64
+ `?await ae(uc(O,U)):await ae(uc(Ge.cps??O,U))}}if(F)return;M(),bt.enabled&&await ae(bt.delay)}while(!F&&bt.enabled)})(),()=>{F=!0,D.forEach(Ee=>clearTimeout(Ee))}):(mt(Wr(Qe)),M(),()=>{F=!0})},[Qe,n,bt,O,U,ue]);let B=e?.config,Pe=f??"bold",ft={fontWeight:B?.bold?Pe:h,fontSize:B?.fontSize??p,color:Do(B?.color??l),fontFamily:B?.fontFamily??m,fontStyle:B?.italic?"italic":void 0},rt=F=>({fontWeight:F.config.bold||B?.bold?Pe:h,fontSize:cc(F.config,B?.fontSize??p),color:Do(F.config.color??B?.color??l),fontFamily:F.config.fontFamily??B?.fontFamily??m,fontStyle:F.config.italic??B?.italic?"italic":void 0,...Nr(F.config.emphasis)}),Ue=gi(v),I=(F,D)=>{if(F===`
65
+ `)return Ve.createElement("br",{key:D});let K=rt(F);return Ve.createElement("span",{key:D,style:{...K,...Hr()},className:Eo("inline-block",F.config.className)},Ve.createElement(fc,{word:F,vertical:Ue,tateChuYoko:g,done:!1,style:K,renderer:Ir(F.config.render)}))};return Ve.createElement("div",{...b,className:Eo("whitespace-pre-wrap",u),style:{...ft,...Or(v,A),...d}},gn.map(I))}function hc(o){return Ve.createElement(zr,{...o,key:o.dialog?.config.action.id})}function Ou({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=wo({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Ve.createElement(zr,{...r,dialog:s,key:s.config.action.id})}function Hu(o){let e=Rt();return Ve.createElement(zr,{...o,dialog:e,key:e.config.action.id})}function fn(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Ve.createElement(Ou,{...o}):Ve.createElement(Hu,{...o})}var Vu=fn;import Ro,{useEffect as Uu,useLayoutEffect as Wu,useMemo as yc,useRef as Bu,useState as zu}from"react";import Lo from"react";var Kr=Lo.createContext(null);function $r(){let o=Lo.useContext(Kr);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var jr=Lo.createContext(null);function gc(){let o=Lo.useContext(jr);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Io({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let c=Bu(null),{register:l,unregister:u,getIndex:d}=gc(),[p,h]=zu(-1),{choose:f,evaluated:m,gameState:v}=$r(),A=p===-1?null:m[p],g=yc(()=>Ce.getCtx({gameState:v}),[v]),{hidden:y,disabled:b}=yc(()=>{if(!A)return{hidden:!1,disabled:!1};let T=A.config.hidden?.evaluate(g)?.value??!1,k=!T&&(A.config.disabled?.evaluate(g)?.value??!1);return{hidden:T,disabled:k}},[A,g]);Wu(()=>{if(!c.current)return;let T=c;l(T);let k=d(T);return h(k),c.current.dataset.index=k.toString(),()=>u(T)},[l,u,d]),Uu(()=>{if(!t)return;let T=k=>{k.key.toLowerCase()===t.toLowerCase()&&!k.ctrlKey&&!k.metaKey&&(k.preventDefault(),k.stopPropagation(),C())};return window.addEventListener("keydown",T,!0),()=>{window.removeEventListener("keydown",T,!0)}},[t]);function C(){if(p===-1||!m[p]||y||b)return;let T=m[p];f({...T,evaluated:ne.getText(T.words||[])})}let w=A&&!y;return Ro.createElement(Ro.Fragment,null,Ro.createElement("button",{className:o,style:{...e,display:w?e?.display??void 0:"none"},onClick:C,ref:c,disabled:b},w&&Ro.createElement(hc,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Me({useTypeEffect:!1,action:{sentence:A.prompt,words:A.words,character:null},gameState:v,evaluatedWords:A.words})})))}import Mo from"react";import{AnimatePresence as Ku}from"motion/react";function No({children:o,...e}){let t=Ku;return Mo.createElement(Mo.Fragment,null,Mo.createElement("div",{...e},Mo.createElement(t,null,o)))}import vc from"react";function en({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=vc.useContext(Cn),c=e??o?.character??a?.config.action.character??null,l=n??c?.config.color,u=i??t??c?.state.name;return vc.createElement("div",{...s,style:{color:l?Ln(l):void 0,...r}},u)}import qu from"clsx";import Yu from"react";import qr,{createContext as $u,useContext as ju,useState as Sc}from"react";var kn=class kn{constructor(){this.preloaded=[];this.events=new _}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(kn.EventTypes["event:preloaded.add"],e),this.events.emit(kn.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(kn.EventTypes["event:preloaded.remove"],e),this.events.emit(kn.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Re.getSrc(e)}};kn.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 $e=kn;var Go=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 Zs(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 Yr=$u(null);function Tc({children:o}){let e=R(),[t]=Sc(()=>new $e),[n]=Sc(()=>new Go(e));return qr.createElement(qr.Fragment,null,qr.createElement(Yr,{value:{preloaded:t,cacheManager:n}},o))}function Kt(){if(!Yr)throw new Error("usePreloaded must be used within a PreloadedProvider");return ju(Yr)}function bc(){let o=Rt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return _u(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?N.getSrcURL(s):null,c=s&&N.isTagSrc(s)?[...s.state.currentSrc]:null,l=Ra({character:n,sentence:i,portrait:s,currentSrc:a,tags:c,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=Qu(l.source);return{visible:!!u,src:u,character:l.character,portrait:l.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function Xu({className:o,style:e,alt:t,...n}){let i=bc(),{cacheManager:r}=Kt();if(!i.visible||!i.src)return null;let s=r.get(i.src)||i.src;return Yu.createElement("img",{...n,"data-element-type":"dialog-avatar",className:qu("dialog-avatar",o),src:s,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function Qu(o){return o?P.srcToURL(o):null}function _u(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var Xr=Xu;import{useEffect as Ju}from"react";function Zu(){let o=Rt(),[e]=se(o.deps),t=ne.getText(o.config.evaluatedWords);return Ju(()=>o.events.on(Me.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 Fo,useEffect as Qr,useMemo as ep,useRef as tp,useState as Ac}from"react";function np(){let o=Rt(),[e]=se(o.deps),[t,n]=Ac(!0),[i,r]=Ac(!0),s=tp(null),a=o.config.gameState,c=o.config.action.sentence,l=c?.config.voiceId??null;Qr(()=>o.events.on(Me.Events.onFlush,()=>{e()}).cancel,[o]);let u=ep(()=>{if(!c)return null;try{return nt.getVoice(a,c)}catch{return null}},[a,c,l,c?.config.voice]);Qr(()=>{s.current=null,r(!0)},[c]),Qr(()=>{let m=!1,v=null,A=null,g=null;if(!u){n(!0);return}n(!1);let y=()=>{m||n(!0)};v=a.audioManager.getToken(u),v&&(v.isPlaying()||n(!0),A=()=>y(),g=()=>y(),v.once("ended",A),v.once("stop",g));let b=a.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{y()});return()=>{m=!0,b.cancel(),v&&A&&v.off("ended",A),v&&g&&v.off("stop",g)}},[a,u]);let d=Fo(async m=>{let v=m??u;if(!v)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let A=v instanceof URL?ge.voice(v.toString()):typeof v=="string"?ge.voice(v):v,g=await a.getLiveGame().playSound(A);s.current=g;let y=()=>{r(!0)};return g.once("ended",y),g.once("stop",y),g},[a,u]),p=Fo(()=>u,[u]),h=Fo(()=>l,[l]),f=Fo(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:d,getVoice:p,getVoiceId:h,getVoiceSrc:f}}import _r,{createContext as fp,useContext as hp,useEffect as wc,useRef as gp}from"react";import{useState as ip}from"react";function Oo(o){let[e]=ip(o);return e}import{AnimatePresence as op}from"motion/react";var Ho=op;import Ti,{createContext as lp,useContext as up,useEffect as pp,useRef as dp}from"react";import{useEffect as yi,useLayoutEffect as rp}from"react";function sp(){let o=Wt(),[e]=se();return yi(()=>o.onChange(e).cancel,[]),o.getPathname()}function ap(){let{router:o,path:e}=Si(),[t]=se();return yi(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function cp(){let o=Wt(),[e]=se();return yi(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function Vo(o,e){let t=Wt();rp(()=>t.onUpdate(()=>o(t)).cancel,e),yi(()=>{o(t)},[])}function vi(){let o=Wt(),[e]=se();return yi(()=>o.onChange(e).cancel,[]),e}var Cc=lp(null);function bi({children:o,path:e,consumedBy:t}){let i={router:Wt(),path:e,consumedBy:t};return Ti.createElement(Cc,{value:i},o)}function Si(){let o=up(Cc);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new E(`Invalid useLayout call: Trying to access layout without a parent.
66
+ This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function mp({children:o,name:e,propagate:t}){let n=R(),[i]=se(),{path:r,router:s,consumedBy:a}=Si(),c=s.joinPath(r,e),l=Oo(()=>s.createToken(c+"@layout")),u=s.getCurrentPath(),d=dp(!1),p=f=>{d.current=f,i()},h=s.matchPath(u,c);if(vi(),Vo(f=>{let m=f.matchPath(f.getCurrentPath(),c);if(d.current&&!m){if(!o){p(!1);return}f.registerUnmountingPath(l)}m&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(l),m&&!d.current&&!f.isTransitioning()&&p(!0)},[h,o]),pp(()=>{if(!h)return;let f=s.mount(c);return()=>{f.cancel()}},[c,s,h]),a)throw new E("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Ti.createElement(bi,{path:c},Ti.createElement(Ho,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),p(!1)}},h&&d.current&&o))}function xc({children:o}){return vi(),Ti.createElement(bi,{path:dn.rootPath},Ti.createElement(To,{"data-layout-path":dn.rootPath,key:dn.rootPath},o))}var Jr=fp(null);function yp(){return hp(Jr)}function vp({children:o,name:e}){let[t]=se(),{path:n,router:i,consumedBy:r}=Si(),s=yp(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,u=Oo(()=>i.createToken(l+"@page")),d=i.getCurrentPath(),p=!a,h=gp(!1),f=g=>{h.current=g,t()},m=p&&i.exactMatch(d,n)||i.exactMatch(d,l);if(r&&r!==c)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");vi(),Vo(g=>{let y=p&&g.exactMatch(g.getCurrentPath(),n)||g.exactMatch(g.getCurrentPath(),l);if(h.current&&!y){if(!o){f(!1);return}g.registerUnmountingPath(u)}y&&g.isPathsUnmounting()&&g.unregisterUnmountingPath(u),y&&!h.current&&!g.isTransitioning()&&f(!0)},[m,o]),wc(()=>{if(!m)return;let g=p?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{g.cancel()}},[l,m]),wc(()=>()=>{i.unregisterUnmountingPath(u),f(!1)},[]);let v=_r.createElement(bi,{path:n,consumedBy:c},_r.createElement(Ho,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),f(!1)}},m&&h.current&&o));return(g=>s?_r.createElement(Jr,{value:{name:null}},g):g)(v)}import Zr,{useCallback as Sp,useEffect as es,useImperativeHandle as Tp,useMemo as kc,useRef as ts,useState as bp}from"react";var Ap=50,Cp={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Pc={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function xp(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Ec(o,e){return e==null?o:Math.max(o,e)}function wp(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 Dc=Zr.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=ts(null),[f,m]=bp({...Pc,width:"0px",height:"0px"}),v=ts(u),A=ts(null);es(()=>{v.current=u},[u]);let g=Sp(()=>{let C=h.current;if(!C)return;let w=C.clientWidth,T=C.clientHeight;if(w<=0||T<=0||e<=0)return;let k=wp(w,T,e),O=Ec(k.width,n),U=Ec(k.height,i),ue=A.current;(!ue||ue.width!==O||ue.height!==U)&&(A.current={width:O,height:U},m({...Pc,width:`${O}px`,height:`${U}px`}));let Ne=t>0?O/t:1;v.current?.({width:O,height:U,scale:Ne,containerWidth:w,containerHeight:T})},[e,t,n,i]),y=kc(()=>_s(g,typeof r=="number"?r:Ap),[g,r]);es(()=>{g()},[g]),es(()=>{let C=new ResizeObserver(()=>{y()});h.current&&C.observe(h.current);let w=()=>{y()};return window.addEventListener("resize",w),()=>{C.disconnect(),window.removeEventListener("resize",w)}},[y]),Tp(p,()=>({requestUpdate:g}),[g]);let b=kc(()=>xp(l),[l]);return Zr.createElement("div",{id:c,ref:h,style:Cp,...b},Zr.createElement("div",{className:s,style:{...f,...a}},d))}),Lc=Dc;function kp(){return R().getLiveGame()}import os from"react";import Pp,{createContext as Ep,useContext as Dp,useEffect as Lp,useState as Rc}from"react";var Rp={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Ic=Ep({state:Rp,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function $t(){return Dp(Ic)}function ns(){let{dialogs:o}=$t();return o}function Ip(){let{isActive:o}=$t();return o}function Mp(){let{isVisible:o}=$t();return o}function is({children:o}){let t=R().getLiveGame().getGameState(),[n,i]=Rc(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=Rc(null);Lp(()=>{let c=f=>({...f,dialogs:[...f.dialogs]}),l=t.events.on(L.EventTypes["event:state.nvl.enter"],(f,m)=>{i(c(t.getNvlState())),s(m?.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"],(f,m)=>{i(c(t.getNvlState())),s(m||null)}),h=t.events.on(L.EventTypes["event:state.nvl.change"],f=>{i(c(f))});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 Pp.createElement(Ic.Provider,{value:a},o)}import{AnimatePresence as Np,motion as Gp}from"motion/react";import Fp from"clsx";function rs({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=$t(),{ratio:r}=fe(),s=R(),a=i?.duration?i.duration/1e3:.3;return os.createElement(Np,null,n&&os.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},os.createElement(Gp.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:Fp("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 Pn from"react";function ss({renderDialogItem:o,dialogs:e}){return Pn.createElement(rs,{className:"bg-black/80 text-white p-16 inset-8"},Pn.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?Pn.createElement(en,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Pn.createElement(fn,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Pn.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}):Pn.createElement(Pn.Fragment,null,r,s))})))}import Tt,{useMemo as Op}from"react";import Mc from"clsx";function Hp({children:o,className:e,style:t,renderDialogItem:n}){let i=ns(),{state:r}=$t();return Tt.createElement("div",{"data-element-type":"nvl-dialog-list",className:Mc("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>Tt.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},Tt.createElement(Vp,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?Tt.createElement(en,{className:"nvl-character-name font-bold mr-2"}):null,texts:Tt.createElement(fn,{className:"nvl-dialog-text"})}):o?Tt.Children.map(o,c=>Tt.isValidElement(c)?Tt.cloneElement(c,{entry:s,index:a}):c):Tt.createElement(Nc,{entry:s,index:a})))))}function Nc({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??Tt.createElement(fn,{className:"nvl-dialog-text"});return Tt.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:Mc("nvl-dialog-item",t),style:n},r&&Tt.createElement(en,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function Vp({entry:o,children:e}){let n=R().getLiveGame().getGameState(),i=Op(()=>o.sentence.evaluate(Ce.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=wo({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return Tt.createElement(Cn,{value:c},e)}import Uo from"react";import{createPortal as Up}from"react-dom";var as=Uo.createContext(null),Wp={Portal:()=>null,measure:()=>null,container:null};function Bp(){let o=Uo.useContext(as);return Uo.useMemo(()=>{if(!o)return Wp;let e=t=>{let n=o.offsetWidth;return!n||!t.width?1:t.width/n};return{container:o,Portal:({children:t})=>Up(Uo.createElement("div",{style:{position:"absolute",left:0,top:0,pointerEvents:"auto"}},t),o),measure:t=>{if(!t)return null;let n=o.getBoundingClientRect(),i=e(n),r=t.getBoundingClientRect(),s=(r.left-n.left)/i,a=(r.top-n.top)/i,c=r.width/i,l=r.height/i;return{left:s,top:a,width:c,height:l,right:s+c,bottom:a+l}}}},[o])}import{useEffect as zp}from"react";function Kp(o){let e=R();zp(()=>{if(!o)return;let t=e.getLiveGame().getGameState();if(t)return t.suspendAdvance()},[o,e])}function Fc({state:o}){let e=R(),t=Wt(),n=cs(null),i=cs(null),r=cs(!1),[s]=mn(re.Preferences.skipDelay),[a]=mn(re.Preferences.skipInterval),[c]=xn("skipAction");return jp(()=>{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(!o.isAdvanceSuspended()&&e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(re.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let f=()=>{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?f():i.current=setTimeout(f,s)}},p=h=>{e.keyMap.match("skipAction",h.key)&&u()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",d).cancel,f=e.getLiveGame().onWindowEvent("keyup",p).cancel;return()=>{u(),h(),f()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",d).cancel,f=e.getLiveGame().onPlayerEvent("keyup",p).cancel;return()=>{u(),h(),f()}}},[t,s,a,c]),Gc.createElement(Gc.Fragment,null)}import Oc,{useEffect as qp}from"react";function Yp(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Hc=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],Xp=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]','[data-element-type="interactive-word"]','[data-element-type="dialog-overlay"]'];function Qp(o,e){return!o||e&&Hc.some(t=>!!o.closest(t))?!1:[...Xp,...Hc].some(t=>!!o.closest(t))}function Vc(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 Uc({state:o}){let e=R();return qp(()=>{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)||!Vc(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!Vc(i,s))||Yp(r)||Qp(r,o.isNvlMode())||o.isAdvanceSuspended()||(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]),Oc.createElement(Oc.Fragment,null)}import{useEffect as Wc}from"react";function ls({gameState:o}){let e=o.audioManager,[t,n]=mn("globalVolume");return Wc(()=>{n(e.getGlobalVolume())},[]),Wc(()=>{e.setGlobalVolume(t)},[t]),null}import{useEffect as Wo,useRef as _p}from"react";function Bc(o){let e=Re.catSrc(o.srcManager?.src||[]),t=Re.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=new Set;for(let s of e.image){let a=Re.getSrc(s);!a||r.has(a)||(r.add(a),n.push(a))}for(let s of t.image){let a=Re.getSrc(s);!a||r.has(a)||(r.add(a),i.push(a))}return{critical:n,lookAhead:i,all:[...n,...i],criticalAudio:e.audio}}function zc({state:o}){let{preloaded:e,cacheManager:t}=Kt(),n=R(),i=_p(new Set),[r]=se(),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($e.EventTypes["event:preloaded.unmount"])}return Wo(()=>o.events.on(L.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Wo(()=>{if(typeof fetch>"u")return e.events.emit($e.EventTypes["event:preloaded.complete"]),e.events.emit($e.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($e.EventTypes["event:preloaded.complete"]),e.events.emit($e.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=Bc(a),h=new Dn(n.config.preloadConcurrency,0),f=new Dn(n.config.preloadConcurrency,n.config.preloadDelay),m=o.logger.group(s,!0),v=!1;o.logger.debug(s,"preloading:",p,a);let A=(g,y,b,C)=>{y.forEach((w,T)=>{if(t.has(w)||t.isPreloading(w)){o.logger.debug(s,`Image already loaded (${b} ${T+1}/${y.length})`,w);return}g.addTask(()=>new Promise(k=>{t.preload(o,w,{retainDecoded:C}).onFinished(()=>{o.logger.debug(s,`Image loaded (${b} ${T+1}/${y.length})`,w),k()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${b} ${T+1}/${y.length})`,w),k()})}))})};A(h,p.critical,"first scene",!0),A(f,p.lookAhead,"look-ahead",!1);for(let g of p.criticalAudio)o.audioManager.preload(g);return m.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($e.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit($e.EventTypes["event:preloaded.ready"]),!v&&(await f.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($e.EventTypes["event:preloaded.ready"]),e.events.emit($e.EventTypes["event:preloaded.mount"]),()=>{v=!0,u()}},[a,l]),Wo(()=>{i.current.clear()},[a]),Wo(()=>{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(g=>Re.getPreloadableSrc(l,g)).filter(function(g){return g!==null});p.filter(function(g){return g?.activeType==="scene"}).forEach(g=>{i.current.has(g)||i.current.add(g)});let f=Re.catSrc([...i.current,...p]),m=new Dn(n.config.preloadConcurrency,n.config.preloadDelay),v=[],A=o.logger.group(s);o.logger.debug(s,"preloading:",f);for(let g of f.image){let y=Re.getSrc(g);if(y){if(v.push(y),t.has(y)||t.isPreloading(y)){o.logger.debug(s,`Image already loaded (${f.image.indexOf(g)+1}/${f.image.length})`,y);continue}m.addTask(()=>new Promise(b=>{t.preload(o,y).onFinished(()=>{o.logger.debug(s,`Image loaded (${f.image.indexOf(g)+1}/${f.image.length})`,y),b()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${f.image.indexOf(g)+1}/${f.image.length})`,y),b()})}))}}A.end(),m.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 Ai from"react";import zo from"react";import us,{useEffect as ps,useLayoutEffect as ds,useRef as Bo,useState as ms}from"react";function jt({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c,companionRefs:l}){let[u,d]=ms(null),[p,h]=ms(null),f=Bo(null),m=us.useRef(null),[v]=ms(()=>new Vi("displayable.refGroup")),A=Bo(v.next()),g=Bo(rt()),b=R().getLiveGame().getGameState(),C=typeof a=="function"?a(u):a,[w]=se([p,u,g]);ps(()=>b.events.depends([b.events.on(L.EventTypes["event:state.player.skip"],ft)]).cancel,[p,u,g]),ds(()=>{if(U(),!u)return;if(g.current.some(([M])=>!M.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:I,task:F}=u,D=M=>{g.current.forEach(([he],Ee)=>{let st=F.resolve[Ee],Ge=typeof st=="function"?st:st.resolver;if(!Ge)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${Ee}])`);let Ri=Ge(...M),ir=q(C[Ee]||C[C.length-1]||{},Ri);Ne(he,c?c(ir):ir)})},K=I.onUpdate(D);D(F.animations.map(M=>M.start));let ae=!1;return Promise.all(g.current.map(([M])=>{let he=M.current;return he?.waitForLoad?he.waitForLoad():Promise.resolve()})).then(()=>{ae||I.start()}),()=>{ae=!0,K.cancel()}},[u]),ps(()=>{if(!m.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),ds(()=>{let I=e.toStyle(b,i);return Object.assign(m.current.style,I),O(),b.logger.debug("Displayable","Initial style applied",m.current,I),bt(),()=>{Qe()}},[]);let T=Bo(()=>{});T.current=()=>{u||!m.current||(U(),!(p||f.current)&&(Object.assign(m.current.style,e.toStyle(b,i)),O()))},ds(()=>{f.current&&!o._getLoop()&&Qe(),T.current()});let{ratio:k}=fe();ps(()=>k.onUpdate(()=>{T.current(),requestAnimationFrame(()=>T.current())}),[k]);function O(){if(l)for(let{ref:I,project:F}of l)I.current&&Object.assign(I.current.style,F(e.get()))}function U(){let I=typeof a=="function"?a(u):a;if(!g.current||!g.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");g.current.some(([F])=>!F.current)||g.current.forEach(([F],D)=>{Ne(F,I[D]||I[I.length-1]||{})})}function ue(I){b.logger.debug("Displayable","Transform applied",e.toStyle(b,i),m.current),w(),r?.(I)}function Ne(I,F){if(!I.current)throw new E("Displayable: Trying to assign properties to unmounted element");oo(I.current,F,c)}function Qe(){f.current&&(f.current.stop(),f.current=null,b.logger.debug("Displayable","Loop stopped",o))}function bt(){let I=o._getLoop();if(!I){Qe();return}f.current||At(I.transform,I.options)}function At(I,F){p&&(p.abort(),h(null)),Qe(),m.current&&(f.current=I.startLoop(e,{gameState:b,ref:m,overwrites:i,companionRefs:l},F))}function gn(I,F){return mt(new J({},{duration:I?.duration??0,ease:I?.ease??"linear"}),F)}function mt(I,F){p&&(p.abort(),h(null)),Qe();let D=I.animate(e,{gameState:b,ref:m,overwrites:i,companionRefs:l}),K=new xe(D);return b.timelines.attachTimeline(K),D.onSkipControllerRegister(ae=>{ae.onAbort(()=>{K.abort(),h(null)})}),h(D),D.then(()=>{h(null),ue(I),F(),bt()}),K}function B(I,F){u&&u.controller.complete();let D=I.createTask(b),K=I.requestAnimations(D.animations),ae=new S().registerSkipController(new V(K.cancel)),M=new xe(ae);ae.skipController.onAbort(()=>{K.cancel()}),K.onCanceled(()=>{M.abort(),d(null),b.logger.debug("Displayable","Transition cancelled",I)}),K.onComplete(()=>{Ue(),d(null),s?.(I),F(),ae.resolve()}),b.timelines.attachTimeline(M),d({task:D,controller:K,transition:I,resolve:F});let he;if(g.current=D.resolve.map(Ee=>{let st=us.createRef(),Ge=typeof Ee=="function"?void 0:Ee.key;if(!Ge)return[st,v.next()];if(Ge==="target")return he=v.next(),[st,he];if(Ge==="current")return[st,A.current];throw new E("Displayable: Invalid key type")}),!he)throw new E("Displayable: No target key found");return A.current=he,M}function Pe(I){return b.logger.debug("initDisplayable",o),mt(J.immediate(e.get()),I)}function ft(){t&&p&&(p.abort(),h(null),b.logger.debug("transform skipped")),n&&u&&(u.controller.complete(),b.logger.debug("transition skipped"))}function rt(){return[[us.createRef(),A.current]]}function Ue(){g.current.forEach(([I])=>{I.current=null}),g.current=rt()}return{transformRef:m,transitionRefs:g.current,transitionTask:u,initDisplayable:Pe,applyTransform:mt,applyTransition:B,applyLoop:At,stopLoop:gn,updateStyleSync:U,flush:w,deps:[p,u,g]}}import{useEffect as Jp}from"react";function xt(o,e,t=[]){let i=R().getLiveGame().getGameState();return Jp(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function fs({state:o,text:e}){let{ratio:t}=fe(),[n]=se(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyLoop:c,stopLoop:l,applyTransition:u,updateStyleSync:d,deps:p}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:h=>({width:"fit-content",transform:J.propToCSSTransform(o,h,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return xt(e,{initDisplayable:s,applyTransform:a,applyLoop:c,stopLoop:l,applyTransition:u,flush:n,updateStyleSync:d},[...p]),zo.createElement(zt.Div,{"data-element-type":"text"},zo.createElement(zt.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([h,f])=>zo.createElement("span",{key:f,ref:h,className:e.config.className},zo.createElement("span",null,e.state.text)))))}import Mt,{forwardRef as ed,useCallback as $c,useImperativeHandle as td,useRef as jo,useState as jc}from"react";import Ko,{useEffect as hs,useRef as zn,forwardRef as Zp}from"react";var Kc=Zp(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=zn(null),{ratio:a}=fe(),[c,l]=Ko.useState(0),[u,d]=Ko.useState(0),p=zn(null),h=zn(null),f=R(),m=zn(!1),v=zn(null),A=zn(null);Ko.useImperativeHandle(r,()=>s.current,[]),hs(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>{let C=()=>{let w=s.current;return!w||typeof w.decode!="function"?Promise.resolve():w.decode().catch(()=>{})};return m.current?C():(v.current||(v.current=new Promise(w=>{A.current=w})),v.current.then(C))},configurable:!0}})},[]),hs(()=>(g(),a.onUpdate(g)),[o]),hs(()=>{let C=new MutationObserver(w=>{w.forEach(T=>{T.type==="attributes"&&T.attributeName==="src"&&s.current&&g()})});return s.current&&C.observe(s.current,{attributes:!0}),()=>{C.disconnect()}},[o]);function g(){if(s.current&&s.current.naturalWidth){let C,w,T;if(s.current.naturalWidth*s.current.naturalHeight===1)C=a.state.width,w=a.state.height,T=`${C} / ${w}`;else{let ue=t?f.config.width/s.current.naturalWidth:1;C=s.current.naturalWidth*a.state.scale*ue,w=s.current.naturalHeight*a.state.scale*ue,T="auto"}let k=p.current,O=!k||k.w!==C||k.h!==w||k.ar!==T,U=!!o&&h.current!==o;if(!O&&!U)return;O&&(p.current={w:C,h:w,ar:T},l(C),d(w),s.current.style.aspectRatio=T),o&&(h.current=o,o(C,w))}}function y(){g(),m.current=!0,A.current&&(A.current(),A.current=null,v.current=null),e&&e()}function b(){m.current=!0,A.current&&(A.current(),A.current=null,v.current=null)}return Ko.createElement("img",{ref:s,onLoad:y,onError:b,width:c,height:u,alt:"",src:n,style:i})});Kc.displayName="AspectScaleImage";var $o=Kc;import qc from"clsx";import{motion as nd}from"motion/react";var id={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},Yc=ed(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=jo(null),a=jo([]),c=o.findIndex(l=>l!==null);return td(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(()=>{})}),[]),Mt.createElement("div",{ref:s},o.map((l,u)=>l===null?null:Mt.createElement($o,{key:"layer-"+u,ref:d=>{a.current[u]=d},src:t(l),style:id,autoFit:e,onSizeChanged:u===c?n:void 0,onLoad:u===c?i:void 0})))});Yc.displayName="LayerStack";function od(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 rd(o){return N.isStaticSrc(o)?o.state.currentSrc:N.getSrcURL(o)??void 0}var sd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function ad({image:o,state:e}){let[t]=jc(()=>new _),[n,i]=jc([]),{cacheManager:r}=Kt(),s=jo([]),a=jo(null),c=N.isLayeredSrc(o)?N.getSrcURLs(o):null;function l(T){return!P.isDataURI(T)&&!r.has(T)&&!r.isPreloading(T)&&!s.current.includes(T)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${T}".
61
67
  This may be caused by complicated image action behavior that cannot be predicted.
62
- 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:f,applyTransform:m,applyLoop:v,stopLoop:A,updateStyleSync:g,flush:y,deps:b}=$t({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:T=>{if(l)return(T?T.task.resolve:[null]).map(U=>U&&typeof U=="function"?{style:rd}:{style:id(o.state.darkness)});let w=T?T.transition._getCurrentSrc():od(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:P.isColor(w)?P.colorToString(w):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:P.isImageSrc(w)?P.srcToURL(w):N.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:c(T.src)}:T});Ct(o,{createWearable:T=>{i(w=>[...w,T])},disposeWearable:T=>{i(w=>w.filter(O=>O.getId()!==T.getId()))},initDisplayable:h,applyTransform:m,applyLoop:v,stopLoop:A,applyTransition:f,events:t,updateStyleSync:g,flush:y},[...b]);let C=Kl((T,w)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${T}px`,height:`${w}px`}))},[t]),x=Kl(()=>{t.emit("event:image.onLoad")},[t]);return It.createElement(td.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},It.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},l?d.map(([T,w],O)=>{let U=p?p.task.resolve[O]:null;if(U&&typeof U=="function")return It.createElement($o,{key:w,ref:T,autoFit:o.config.autoFit});let ue=U?U.key==="target"?p.transition._getTargetLayers():p.transition._getPrevLayers():l;return It.createElement(ql,{key:w,ref:T,src:ue||l,autoFit:o.config.autoFit,resolveSrc:c,onSizeChanged:O===0?C:void 0,onLoad:O===0?x:void 0})}):d.map(([T,w],O)=>It.createElement($o,{key:w,ref:T,autoFit:o.config.autoFit,onSizeChanged:O===0?C:void 0,onLoad:O===0?x:void 0})),It.createElement("div",{className:jl("w-full h-full top-0 left-0 absolute")},n.map(T=>It.createElement("div",{className:jl("w-full h-full relative"),key:"wearable-"+T.getId()},It.createElement(Yl,{image:T,state:e}))))))}var Yl=It.memo(sd),Xl=Yl;import Yo,{useEffect as Jl,useMemo as pd,useRef as hs}from"react";var ad=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,ld=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function Ql(o,e){if(typeof e!="string"||!e.length)return o;if(ad.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=cd(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+ud(r+e.replace(/\\/g,"/"))}function cd(o){let e=ld.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function ud(o){let e=o.split("/"),t=[];for(let n=0;n<e.length;n++){let i=e[n];if(!(i==="."||i===""&&n!==e.length-1)){if(i===".."){t.pop();continue}t.push(i)}}return t.join("/")}var qo=class{constructor(){this.backends=new Map;this.reportedMissing=new Set}register(e){if(!e||typeof e.name!="string"||!e.name.length)throw new Error("A puppet backend must have a non-empty name.");if(typeof e.mount!="function")throw new Error(`Puppet backend "${e.name}" must implement mount().`);return this.backends.set(e.name,e),this.reportedMissing.delete(e.name),this}get(e){return this.backends.get(e)||null}has(e){return this.backends.has(e)}list(){return Array.from(this.backends.keys())}unregister(e){return this.backends.delete(e)}reportMissing(e,t){return this.reportedMissing.has(e)?!1:(this.reportedMissing.add(e),t(`No puppet backend is registered under "${e}". The element keeps its place on the stage, its transform and its saved state, but draws nothing. Register one with game.registerPuppetBackend({name, mount}) before the game mounts.`),!0)}};function gs({state:o,puppet:e}){let[t]=se(),{cacheManager:n}=zt(),i=hs(null),r=pd(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=hs(r);s.current=r;let{transformRef:a,transitionRefs:l,initDisplayable:c,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,deps:m}=$t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipImageTransform,skipTransition:o.game.config.allowSkipImageTransition,transitionsProps:[{style:{position:"relative",width:`${r.width}px`,height:`${r.height}px`}}]});Ct(e,{initDisplayable:c,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,flush:t},[...m]),Jl(()=>{let g=i.current;if(!g)return;let y=o.game,b=e.config.backend,C=y.getPuppetBackend(b);if(!C)return e._setStatus("missing-backend"),y.getPuppetBackendRegistry().reportMissing(b,w=>{o.logger.warn("Puppet",w)}),()=>{e._setStatus("unmounted")};let x;try{x=C.mount(g,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:A,resolveSibling:w=>A(Ql(e.config.src,w)),warn:(w,O)=>{o.logger.warn("Puppet",w,O)}})}catch(w){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" threw while mounting "${e.config.src}"`,w),()=>{e._setStatus("unmounted")}}let T=!1;return e._attachInstance(x),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!T&&typeof x.ready=="function"?x.ready():void 0).then(()=>{T||e._setStatus("ready")}).catch(w=>{T||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" failed to load "${e.config.src}"`,w))}),()=>{T=!0,e._attachInstance(null),e._setStatus("unmounted");try{x.dispose()}catch(w){o.logger.error("Puppet",`Backend "${b}" threw while disposing`,w)}}},[]);let v=hs(r);Jl(()=>{let g=v.current;if(g.width===r.width&&g.height===r.height)return;v.current=r;let y=e._getInstance();if(!(!y||typeof y.resize!="function"))try{y.resize(r)}catch(b){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,b)}},[r]);function A(g){return P.isDataURI(g)?g:n.get(g)||g}return Yo.createElement(Bt.Div,{"data-element-type":"puppet"},Yo.createElement(Bt.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},l.map(([g,y])=>Yo.createElement("div",{key:y,ref:g,className:e.config.className},Yo.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function ys({state:o,displayable:e}){return bi.createElement(bi.Fragment,null,e.map(t=>{if(t instanceof An)return bi.createElement(ms,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof N)return bi.createElement(Xl,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Et)return bi.createElement(gs,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import Xo,{useEffect as dd}from"react";import{motion as md}from"motion/react";function _l({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u,deps:d}=$t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return Ct(e,{initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u},[...d]),dd(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),Xo.createElement(Xo.Fragment,null,Xo.createElement(md.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([p,h])=>Xo.createElement("div",{className:"relative w-full h-full",ref:p,key:h},t))))}async function Zl(o,e,t,n){let i=e.state.backgroundMusic,r=i&&o.audioManager.isManaged(i)?o.audioManager.stop(i,n):null;if(r&&t===i&&await r,t)try{await o.audioManager.playSoundToken(t,{end:t.state.volume,duration:n}),e.state.backgroundMusic=t}catch{e.state.backgroundMusic=null}else e.state.backgroundMusic=null;r&&await r}import fd from"clsx";import{useEffect as vs,useRef as hd}from"react";import Ss from"react";function Ts({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=hd(null);return vs(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),vs(()=>n.events.depends([n.events.on(nt.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),vs(()=>(n.events.emit(nt.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(nt.EventTypes["event:scene.unmount"]),o.events.emit(L.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),Ct(n,{setBackgroundMusic(s,a){return Zl(o,n,s,a)}}),Ss.createElement("div",{className:fd(e,"w-full h-full absolute"),ref:r,"data-element-type":"scene","data-scene-id":n.getId()},[...i.entries()].sort(([s],[a])=>s.state.zIndex-a.state.zIndex).map(([s,a])=>Ss.createElement(_l,{state:o,layer:s,key:s.getId()},Ss.createElement(ys,{state:o,displayable:a}))))}import{AnimatePresence as Sd}from"motion/react";import{useEffect as Td,useReducer as bd,useRef as Ai}from"react";import gd from"clsx";import jt,{useCallback as bs,useMemo as yd,useRef as vd}from"react";function As({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=R(),a=vd([]),l=bs(f=>(a.current.push(f),a.current.indexOf(f)),[]),c=bs(f=>{let m=a.current.indexOf(f);m!==-1&&a.current.splice(m,1)},[]),u=bs(f=>a.current.indexOf(f),[]),d=s.config.menu,p=yd(()=>e.map(f=>({...f,words:f.prompt.evaluate(Ae.getCtx({gameState:n}))})),[]);function h(f){t(f)}return jt.createElement(jt.Fragment,null,jt.createElement(zr,{value:{evaluated:p,choose:h,gameState:n}},jt.createElement($r,{value:{register:l,unregister:c,getIndex:u}},jt.createElement(Wt,{className:"absolute"},r&&o&&jt.createElement(mi,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),jt.createElement(Bt.Div,{color:"green",border:"dashed",className:gd("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},jt.createElement(d,{items:p.map((f,m)=>m)})))))}function ec({items:o}){return jt.createElement(bo,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>jt.createElement(Io,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Ad from"clsx";import Ci from"react";var Cd=120;function Cs({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=Ai(!1),a=Ai({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),l=Ai([]),c=Ai(null),u=Ai(null),[,d]=bd(m=>m+1,0),p=()=>{u.current&&(clearTimeout(u.current),u.current=null)},h=()=>{let m=c.current;if(!m)return;let v=a.current;m.forEach(({slot:A,presenceKey:g})=>{v.slotKeys.get(A)===g&&v.slotKeys.delete(A),v.exitingKeys.add(g)}),c.current=null,u.current=null,l.current=[],d()};Td(()=>()=>{p()},[]);let f=(()=>{let m=a.current,v=i.length>0?i.map(({action:y,onClick:b},C)=>({action:y,slot:C,useTypeEffect:!s.current,onFinished:x=>{x!==void 0&&(s.current=x),b(),o.events.emit(L.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((y,b)=>{if(!y.action.prompt||!y.action.words)return[];let C=m.menuPromptIds.get(y);return C||(C=`menu-prompt-${n.getId()}-${m.nextKey++}`,m.menuPromptIds.set(y,C)),[{action:{sentence:y.action.prompt,words:y.action.words,character:null,id:C},slot:b,useTypeEffect:!1}]});if(v.length===0)return!c.current&&l.current.length>0&&(c.current=l.current.map(y=>({...y,active:!1}))),c.current&&!u.current&&(u.current=setTimeout(h,Cd)),c.current??[];p(),c.current=null;let A=new Set(v.map(({slot:y})=>y));for(let[y,b]of Array.from(m.slotKeys))A.has(y)||(m.exitingKeys.add(b),m.slotKeys.delete(y));let g=v.map(({slot:y,...b})=>{let C=m.slotKeys.get(y);return(!C||m.exitingKeys.has(C))&&(C=`say-${n.getId()}-${m.nextKey++}`,m.slotKeys.set(y,C)),{...b,presenceKey:C,slot:y,active:!0}});return l.current=g,g})();return Ci.createElement("div",{className:Ad(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs"},Ci.createElement(Sd,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{a.current.exitingKeys.clear()}},f.map(({action:m,onFinished:v,presenceKey:A,active:g,useTypeEffect:y})=>Ci.createElement(mi,{gameState:o,key:A,action:m,active:g,onFinished:v,useTypeEffect:y}))),r.map(({action:m,onClick:v},A)=>Ci.createElement("div",{key:"menu-"+A,"data-element-type":"menu"},Ci.createElement(As,{state:o,prompt:m.prompt,choices:m.choices,renderPrompt:!m.prompt,afterChoose:g=>{s.current=!1,v(g),o.stage.next()},words:m.words}))))}import hn,{useEffect as xd,useRef as xs}from"react";import{motion as wd}from"motion/react";function tc({state:o,camera:e,children:t}){let n=xs(null),i=xs(null),r=xs(null),{transformRef:s,transitionRefs:a,initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h,deps:f}=$t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:Ea},{ref:i,project:ka},{ref:r,project:Pa}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return Ct(e,{initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h},[...f]),xd(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),hn.createElement(hn.Fragment,null,hn.createElement(wd.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,v])=>hn.createElement("div",{className:"relative w-full h-full",ref:m,key:v},t))),hn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},hn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),hn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),hn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import kd from"react";import{useEffect as ws,useRef as Pd}from"react";import{useCallback as nc}from"react";function ic(o){let e=nc(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=nc(()=>{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 ks({gameState:o,video:e}){let t=Pd(null),{show:n,hide:i}=ic(t);ws(()=>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,[]),ws(()=>{i(),e.state.display&&n()},[]),ws(()=>{if(!t.current)return;let s=t.current,a=!1,l=new Set,c=()=>new E(`Failed to add event listener, ref is not available
63
- at Video.tsx: useEffect`),u=h=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw c();n()},hide:()=>{if(!t.current)throw c();i()},play:()=>{if(!t.current)throw c();let f=t.current;return h||f.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(f.currentTime=0,new Promise(m=>{let v=!1,A=null,g=[],y=()=>{v||(v=!0,l.delete(y),A&&A(),g.forEach(b=>b()),m())};l.add(y),A=o.schedule(({retry:b})=>{if(v)return;if(f.readyState<3){let w=()=>{f.removeEventListener("loadeddata",w),b()};f.addEventListener("loadeddata",w),g.push(()=>f.removeEventListener("loadeddata",w));return}let C=()=>y(),x=()=>y(),T=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),y()};f.addEventListener("ended",C),f.addEventListener("stopped",x),f.addEventListener("error",T),g.push(()=>{f.removeEventListener("ended",C),f.removeEventListener("stopped",x),f.removeEventListener("error",T)}),f.play().catch(w=>{o.logger.error("Failed to play video: "+w),y()})},10)}))},pause:()=>{if(!t.current)throw c();t.current.pause()},resume:()=>{if(!t.current)throw c();return t.current.play().catch(f=>{o.logger.error("Failed to resume video: "+f)})},stop:()=>{if(!t.current)throw c();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:f=>{if(!t.current)throw c();t.current.currentTime=f}}))},d=()=>u(!1),p=()=>{o.logger.error("NarraLeaf-React: Video",`Failed to load video source: ${e.config.src}`+(s.error?` (media error code ${s.error.code})`:"")),u(!0)};return s.addEventListener("canplay",d),s.addEventListener("error",p),s.readyState>=3?u(!1):s.error&&p(),()=>{s.removeEventListener("canplay",d),s.removeEventListener("error",p),l.forEach(h=>h()),s.currentTime>0&&s.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]);function r(){t.current&&(t.current.pause(),t.current.currentTime=0,t.current.dispatchEvent(new Event("stopped")))}return kd.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 Ed,{useEffect as Dd,useRef as Ld}from"react";var oc={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 Rd(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&oc[e]?oc[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Ps({gameState:o,vfx:e}){let t=Ld(null);return Dd(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,l=new Set,c=new Set,u=[],d=b=>{n.style.transition="",n.style.opacity=String(b)},p=()=>{n.play().catch(b=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+b)})},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(b=>{let C=!1,x=()=>w(),T=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),w()},w=()=>{C||(C=!0,c.delete(w),n.removeEventListener("loadeddata",x),n.removeEventListener("error",T),b())};c.add(w),n.addEventListener("loadeddata",x),n.addEventListener("error",T),(n.readyState>=2||n.error)&&w()}),f=(b,C,x)=>{let T=C?.duration??0,w=++s;return x.instant||T<=0?(d(b),Promise.resolve()):new Promise(O=>{let U=!1,ue=null,Ie=()=>{U||(U=!0,c.delete(Ie),ue!==null&&clearTimeout(ue),s===w&&t.current&&d(b),O())};c.add(Ie),n.style.transition=`opacity ${T}ms ${Rd(o,C?.easing)}`,n.offsetWidth,n.style.opacity=String(b),ue=setTimeout(Ie,T)})},m=b=>{r||(r=!0,i=b,o.mountState(e,{show:async C=>{a=!0;let x={instant:!1};l.add(x);try{if(await h(),!t.current)return;n.playbackRate=C?.rate??e.config.playbackRate,e.state.paused||p(),await f(C?.opacity??e.config.opacity,C,x)}finally{l.delete(x)}},hide:async C=>{a=!0;let x={instant:!1};l.add(x);try{await f(0,C,x),t.current&&n.pause()}finally{l.delete(x)}},pause:()=>{n.pause()},resume:()=>{p()},setRate:C=>{n.playbackRate=C}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&d(e.config.opacity)},0)))},v=()=>m(!1),A=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),m(!0)},g=o.events.on(L.EventTypes["event:state.player.skip"],()=>{l.size===0&&c.size===0||(l.forEach(b=>{b.instant=!0}),[...c].forEach(b=>b()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),y=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&p()};return document.addEventListener("visibilitychange",y),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",A),n.readyState>=3?m(!1):n.error&&A(),()=>{n.removeEventListener("canplay",v),n.removeEventListener("error",A),document.removeEventListener("visibilitychange",y),g.cancel(),u.forEach(b=>b()),[...c].forEach(b=>b()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),Ed.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,loop:e.config.loop,playsInline:!0,onContextMenu:n=>n.preventDefault(),style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:e.config.fit,pointerEvents:"none"}})}import Id from"clsx";import Md,{useCallback as Nd,useEffect as Qo,useRef as Gd}from"react";function Es({children:o,className:e,gameState:t}){let{ratio:n}=fe(),i=R(),[r]=se(),s=Gd(null),a=i.config.minWidth,l=i.config.minHeight,c=Nd(u=>{if(n.isLocked()){t.logger.weakWarn("AspectRatio","ratio is locked, skipping update");return}n.update(u.width,u.height,u.scale),n.updateMin(a,l),r()},[r,t.logger,l,a,n]);return Qo(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),Qo(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),Qo(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,l,a]),Qo(()=>t.events.on(L.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),Md.createElement(Dl,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:l,debounceMs:i.config.ratioUpdateInterval,className:Id(e),onUpdate:c},o)}import rc,{useEffect as Fd,useRef as Od,useState as sc}from"react";function Ds({src:o,width:e,height:t}){let[n,i]=sc({x:0,y:0}),[r,s]=sc(!1),a=Od(null),{ratio:l}=fe();return Fd(()=>{let c=u=>{if(a.current){let d=a.current.getBoundingClientRect(),p=u.clientX-d.left,h=u.clientY-d.top;i({x:p,y:h}),r||s(!0)}};return window.addEventListener("mousemove",c),()=>{window.removeEventListener("mousemove",c)}},[r]),rc.createElement(Wt,{ref:a,className:"overflow-hidden absolute"},rc.createElement("img",{src:o,style:{position:"absolute",left:n.x,top:n.y,width:e,height:t,pointerEvents:"none",zIndex:1001,display:r?"block":"none",cursor:"none",transform:`scale(${l.state.scale})`},alt:""}))}import ac from"react";import tn from"react";function Ls({error:o,errorInfo:e}){return R().config.app.debug?tn.createElement("div",{className:"text-left"},tn.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),tn.createElement("p",{className:"text-red-700"},"Message: ",o.message),tn.createElement("pre",null,"Error Stack: ",o?.stack),tn.createElement("pre",null,"Component Stack: ",e?.componentStack),tn.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):tn.createElement("div",{className:"bg-white w-full h-full"},tn.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),tn.createElement("p",null,"Please contact the game developer for further assistance."))}var Jo=class extends ac.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?ac.createElement(Ls,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import uc from"clsx";import W,{useEffect as Mt,useReducer as pc,useState as Kn}from"react";import{flushSync as dc}from"react-dom";import{useRef as Hd}from"react";import{useEffect as Vd}from"react";function lc({gameState:o}){let e=Hd(null);return Vd(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(L.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import xi,{useEffect as Ud}from"react";function Rs({gameState:o}){let[e]=se(),{ratio:t}=fe(),n=o.notificationMgr;Ud(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return xi.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"},xi.createElement(i,{notifications:n.toArray()}))}function cc({notifications:o}){return xi.createElement(No,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>xi.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},xi.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function mc({story:o=ri.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:l,onError:c,children:u,active:d=!0}){let[p,h]=pc(D=>D+1,0),[f,m]=pc(D=>D+1,0),[v,A]=Kn(0),g=R(),[y]=Kn(()=>new L(g,{update:h,forceUpdate:()=>{y.logger.weakWarn("Player","force update"),dc(()=>{h()})},forceRemount:()=>{y.logger.weakWarn("Player","force remount"),dc(()=>{A(D=>D+1),h()})},next:He})),b=W.createRef(),C=W.createRef(),[x,T]=Kn(!1),w=W.useRef(!1),O=W.useRef(null),U=W.useRef(null),{preloaded:ue}=zt(),[Ie,Xe]=Kn(!1),Tt=W.useRef(!1),[bt,gn]=Kn(!1),dt=W.useRef(!1),B=W.useRef(null),ke=W.useRef(!1),[mt]=Kn(new Map);function ot(D){return{game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable(),scene:D}}function He(){let D=()=>{mt.forEach(M=>M.cancel())};if(y.rollLock.isLocked())return;D();let z=!1,ae=0;for(;!z;){if(ae++>g.config.maxStackModelLoop)throw new E("Max stack model loop reached");let M=g.getLiveGame().next();if(!M){if(g.getLiveGame().stackModel&&!g.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(M)){if(O.current===M)break;O.current=M,M.onSettled(()=>{M.isFailed()||(O.current===M&&(O.current=null),He())}),M.onFailed(he=>{O.current===M&&(O.current=null),y.logger.error("Player",he)}),z=!0;break}if(M instanceof En){if(U.current===M)break;U.current=M,M.nextUnlock().then(()=>{U.current===M&&(U.current=null),He()}),z=!0;break}if(qe.isCalledActionResult(M)&&M.wait&&qe.isStackModelsAwaiting(M.wait.type,M.wait.stackModels)){if(O.current===M)break;if(O.current=M,M.wait){let he=qe.executeStackModelGroup(M.wait.type,M.wait.stackModels);he.then(()=>{O.current===M&&(O.current=null),He()}),he.onFailed(Pe=>{O.current===M&&(O.current=null),y.logger.error("Player",Pe)})}z=!0;break}y.handle(M)}y.stage.update()}Mt(()=>{y.audioManager.initialize()},[]),Mt(()=>(g.getLiveGame().setGameState(y),o&&!g.getLiveGame().isPlaying()&&g.getLiveGame().loadStory(o),o?.entryScene&&!y.getPreloadingScene()&&!y.getLastScene()&&y.preloadScene(o.entryScene),y.playerCurrent=b.current,y.mainContentNode=C.current,()=>{g.getLiveGame().setGameState(void 0),y.playerCurrent=null}),[g,o]),Mt(()=>at(()=>{T(!0);let D=y.getLastScene(),z=[];D?z.push(D.events.once("event:scene.mount",()=>{y.stage.next()}).cancel):y.stage.next();let ae=y.events.on(L.EventTypes["event:state.end"],()=>{l&&l({game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable()})});return y.stage.update(),()=>{D&&z.forEach(M=>M()),ae.cancel()}}),[]),Mt(()=>at(()=>{x&&i&&!w.current&&(w.current=!0,y.stage.forceUpdate(),g.hooks.trigger("init",[]),i({game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable()}))}),[x]),Mt(()=>at(()=>{if(Ie&&s&&!Tt.current){Tt.current=!0;let D=B.current||y.getLastScene()||y.getPreloadingScene(),z=ot(D);s(z)}}),[Ie]),Mt(()=>at(()=>{if(bt&&!dt.current){dt.current=!0;let D=B.current||y.getLastScene()||y.getPreloadingScene(),z=ot(D);g.markPreloadComplete(z)&&r&&r(z)}}),[bt]),Mt(()=>y.events.on(L.EventTypes["event:state.scene.mount"],D=>{B.current||(B.current=D,m())}).cancel,[]),Mt(()=>{if(!bt||!d||ke.current||g.isFirstSceneReady())return;let D=B.current||y.getLastScene();if(!D)return;let z=null,ae=null,M=!1;ke.current=!0;let he=()=>{M=!0,ke.current=!1;let Pe=ot(D);g.markFirstSceneReady(Pe)&&a&&a(Pe)};return typeof requestAnimationFrame=="function"?z=requestAnimationFrame(()=>{ae=setTimeout(he,0)}):ae=setTimeout(he,0),()=>{M||(ke.current=!1,z!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(z),ae!==null&&clearTimeout(ae))}},[d,f,p,bt]),Mt(()=>ue.events.depends([ue.events.on(Ke.EventTypes["event:preloaded.ready"],()=>{Xe(!0),y.stage.update(),o&&g.getLiveGame().isPlaying()&&He()}),ue.events.on(Ke.EventTypes["event:preloaded.complete"],()=>{gn(!0)})]).cancel,[]),Mt(()=>{y.flushDep=p},[p]);let I=e||g.config.width,F=t||g.config.height;return W.createElement(Jo,{onError:c},W.createElement("div",{style:{width:typeof I=="number"?`${I}px`:I,height:typeof F=="number"?`${F}px`:F},className:uc(n,"__narraleaf_content-player"),ref:b,tabIndex:0},W.createElement(Es,{className:uc("flex-grow overflow-auto"),gameState:y},W.createElement(ls,{gameState:y}),W.createElement(lc,{gameState:y}),W.createElement(Wt,{className:"absolute",ref:C,style:{cursor:y.game.config.cursor?"none":"auto",overflow:y.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},g.config.cursor&&W.createElement(Ds,{src:g.config.cursor,width:g.config.cursorWidth,height:g.config.cursorHeight}),W.createElement(Wd,{show:Ie&&d,key:v},W.createElement(ns,null,W.createElement(Gl,{state:y}),W.createElement(Vl,{state:y}),W.createElement(Bd,{state:y},W.createElement("div",{className:"w-full h-full absolute",style:{isolation:"isolate"},"data-element-type":"scene-group"},y.getSceneElements().map(D=>W.createElement(Ts,{key:"scene-"+D.scene.getId(),state:y,elements:D}))),W.createElement(zd,{state:y}),y.getVideos().map((D,z)=>W.createElement("div",{className:"w-full h-full absolute",key:"video-"+z,"data-element-type":"video"},W.createElement(ks,{gameState:y,video:D}))),y.getVfx().map(D=>W.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+D.getId(),"data-element-type":"vfx",style:{zIndex:D.config.zIndex,mixBlendMode:D.config.blendMode}},W.createElement(Ps,{gameState:y,vfx:D})))),y.getSceneElements().map(D=>W.createElement(Cs,{key:"scene-dialogs-"+D.scene.getId(),state:y,elements:D})),W.createElement(Kd,{NvlComponent:g.config.nvlDialog}))),W.createElement(Bl,{state:y}),W.createElement(Cl,null,u),W.createElement(Rs,{gameState:y})))))}function Wd({children:o,show:e}){return W.createElement(W.Fragment,null,e?o:null)}function Bd({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?W.createElement(tc,{state:o,camera:t},e):W.createElement(W.Fragment,null,e)}function zd({state:o}){let e=W.useRef(null);return Mt(()=>(o.stageTransition.registerOverlayHost(e.current),()=>{o.stageTransition.registerOverlayHost(null)}),[]),W.createElement("div",{className:"w-full h-full absolute pointer-events-none",ref:e,"data-element-type":"stage-transition-overlay-host"})}function Kd({NvlComponent:o}){let{dialogs:e,state:t}=Kt(),i=R().getLiveGame().getGameState(),r=W.useMemo(()=>e.map((s,a)=>{let l=s.sentence.evaluate(Ae.getCtx({gameState:i})),c=t.activeDialogId===s.id,u=c&&t.phase==="typing";return{entry:s,index:a,isActive:c,gameState:i,words:l,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return W.createElement(o,{dialogs:r})}import"client-only";import $n from"react";function fc({children:o,game:e}){return $n.createElement($n.Fragment,null,$n.createElement(Ba,null,$n.createElement(Oa,{game:e},$n.createElement(Sl,null,$n.createElement(Wa,null,o)))))}var $d=(l=>(l.image="narraleaf:image",l.text="narraleaf:text",l.layer="narraleaf:layer",l.scene="narraleaf:scene",l.video="narraleaf:video",l.vfx="narraleaf:vfx",l.camera="narraleaf:camera",l.puppet="narraleaf:puppet",l))($d||{});import jd from"clsx";import xt,{useEffect as hc,useRef as qd,useState as Yd}from"react";import{motion as Xd,useIsPresent as Qd}from"motion/react";var Jd={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function _d({children:o,initial:e,transition:t,...n}){let i=R(),r=Lt(),{ratio:s}=fe(),[a]=mn(re.Preferences.showDialog),l=qd(null),[c]=xn("nextAction"),u=Qd(),[d,p]=Yd(null);function h(){r.config.gameState.isAdvanceSuspended()||r.requestComplete()}return hc(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
64
- at Say.tsx: onElementClick`);return}let f=v=>{v.repeat||r.config.gameState.isAdvanceSuspended()||i.keyMap.match("nextAction",v.key)&&r.requestComplete()};window.addEventListener("keydown",f);let m=r.events.on(Re.Events.simulateClick,()=>{l.current&&l.current.click()});return()=>{window.removeEventListener("keydown",f),m.cancel()}},[r,c]),hc(()=>{let f=i.preference.onPreferenceChange(re.Preferences.autoForward,m=>{m&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{f.cancel()}},[r]),xt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},xt.createElement("div",{className:jd("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:h,style:{...Ki(i.config.useAspectScale,{maxWidth:i.config.dialogWidth,maxHeight:i.config.dialogHeight,transform:`scale(${s.state.scale})`,transformOrigin:"bottom left",width:i.config.width,height:i.config.height})},ref:l},xt.createElement(ss,{value:d},xt.createElement(Xd.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&u?{duration:0}:t},o)),xt.createElement("div",{"data-element-type":"dialog-overlay",className:"absolute inset-0 pointer-events-none",ref:p})))}function gc({children:o,...e}){let t=Lt();return!t.config.action.sentence||!t.config.action.words?null:xt.createElement(_d,{...e},o)}var Kp=gc;function yc(){return xt.createElement(gc,null,xt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},xt.createElement(Yr,null),xt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},xt.createElement(en,null),xt.createElement(fn,{...Jd}))))}var wi={say:yc,menu:ec,notification:cc,nvlDialog:rs};var _o=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 ki=class{constructor(e={}){this.keyMap=e;this.events=new Q}setKeyBinding(e,t){this.keyMap[e]=t,this.events.emit("event:keyMap.change",e,t)}getKeyBinding(e){return this.keyMap[e]??null}addKeyBinding(e,t){if(t===null)return;let n=this.getKeyBinding(e)??[],i=r=>Array.isArray(r)?r:[r];Array.isArray(n)?this.setKeyBinding(e,[...n,...i(t)]):this.setKeyBinding(e,[n,...i(t)])}getKeyBindings(){return this.keyMap}onKeyBindingChange(e,t){return this.events.on("event:keyMap.change",(n,i)=>{n===e&&t(i)})}importKeyBindings(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setKeyBinding(t,e[t])}exportKeyBindings(){return this.keyMap}match(e,t){let n=this.getKeyBinding(e);return n===null?!1:Array.isArray(n)?n.includes(t)||n.some(i=>i.toLowerCase()===t.toLowerCase()):n===t||n.toLowerCase()===t.toLowerCase()}};var vc=(e=>(e.game="game",e))(vc||{}),Ye=class Ye{constructor(e){this.hooks=new Ui;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new pi(Ye.DefaultPreference);this.audioBuses=new ti(()=>this.config.audioBuses??[],ha(this.preference));this.keyMap=new ki({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new Q;this.puppetBackends=new qo;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=j(Ye.DefaultConfig,e),this.plugins=new _o(this),this.router=new dn(this)}configure(e){let[t,n]=ia(e,this.freezeFields);return n.length>0&&console.warn(`NarraLeaf-React [Game] The following fields are not allowed to be configured: ${n.join(", ")}`),this.config=j(this.config,t),Object.prototype.hasOwnProperty.call(t,"audioBuses")&&this.audioBuses.invalidate(),this.getLiveGame().getGameState()?.events.emit(L.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}registerPuppetBackend(e){return this.puppetBackends.register(e),this}getPuppetBackend(e){return this.puppetBackends.get(e)}listPuppetBackends(){return this.puppetBackends.list()}getPuppetBackendRegistry(){return this.puppetBackends}onPreloadComplete(e){return this.lifecycleEvents.on(Ye.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(Ye.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(Ye.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(Ye.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(Ye.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(Ye.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.audioBuses.dispose(),this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new Vt(this)}};Ye.defaultSettings={volume:1},Ye.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},Ye.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"},Ye.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,allowSkipSceneTransition:!0,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:wi.notification,menu:wi.menu,dialog:wi.say,nvlDialog:wi.nvlDialog,onError:e=>{console.error(e)},disableTextScaling:!1,stage:null,maxStackModelLoop:1e3,maxActionHistory:100,audioBuses:[]},Ye.GameSettingsNamespace=vc,Ye.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var re=Ye;var Zo=class Zo extends Y{constructor(){super(...arguments);this._jumpTarget=null}setJumpTarget(t){return this._jumpTarget=t,this}getJumpTarget(){return this._jumpTarget}static executeActionsAsync(t,n){let i=t.game.getLiveGame().requestAsyncStackModel([{type:n.type,node:n.contentNode}]);return t.game.getLiveGame().executeAsyncStackModel(i)}checkActionChain(t){if(t.some(n=>!!n.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return t}executeAction(t,n){let i=this.contentNode,[r]=i.getContent();if(this.type===ne.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===ne.doAsync){if(r.length===0)return super.executeAction(t,n);let s=Zo.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===ne.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===ne.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===ne.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===ne.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let l=qe.createCountLoop(t.game.getLiveGame(),a,this.checkActionChain(s));return t.logger.debug("ControlAction","repeat",s,a),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[l]}}}else if(this.type===ne.while){let[s,a]=this.contentNode.getContent();if(s.length===0)return super.executeAction(t,n);if(!a.evaluate({gameState:t}).value)return super.executeAction(t,n);let l=qe.createConditionLoop(t.game.getLiveGame(),a,this.getId(),this.checkActionChain(s));return t.logger.debug("ControlAction","while",s),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[l]}}}else if(this.type===ne.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===ne.sleep){let[,s]=this.contentNode.getContent();if(t.isFastForwarding())return{type:this.type,node:this.contentNode.getChild()};let a;typeof s=="number"?a=S.delay(s):S.isAwaitable(s)?a=s:a=S.fromPromise(s);let l=new S,c=new Ce(a);return t.timelines.attachTimeline(c),a.then(()=>{l.resolve({type:this.type,node:this.contentNode.getChild()})}),l.onSkipControllerRegister(u=>{u.onAbort(()=>{c.abort()})}),l}else if(this.type===ne.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,l=new Ce(a);t.timelines.attachTimeline(l);let c=t.game.preference,u=c.getPreference(re.Preferences.autoForward),d=c.getPreference(re.Preferences.gameSpeed),p=u?t.game.config.autoForwardDelay/d:null,h=!1,f=null,m=null,v=null,A=()=>{m?.cancel(),v?.cancel(),f&&(clearTimeout(f),f=null)},g=()=>{h||(h=!0,A(),a.resolve())};return m=t.events.on(L.EventTypes["event:state.player.stageClick"],g),v=t.events.on(L.EventTypes["event:state.player.skip"],g),p!==null&&(f=setTimeout(g,p)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(y=>{y.onAbort(()=>{h||(h=!0,A(),l.abort())})}),s}else{if(this.type===ne.label)return super.executeAction(t,n);if(this.type===ne.jump){let s=this._jumpTarget;if(!s){let[c]=this.contentNode.getContent();throw new Fe(`Jump target label "${c}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),l=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},c=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(c,u)},[l]),a.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===ne.break||this.type===ne.waitForClick||this.type===ne.label||this.type===ne.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===ne.break)return super.stringifyWithContent("Control","break");if(this.type===ne.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===ne.label||this.type===ne.jump){let[a]=this.contentNode.getContent(),l=this.type===ne.label?"label":"jump";return super.stringifyWithContent("Control",`${l}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};Zo.ActionTypes=ne;var oe=Zo;var Be=class o extends le{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(oe.ActionTypes.do,t)}doAsync(t){return this.push(oe.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(oe.ActionTypes.any,t)}all(t){return this.pushUnchained(oe.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(oe.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(oe.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=X.from(t);return this.pushWithLambda(oe.ActionTypes.while,n,i)}breakLoop(){let t=new oe(this.chain(),oe.ActionTypes.break,new k().setContent([]));return this.chain(t)}sleep(t){return this.push(oe.ActionTypes.sleep,[],t)}waitForClick(){let t=new oe(this.chain(),oe.ActionTypes.waitForClick,new k().setContent([]));return this.chain(t)}label(t){let n=new oe(this.chain(),oe.ActionTypes.label,new k().setContent([t]));return this.chain(n)}jump(t){let n=new oe(this.chain(),oe.ActionTypes.jump,new k().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new oe(this.chain(),t,new k().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new oe(this.chain(),t,new k().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new oe(this.chain(),t,new k().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Jt.say(n).getActions():Ue.toActions([n]))}};var $=class $ extends ze{static get DefaultUserConfig(){return $._defaultUserConfig??($._defaultUserConfig=new K({name:"(anonymous)",autoInit:!0,src:$.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...Z.DefaultTransformState.getDefaultConfig()},{position:e=>G.tryParsePosition(e)}))}static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return P.isStaticImageData(t)?P.srcToURL(t):P.isColor(t)?t:P.isImageSrc(t)?P.srcToURL(t):$.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isLayeredSrc(e){return!!e.config.src?.slots}static isSrcDefinitionObject(e){return typeof e=="object"&&e!==null&&!P.isImageSrc(e)&&!P.isColor(e)}static isLayeredDefinition(e){return this.isSrcDefinitionObject(e)&&"layers"in e}static isTagDefinition(e){return this.isSrcDefinitionObject(e)&&"resolve"in e}static isLayerVariants(e){return typeof e=="object"&&e!==null}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(P.isImageSrc(t)||P.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:$.isLayeredSrc(e)?null:$.isTagSrc(e)&&e.config.src.resolve?$.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):$.isStaticSrc(e)?P.isStaticImageData(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):P.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static getSrcURLs(e,t){let n=e.config.src?.slots;if(!n)return[];let i=new Set(t??e.state.currentSrc);return n.map(r=>$.resolveLayerSlot(r,i))}static resolveLayerSlot(e,t){if(e===null||typeof e=="string")return e;if(typeof e=="function")return e(t);for(let[n,i]of Object.entries(e))if(t.has(n))return i;return null}static getAllLayerSrc(e){let t=e.config.src?.slots;if(!t)return[];let n=[];for(let i of t)if(typeof i=="string")n.push(i);else if($.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new $({src:e})}constructor(e={}){super();let t=$.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new Be,n=>{if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Error("Color src is not allowed for non-background image");return n.chain(this._setSrc(n,e,t))}else{let i=new ye(n,ye.ActionTypes.setAppearance,new k().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Be,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 te("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:$.StateSerializer.serialize(this.state),transformState:Z.TransformStateSerializer.serialize(this.transformState.get()),loop:this._serializeLoop()}}fromData(e){return this.state=$.StateSerializer.deserialize(e.state),this.transformState.resetTo(Z.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_applyTransition(e,t){return new Se(this.chain(),pe.applyTransition,new k().setContent([e,t]))}_init(e,t){return new Se(this.chain(),pe.init,new k().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new ye(this.chain(),ye.ActionTypes.initWearable,new k().setContent([e]))}_flush(){return new ye(this.chain(),ye.ActionTypes.flush,new k)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get()),this}resolveTags(e,t){if(!$.isTagSrc(this))throw new Error(`Tag not defined
65
- Tag must be defined in the image config`);let n=this.constructTagMap(this.config.src.groups),i=new Map,r=[];this.config.src.groups.forEach(a=>{i.set(a,null)});let s=a=>{a.forEach(l=>{let c=n.get(l);c&&i.set(c,l)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let l=i.get(a);if(!l)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(l)}),r}_setAppearanceSync(e){if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new te("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!$.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new te(`Trying to mix src and tags
68
+ 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:f,applyTransform:m,applyLoop:v,stopLoop:A,updateStyleSync:g,flush:y,deps:b}=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(U=>U&&typeof U=="function"?{style:sd}:{style:od(o.state.darkness)});let k=T?T.transition._getCurrentSrc():rd(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:P.isColor(k)?P.colorToString(k):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:P.isImageSrc(k)?P.srcToURL(k):N.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});xt(o,{createWearable:T=>{i(k=>[...k,T])},disposeWearable:T=>{i(k=>k.filter(O=>O.getId()!==T.getId()))},initDisplayable:h,applyTransform:m,applyLoop:v,stopLoop:A,applyTransition:f,events:t,updateStyleSync:g,flush:y},[...b]);let C=$c((T,k)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${T}px`,height:`${k}px`}))},[t]),w=$c(()=>{t.emit("event:image.onLoad")},[t]);return Mt.createElement(nd.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},Mt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},c?d.map(([T,k],O)=>{let U=p?p.task.resolve[O]:null;if(U&&typeof U=="function")return Mt.createElement($o,{key:k,ref:T,autoFit:o.config.autoFit});let ue=U?U.key==="target"?p.transition._getTargetLayers():p.transition._getPrevLayers():c;return Mt.createElement(Yc,{key:k,ref:T,src:ue||c,autoFit:o.config.autoFit,resolveSrc:l,onSizeChanged:O===0?C:void 0,onLoad:O===0?w:void 0})}):d.map(([T,k],O)=>Mt.createElement($o,{key:k,ref:T,autoFit:o.config.autoFit,onSizeChanged:O===0?C:void 0,onLoad:O===0?w:void 0})),Mt.createElement("div",{className:qc("w-full h-full top-0 left-0 absolute")},n.map(T=>Mt.createElement("div",{className:qc("w-full h-full relative"),key:"wearable-"+T.getId()},Mt.createElement(Xc,{image:T,state:e}))))))}var Xc=Mt.memo(ad),Qc=Xc;import Yo,{useEffect as Jc,useMemo as dd,useRef as gs}from"react";var cd=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,ld=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function _c(o,e){if(typeof e!="string"||!e.length)return o;if(cd.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=ud(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+pd(r+e.replace(/\\/g,"/"))}function ud(o){let e=ld.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function pd(o){let e=o.split("/"),t=[];for(let n=0;n<e.length;n++){let i=e[n];if(!(i==="."||i===""&&n!==e.length-1)){if(i===".."){t.pop();continue}t.push(i)}}return t.join("/")}var qo=class{constructor(){this.backends=new Map;this.reportedMissing=new Set}register(e){if(!e||typeof e.name!="string"||!e.name.length)throw new Error("A puppet backend must have a non-empty name.");if(typeof e.mount!="function")throw new Error(`Puppet backend "${e.name}" must implement mount().`);return this.backends.set(e.name,e),this.reportedMissing.delete(e.name),this}get(e){return this.backends.get(e)||null}has(e){return this.backends.has(e)}list(){return Array.from(this.backends.keys())}unregister(e){return this.backends.delete(e)}reportMissing(e,t){return this.reportedMissing.has(e)?!1:(this.reportedMissing.add(e),t(`No puppet backend is registered under "${e}". The element keeps its place on the stage, its transform and its saved state, but draws nothing. Register one with game.registerPuppetBackend({name, mount}) before the game mounts.`),!0)}};function ys({state:o,puppet:e}){let[t]=se(),{cacheManager:n}=Kt(),i=gs(null),r=dd(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=gs(r);s.current=r;let{transformRef:a,transitionRefs:c,initDisplayable:l,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,deps:m}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipImageTransform,skipTransition:o.game.config.allowSkipImageTransition,transitionsProps:[{style:{position:"relative",width:`${r.width}px`,height:`${r.height}px`}}]});xt(e,{initDisplayable:l,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,flush:t},[...m]),Jc(()=>{let g=i.current;if(!g)return;let y=o.game,b=e.config.backend,C=y.getPuppetBackend(b);if(!C)return e._setStatus("missing-backend"),y.getPuppetBackendRegistry().reportMissing(b,k=>{o.logger.warn("Puppet",k)}),()=>{e._setStatus("unmounted")};let w;try{w=C.mount(g,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:A,resolveSibling:k=>A(_c(e.config.src,k)),warn:(k,O)=>{o.logger.warn("Puppet",k,O)}})}catch(k){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" threw while mounting "${e.config.src}"`,k),()=>{e._setStatus("unmounted")}}let T=!1;return e._attachInstance(w),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!T&&typeof w.ready=="function"?w.ready():void 0).then(()=>{T||e._setStatus("ready")}).catch(k=>{T||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" failed to load "${e.config.src}"`,k))}),()=>{T=!0,e._attachInstance(null),e._setStatus("unmounted");try{w.dispose()}catch(k){o.logger.error("Puppet",`Backend "${b}" threw while disposing`,k)}}},[]);let v=gs(r);Jc(()=>{let g=v.current;if(g.width===r.width&&g.height===r.height)return;v.current=r;let y=e._getInstance();if(!(!y||typeof y.resize!="function"))try{y.resize(r)}catch(b){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,b)}},[r]);function A(g){return P.isDataURI(g)?g:n.get(g)||g}return Yo.createElement(zt.Div,{"data-element-type":"puppet"},Yo.createElement(zt.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},c.map(([g,y])=>Yo.createElement("div",{key:y,ref:g,className:e.config.className},Yo.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function vs({state:o,displayable:e}){return Ai.createElement(Ai.Fragment,null,e.map(t=>{if(t instanceof An)return Ai.createElement(fs,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof N)return Ai.createElement(Qc,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Dt)return Ai.createElement(ys,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import Xo,{useEffect as md}from"react";import{motion as fd}from"motion/react";function Zc({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:c,stopLoop:l,updateStyleSync:u,deps:d}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return xt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:c,stopLoop:l,updateStyleSync:u},[...d]),md(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),Xo.createElement(Xo.Fragment,null,Xo.createElement(fd.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([p,h])=>Xo.createElement("div",{className:"relative w-full h-full",ref:p,key:h},t))))}async function el(o,e,t,n){let i=e.state.backgroundMusic,r=i&&o.audioManager.isManaged(i)?o.audioManager.stop(i,n):null;if(r&&t===i&&await r,t)try{await o.audioManager.playSoundToken(t,{end:t.state.volume,duration:n}),e.state.backgroundMusic=t}catch{e.state.backgroundMusic=null}else e.state.backgroundMusic=null;r&&await r}import hd from"clsx";import{useEffect as Ss,useRef as gd}from"react";import Ts from"react";function bs({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=gd(null);return Ss(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),Ss(()=>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,[]),Ss(()=>(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())}),[]),xt(n,{setBackgroundMusic(s,a){return el(o,n,s,a)}}),Ts.createElement("div",{className:hd(e,"w-full h-full absolute"),ref:r,"data-element-type":"scene","data-scene-id":n.getId()},[...i.entries()].sort(([s],[a])=>s.state.zIndex-a.state.zIndex).map(([s,a])=>Ts.createElement(Zc,{state:o,layer:s,key:s.getId()},Ts.createElement(vs,{state:o,displayable:a}))))}import{AnimatePresence as Td}from"motion/react";import{useEffect as bd,useReducer as Ad,useRef as Ci}from"react";import yd from"clsx";import qt,{useCallback as As,useMemo as vd,useRef as Sd}from"react";function Cs({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=R(),a=Sd([]),c=As(f=>(a.current.push(f),a.current.indexOf(f)),[]),l=As(f=>{let m=a.current.indexOf(f);m!==-1&&a.current.splice(m,1)},[]),u=As(f=>a.current.indexOf(f),[]),d=s.config.menu,p=vd(()=>e.map(f=>({...f,words:f.prompt.evaluate(Ce.getCtx({gameState:n}))})),[]);function h(f){t(f)}return qt.createElement(qt.Fragment,null,qt.createElement(Kr,{value:{evaluated:p,choose:h,gameState:n}},qt.createElement(jr,{value:{register:c,unregister:l,getIndex:u}},qt.createElement(Bt,{className:"absolute"},r&&o&&qt.createElement(fi,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),qt.createElement(zt.Div,{color:"green",border:"dashed",className:yd("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},qt.createElement(d,{items:p.map((f,m)=>m)})))))}function tl({items:o}){return qt.createElement(bo,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>qt.createElement(Io,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Cd from"clsx";import xi from"react";var xd=120;function xs({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=Ci(!1),a=Ci({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),c=Ci([]),l=Ci(null),u=Ci(null),[,d]=Ad(m=>m+1,0),p=()=>{u.current&&(clearTimeout(u.current),u.current=null)},h=()=>{let m=l.current;if(!m)return;let v=a.current;m.forEach(({slot:A,presenceKey:g})=>{v.slotKeys.get(A)===g&&v.slotKeys.delete(A),v.exitingKeys.add(g)}),l.current=null,u.current=null,c.current=[],d()};bd(()=>()=>{p()},[]);let f=(()=>{let m=a.current,v=i.length>0?i.map(({action:y,onClick:b},C)=>({action:y,slot:C,useTypeEffect:!s.current,onFinished:w=>{w!==void 0&&(s.current=w),b(),o.events.emit(L.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((y,b)=>{if(!y.action.prompt||!y.action.words)return[];let C=m.menuPromptIds.get(y);return C||(C=`menu-prompt-${n.getId()}-${m.nextKey++}`,m.menuPromptIds.set(y,C)),[{action:{sentence:y.action.prompt,words:y.action.words,character:null,id:C},slot:b,useTypeEffect:!1}]});if(v.length===0)return!l.current&&c.current.length>0&&(l.current=c.current.map(y=>({...y,active:!1}))),l.current&&!u.current&&(u.current=setTimeout(h,xd)),l.current??[];p(),l.current=null;let A=new Set(v.map(({slot:y})=>y));for(let[y,b]of Array.from(m.slotKeys))A.has(y)||(m.exitingKeys.add(b),m.slotKeys.delete(y));let g=v.map(({slot:y,...b})=>{let C=m.slotKeys.get(y);return(!C||m.exitingKeys.has(C))&&(C=`say-${n.getId()}-${m.nextKey++}`,m.slotKeys.set(y,C)),{...b,presenceKey:C,slot:y,active:!0}});return c.current=g,g})();return xi.createElement("div",{className:Cd(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs"},xi.createElement(Td,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{a.current.exitingKeys.clear()}},f.map(({action:m,onFinished:v,presenceKey:A,active:g,useTypeEffect:y})=>xi.createElement(fi,{gameState:o,key:A,action:m,active:g,onFinished:v,useTypeEffect:y}))),r.map(({action:m,onClick:v},A)=>xi.createElement("div",{key:"menu-"+A,"data-element-type":"menu"},xi.createElement(Cs,{state:o,prompt:m.prompt,choices:m.choices,renderPrompt:!m.prompt,afterChoose:g=>{s.current=!1,v(g),o.stage.next()},words:m.words}))))}import hn,{useEffect as wd,useRef as ws}from"react";import{motion as kd}from"motion/react";function nl({state:o,camera:e,children:t}){let n=ws(null),i=ws(null),r=ws(null),{transformRef:s,transitionRefs:a,initDisplayable:c,applyTransition:l,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h,deps:f}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:Da},{ref:i,project:Pa},{ref:r,project:Ea}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return xt(e,{initDisplayable:c,applyTransition:l,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h},[...f]),wd(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),hn.createElement(hn.Fragment,null,hn.createElement(kd.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,v])=>hn.createElement("div",{className:"relative w-full h-full",ref:m,key:v},t))),hn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},hn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),hn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),hn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import Pd from"react";import{useEffect as ks,useRef as Ed}from"react";import{useCallback as il}from"react";function ol(o){let e=il(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=il(()=>{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 Ps({gameState:o,video:e}){let t=Ed(null),{show:n,hide:i}=ol(t);ks(()=>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,[]),ks(()=>{i(),e.state.display&&n()},[]),ks(()=>{if(!t.current)return;let s=t.current,a=!1,c=new Set,l=()=>new E(`Failed to add event listener, ref is not available
69
+ 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 f=t.current;return h||f.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(f.currentTime=0,new Promise(m=>{let v=!1,A=null,g=[],y=()=>{v||(v=!0,c.delete(y),A&&A(),g.forEach(b=>b()),m())};c.add(y),A=o.schedule(({retry:b})=>{if(v)return;if(f.readyState<3){let k=()=>{f.removeEventListener("loadeddata",k),b()};f.addEventListener("loadeddata",k),g.push(()=>f.removeEventListener("loadeddata",k));return}let C=()=>y(),w=()=>y(),T=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),y()};f.addEventListener("ended",C),f.addEventListener("stopped",w),f.addEventListener("error",T),g.push(()=>{f.removeEventListener("ended",C),f.removeEventListener("stopped",w),f.removeEventListener("error",T)}),f.play().catch(k=>{o.logger.error("Failed to play video: "+k),y()})},10)}))},pause:()=>{if(!t.current)throw l();t.current.pause()},resume:()=>{if(!t.current)throw l();return t.current.play().catch(f=>{o.logger.error("Failed to resume video: "+f)})},stop:()=>{if(!t.current)throw l();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:f=>{if(!t.current)throw l();t.current.currentTime=f}}))},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 Pd.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 Dd,{useEffect as Ld,useRef as Rd}from"react";var rl={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 Id(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&rl[e]?rl[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Es({gameState:o,vfx:e}){let t=Rd(null);return Ld(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,c=new Set,l=new Set,u=[],d=b=>{n.style.transition="",n.style.opacity=String(b)},p=()=>{n.play().catch(b=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+b)})},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(b=>{let C=!1,w=()=>k(),T=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),k()},k=()=>{C||(C=!0,l.delete(k),n.removeEventListener("loadeddata",w),n.removeEventListener("error",T),b())};l.add(k),n.addEventListener("loadeddata",w),n.addEventListener("error",T),(n.readyState>=2||n.error)&&k()}),f=(b,C,w)=>{let T=C?.duration??0,k=++s;return w.instant||T<=0?(d(b),Promise.resolve()):new Promise(O=>{let U=!1,ue=null,Ne=()=>{U||(U=!0,l.delete(Ne),ue!==null&&clearTimeout(ue),s===k&&t.current&&d(b),O())};l.add(Ne),n.style.transition=`opacity ${T}ms ${Id(o,C?.easing)}`,n.offsetWidth,n.style.opacity=String(b),ue=setTimeout(Ne,T)})},m=b=>{r||(r=!0,i=b,o.mountState(e,{show:async C=>{a=!0;let w={instant:!1};c.add(w);try{if(await h(),!t.current)return;n.playbackRate=C?.rate??e.config.playbackRate,e.state.paused||p(),await f(C?.opacity??e.config.opacity,C,w)}finally{c.delete(w)}},hide:async C=>{a=!0;let w={instant:!1};c.add(w);try{await f(0,C,w),t.current&&n.pause()}finally{c.delete(w)}},pause:()=>{n.pause()},resume:()=>{p()},setRate:C=>{n.playbackRate=C}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&d(e.config.opacity)},0)))},v=()=>m(!1),A=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),m(!0)},g=o.events.on(L.EventTypes["event:state.player.skip"],()=>{c.size===0&&l.size===0||(c.forEach(b=>{b.instant=!0}),[...l].forEach(b=>b()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),y=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&p()};return document.addEventListener("visibilitychange",y),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",A),n.readyState>=3?m(!1):n.error&&A(),()=>{n.removeEventListener("canplay",v),n.removeEventListener("error",A),document.removeEventListener("visibilitychange",y),g.cancel(),u.forEach(b=>b()),[...l].forEach(b=>b()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),Dd.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,loop:e.config.loop,playsInline:!0,onContextMenu:n=>n.preventDefault(),style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:e.config.fit,pointerEvents:"none"}})}import Md from"clsx";import Nd,{useCallback as Gd,useEffect as Qo,useRef as Fd}from"react";function Ds({children:o,className:e,gameState:t}){let{ratio:n}=fe(),i=R(),[r]=se(),s=Fd(null),a=i.config.minWidth,c=i.config.minHeight,l=Gd(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 Qo(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),Qo(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),Qo(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),Qo(()=>t.events.on(L.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),Nd.createElement(Lc,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:Md(e),onUpdate:l},o)}import sl,{useEffect as Od,useRef as Hd,useState as al}from"react";function Ls({src:o,width:e,height:t}){let[n,i]=al({x:0,y:0}),[r,s]=al(!1),a=Hd(null),{ratio:c}=fe();return Od(()=>{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]),sl.createElement(Bt,{ref:a,className:"overflow-hidden absolute"},sl.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 cl from"react";import tn from"react";function Rs({error:o,errorInfo:e}){return R().config.app.debug?tn.createElement("div",{className:"text-left"},tn.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),tn.createElement("p",{className:"text-red-700"},"Message: ",o.message),tn.createElement("pre",null,"Error Stack: ",o?.stack),tn.createElement("pre",null,"Component Stack: ",e?.componentStack),tn.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):tn.createElement("div",{className:"bg-white w-full h-full"},tn.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),tn.createElement("p",null,"Please contact the game developer for further assistance."))}var _o=class extends cl.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?cl.createElement(Rs,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import pl from"clsx";import W,{useEffect as Nt,useReducer as dl,useState as Kn}from"react";import{flushSync as ml}from"react-dom";import{useRef as Vd}from"react";import{useEffect as Ud}from"react";function ll({gameState:o}){let e=Vd(null);return Ud(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(L.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import wi,{useEffect as Wd}from"react";function Is({gameState:o}){let[e]=se(),{ratio:t}=fe(),n=o.notificationMgr;Wd(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return wi.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"},wi.createElement(i,{notifications:n.toArray()}))}function ul({notifications:o}){return wi.createElement(No,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>wi.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},wi.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function fl({story:o=si.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]=dl(D=>D+1,0),[f,m]=dl(D=>D+1,0),[v,A]=Kn(0),g=R(),[y]=Kn(()=>new L(g,{update:h,forceUpdate:()=>{y.logger.weakWarn("Player","force update"),ml(()=>{h()})},forceRemount:()=>{y.logger.weakWarn("Player","force remount"),ml(()=>{A(D=>D+1),h()})},next:Ue})),b=W.createRef(),C=W.createRef(),[w,T]=Kn(!1),k=W.useRef(!1),O=W.useRef(null),U=W.useRef(null),{preloaded:ue}=Kt(),[Ne,Qe]=Kn(!1),bt=W.useRef(!1),[At,gn]=Kn(!1),mt=W.useRef(!1),B=W.useRef(null),Pe=W.useRef(!1),[ft]=Kn(new Map);function rt(D){return{game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable(),scene:D}}function Ue(){let D=()=>{ft.forEach(M=>M.cancel())};if(y.rollLock.isLocked())return;D();let K=!1,ae=0;for(;!K;){if(ae++>g.config.maxStackModelLoop)throw new E("Max stack model loop reached");let M=g.getLiveGame().next();if(!M){if(g.getLiveGame().stackModel&&!g.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(M)){if(O.current===M)break;O.current=M,M.onSettled(()=>{M.isFailed()||(O.current===M&&(O.current=null),Ue())}),M.onFailed(he=>{O.current===M&&(O.current=null),y.logger.error("Player",he)}),K=!0;break}if(M instanceof En){if(U.current===M)break;U.current=M,M.nextUnlock().then(()=>{U.current===M&&(U.current=null),Ue()}),K=!0;break}if(Ye.isCalledActionResult(M)&&M.wait&&Ye.isStackModelsAwaiting(M.wait.type,M.wait.stackModels)){if(O.current===M)break;if(O.current=M,M.wait){let he=Ye.executeStackModelGroup(M.wait.type,M.wait.stackModels);he.then(()=>{O.current===M&&(O.current=null),Ue()}),he.onFailed(Ee=>{O.current===M&&(O.current=null),y.logger.error("Player",Ee)})}K=!0;break}y.handle(M)}y.stage.update()}Nt(()=>{y.audioManager.initialize()},[]),Nt(()=>(g.getLiveGame().setGameState(y),o&&!g.getLiveGame().isPlaying()&&g.getLiveGame().loadStory(o),o?.entryScene&&!y.getPreloadingScene()&&!y.getLastScene()&&y.preloadScene(o.entryScene),y.playerCurrent=b.current,y.mainContentNode=C.current,()=>{g.getLiveGame().setGameState(void 0),y.playerCurrent=null}),[g,o]),Nt(()=>ct(()=>{T(!0);let D=y.getLastScene(),K=[];D?K.push(D.events.once("event:scene.mount",()=>{y.stage.next()}).cancel):y.stage.next();let ae=y.events.on(L.EventTypes["event:state.end"],()=>{c&&c({game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable()})});return y.stage.update(),()=>{D&&K.forEach(M=>M()),ae.cancel()}}),[]),Nt(()=>ct(()=>{w&&i&&!k.current&&(k.current=!0,y.stage.forceUpdate(),g.hooks.trigger("init",[]),i({game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable()}))}),[w]),Nt(()=>ct(()=>{if(Ne&&s&&!bt.current){bt.current=!0;let D=B.current||y.getLastScene()||y.getPreloadingScene(),K=rt(D);s(K)}}),[Ne]),Nt(()=>ct(()=>{if(At&&!mt.current){mt.current=!0;let D=B.current||y.getLastScene()||y.getPreloadingScene(),K=rt(D);g.markPreloadComplete(K)&&r&&r(K)}}),[At]),Nt(()=>y.events.on(L.EventTypes["event:state.scene.mount"],D=>{B.current||(B.current=D,m())}).cancel,[]),Nt(()=>{if(!At||!d||Pe.current||g.isFirstSceneReady())return;let D=B.current||y.getLastScene();if(!D)return;let K=null,ae=null,M=!1;Pe.current=!0;let he=()=>{M=!0,Pe.current=!1;let Ee=rt(D);g.markFirstSceneReady(Ee)&&a&&a(Ee)};return typeof requestAnimationFrame=="function"?K=requestAnimationFrame(()=>{ae=setTimeout(he,0)}):ae=setTimeout(he,0),()=>{M||(Pe.current=!1,K!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(K),ae!==null&&clearTimeout(ae))}},[d,f,p,At]),Nt(()=>ue.events.depends([ue.events.on($e.EventTypes["event:preloaded.ready"],()=>{Qe(!0),y.stage.update(),o&&g.getLiveGame().isPlaying()&&Ue()}),ue.events.on($e.EventTypes["event:preloaded.complete"],()=>{gn(!0)})]).cancel,[]),Nt(()=>{y.flushDep=p},[p]);let I=e||g.config.width,F=t||g.config.height;return W.createElement(_o,{onError:l},W.createElement("div",{style:{width:typeof I=="number"?`${I}px`:I,height:typeof F=="number"?`${F}px`:F},className:pl(n,"__narraleaf_content-player"),ref:b,tabIndex:0},W.createElement(Ds,{className:pl("flex-grow overflow-auto"),gameState:y},W.createElement(ls,{gameState:y}),W.createElement(ll,{gameState:y}),W.createElement(Bt,{className:"absolute",ref:C,style:{cursor:y.game.config.cursor?"none":"auto",overflow:y.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},g.config.cursor&&W.createElement(Ls,{src:g.config.cursor,width:g.config.cursorWidth,height:g.config.cursorHeight}),W.createElement(Bd,{show:Ne&&d,key:v},W.createElement(is,null,W.createElement(Fc,{state:y}),W.createElement(Uc,{state:y}),W.createElement(zd,{state:y},W.createElement("div",{className:"w-full h-full absolute",style:{isolation:"isolate"},"data-element-type":"scene-group"},y.getSceneElements().map(D=>W.createElement(bs,{key:"scene-"+D.scene.getId(),state:y,elements:D}))),W.createElement(Kd,{state:y}),y.getVideos().map((D,K)=>W.createElement("div",{className:"w-full h-full absolute",key:"video-"+K,"data-element-type":"video"},W.createElement(Ps,{gameState:y,video:D}))),y.getVfx().map(D=>W.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+D.getId(),"data-element-type":"vfx",style:{zIndex:D.config.zIndex,mixBlendMode:D.config.blendMode}},W.createElement(Es,{gameState:y,vfx:D})))),y.getSceneElements().map(D=>W.createElement(xs,{key:"scene-dialogs-"+D.scene.getId(),state:y,elements:D})),W.createElement($d,{NvlComponent:g.config.nvlDialog}))),W.createElement(zc,{state:y}),W.createElement(xc,null,u),W.createElement(Is,{gameState:y})))))}function Bd({children:o,show:e}){return W.createElement(W.Fragment,null,e?o:null)}function zd({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?W.createElement(nl,{state:o,camera:t},e):W.createElement(W.Fragment,null,e)}function Kd({state:o}){let e=W.useRef(null);return Nt(()=>(o.stageTransition.registerOverlayHost(e.current),()=>{o.stageTransition.registerOverlayHost(null)}),[]),W.createElement("div",{className:"w-full h-full absolute pointer-events-none",ref:e,"data-element-type":"stage-transition-overlay-host"})}function $d({NvlComponent:o}){let{dialogs:e,state:t}=$t(),i=R().getLiveGame().getGameState(),r=W.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(Ce.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 W.createElement(o,{dialogs:r})}import"client-only";import $n from"react";function hl({children:o,game:e}){return $n.createElement($n.Fragment,null,$n.createElement(za,null,$n.createElement(Ha,{game:e},$n.createElement(Tc,null,$n.createElement(Ba,null,o)))))}var jd=(c=>(c.image="narraleaf:image",c.text="narraleaf:text",c.layer="narraleaf:layer",c.scene="narraleaf:scene",c.video="narraleaf:video",c.vfx="narraleaf:vfx",c.camera="narraleaf:camera",c.puppet="narraleaf:puppet",c))(jd||{});import qd from"clsx";import wt,{useEffect as gl,useRef as Yd,useState as Xd}from"react";import{motion as Qd,useIsPresent as _d}from"motion/react";var Jd={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function Zd({children:o,initial:e,transition:t,...n}){let i=R(),r=Rt(),{ratio:s}=fe(),[a]=mn(re.Preferences.showDialog),c=Yd(null),[l]=xn("nextAction"),u=_d(),[d,p]=Xd(null);function h(){r.config.gameState.isAdvanceSuspended()||r.requestComplete()}return gl(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
70
+ at Say.tsx: onElementClick`);return}let f=v=>{v.repeat||r.config.gameState.isAdvanceSuspended()||i.keyMap.match("nextAction",v.key)&&r.requestComplete()};window.addEventListener("keydown",f);let m=r.events.on(Me.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keydown",f),m.cancel()}},[r,l]),gl(()=>{let f=i.preference.onPreferenceChange(re.Preferences.autoForward,m=>{m&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{f.cancel()}},[r]),wt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},wt.createElement("div",{className:qd("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:h,style:{...$i(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},wt.createElement(as,{value:d},wt.createElement(Qd.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&u?{duration:0}:t},o)),wt.createElement("div",{"data-element-type":"dialog-overlay",className:"absolute inset-0 pointer-events-none",ref:p})))}function yl({children:o,...e}){let t=Rt();return!t.config.action.sentence||!t.config.action.words?null:wt.createElement(Zd,{...e},o)}var $p=yl;function vl(){return wt.createElement(yl,null,wt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},wt.createElement(Xr,null),wt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},wt.createElement(en,null),wt.createElement(fn,{...Jd}))))}var ki={say:vl,menu:tl,notification:ul,nvlDialog:ss};var Jo=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 Pi=class{constructor(e={}){this.keyMap=e;this.events=new _}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 Sl=(e=>(e.game="game",e))(Sl||{}),Xe=class Xe{constructor(e){this.hooks=new Wi;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new di(Xe.DefaultPreference);this.audioBuses=new ti(()=>this.config.audioBuses??[],ga(this.preference));this.keyMap=new Pi({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new _;this.puppetBackends=new qo;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=q(Xe.DefaultConfig,e),this.plugins=new Jo(this),this.router=new dn(this)}configure(e){let[t,n]=oa(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=q(this.config,t),Object.prototype.hasOwnProperty.call(t,"audioBuses")&&this.audioBuses.invalidate(),this.getLiveGame().getGameState()?.events.emit(L.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}registerPuppetBackend(e){return this.puppetBackends.register(e),this}getPuppetBackend(e){return this.puppetBackends.get(e)}listPuppetBackends(){return this.puppetBackends.list()}getPuppetBackendRegistry(){return this.puppetBackends}onPreloadComplete(e){return this.lifecycleEvents.on(Xe.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(Xe.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(Xe.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(Xe.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(Xe.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(Xe.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.audioBuses.dispose(),this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new Ut(this)}};Xe.defaultSettings={volume:1},Xe.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},Xe.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"},Xe.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,allowSkipSceneTransition:!0,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:ki.notification,menu:ki.menu,dialog:ki.say,nvlDialog:ki.nvlDialog,onError:e=>{console.error(e)},disableTextScaling:!1,stage:null,maxStackModelLoop:1e3,maxActionHistory:100,maxSceneCallDepth:8,audioBuses:[]},Xe.GameSettingsNamespace=Sl,Xe.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var re=Xe;var Zo=class Zo extends X{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===ie.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===ie.doAsync){if(r.length===0)return super.executeAction(t,n);let s=Zo.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===ie.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===ie.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===ie.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===ie.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let c=Ye.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===ie.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=Ye.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===ie.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===ie.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 xe(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===ie.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,c=new xe(a);t.timelines.attachTimeline(c);let l=t.game.preference,u=l.getPreference(re.Preferences.autoForward),d=l.getPreference(re.Preferences.gameSpeed),p=u?t.game.config.autoForwardDelay/d:null,h=!1,f=null,m=null,v=null,A=()=>{m?.cancel(),v?.cancel(),f&&(clearTimeout(f),f=null)},g=()=>{h||(h=!0,A(),a.resolve())};return m=t.events.on(L.EventTypes["event:state.player.stageClick"],g),v=t.events.on(L.EventTypes["event:state.player.skip"],g),p!==null&&(f=setTimeout(g,p)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(y=>{y.onAbort(()=>{h||(h=!0,A(),c.abort())})}),s}else{if(this.type===ie.label)return super.executeAction(t,n);if(this.type===ie.jump){let s=this._jumpTarget;if(!s){let[l]=this.contentNode.getContent();throw new be(`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.getStackModelForce().clearAboveCallFrame().push({type:this.type,node:s.contentNode}),null}}throw new Error("Unknown control action type: "+this.type)}getFutureActions(t,n){if(this.callee.config.allowFutureScene===!1&&n.allowFutureScene===!1)return[...super.getFutureActions(t,n)];if(this.type===ie.break||this.type===ie.waitForClick||this.type===ie.label||this.type===ie.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===ie.break)return super.stringifyWithContent("Control","break");if(this.type===ie.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===ie.label||this.type===ie.jump){let[a]=this.contentNode.getContent(),c=this.type===ie.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(";"))}};Zo.ActionTypes=ie;var oe=Zo;var Fe=class o extends ce{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(oe.ActionTypes.do,t)}doAsync(t){return this.push(oe.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(oe.ActionTypes.any,t)}all(t){return this.pushUnchained(oe.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(oe.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(oe.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=Q.from(t);return this.pushWithLambda(oe.ActionTypes.while,n,i)}breakLoop(){let t=new oe(this.chain(),oe.ActionTypes.break,new x().setContent([]));return this.chain(t)}sleep(t){return this.push(oe.ActionTypes.sleep,[],t)}waitForClick(){let t=new oe(this.chain(),oe.ActionTypes.waitForClick,new x().setContent([]));return this.chain(t)}label(t){let n=new oe(this.chain(),oe.ActionTypes.label,new x().setContent([t]));return this.chain(n)}jump(t){let n=new oe(this.chain(),oe.ActionTypes.jump,new x().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new oe(this.chain(),t,new x().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new oe(this.chain(),t,new x().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new oe(this.chain(),t,new x().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?_t.say(n).getActions():Be.toActions([n]))}};var j=class j extends Ke{static get DefaultUserConfig(){return j._defaultUserConfig??(j._defaultUserConfig=new $({name:"(anonymous)",autoInit:!0,src:j.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...te.DefaultTransformState.getDefaultConfig()},{position:e=>G.tryParsePosition(e)}))}static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return P.isStaticImageData(t)?P.srcToURL(t):P.isColor(t)?t:P.isImageSrc(t)?P.srcToURL(t):j.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isLayeredSrc(e){return!!e.config.src?.slots}static isSrcDefinitionObject(e){return typeof e=="object"&&e!==null&&!P.isImageSrc(e)&&!P.isColor(e)}static isLayeredDefinition(e){return this.isSrcDefinitionObject(e)&&"layers"in e}static isTagDefinition(e){return this.isSrcDefinitionObject(e)&&"resolve"in e}static isLayerVariants(e){return typeof e=="object"&&e!==null}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(P.isImageSrc(t)||P.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:j.isLayeredSrc(e)?null:j.isTagSrc(e)&&e.config.src.resolve?j.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):j.isStaticSrc(e)?P.isStaticImageData(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):P.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static getSrcURLs(e,t){let n=e.config.src?.slots;if(!n)return[];let i=new Set(t??e.state.currentSrc);return n.map(r=>j.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(j.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new j({src:e})}constructor(e={}){super();let t=j.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new Fe,n=>{if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Error("Color src is not allowed for non-background image");return n.chain(this._setSrc(n,e,t))}else{let i=new ye(n,ye.ActionTypes.setAppearance,new x().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Fe,i=>i.chain(this._setDarkness(i,e,t,n)))}addWearable(e){let t=Array.isArray(e)?e:[e];for(let n of t){if(n===this)throw new Z("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:j.StateSerializer.serialize(this.state),transformState:te.TransformStateSerializer.serialize(this.transformState.get()),loop:this._serializeLoop()}}fromData(e){return this.state=j.StateSerializer.deserialize(e.state),this.transformState.resetTo(te.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_applyTransition(e,t){return new Se(this.chain(),pe.applyTransition,new x().setContent([e,t]))}_init(e,t){return new Se(this.chain(),pe.init,new x().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new ye(this.chain(),ye.ActionTypes.initWearable,new x().setContent([e]))}_flush(){return new ye(this.chain(),ye.ActionTypes.flush,new x)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get()),this}resolveTags(e,t){if(!j.isTagSrc(this))throw new Error(`Tag not defined
71
+ 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(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Z("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!j.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new Z(`Trying to mix src and tags
66
72
  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
67
73
  Wearable must be an Image with isWearable set to true
68
74
  It seems like you are trying to add a non-wearable image to wearables
69
75
  Image below violates the rule:
70
76
  `+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?`
71
77
  Tag "${e}" belongs to more than one group.`:"")+(t?`
72
- 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(ye.resolveCurrentSrc(this))._setTargetSrc(t))),new ye(e,ye.ActionTypes.setSrc,new k().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?$.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc($.getSrcFromTags(e.defaults,e.resolve)):P.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(P.srcToURL(this.state.currentSrc)),this}static collectLayerGroups(e){let t=[],n=new Set;for(let i of e){if(!$.isLayerVariants(i))continue;let r=Object.keys(i),s=[...r].sort().join("\0");n.has(s)||(n.add(s),t.push(r))}return t}static normalizeSrcDefinition(e){return $.isLayeredDefinition(e)?{groups:$.collectLayerGroups(e.layers),defaults:[...e.defaults],resolve:null,slots:e.layers}:$.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return $.DefaultImageConfig.create({...t,src:$.normalizeSrcDefinition(t.src)})}getInitialState(){return $.DefaultImageState.create().assign({currentSrc:$.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(Z.DefaultTransformState.keys());return new Z(Z.DefaultTransformState.create(t.get()).get())}checkConfig(){for(let e of this.config.wearables)if(!e.config.isWearable)throw this._invalidWearableError(JSON.stringify(e.config));if($.isTagSrc(this)){let e=this.config.src,t=new Set;for(let r of e.groups)for(let s of r){if(t.has(s))throw this._invalidTagGroupDefinitionError(s,!!e.slots);t.add(s)}let n=this.constructTagMap(e.groups),i=new Set;for(let r of e.defaults){if(i.has(r))throw new Error(`Tag conflict
78
+ 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(ye.resolveCurrentSrc(this))._setTargetSrc(t))),new ye(e,ye.ActionTypes.setSrc,new x().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?j.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc(j.getSrcFromTags(e.defaults,e.resolve)):P.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(P.srcToURL(this.state.currentSrc)),this}static collectLayerGroups(e){let t=[],n=new Set;for(let i of e){if(!j.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 j.isLayeredDefinition(e)?{groups:j.collectLayerGroups(e.layers),defaults:[...e.defaults],resolve:null,slots:e.layers}:j.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return j.DefaultImageConfig.create({...t,src:j.normalizeSrcDefinition(t.src)})}getInitialState(){return j.DefaultImageState.create().assign({currentSrc:j.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(te.DefaultTransformState.keys());return new te(te.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(j.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
73
79
  Tag "${r}" is conflicting with another tag
74
80
  Error found in config.tag.defaults`);if(!n.has(r))throw new Error(`Tag not found
75
81
  Tag "${r}" is not defined in tagDefinitions
76
- 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 te(`Layer has no default
77
- 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 ye(e,ye.ActionTypes.setDarkness,new k().setContent([t,n,i]))}};$.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",$.StateSerializer=new je,$._defaultUserConfig=null,$.DefaultImageConfig=new K({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),$.DefaultImageState=new K({currentSrc:$.DefaultImagePlaceholder,darkness:0});var N=$;var Te=class extends Ht{constructor(){super(...arguments);this._detached=!1}_setDetached(t){return this._detached=t,this}_isDetached(){return this._detached}_setPrevLayers(t){return this._prevLayers=t,this}_setTargetLayers(t){return this._targetLayers=t,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(t){return this._prevSrc=t,this}_setTargetSrc(t){return this._targetSrc=t,this}_setCurrentSrc(t){return this._currentSrc=t,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),n}asPrev(t){return super.asPrev((...n)=>j(t(...n),this._srcToProps(this._prevSrc)))}asTarget(t){return super.asTarget((...n)=>j(t(...n),this._srcToProps(this._targetSrc)))}_srcToProps(t){if(this._isLayered()||this._detached)return{};if(P.isColor(t))return{src:N.DefaultImagePlaceholder,style:{backgroundColor:P.isRGBAColor(t)?P.RGBAColorToHex(t):t}};if(P.isImageSrc(t))return{src:P.srcToURL(t)};throw new te("Image transition src cannot be identified, using: "+t)}};import{anticipate as Zd,backIn as em,backInOut as tm,backOut as nm,circIn as im,circInOut as om,circOut as rm,cubicBezier as sm,easeIn as am,easeInOut as Sc,easeOut as lm}from"motion/react";function q(o){return o<0?0:o>1?1:o}function Tc(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function Is(o){return{position:"absolute",top:"50%",left:"50%",width:"100%",height:"100%",transform:"translate(-50%, -50%)",backgroundColor:o}}function bc(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 Ac(o){return o==="vertical"?"to right":"to bottom"}var cm={easeIn:am,easeOut:lm,easeInOut:Sc,circIn:im,circOut:rm,circInOut:om,backIn:em,backOut:nm,backInOut:tm,anticipate:Zd};function Ms(o){return typeof o=="function"?o:Array.isArray(o)?sm(o[0],o[1],o[2],o[3]):o==="linear"?e=>e:cm[o??"easeInOut"]??Sc}function er(o){let e=Ms(o.easing),t=(1-Pi(o))/2,n=1-t;return i=>i<=t?t<=0?1:e(q(i/t)):i>=n?n>=1?1:e(q((1-i)/(1-n))):1}function Pi(o){return o.holdMs!==void 0?o.duration<=0?o.holdMs>0?1:0:q(o.holdMs/o.duration):q(o.hold??0)}var Ei=class o extends Te{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.holdMs=e.holdMs,this.easing=e.easing}createTask(){let e=Pi({duration:this.duration,holdMs:this.holdMs}),t=Ms(this.easing),n=i=>i<=e?this.from:e>=1?this.from:this.from+(this.to-this.from)*t((i-e)/(1-e));return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asTarget(i=>({style:{filter:`brightness(${1-n(i)})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o({from:this.from,to:this.to,duration:this.duration,holdMs:this.holdMs,easing:this.easing})}};var Di=class Di extends Y{static resolveTagSrc(e,t){if(!N.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return N.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(N.isLayeredSrc(e))throw e._mixedSrcError();if(N.isStaticSrc(e))return P.isImageSrc(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):e.state.currentSrc;if(N.isTagSrc(e)&&e.config.src.resolve)return N.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===ft.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new S(s=>s);return i.createWearable(n),e.getExposedStateAsync(n,s=>{s.initDisplayable(()=>{r.resolve(super.executeAction(e,t))})}),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.disposeWearable(s)},[n]),r}else if(this.type===ft.setSrc){let n=this.contentNode.getContent()[0];if(P.isColor(n)&&!this.callee.config.isBackground)throw new te("Color src is not allowed for non-background image");let i=this.callee.state.currentSrc;return this.callee.state.currentSrc=n,e.logger.debug("Image Set Src",n),e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.currentSrc=r},[i]),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else{if(this.type===ft.flush)return super.executeAction(e,t);if(this.type===ft.setAppearance){let[n,i]=this.contentNode.getContent();if(!N.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],l=()=>{this.callee.state.currentSrc=a};if(N.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let d=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevLayers(N.getSrcURLs(this.callee))._setTargetLayers(N.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},l,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.flush(),super.executeAction(e,t)}let c=this.callee.config.src.resolve;if(!c)throw this.callee._invalidSrcHandlerError();let u=N.getSrcFromTags(s,c);if(e.logger.debug("Image - Set Appearance",s,u),i){let d=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevSrc(Di.resolveCurrentSrc(this.callee))._setTargetSrc(u);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},l,[]),d}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===ft.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},l=e.getExposedStateForce(this.callee);if(i){let c=new S(h=>h),u=new Ei({from:s,to:n,duration:i,easing:r});if(N.isLayeredSrc(this.callee)){let h=N.getSrcURLs(this.callee);u._setPrevLayers(h)._setTargetLayers(h)}else{let h=Di.resolveCurrentSrc(this.callee);u._setPrevSrc(h)._setTargetSrc(h)}let d=l.applyTransition(u,()=>{this.callee.state.darkness=n,c.resolve(super.executeAction(e,t))}),p=e.timelines.attachTimeline(c).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:p},()=>{c.isSettled()||c.abort(),d.abort(),a()}),c}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),l.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};Di.ActionTypes=ft;var ye=Di;var Ns=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)}},Nt=class Nt{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)||Nt.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return Nt.isHexString(e)||Nt.isNamedColor(e)||Nt.isRGBAColor(e)}static isNamedColor(e){return ea(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(Nt.isHexString(e))return e;if(Nt.isNamedColor(e))return e;if(Nt.isRGBAColor(e))return Nt.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,l=this.calc(i,s),c=this.calc(r,a),u=n.invertX?{right:l}:{left:l},d=n.invertY?{bottom:c}:{top:c};return{left:"auto",right:"auto",top:"auto",bottom:"auto",...u,...d}}static calc(e,t){let n=typeof e=="string"?e:`${e}px`;if(t===void 0)return`calc(${n} + 0px)`;let i=typeof t=="string"?"+":t<0?"-":"+",r=typeof t=="string"?t:`${Math.abs(t)}px`;return`calc(${n} ${i} ${r})`}static formatLength(e){return typeof e=="number"?`${e}px`:e}static toPixel(e){return typeof e=="number"?e:parseFloat(e)}};Nt.RGBColor=Ns;var P=Nt,Gs=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},Ne=class o extends Gs{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},mo=class{constructor(e){this.scene=e}run(e){let t=new Map,n=new Map,i=[],r=new Set,s=this.scene.getAllChildren(e,this.scene.getSceneRoot());if(!s.length)return null;for(i.push(s[0]);i.length;){let a=i.shift();this.checkAction(e,a,{imageStates:t,scenes:n},r);let l=a.contentNode.getChild();l&&l.action&&i.push(l.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof ye)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof ie){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
82
+ Error found in config.tag.defaults`);n.get(r)?.forEach(s=>i.add(s))}if(e.slots){let r=new Set(e.defaults);for(let s of e.groups)if(!s.some(a=>r.has(a)))throw new Z(`Layer has no default
83
+ 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 ye(e,ye.ActionTypes.setDarkness,new x().setContent([t,n,i]))}};j.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",j.StateSerializer=new qe,j._defaultUserConfig=null,j.DefaultImageConfig=new $({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),j.DefaultImageState=new $({currentSrc:j.DefaultImagePlaceholder,darkness:0});var N=j;var Te=class extends Vt{constructor(){super(...arguments);this._detached=!1}_setDetached(t){return this._detached=t,this}_isDetached(){return this._detached}_setPrevLayers(t){return this._prevLayers=t,this}_setTargetLayers(t){return this._targetLayers=t,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(t){return this._prevSrc=t,this}_setTargetSrc(t){return this._targetSrc=t,this}_setCurrentSrc(t){return this._currentSrc=t,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),n}asPrev(t){return super.asPrev((...n)=>q(t(...n),this._srcToProps(this._prevSrc)))}asTarget(t){return super.asTarget((...n)=>q(t(...n),this._srcToProps(this._targetSrc)))}_srcToProps(t){if(this._isLayered()||this._detached)return{};if(P.isColor(t))return{src:N.DefaultImagePlaceholder,style:{backgroundColor:P.isRGBAColor(t)?P.RGBAColorToHex(t):t}};if(P.isImageSrc(t))return{src:P.srcToURL(t)};throw new Z("Image transition src cannot be identified, using: "+t)}};import{anticipate as em,backIn as tm,backInOut as nm,backOut as im,circIn as om,circInOut as rm,circOut as sm,cubicBezier as am,easeIn as cm,easeInOut as Tl,easeOut as lm}from"motion/react";function Y(o){return o<0?0:o>1?1:o}function bl(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function Ms(o){return{position:"absolute",top:"50%",left:"50%",width:"100%",height:"100%",transform:"translate(-50%, -50%)",backgroundColor:o}}function Al(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 Cl(o){return o==="vertical"?"to right":"to bottom"}var um={easeIn:cm,easeOut:lm,easeInOut:Tl,circIn:om,circOut:sm,circInOut:rm,backIn:tm,backOut:im,backInOut:nm,anticipate:em};function Ns(o){return typeof o=="function"?o:Array.isArray(o)?am(o[0],o[1],o[2],o[3]):o==="linear"?e=>e:um[o??"easeInOut"]??Tl}function er(o){let e=Ns(o.easing),t=(1-Ei(o))/2,n=1-t;return i=>i<=t?t<=0?1:e(Y(i/t)):i>=n?n>=1?1:e(Y((1-i)/(1-n))):1}function Ei(o){return o.holdMs!==void 0?o.duration<=0?o.holdMs>0?1:0:Y(o.holdMs/o.duration):Y(o.hold??0)}var Di=class o extends Te{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.holdMs=e.holdMs,this.easing=e.easing}createTask(){let e=Ei({duration:this.duration,holdMs:this.holdMs}),t=Ns(this.easing),n=i=>i<=e?this.from:e>=1?this.from:this.from+(this.to-this.from)*t((i-e)/(1-e));return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asTarget(i=>({style:{filter:`brightness(${1-n(i)})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o({from:this.from,to:this.to,duration:this.duration,holdMs:this.holdMs,easing:this.easing})}};var Li=class Li extends X{static resolveTagSrc(e,t){if(!N.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return N.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(N.isLayeredSrc(e))throw e._mixedSrcError();if(N.isStaticSrc(e))return P.isImageSrc(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):e.state.currentSrc;if(N.isTagSrc(e)&&e.config.src.resolve)return N.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===ht.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===ht.setSrc){let n=this.contentNode.getContent()[0];if(P.isColor(n)&&!this.callee.config.isBackground)throw new Z("Color src is not allowed for non-background image");let i=this.callee.state.currentSrc;return this.callee.state.currentSrc=n,e.logger.debug("Image Set Src",n),e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.currentSrc=r},[i]),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else{if(this.type===ht.flush)return super.executeAction(e,t);if(this.type===ht.setAppearance){let[n,i]=this.contentNode.getContent();if(!N.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(N.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let d=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevLayers(N.getSrcURLs(this.callee))._setTargetLayers(N.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},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=N.getSrcFromTags(s,l);if(e.logger.debug("Image - Set Appearance",s,u),i){let d=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevSrc(Li.resolveCurrentSrc(this.callee))._setTargetSrc(u);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,d.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(d).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},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===ht.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 Di({from:s,to:n,duration:i,easing:r});if(N.isLayeredSrc(this.callee)){let h=N.getSrcURLs(this.callee);u._setPrevLayers(h)._setTargetLayers(h)}else{let h=Li.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")}};Li.ActionTypes=ht;var ye=Li;var Gs=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 ta(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=Gs;var P=Gt,Fs=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},Oe=class o extends Fs{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},mo=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 ye)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof ee){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
78
84
  Scene: ${s.config.name}
79
85
 
80
- At: ${t.__stack}`;throw new Ne(a)}}else i.set(s.config.name,s);if(t.type===J.jumpTo){let a=t.contentNode.getContent()[0],l=e.getScene(a,!0);if(r.has(l))return;r.add(l)}}}checkImage(e,t){if(t.type===ft.setSrc){let i=t.contentNode.getContent()[0];P.isImageURL(i)&&P.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},te=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`
86
+ At: ${t.__stack}`;throw new Oe(a)}}else i.set(s.config.name,s);if(t.type===z.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===ht.setSrc){let i=t.contentNode.getContent()[0];P.isImageURL(i)&&P.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},Z=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`
81
87
  Using action (id: ${e.getId()})
82
- at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},E=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},Fe=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function um(o,e){return ee.color(o,e)}function pm(o){return ee.bold(o)}function dm(o){return ee.italic(o)}var Fs=class o extends Te{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 Os=class o extends Te{constructor(e){super(),this.duration=e.duration,this.offset=e.offset??[0,0],this.easing=e.easing}createTask(e){let{invertX:t,invertY:n}=e.getStory().getInversionConfig();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing},{type:0,start:this.offset[0],end:0,duration:this.duration,ease:this.easing},{type:0,start:this.offset[1],end:0,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget((i,r,s)=>({style:{opacity:i,translate:`${t?-r:r}px ${n?-s:s}px`}}))]}}copy(){return new o({duration:this.duration,offset:this.offset,easing:this.easing})}};var Hs=class o extends Te{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-q(t),filter:`blur(${e*q(t)}px)`}})),this.asTarget(t=>({style:{opacity:q(t),filter:`blur(${e*(1-q(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var Vs=class o extends Te{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*q(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-q(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};var Us=class o extends Te{constructor(e){super(),this.duration=e.duration,this.ev=e.ev??4.6,this.lift=e.lift??.04,this.hold=e.hold,this.holdMs=e.holdMs,this.easing=e.easing}burnStyle(e){let t=q(e);if(t<=0)return{filter:"none"};let n=q(this.lift)*t,i=Math.pow(2,Math.max(0,this.ev)*t);return{filter:`invert(1) brightness(${1-n}) invert(1) brightness(${i})`}}createTask(){let t=er({duration:this.duration,hold:this.hold,holdMs:this.holdMs,easing:this.easing});return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(n=>({style:{opacity:n<.5?1:0,...this.burnStyle(t(n))}})),this.asTarget(n=>({style:{opacity:n<.5?0:1,...this.burnStyle(t(n))}}))]}}copy(){return new o({duration:this.duration,ev:this.ev,lift:this.lift,hold:this.hold,holdMs:this.holdMs,easing:this.easing})}};function H(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function tr(o,e,t){return o<e?e:o>t?t:o}var nn=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${H(t)}deg`:bc(t);return{mask:(r,s)=>{let a=-n+(s?1-q(r):q(r))*(100+n);return s?`linear-gradient(${i}, transparent ${H(a)}%, #000 ${H(a+n)}%)`:`linear-gradient(${i}, #000 ${H(a)}%, transparent ${H(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${H(t)}deg`,`${H(t+180)}deg`]:t==="vertical"?["to bottom","to top"]:["to right","to left"];return{mask:(s,a)=>{let l=-n+q(s)*(50+n);if(!a){let c=u=>`linear-gradient(${u}, #000 ${H(l)}%, transparent ${H(l+n)}%)`;return`${c(i)}, ${c(r)}`}if(l<0){let c=q((l+n)/Math.max(n,1e-6));return`linear-gradient(${i}, transparent ${H(50-l-n)}%, rgba(0,0,0,${H(c)}) 50%, transparent ${H(50+l+n)}%)`}return`linear-gradient(${i}, transparent ${H(50-l-n)}%, #000 ${H(50-l)}%, #000 ${H(50+l)}%, transparent ${H(50+l+n)}%)`}}}static iris(e={}){let t=e.center??"50% 50%",n=Math.max(0,e.feather??12),i=e.shape??"circle";return{mask:(r,s)=>{if(s){let l=(1-q(r))*150;return`radial-gradient(${i} at ${t}, transparent ${H(l-n)}%, #000 ${H(l)}%)`}let a=q(r)*150;return`radial-gradient(${i} at ${t}, #000 ${H(a-n)}%, transparent ${H(a)}%)`}}}static clock(e={}){let t=e.center??"50% 50%",n=e.from??0,i=Math.max(0,e.feather??24),r=e.direction??"clockwise";return{mask:(s,a)=>{let l=r==="counterclockwise"!=!!a,c=-i+q(s)*(360+i);if(l){let d=Math.max(0,360-c-i),p=Math.max(d,360-c);return`conic-gradient(from ${H(n)}deg at ${t}, transparent ${H(d)}deg, #000 ${H(p)}deg)`}let u=Math.max(0,c);return`conic-gradient(from ${H(n)}deg at ${t}, #000 ${H(u)}deg, transparent ${H(Math.max(u,c+i))}deg)`}}}static fan(e={}){let t=Math.max(1,Math.round(e.blades??4)),n=e.center??"50% 50%",i=e.from??0,r=Math.max(0,e.feather??10),s=360/t;return{mask:(a,l)=>{let c=-r+(l?1-q(a):q(a))*(s+r),u=tr(c,0,s),d=tr(c+r,0,s),p=`repeating-conic-gradient(from ${H(i)}deg at ${n}`;return l?`${p}, transparent 0deg, transparent ${H(u)}deg, #000 ${H(d)}deg, #000 ${H(s)}deg)`:`${p}, #000 0deg, #000 ${H(u)}deg, transparent ${H(d)}deg, transparent ${H(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"?`${H(t)}deg`:Ac(t),s=100/n;return{mask:(a,l)=>{let c=-i+(l?1-q(a):q(a))*(s+i),u=tr(c,0,s),d=tr(c+i,0,s);return l?`repeating-linear-gradient(${r}, transparent 0, transparent ${H(u)}%, #000 ${H(d)}%, #000 ${H(s)}%)`:`repeating-linear-gradient(${r}, #000 0, #000 ${H(u)}%, transparent ${H(d)}%, transparent ${H(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=q(e.stagger??0)*.5,a=(l,c,u)=>{let d=-i+q(c)*(100+i);return u?`radial-gradient(circle farthest-corner at ${l}, transparent ${H(d)}%, #000 ${H(d+i)}%)`:`radial-gradient(circle farthest-corner at ${l}, #000 ${H(d)}%, transparent ${H(d+i)}%)`};return{size:`${H(100/n)}% ${H(100/t)}%`,repeat:"repeat",mask:(l,c)=>{let u=c?1-q(l):q(l);if(s<=0)return a("50% 50%",u,c);let d=q(u/(1-s)),p=q((u-s)/(1-s));return c?`${a("50% 50%",p,!0)}, ${a("0% 0%",d,!0)}`:`${a("50% 50%",d)}, ${a("0% 0%",p)}`}}}static invert(e){return{...e,mask:(t,n)=>e.mask(t,!n)}}static toStyle(e,t,n=!1){return Tc(e.mask(t,n),e.size,e.repeat)}};var mm=.3,Ws=class o extends Te{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold,this.holdMs=e.holdMs,this.pattern=e.pattern??null,this.inverted=e.inverted??!1,this.uncover=e.uncover??"retreat",this.easing=e.easing}coverStyle(e,t){if(!this.pattern)return{...Is(this.color),opacity:q(e)};let n={...Is(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...nn.toStyle(this.pattern,e,!this.inverted)}:{...n,...nn.toStyle(this.uncover,e)}:{...n,...nn.toStyle(this.pattern,e,this.inverted)}}createTask(){let e={duration:this.duration,hold:this.hold??(this.holdMs===void 0?mm:void 0),holdMs:this.holdMs,easing:this.easing},t=1-(1-Pi(e))/2,n=.5,i=er(e);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(r=>({style:{opacity:r<n?1:0}})),this.asTarget(r=>({style:{opacity:r<n?0:1}})),r=>({src:N.DefaultImagePlaceholder,style:this.coverStyle(i(r),r>=t)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,holdMs:this.holdMs,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var Bs=class o extends Te{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:nn.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var jn="http://www.w3.org/2000/svg",fm="http://www.w3.org/1999/xlink",hm=.002,gm=1,ym=.12,vm=0,zs=class o extends Te{constructor(t){super();this.filterId=null;this.host=null;this.cut=null;this.duration=t.duration,this.rule=P.srcToURL(t.rule),this.feather=Math.min(gm,Math.max(hm,t.feather??ym)),this.inverted=t.inverted??!1,this.easing=t.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(t=>({style:this.styleAt(t)}))]}}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>this.dispose()),n.onCanceled(()=>this.dispose()),n}copy(){return new o({duration:this.duration,rule:this.rule,feather:this.feather,inverted:this.inverted,easing:this.easing})}styleAt(t){if(t>=1)return this.dispose(),{filter:""};let n=this.ensureScaffold();if(!n)return{filter:""};let i=t*(1+this.feather),r=(this.inverted?1:-1)/this.feather,s=(this.inverted?i-1:i)/this.feather;return this.cut?.setAttribute("k3",String(r)),this.cut?.setAttribute("k4",String(s)),{filter:`url(#${n})`}}ensureScaffold(){if(typeof document>"u")return null;if(this.filterId&&this.host)return this.filterId;let t=`nl-rule-${++vm}`,n=document.createElementNS(jn,"svg");n.setAttribute("aria-hidden","true"),n.setAttribute("data-element-type","rule-transition"),n.setAttribute("width","0"),n.setAttribute("height","0"),Object.assign(n.style,{position:"absolute",width:"0",height:"0",overflow:"hidden"});let i=document.createElementNS(jn,"filter");i.setAttribute("id",t),i.setAttribute("color-interpolation-filters","sRGB"),i.setAttribute("primitiveUnits","objectBoundingBox"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("width","100%"),i.setAttribute("height","100%");let r=document.createElementNS(jn,"feImage");r.setAttribute("href",this.rule),r.setAttributeNS(fm,"xlink:href",this.rule),r.setAttribute("preserveAspectRatio","none"),r.setAttribute("x","0"),r.setAttribute("y","0"),r.setAttribute("width","1"),r.setAttribute("height","1"),r.setAttribute("result","rule");let s=document.createElementNS(jn,"feColorMatrix");s.setAttribute("in","rule"),s.setAttribute("type","luminanceToAlpha"),s.setAttribute("result","lum");let a=document.createElementNS(jn,"feComposite");a.setAttribute("in","lum"),a.setAttribute("in2","lum"),a.setAttribute("operator","arithmetic"),a.setAttribute("k1","0"),a.setAttribute("k2","0"),a.setAttribute("k3","0"),a.setAttribute("k4","0"),a.setAttribute("result","cut");let l=document.createElementNS(jn,"feComposite");return l.setAttribute("in","SourceGraphic"),l.setAttribute("in2","cut"),l.setAttribute("operator","in"),i.append(r,s,a,l),n.appendChild(i),document.body.appendChild(n),this.filterId=t,this.host=n,this.cut=a,t}dispose(){this.host?.remove(),this.host=null,this.cut=null,this.filterId=null}};var Ks=class extends ai{constructor(){super();this.unlocked={};this.setupActions()}serialize(){return{unlocked:this.unlocked}}deserialize(t){this.unlocked=t.unlocked}add(t,n){return this.trigger("add",t,n)}has(t){return new X(()=>this.unlocked[t]!==void 0)}remove(t){return this.trigger("remove",t)}clear(){return this.trigger("clear")}$remove(t){delete this.unlocked[t]}$clear(){this.unlocked={}}$get(t){return this.unlocked[t]}$set(t,n){this.unlocked[t]=n}$getAll(){return this.unlocked}$has(t){return this.unlocked[t]!==void 0}setupActions(){this.on("add",(t,n,i)=>{let r={gameState:t.gameState,game:t.game,liveGame:t.liveGame,storable:t.storable,$:t.$},s=typeof i=="function"?i(r):i;this.unlocked[n]=s}),this.on("remove",(t,n)=>{delete this.unlocked[n]}),this.on("clear",t=>{this.$clear()})}};var nr=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=Ue.isChained(e)?e.getActions():e;return Be.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static getLayerSrcs(e,t){return N.getSrcURLs(e,t)}static registerDisplayable(e,t,n=null,i=null){e.findElementByDisplayable(t)||(e.createDisplayable(t,n,i),e.flush())}static setElementId(e,t){e.setId(t)}static setElementStaticId(e,t){e.setStaticId(t)}static getDisplayableTransformProps(e){return{...e.transformState.get()}}static setDisplayableTransformProps(e,t,n,i={}){let r=t.transformState;i.merge===!1?r.forceOverwrite(n):r.assign(Symbol("DevTools.setDisplayableTransformProps"),n),t.markDirty(),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}static getPuppetStatus(e){return e._getStatus()}static onPuppetStatusChange(e,t){return e._onStatusChange(t)}static async describePuppet(e,t){try{return await t._describe()}catch(n){return e.logger.error("DevTools","Puppet backend threw while describing itself",n),null}}static getPuppetState(e){return Et.normalizeState(e.state)}static setPuppetState(e,t,n,i={}){t.state=i.merge===!1?Et.normalizeState(n):Et.mergeState(t.state,n),t._applyState().catch(r=>{e.logger.error("DevTools","Puppet backend threw while applying state",r)}),e.flush()}static async runPuppetCommand(e,t,n,i){try{await t._runCommand(n,i)||e.logger.weakWarn("DevTools",`Puppet command "${n}" was dropped: the puppet is not mounted.`)}catch(r){e.logger.error("DevTools",`Puppet backend threw while running "${n}"`,r)}}static listPuppetBackends(e){return e.listPuppetBackends()}static getCurrentDialog(e){if(e.isNvlMode()){let n=e.getNvlState();if(!n.activeDialogId||n.phase==="idle")return null;let i=e.getNvlDialog(n.activeDialogId);return i?{actionId:i.actionId||null,ended:n.phase==="awaitAdvance",mode:"nvl"}:null}let t=e.getAdvDialogState();return t?{actionId:t.actionId,ended:t.ended,mode:"adv"}:null}static onDialogStateChange(e,t){let n=[e.events.on(L.EventTypes["event:state.dialog.change"],t),e.events.on(L.EventTypes["event:state.nvl.change"],t)];return{cancel:()=>{for(let i of n)i.cancel()}}}};nr.DynamicPersistent=Fn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
88
+ at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},E=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},be=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function pm(o,e){return ne.color(o,e)}function dm(o){return ne.bold(o)}function mm(o){return ne.italic(o)}var Os=class o extends Te{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 Hs=class o extends Te{constructor(e){super(),this.duration=e.duration,this.offset=e.offset??[0,0],this.easing=e.easing}createTask(e){let{invertX:t,invertY:n}=e.getStory().getInversionConfig();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing},{type:0,start:this.offset[0],end:0,duration:this.duration,ease:this.easing},{type:0,start:this.offset[1],end:0,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget((i,r,s)=>({style:{opacity:i,translate:`${t?-r:r}px ${n?-s:s}px`}}))]}}copy(){return new o({duration:this.duration,offset:this.offset,easing:this.easing})}};var Vs=class o extends Te{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 Us=class o extends Te{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})}};var Ws=class o extends Te{constructor(e){super(),this.duration=e.duration,this.ev=e.ev??4.6,this.lift=e.lift??.04,this.hold=e.hold,this.holdMs=e.holdMs,this.easing=e.easing}burnStyle(e){let t=Y(e);if(t<=0)return{filter:"none"};let n=Y(this.lift)*t,i=Math.pow(2,Math.max(0,this.ev)*t);return{filter:`invert(1) brightness(${1-n}) invert(1) brightness(${i})`}}createTask(){let t=er({duration:this.duration,hold:this.hold,holdMs:this.holdMs,easing:this.easing});return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(n=>({style:{opacity:n<.5?1:0,...this.burnStyle(t(n))}})),this.asTarget(n=>({style:{opacity:n<.5?0:1,...this.burnStyle(t(n))}}))]}}copy(){return new o({duration:this.duration,ev:this.ev,lift:this.lift,hold:this.hold,holdMs:this.holdMs,easing:this.easing})}};function H(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function tr(o,e,t){return o<e?e:o>t?t:o}var nn=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${H(t)}deg`:Al(t);return{mask:(r,s)=>{let a=-n+(s?1-Y(r):Y(r))*(100+n);return s?`linear-gradient(${i}, transparent ${H(a)}%, #000 ${H(a+n)}%)`:`linear-gradient(${i}, #000 ${H(a)}%, transparent ${H(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${H(t)}deg`,`${H(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 ${H(c)}%, transparent ${H(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 ${H(50-c-n)}%, rgba(0,0,0,${H(l)}) 50%, transparent ${H(50+c+n)}%)`}return`linear-gradient(${i}, transparent ${H(50-c-n)}%, #000 ${H(50-c)}%, #000 ${H(50+c)}%, transparent ${H(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 ${H(c-n)}%, #000 ${H(c)}%)`}let a=Y(r)*150;return`radial-gradient(${i} at ${t}, #000 ${H(a-n)}%, transparent ${H(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 ${H(n)}deg at ${t}, transparent ${H(d)}deg, #000 ${H(p)}deg)`}let u=Math.max(0,l);return`conic-gradient(from ${H(n)}deg at ${t}, #000 ${H(u)}deg, transparent ${H(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=tr(l,0,s),d=tr(l+r,0,s),p=`repeating-conic-gradient(from ${H(i)}deg at ${n}`;return c?`${p}, transparent 0deg, transparent ${H(u)}deg, #000 ${H(d)}deg, #000 ${H(s)}deg)`:`${p}, #000 0deg, #000 ${H(u)}deg, transparent ${H(d)}deg, transparent ${H(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"?`${H(t)}deg`:Cl(t),s=100/n;return{mask:(a,c)=>{let l=-i+(c?1-Y(a):Y(a))*(s+i),u=tr(l,0,s),d=tr(l+i,0,s);return c?`repeating-linear-gradient(${r}, transparent 0, transparent ${H(u)}%, #000 ${H(d)}%, #000 ${H(s)}%)`:`repeating-linear-gradient(${r}, #000 0, #000 ${H(u)}%, transparent ${H(d)}%, transparent ${H(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 ${H(d)}%, #000 ${H(d+i)}%)`:`radial-gradient(circle farthest-corner at ${c}, #000 ${H(d)}%, transparent ${H(d+i)}%)`};return{size:`${H(100/n)}% ${H(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 bl(e.mask(t,n),e.size,e.repeat)}};var fm=.3,Bs=class o extends Te{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold,this.holdMs=e.holdMs,this.pattern=e.pattern??null,this.inverted=e.inverted??!1,this.uncover=e.uncover??"retreat",this.easing=e.easing}coverStyle(e,t){if(!this.pattern)return{...Ms(this.color),opacity:Y(e)};let n={...Ms(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...nn.toStyle(this.pattern,e,!this.inverted)}:{...n,...nn.toStyle(this.uncover,e)}:{...n,...nn.toStyle(this.pattern,e,this.inverted)}}createTask(){let e={duration:this.duration,hold:this.hold??(this.holdMs===void 0?fm:void 0),holdMs:this.holdMs,easing:this.easing},t=1-(1-Ei(e))/2,n=.5,i=er(e);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(r=>({style:{opacity:r<n?1:0}})),this.asTarget(r=>({style:{opacity:r<n?0:1}})),r=>({src:N.DefaultImagePlaceholder,style:this.coverStyle(i(r),r>=t)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,holdMs:this.holdMs,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var zs=class o extends Te{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:nn.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var jn="http://www.w3.org/2000/svg",hm="http://www.w3.org/1999/xlink",gm=.002,ym=1,vm=.12,Sm=0,Ks=class o extends Te{constructor(t){super();this.filterId=null;this.host=null;this.cut=null;this.duration=t.duration,this.rule=P.srcToURL(t.rule),this.feather=Math.min(ym,Math.max(gm,t.feather??vm)),this.inverted=t.inverted??!1,this.easing=t.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(t=>({style:this.styleAt(t)}))]}}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>this.dispose()),n.onCanceled(()=>this.dispose()),n}copy(){return new o({duration:this.duration,rule:this.rule,feather:this.feather,inverted:this.inverted,easing:this.easing})}styleAt(t){if(t>=1)return this.dispose(),{filter:""};let n=this.ensureScaffold();if(!n)return{filter:""};let i=t*(1+this.feather),r=(this.inverted?1:-1)/this.feather,s=(this.inverted?i-1:i)/this.feather;return this.cut?.setAttribute("k3",String(r)),this.cut?.setAttribute("k4",String(s)),{filter:`url(#${n})`}}ensureScaffold(){if(typeof document>"u")return null;if(this.filterId&&this.host)return this.filterId;let t=`nl-rule-${++Sm}`,n=document.createElementNS(jn,"svg");n.setAttribute("aria-hidden","true"),n.setAttribute("data-element-type","rule-transition"),n.setAttribute("width","0"),n.setAttribute("height","0"),Object.assign(n.style,{position:"absolute",width:"0",height:"0",overflow:"hidden"});let i=document.createElementNS(jn,"filter");i.setAttribute("id",t),i.setAttribute("color-interpolation-filters","sRGB"),i.setAttribute("primitiveUnits","objectBoundingBox"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("width","100%"),i.setAttribute("height","100%");let r=document.createElementNS(jn,"feImage");r.setAttribute("href",this.rule),r.setAttributeNS(hm,"xlink:href",this.rule),r.setAttribute("preserveAspectRatio","none"),r.setAttribute("x","0"),r.setAttribute("y","0"),r.setAttribute("width","1"),r.setAttribute("height","1"),r.setAttribute("result","rule");let s=document.createElementNS(jn,"feColorMatrix");s.setAttribute("in","rule"),s.setAttribute("type","luminanceToAlpha"),s.setAttribute("result","lum");let a=document.createElementNS(jn,"feComposite");a.setAttribute("in","lum"),a.setAttribute("in2","lum"),a.setAttribute("operator","arithmetic"),a.setAttribute("k1","0"),a.setAttribute("k2","0"),a.setAttribute("k3","0"),a.setAttribute("k4","0"),a.setAttribute("result","cut");let c=document.createElementNS(jn,"feComposite");return c.setAttribute("in","SourceGraphic"),c.setAttribute("in2","cut"),c.setAttribute("operator","in"),i.append(r,s,a,c),n.appendChild(i),document.body.appendChild(n),this.filterId=t,this.host=n,this.cut=a,t}dispose(){this.host?.remove(),this.host=null,this.cut=null,this.filterId=null}};var $s=class extends ci{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 Q(()=>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 nr=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=Be.isChained(e)?e.getActions():e;return Fe.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static getLayerSrcs(e,t){return N.getSrcURLs(e,t)}static registerDisplayable(e,t,n=null,i=null){e.findElementByDisplayable(t)||(e.createDisplayable(t,n,i),e.flush())}static setElementId(e,t){e.setId(t)}static setElementStaticId(e,t){e.setStaticId(t)}static getDisplayableTransformProps(e){return{...e.transformState.get()}}static setDisplayableTransformProps(e,t,n,i={}){let r=t.transformState;i.merge===!1?r.forceOverwrite(n):r.assign(Symbol("DevTools.setDisplayableTransformProps"),n),t.markDirty(),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}static getPuppetStatus(e){return e._getStatus()}static onPuppetStatusChange(e,t){return e._onStatusChange(t)}static async describePuppet(e,t){try{return await t._describe()}catch(n){return e.logger.error("DevTools","Puppet backend threw while describing itself",n),null}}static getPuppetState(e){return Dt.normalizeState(e.state)}static setPuppetState(e,t,n,i={}){t.state=i.merge===!1?Dt.normalizeState(n):Dt.mergeState(t.state,n),t._applyState().catch(r=>{e.logger.error("DevTools","Puppet backend threw while applying state",r)}),e.flush()}static async runPuppetCommand(e,t,n,i){try{await t._runCommand(n,i)||e.logger.weakWarn("DevTools",`Puppet command "${n}" was dropped: the puppet is not mounted.`)}catch(r){e.logger.error("DevTools",`Puppet backend threw while running "${n}"`,r)}}static listPuppetBackends(e){return e.listPuppetBackends()}static getCurrentDialog(e){if(e.isNvlMode()){let n=e.getNvlState();if(!n.activeDialogId||n.phase==="idle")return null;let i=e.getNvlDialog(n.activeDialogId);return i?{actionId:i.actionId||null,ended:n.phase==="awaitAdvance",mode:"nvl"}:null}let t=e.getAdvDialogState();return t?{actionId:t.actionId,ended:t.ended,mode:"adv"}:null}static onDialogStateChange(e,t){let n=[e.events.on(L.EventTypes["event:state.dialog.change"],t),e.events.on(L.EventTypes["event:state.nvl.change"],t)];return{cancel:()=>{for(let i of n)i.cancel()}}}};nr.DynamicPersistent=Fn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
83
89
  @layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.isolate{isolation:isolate}.z-20{z-index:20}.container{width:100%}.\\!hidden{display:none!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-\\[80px\\]{height:80px}.h-full{height:100%}.h-max{height:-moz-max-content;height:max-content}.w-1\\/2{width:50%}.w-\\[100px\\]{width:100px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-full{min-width:100%}.flex-grow,.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.text-center{text-align:center}.text-left{text-align:left}.align-bottom{vertical-align:bottom}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.__narraleaf_content-player *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.__narraleaf_content-player img{pointer-events:none;-webkit-user-drag:none;-webkit-user-select:none}.__narraleaf_content-player .pointer-disabled{pointer-events:none}.__narraleaf_content-player .pointer-disabled>:not(.pointer-disabled){pointer-events:auto}.__narraleaf_content-player img:before,.__narraleaf_content-player img:after{content:none!important;border:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.bg-cover{background-size:cover}.bg-center{background-position:50%}.pointer-events-auto-rest *{pointer-events:auto}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}\r
84
- `,document.head.appendChild(o)}export{vn as Align,sn as AudioBusError,ti as AudioBusMixer,ei as AudioBusTree,Yr as Avatar,Hs as BlurDissolve,oi as Camera,lo as Character,lt as CommonPosition,Rn as CommonPositionType,gr as Condition,Be as Control,gt as Coord2D,Ei as Darkness,et as DefaultAudioBusIds,rs as DefaultNvlContainer,Ml as DefaultNvlDialogItem,nr as DevTools,Kp as Dialog,Fs as Dissolve,$d as ExposedStateType,Us as Exposure,Os as FadeIn,El as FixedAspectRatioContainer,Ks as Gallery,re as Game,bo as GameMenu,fc as GameProviders,L as GameState,N as Image,Te as ImageTransition,Wt as Isolated,Io as Item,Wn as KeyBindingType,ki as KeyMap,X as Lambda,Hn as Layer,dp as Layout,Ti as LayoutRouterProvider,Vt as LiveGame,nn as Mask,Qi as MaxAudioBusDepth,yr as Menu,ci as NVLToken,Ot as Namespace,en as Nametag,Jt as Narrator,No as Notifications,os as NvlContainer,Op as NvlDialogList,ns as NvlProvider,yp as Page,Jr as PageInjectContext,We as Pause,Gn as Persistent,mc as Player,pi as Preference,Et as Puppet,Vs as Push,Bs as Reveal,Ua as RootPath,zs as RuleReveal,nt as Scene,Ae as Script,fa as SeededBusPreferenceKeys,me as Sentence,ai as Service,ge as Sound,ga as SoundType,ou as Stage,_n as Storable,ri as Story,An as Text,ct as TextEvent,si as TextTransition,Hu as Texts,Gu as TextsPreview,Ws as ThroughColor,_ as Transform,Ht as Transition,Ar as Vfx,br as Video,ee as Word,Ji as acceptsAudioBus,pm as b,um as c,hr as getActiveAudioBusTree,Cu as getWordRenderer,dm as i,bu as registerWordRenderer,Au as unregisterWordRenderer,Tl as useAvatar,_u as useDialog,Wp as useDialogOverlay,R as useGame,Rp as useIsNvlMode,Ip as useIsNvlVisible,xn as useKeyBinding,wp as useLiveGame,Kt as useNvl,ts as useNvlDialogs,sp as useParams,rp as usePathname,mn as usePreference,ap as useQueryParams,Ut as useRouter,zp as useSuspendAdvance,Kr as useUIMenuContext,tp as useVoiceState};
90
+ `,document.head.appendChild(o)}export{vn as Align,sn as AudioBusError,ti as AudioBusMixer,ei as AudioBusTree,Xr as Avatar,Vs as BlurDissolve,ri as Camera,co as Character,lt as CommonPosition,Rn as CommonPositionType,yr as Condition,Fe as Control,yt as Coord2D,Di as Darkness,tt as DefaultAudioBusIds,ss as DefaultNvlContainer,Nc as DefaultNvlDialogItem,nr as DevTools,$p as Dialog,Os as Dissolve,jd as ExposedStateType,Ws as Exposure,Hs as FadeIn,Dc as FixedAspectRatioContainer,$s as Gallery,re as Game,bo as GameMenu,hl as GameProviders,L as GameState,N as Image,Te as ImageTransition,Bt as Isolated,Io as Item,Wn as KeyBindingType,Pi as KeyMap,Q as Lambda,Hn as Layer,mp as Layout,bi as LayoutRouterProvider,Ut as LiveGame,nn as Mask,_i as MaxAudioBusDepth,vr as Menu,ui as NVLToken,Ht as Namespace,en as Nametag,_t as Narrator,No as Notifications,rs as NvlContainer,Hp as NvlDialogList,is as NvlProvider,vp as Page,Jr as PageInjectContext,ze as Pause,Gn as Persistent,fl as Player,di as Preference,Dt as Puppet,Us as Push,zs as Reveal,Wa as RootPath,Ks as RuleReveal,it as Scene,Ce as Script,ha as SeededBusPreferenceKeys,me as Sentence,ci as Service,ge as Sound,ya as SoundType,ru as Stage,Jn as Storable,si as Story,An as Text,ut as TextEvent,ai as TextTransition,Vu as Texts,Fu as TextsPreview,Bs as ThroughColor,J as Transform,Vt as Transition,Cr as Vfx,Ar as Video,ne as Word,Ji as acceptsAudioBus,dm as b,pm as c,hr as getActiveAudioBusTree,xu as getWordRenderer,mm as i,Au as registerWordRenderer,Cu as unregisterWordRenderer,bc as useAvatar,Zu as useDialog,Bp as useDialogOverlay,R as useGame,Ip as useIsNvlMode,Mp as useIsNvlVisible,xn as useKeyBinding,kp as useLiveGame,$t as useNvl,ns as useNvlDialogs,ap as useParams,sp as usePathname,mn as usePreference,cp as useQueryParams,Wt as useRouter,Kp as useSuspendAdvance,$r as useUIMenuContext,np as useVoiceState};