narraleaf-react 0.46.0 → 0.47.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,88 +1,88 @@
|
|
|
1
|
-
var de={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",applyLoop:"displayable:applyLoop",stopLoop:"displayable:stopLoop",init:"displayable:init",bringToFront:"displayable:bringToFront"},Zt={say:"character:say",action:"character:action",setName:"character:setName"},B={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
|
|
1
|
+
var de={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",applyLoop:"displayable:applyLoop",stopLoop:"displayable:stopLoop",init:"displayable:init",bringToFront:"displayable:bringToFront"},Zt={say:"character:say",action:"character:action",setName:"character:setName"},B={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",callTo:"scene:callTo",preSuspend:"scene:preSuspend",resume:"scene:resume",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var mt={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},ra={action:"condition:action"},sa={action:"script:action"},aa={action:"menu:action"},Ht={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute",seek:"sound:seek"},re={action:"control:action",do:"control:do",doAsync:"control:doAsync",any:"control:any",all:"control:all",allAsync:"control:allAsync",repeat:"control:repeat",while:"control:while",break:"control:break",sleep:"control:sleep",waitForClick:"control:waitForClick",label:"control:label",jump:"control:jump"},Wi={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},ei={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},Tn={action:"layer:action",setZIndex:"layer:setZIndex"},Et={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"},en={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 la=(d=>(d[d.string=0]="string",d[d.number=1]="number",d[d.boolean=2]="boolean",d[d.object=3]="object",d[d.array=4]="array",d[d.function=5]="function",d[d.symbol=6]="symbol",d[d.undefined=7]="undefined",d[d.null=8]="null",d[d.date=9]="date",d[d.regexp=10]="regexp",d[d.other=11]="other",d))(la||{}),dr=(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});dr.DataTypes=la;function j(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,l)=>dr(a)===3&&dr(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 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=mr()}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=>{t.fail(i),e.forEach(r=>{r!==n&&r.abort()})})}),t.registerSkipController(new V(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new 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 ca(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 Gn(o){return typeof o=="string"?o:`#${(o.r||0).toString(16).padStart(2,"0")}${(o.g||0).toString(16).padStart(2,"0")}${(o.b||0).toString(16).padStart(2,"0")}${o.a===void 0?"":o.a.toString(16).padStart(2,"0")}`}var X=class{constructor(){this.events={};this.maxListeners=10}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),this.events[e].length>this.maxListeners&&console.warn(`NarraLeaf-React: Event ${e} has more than ${this.maxListeners} listeners (total: ${this.events[e].length}), this may cause performance issues.`),this.emit("event:EventDispatcher.register",e,t),{type:e,listener:t,cancel:()=>{this.off(e,t)}}}depends(e){return{cancel:()=>{e.forEach(t=>t.cancel())}}}off(e,t){this.events[e]&&(this.events[e]=this.events[e].filter(n=>n!==t))}emit(e,...t){if(!this.events[e])return 0;let n=this.events[e].length;return this.events[e].forEach(i=>{i(...t)}),n}once(e,t){let n=(...i)=>{t(...i),this.off(e,n)};return this.on(e,n)}async any(e,...t){if(this.events[e]||(this.events[e]=[]),this.events[e].length>0){await Promise.all(this.events[e].map(n=>n(...t)));return}return new Promise(n=>{let i="event:EventDispatcher.register",r=this.on(i,(s,a)=>{if(s===e){this.off(i,r);let 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 mr(o=1){let e=new Error().stack;return e?e.split(`
|
|
2
2
|
`).slice(o+1).join(`
|
|
3
|
-
`).trim():""}function Yi(o){return new Promise(e=>setTimeout(e,o))}var _i=class _i{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(_i.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};_i.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=_i;var ti=class{constructor(){this.locked=!1;this.listeners=[];this.unlockListeners=[]}lock(){return this.locked=!0,this}unlock(){this.locked=!1;for(let e of this.listeners)e();for(let e of this.unlockListeners)e();return this.listeners=[],this}onUnlock(e){return this.unlockListeners.push(e),e}offUnlock(e){this.unlockListeners=this.unlockListeners.filter(t=>t!==e)}async nextUnlock(){if(this.locked)return new Promise(e=>{this.listeners.push(e)})}isLocked(){return this.locked}},Mn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new ti;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 Fn(o,e,t={}){return o?e:t}function ca(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var zi=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 ua(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 pa(o,e){let n=await(await fetch(o,e)).blob();return{url:URL.createObjectURL(n),bytes:n.size}}var Nn=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 Yi(this.delay),await e())};await e()}};function at(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function da(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 ma(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 fa(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ni(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function mr(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"&&!mr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Ki=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Xi(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 ha(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var $i=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},ji=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 qi=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 ga(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 ya(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,l=16777216,c=r*a>>>0,u=r*l+s*a>>>0,p=s*l+(u>>>0)>>>0;e=c,t=p}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var ii=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=dr(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}abandon(e){}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};ii.ActionTypes={action:"action"};var _=class extends ii{constructor(e,t,n){super(e,t,n),this.callee=e.getSelf(),this.contentNode.action=this}unknownTypeError(){throw new Error("Unknown action type: "+this.type)}resolveAwaitable(e,t){let n=t||new S(i=>i);return(async()=>await e(n.resolve.bind(n),n))(),n}is(e,t){return this instanceof e&&this.type===t}stringify(e,t,n){return this.stringifyWithName("Action")}stringifyWithName(e){return`${e}#${this._id}(${this.type})`}stringifyWithContent(e,t){return`${e}#${this._id}(${this.type}){${t}}`}};var ve=class ve extends _{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await ve.initBackgroundMusic(e,r,n),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t,n){n?.isSceneSuspended(e)||e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new J("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);if(t.addElement(r),t.setSceneSuspended(n,e.element.suspended===!0),n.local.getNamespace(t.getStorable()).load(e.local),e.state){let[,s]=t.getLiveGame().constructMaps();n.fromData(e.state,s)}e.background&&n.background.fromData(e.background)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new V(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),l=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{r.isSettled()||r.abort(),a.abort()}),r}static unloadScene(e,t){t.settlePendingLines(e),t.getStorable().removeNamespace(e.local.getNamespaceName()),t.offSrcManager(e.srcManager).removeScene(e),e.state.backgroundImage.reset()}static unwindCallStack(e){let t=e.getSuspendedScenes(),n=t.map(i=>[i,ve.createSceneSnapshot(i,e)]);return t.forEach(i=>{i.events.emit("event:scene.preUnmount"),ve.unloadScene(i,e)}),n}static rewindCallStack(e,t){e.forEach(([n,i])=>{let r=new S(s=>s);t.timelines.attachTimeline(r),ve.handleSceneInit(n,{type:B.callTo,node:null},t,r),ve.restoreSceneSnapshot(i,t),t.setSceneSuspended(n,!0)})}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}abandon(e){if(this.type!==B.resume)return;let t=this.contentNode.getContent()[0],n=this.callee,i=n.state.backgroundMusic;e.isSceneActive(t)&&(t.events.emit("event:scene.preUnmount"),ve.unloadScene(t,e)),e.setSceneSuspended(n,!1),i&&e.audioManager.isManaged(i)&&e.audioManager.resume(i,n.config.backgroundMusicFade)}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new S(c=>c),l=null;return a.registerSkipController(new V(()=>(l&&(clearTimeout(l),l=null),s))),l=e.setTimeout(()=>{l=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===B.action)return super.executeAction(e,t);if(this.is(ve,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{ve.unloadScene(this.callee,e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return ve.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===B.exit){let n=ve.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),ve.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),ve.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===B.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize(),s=ve.unwindCallStack(e);e.actionHistory.push({action:this,stackModel:t.stackModel},(l,c)=>{ve.rewindCallStack(c,e);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(l,u)},[r,s]);let a=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:a}),null}else if(this.type===B.preSuspend){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));if(e.isSceneActive(i))throw new J(`Cannot call scene ${this.getSceneName(n)}: it is already on stage.
|
|
3
|
+
`).trim():""}function Qi(o){return new Promise(e=>setTimeout(e,o))}var _i=class _i{constructor(e){this.abortHandler=e;this.events=new X;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(_i.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};_i.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=_i;var ti=class{constructor(){this.locked=!1;this.listeners=[];this.unlockListeners=[]}lock(){return this.locked=!0,this}unlock(){this.locked=!1;for(let e of this.listeners)e();for(let e of this.unlockListeners)e();return this.listeners=[],this}onUnlock(e){return this.unlockListeners.push(e),e}offUnlock(e){this.unlockListeners=this.unlockListeners.filter(t=>t!==e)}async nextUnlock(){if(this.locked)return new Promise(e=>{this.listeners.push(e)})}isLocked(){return this.locked}},Mn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new ti;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 Fn(o,e,t={}){return o?e:t}function ua(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var zi=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 pa(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 da(o,e){let n=await(await fetch(o,e)).blob();return{url:URL.createObjectURL(n),bytes:n.size}}var Nn=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 Qi(this.delay),await e())};await e()}};function st(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function ma(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 fa(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 ha(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ni(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function fr(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"&&!fr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Ki=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Yi(o=16){let e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=t.length;for(let i=0;i<o;i++)e+=t.charAt(Math.floor(Math.random()*n));return e}function ga(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var $i=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},ji=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 qi=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 ya(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 va(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,l=16777216,c=r*a>>>0,u=r*l+s*a>>>0,p=s*l+(u>>>0)>>>0;e=c,t=p}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var ii=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=mr(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}abandon(e){}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};ii.ActionTypes={action:"action"};var _=class extends ii{constructor(e,t,n){super(e,t,n),this.callee=e.getSelf(),this.contentNode.action=this}unknownTypeError(){throw new Error("Unknown action type: "+this.type)}resolveAwaitable(e,t){let n=t||new S(i=>i);return(async()=>await e(n.resolve.bind(n),n))(),n}is(e,t){return this instanceof e&&this.type===t}stringify(e,t,n){return this.stringifyWithName("Action")}stringifyWithName(e){return`${e}#${this._id}(${this.type})`}stringifyWithContent(e,t){return`${e}#${this._id}(${this.type}){${t}}`}};var ve=class ve extends _{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await ve.initBackgroundMusic(e,r,n),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t,n){n?.isSceneSuspended(e)||e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new J("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);if(t.addElement(r),t.setSceneSuspended(n,e.element.suspended===!0),n.local.getNamespace(t.getStorable()).load(e.local),e.state){let[,s]=t.getLiveGame().constructMaps();n.fromData(e.state,s)}e.background&&n.background.fromData(e.background)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new V(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),l=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{r.isSettled()||r.abort(),a.abort()}),r}static unloadScene(e,t){t.settlePendingLines(e),t.getStorable().removeNamespace(e.local.getNamespaceName()),t.offSrcManager(e.srcManager).removeScene(e),e.state.backgroundImage.reset()}static unwindCallStack(e){let t=e.getSuspendedScenes(),n=t.map(i=>[i,ve.createSceneSnapshot(i,e)]);return t.forEach(i=>{i.events.emit("event:scene.preUnmount"),ve.unloadScene(i,e)}),n}static rewindCallStack(e,t){e.forEach(([n,i])=>{let r=new S(s=>s);t.timelines.attachTimeline(r),ve.handleSceneInit(n,{type:B.callTo,node:null},t,r),ve.restoreSceneSnapshot(i,t),t.setSceneSuspended(n,!0)})}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}abandon(e){if(this.type!==B.resume)return;let t=this.contentNode.getContent()[0],n=this.callee,i=n.state.backgroundMusic;e.isSceneActive(t)&&(t.events.emit("event:scene.preUnmount"),ve.unloadScene(t,e)),e.setSceneSuspended(n,!1),i&&e.audioManager.isManaged(i)&&e.audioManager.resume(i,n.config.backgroundMusicFade)}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new S(c=>c),l=null;return a.registerSkipController(new V(()=>(l&&(clearTimeout(l),l=null),s))),l=e.setTimeout(()=>{l=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===B.action)return super.executeAction(e,t);if(this.is(ve,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{ve.unloadScene(this.callee,e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return ve.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===B.exit){let n=ve.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),ve.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),ve.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===B.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize(),s=ve.unwindCallStack(e);e.actionHistory.push({action:this,stackModel:t.stackModel},(l,c)=>{ve.rewindCallStack(c,e);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(l,u)},[r,s]);let a=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:a}),null}else if(this.type===B.preSuspend){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));if(e.isSceneActive(i))throw new J(`Cannot call scene ${this.getSceneName(n)}: it is already on stage.
|
|
4
4
|
A returnable jump suspends the scene it leaves rather than unloading it, so a scene cannot be called from itself or from anything it has called.`,this);if(e.isSceneSuspended(this.callee))throw this._callerAlreadyParkedError(n);let r=e.getSuspendedScenes().length,s=e.game.config.maxSceneCallDepth;if(r>=s)throw new J(`Scene call depth limit reached (${s}).
|
|
5
5
|
Each returnable jump keeps the scene it left mounted, so a chain of them holds every scene in the chain on the stage at once. Raise maxSceneCallDepth if the story really needs to go this deep.`,this);let a=this.callee.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{a&&e.audioManager.isManaged(a)&&e.audioManager.resume(a,0)},[]),a&&e.audioManager.isManaged(a)&&e.audioManager.pause(a,this.callee.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===B.callTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=this.contentNode.getChild();if(!r?.action)throw new Ce("A scene call has no return address. `scene:callTo` is only ever built with a `scene:resume` chained behind it (see Scene._callScene).");let s=this.callee;if(e.isSceneSuspended(s))throw this._callerAlreadyParkedError(n);let a=e.getLiveGame().getStackModelForce().serialize();e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{e.setSceneSuspended(s,!1);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(c,u)},[a]),e.setSceneSuspended(s,!0);let l=i.getSceneRoot().contentNode;return[{type:this.type,node:r},{type:this.type,node:l}]}else if(this.type===B.resume){let n=this.contentNode.getContent()[0],i=this.callee,r=i.state.backgroundMusic,s=ve.createSceneSnapshot(n,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let l=new S(c=>c);e.timelines.attachTimeline(l),ve.handleSceneInit(n,{type:this.type,node:this.contentNode.getChild()},e,l),ve.restoreSceneSnapshot(a,e),e.setSceneSuspended(i,!0),r&&e.audioManager.isManaged(r)&&e.audioManager.pause(r,0)},[s]),n.events.emit("event:scene.preUnmount"),ve.unloadScene(n,e),e.setSceneSuspended(i,!1),r&&e.audioManager.isManaged(r)&&e.audioManager.resume(r,i.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===B.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===B.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===B.transitionToScene){let[n,i]=this.contentNode.getContent();return this.applyStageTransition(e,n,i,t)}else if(this.type===B.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===B.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===B.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===B.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===B.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===B.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===B.nvlBlock){let[i]=this.contentNode.getContent(),r=super.getFutureActions(e,t);return[...i??[],...r]}let n=this.contentNode.getChild()?.action;return n?[n]:[]}_sceneNotFoundError(e){return new J(`Scene with name ${e} not found
|
|
6
6
|
Make sure you have registered the scene using story.register`,this)}_callerAlreadyParkedError(e){let t=this.getSceneName(this.callee);return new J(`Cannot call scene ${this.getSceneName(e)} from ${t}: ${t} is already parked behind another call.
|
|
7
|
-
A returnable jump suspends the scene it is taken from, and a scene has one place on the stage, so two calls cannot be open from the same scene at the same time. Take the calls one after the other in a single branch rather than one per branch of a concurrent group.`,this)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===B.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===B.jumpTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`jumpTo {${i.stringify(e,t,n)}}`)}return super.stringifyWithName("SceneAction")}};ve.ActionTypes=B;var ne=ve;var fr=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},C=class o extends fr{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 Sa}from"motion/react";var On=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(On||{}),va={left:"33.33%",center:"50%",right:"66.66%"},ht=class ht{static isUnknown(e){return e===ht.Unknown}static D2PositionToCSS(e,t=!1,n=!1,i){let r=this.calc(e.y,e.yoffset,i?.height),s=this.calc(e.x,e.xoffset,i?.width),a=n?{bottom:r}:{top:r},l=t?{right:s}:{left:s};return this.wrap({...a,...l})}static calc(e,t,n){if(e==null||e===""||ht.isUnknown(e))return"auto";let i=!(t===void 0||ht.isUnknown(t));if(typeof n=="number"&&n>0){let s=ht.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}let r=typeof e=="number"?`${e}px`:e;return i?`calc(${r} + ${t}px)`:`calc(${r} + 0px)`}static toPercent(e,t){if(typeof e=="number")return t>0?e/t*100:null;let n=/^(-?\d+(?:\.\d+)?)%$/.exec(e.trim());return n?parseFloat(n[1]):null}static toCoord2D(e){if(lt.isCommonPositionType(e))return gt.fromCommonPosition(e);if(gt.isCoord2DPosition(e))return e;if(An.isAlignPosition(e))return gt.fromAlignPosition(e);if(typeof e=="object"&&e!==null&&["x","y","xalign","yalign","xoffset","yoffset"].some(t=>t in e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static orUnknown(e){return ht.isUnknown(e)||e===void 0?ht.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return gt.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:ht.isUnknown(t.x)?0:t.x,y:ht.isUnknown(t.y)?0:t.y,xoffset:ht.isUnknown(t.xoffset)?0:t.xoffset,yoffset:ht.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(On).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 An}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 H=ht,Ji=class Ji{static isCommonPositionType(e){return e instanceof Ji}constructor(e){this.position=e}toCSS(){return{x:va[this.position],y:"50%",xoffset:0,yoffset:0}}};Ji.Positions=On;var lt=Ji,gt=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:va[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>typeof n!="number"||!Number.isFinite(n)?H.Unknown:`${n*100}%`;return new o({x:t(e.xalign),y:t(e.yalign),xoffset:e.xoffset,yoffset:e.yoffset})}static merge(e,t){return new o({x:H.isUnknown(t.x)?e.x:t.x,y:H.isUnknown(t.y)?e.y:t.y,xoffset:H.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:H.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=H.orUnknown(e.x),this.y=H.orUnknown(e.y),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.x=H.orUnknown(e),this.y=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){let e=t=>/^-?\d+(\.\d+)?%$/.test(t);if(typeof this.x=="string"&&!e(this.x))throw new Error(`Invalid x position: ${this.x}`);if(typeof this.y=="string"&&!e(this.y))throw new Error(`Invalid y position: ${this.y}`)}toCSS(){return{x:this.x,y:this.y,xoffset:this.xoffset,yoffset:this.yoffset}}},An=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=H.orUnknown(e.xalign),this.yalign=H.orUnknown(e.yalign),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.xalign=H.orUnknown(e),this.yalign=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){if(typeof this.xalign=="number"&&isNaN(this.xalign))throw new Error("Invalid xalign position: "+this.xalign);if(typeof this.yalign=="number"&&isNaN(this.yalign))throw new Error("Invalid yalign position: "+this.yalign)}toCSS(){return{x:H.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:H.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var K=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new hr(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}},hr=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(j({},this.config))}join(e){let t=da(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 tu={[Qi.left]:"25.33%",[Qi.center]:"50%",[Qi.right]:"75.66%"},Dt=class Dt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new Dt(Dt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){if("position"in e&&"position"in t){let n=this.mergePosition(e.position,t.position);return{...Object.assign({},e,t),position:n}}return{...Object.assign({},e,t)}}get(){return this.state}freeze(){return this.frozen=!0,this}assign(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Dt.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 ni(Z.constructStyle(e,this.state,t))}toStyle(e,t){return ni(Z.constructStyle(e,this.state,t))}serialize(){return Dt.TransformStateSerializer.serialize(this.state)}clone(){return new Dt(Dt.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=Dt.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}};Dt.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}),Dt.TransformStateSerializer=new qe({position:e=>H.serializePosition(H.tryParsePosition(e))},{position:e=>H.toCoord2D(e)});var ie=Dt,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)||gt.isCoord2DPosition(e)||An.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?H.isRawPosition(e)?H.D2PositionToCSS(H.rawPositionToCoord2D(e),n,t,i):H.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...j(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,l=function(d,g,y){return typeof d>"u"?typeof y<"u"?g(y):"":g(d)},c=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${c}, ${u})`,l(t.rotation,d=>`rotate(${d}deg)`,0),l(t.scaleX,d=>`scaleX(${d*a})`,1),l(t.scaleY,d=>`scaleY(${d*a})`,1)].filter(Boolean).join(" ")}static constructStyle(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{overwrite:s}=n||{},a=e.game?.config,l=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...Le.positionToCSS(t.position,i,r,l),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?Gn(t.fontColor):void 0,transform:Le.propToCSSTransform(e,t),...Le.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i,companionRefs:r}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:s,sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(m=>!!m.ref.current).map(({ref:m,project:f})=>({el:m.current,project:f}))});if(a.length||t.logger.warn("Transform","No sequences to animate."),l.repeat!==void 0&&!Number.isFinite(l.repeat))throw new J("A transform applied with `transform()` (or `show`, `hide`, `pos`, ...) has to end, but this one repeats forever.\nUse `element.loop(transform)` for a motion that runs until it is stopped - the line does not wait for it, and `element.stopLoop()` ends it.");let c=!1,u=e.lock(),p=Sa(a,l),d=()=>{e.overwrite(u,s.get()).unlock(u),p.complete(),c=!0},g=new S().registerSkipController(new V(d)),y=()=>{c||e.overwrite(u,s.get()).unlock(u),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),g.resolve()};return p.then(y,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{y()}catch{g.resolve()}})),p.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:s,sequences:a,options:l},this),g}startLoop(e,{gameState:t,ref:n,overwrites:i,companionRefs:r},s){if(!n.current)throw new Error("No ref found when looping.");this.commit();let{sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(p=>!!p.ref.current).map(({ref:p,project:d})=>({el:p.current,project:d}))});a.length||t.logger.warn("Transform","No sequences to loop.");let c=[n.current,ni(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{...Le.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i,companions:r}){let s=t.clone(),a=s.lock(),l=this.sequences.flatMap(({props:c,options:u})=>{let p=s.assign(a,c),d=p.toFramesDefinition(e,n),g=this.getOptions(u),y=[i,d,g];if(!r||!r.length)return[y];let m=p.get();return[y,...r.map(({el:f,project:b})=>[f,ni(b(m)),{...g,at:"<"}])]});return{finalState:s.unlock(a).freeze(),sequences:l,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t,repeatType:n}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0),repeatType:n}}copy(){return new Le(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}lens(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new J("Invalid at definition. At definition must be a number or a string in the format of `+n` or `-n`.");let[i,r,s]=n,a=Number(s);if(isNaN(a))throw new J("Invalid number in at definition.");let l=a/1e3;return r==="+"?`+${l}`:`-${l}`}};Le.defaultConfig={sync:!0},Le.defaultOptions={duration:0,ease:"linear"},Le.CommonImagePositionMap=tu;var Z=Le;var Zi=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 ba=Symbol("_Chained"),Ta;Ta=ba;var gr=class gr{constructor(e){this[Ta]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[ba]}static toActions(e){return e.flat(2).map(t=>gr.isChained(t)?t.fromChained(t):t).flat(3)}push(...e){this.__actions.push(...e)}getActions(){return this.__actions}getSelf(){return this.__self}newChain(){return this.getSelf().chain()}},ze=gr,Hn=class extends Zi{chain(e){let t=ze.isChained(this)?this:this.proxy(this,new ze(this));if(!e)return t;let n=Array.isArray(e)?e:[e];return t.push(...n),t}proxy(e,t){let n=new Proxy(e,{get:function(i,r){if(r in t)return t[r];let s=i[r];return typeof s=="function"?s.bind(n):s},set:function(i,r,s){return i[r]=s,!0}});return n}combineActions(e,t){let n=t(this.chain().newChain()),i=e.do([n]).getActions()[0];return this.chain(i)}};var ce=class extends Hn{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var Vt=class extends _{executeAction(e,t){let n=this.callee.evaluate(this.contentNode.getContent(),{gameState:e});return n?.length?[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]:super.executeAction(e,t)}getFutureActions(e,t){return[...this.callee._getFutureActions(),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=s=>{let a=s.condition?n?s.condition.toString():"Lambda(unknown)":"null",l=s.action?s.action.map(c=>c.stringify(e,t,n)).join(";"):"null";return`(${a}) {${l}}`};return super.stringifyWithContent("Condition",`if ${r(i.If)} ${i.ElseIf.length>0?`else if ${i.ElseIf.map(r).join(";")} `:""}${i.Else?`else {${r(i.Else)}}`:""}`)}};Vt.ActionTypes=oa;var oi=64;function Ca(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function yr(o){return o.length?o.map(e=>typeof e=="number"?`[${e}]`:`.${e}`).join(""):"the value itself"}function eo(o,e=0,t=new Set){if(e>oi)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=>eo(n,e+1,t)):Ca(o)?Object.values(o).every(n=>eo(n,e+1,t)):!1}finally{t.delete(o)}}function xa(o,e){let t=[],n=[];return{data:vr(o,[],0,new Set,t,n,e),dates:t,undefineds:n}}function vr(o,e,t,n,i,r,s){if(t>oi)throw new E(`A stored value nests deeper than ${oi} levels and cannot be saved
|
|
8
|
-
at ${s}, ${
|
|
7
|
+
A returnable jump suspends the scene it is taken from, and a scene has one place on the stage, so two calls cannot be open from the same scene at the same time. Take the calls one after the other in a single branch rather than one per branch of a concurrent group.`,this)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===B.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===B.jumpTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`jumpTo {${i.stringify(e,t,n)}}`)}return super.stringifyWithName("SceneAction")}};ve.ActionTypes=B;var ne=ve;var hr=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},C=class o extends hr{static create(e){return new o().setContent(e)}static forEachParent(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getParent()}static forEachChild(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getChild()}constructor(e,t,n){super("ContentNode"),this.child=n||null,this.parent=t||null,this.action=e||null}setParent(e){if(e===this)throw new Error("Cannot set parent to itself");return this.parent&&this.parent.setChild(null),this.parent=e,this}setChild(e){if(e===this)throw new Error("Cannot set child to itself");return this.child&&(this.child.parent=null),this.child=e,e&&e.parent!==this&&(e.remove(),e.parent=this),this}getChild(){return this.child||null}getParent(){return this.parent||null}addChild(e){return this.setChild(e),this}removeChild(e){return e&&this.child===e?(this.child=null,e.setParent(null)):e||(this.child=null),this}remove(){return this.parent&&this.parent.removeChild(this),this.child&&this.child.setParent(null),this}hasChild(){return!!this.child}};var Xi={center:"center",left:"left",right:"right"};import{animate as ba}from"motion/react";var On=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(On||{}),Sa={left:"33.33%",center:"50%",right:"66.66%"},ft=class ft{static isUnknown(e){return e===ft.Unknown}static D2PositionToCSS(e,t=!1,n=!1,i){let r=this.calc(e.y,e.yoffset,i?.height),s=this.calc(e.x,e.xoffset,i?.width),a=n?{bottom:r}:{top:r},l=t?{right:s}:{left:s};return this.wrap({...a,...l})}static calc(e,t,n){if(e==null||e===""||ft.isUnknown(e))return"auto";let i=!(t===void 0||ft.isUnknown(t));if(typeof n=="number"&&n>0){let s=ft.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}let r=typeof e=="number"?`${e}px`:e;return i?`calc(${r} + ${t}px)`:`calc(${r} + 0px)`}static toPercent(e,t){if(typeof e=="number")return t>0?e/t*100:null;let n=/^(-?\d+(?:\.\d+)?)%$/.exec(e.trim());return n?parseFloat(n[1]):null}static toCoord2D(e){if(at.isCommonPositionType(e))return ht.fromCommonPosition(e);if(ht.isCoord2DPosition(e))return e;if(An.isAlignPosition(e))return ht.fromAlignPosition(e);if(typeof e=="object"&&e!==null&&["x","y","xalign","yalign","xoffset","yoffset"].some(t=>t in e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static orUnknown(e){return ft.isUnknown(e)||e===void 0?ft.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return ht.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:ft.isUnknown(t.x)?0:t.x,y:ft.isUnknown(t.y)?0:t.y,xoffset:ft.isUnknown(t.xoffset)?0:t.xoffset,yoffset:ft.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(On).includes(e)}static isRawCoord2DPosition(e){return typeof e=="object"&&("x"in e||"y"in e||"xoffset"in e||"yoffset"in e)}static isRawAlignPosition(e){return typeof e=="object"&&e!==null&&("xalign"in e||"yalign"in e)}static isRawPosition(e){return this.isRawCommonPositionType(e)||this.isRawCoord2DPosition(e)||this.isRawAlignPosition(e)}static isPosition(e){return e instanceof at||e instanceof ht||e instanceof An}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return ht.fromCommonPosition(new at(e));if(this.isRawAlignPosition(e))return ht.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new ht(e);throw new Error("Invalid position type")}static tryParsePosition(e){if(this.isPosition(e))return e;if(this.isRawPosition(e))return this.rawPositionToCoord2D(e);throw new Error("Invalid position type")}static wrap(e){return{left:"auto",top:"auto",right:"auto",bottom:"auto",...e}}};ft.Unknown=Symbol("Unknown");var H=ft,Ji=class Ji{static isCommonPositionType(e){return e instanceof Ji}constructor(e){this.position=e}toCSS(){return{x:Sa[this.position],y:"50%",xoffset:0,yoffset:0}}};Ji.Positions=On;var at=Ji,ht=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=>typeof n!="number"||!Number.isFinite(n)?H.Unknown:`${n*100}%`;return new o({x:t(e.xalign),y:t(e.yalign),xoffset:e.xoffset,yoffset:e.yoffset})}static merge(e,t){return new o({x:H.isUnknown(t.x)?e.x:t.x,y:H.isUnknown(t.y)?e.y:t.y,xoffset:H.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:H.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=H.orUnknown(e.x),this.y=H.orUnknown(e.y),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.x=H.orUnknown(e),this.y=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){let e=t=>/^-?\d+(\.\d+)?%$/.test(t);if(typeof this.x=="string"&&!e(this.x))throw new Error(`Invalid x position: ${this.x}`);if(typeof this.y=="string"&&!e(this.y))throw new Error(`Invalid y position: ${this.y}`)}toCSS(){return{x:this.x,y:this.y,xoffset:this.xoffset,yoffset:this.yoffset}}},An=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=H.orUnknown(e.xalign),this.yalign=H.orUnknown(e.yalign),this.xoffset=H.orUnknown(e.xoffset),this.yoffset=H.orUnknown(e.yoffset)):(this.xalign=H.orUnknown(e),this.yalign=H.orUnknown(t),this.xoffset=H.Unknown,this.yoffset=H.Unknown),this.check()}check(){if(typeof this.xalign=="number"&&isNaN(this.xalign))throw new Error("Invalid xalign position: "+this.xalign);if(typeof this.yalign=="number"&&isNaN(this.yalign))throw new Error("Invalid yalign position: "+this.yalign)}toCSS(){return{x:H.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:H.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var K=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new gr(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}},gr=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(j({},this.config))}join(e){let t=ma(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 nu={[Xi.left]:"25.33%",[Xi.center]:"50%",[Xi.right]:"75.66%"},Dt=class Dt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new Dt(Dt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){if("position"in e&&"position"in t){let n=this.mergePosition(e.position,t.position);return{...Object.assign({},e,t),position:n}}return{...Object.assign({},e,t)}}get(){return this.state}freeze(){return this.frozen=!0,this}assign(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=Dt.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 ni(Z.constructStyle(e,this.state,t))}toStyle(e,t){return ni(Z.constructStyle(e,this.state,t))}serialize(){return Dt.TransformStateSerializer.serialize(this.state)}clone(){return new Dt(Dt.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=Dt.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}};Dt.DefaultTransformState=new K({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new at("center"),opacity:0,alt:"",maskImage:void 0,maskSize:void 0,maskPosition:void 0,maskRepeat:void 0,maskMode:void 0,clipPath:void 0,filter:void 0,backdropFilter:void 0,mixBlendMode:void 0}),Dt.TransformStateSerializer=new qe({position:e=>H.serializePosition(H.tryParsePosition(e))},{position:e=>H.toCoord2D(e)});var ie=Dt,Le=class Le{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Le.defaultConfig,t||{});else{let[n,i]=[e,t||Le.defaultOptions];this.sequences.push({props:n,options:i||Le.defaultOptions}),this.config=Object.assign({},Le.defaultConfig)}}static isPosition(e){return at.isCommonPositionType(e)||ht.isCoord2DPosition(e)||An.isAlignPosition(e)}static immediate(e){return new Le(e,{duration:0,ease:"linear"})}static left(e,t){return new Le({position:at.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Le({position:at.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Le({position:at.Positions.Center},{duration:e,ease:t})}static create(e){return new Le([],e)}static positionToCSS(e,t,n,i){return e?H.isRawPosition(e)?H.D2PositionToCSS(H.rawPositionToCoord2D(e),n,t,i):H.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?H.toCoord2D(H.tryParsePosition(e||t)):H.mergePosition(H.tryParsePosition(e),H.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...j(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,l=function(d,h,f){return typeof d>"u"?typeof f<"u"?h(f):"":h(d)},c=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${c}, ${u})`,l(t.rotation,d=>`rotate(${d}deg)`,0),l(t.scaleX,d=>`scaleX(${d*a})`,1),l(t.scaleY,d=>`scaleY(${d*a})`,1)].filter(Boolean).join(" ")}static constructStyle(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{overwrite:s}=n||{},a=e.game?.config,l=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...Le.positionToCSS(t.position,i,r,l),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?Gn(t.fontColor):void 0,transform:Le.propToCSSTransform(e,t),...Le.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i,companionRefs:r}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:s,sequences:a,options:l}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current,companions:r?.filter(m=>!!m.ref.current).map(({ref:m,project:g})=>({el:m.current,project:g}))});if(a.length||t.logger.warn("Transform","No sequences to animate."),l.repeat!==void 0&&!Number.isFinite(l.repeat))throw new J("A transform applied with `transform()` (or `show`, `hide`, `pos`, ...) has to end, but this one repeats forever.\nUse `element.loop(transform)` for a motion that runs until it is stopped - the line does not wait for it, and `element.stopLoop()` ends it.");let c=!1,u=e.lock(),p=ba(a,l),d=()=>{e.overwrite(u,s.get()).unlock(u),p.complete(),c=!0},h=new S().registerSkipController(new V(d)),f=()=>{c||e.overwrite(u,s.get()).unlock(u),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),h.resolve()};return p.then(f,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""));try{f()}catch{h.resolve()}})),p.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(p=>!!p.ref.current).map(({ref:p,project:d})=>({el:p.current,project:d}))});a.length||t.logger.warn("Transform","No sequences to loop.");let c=[n.current,ni(e.toFramesDefinition(t,i)),{duration:0}],u=ba([c,...a],{...l,repeat:1/0,repeatType:s?.repeatType??l.repeatType??"loop",repeatDelay:s?.repeatDelay!==void 0?this.toSeconds(s.repeatDelay,void 0):l.repeatDelay});return u.play(),t.logger.debug("Transform","Loop started.",{sequences:a,options:l},this),{stop:()=>{u.stop()}}}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...Le.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i,companions:r}){let s=t.clone(),a=s.lock(),l=this.sequences.flatMap(({props:c,options:u})=>{let p=s.assign(a,c),d=p.toFramesDefinition(e,n),h=this.getOptions(u),f=[i,d,h];if(!r||!r.length)return[f];let m=p.get();return[f,...r.map(({el:g,project:b})=>[g,ni(b(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 Le(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}lens(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new J("Invalid at definition. At definition must be a number or a string in the format of `+n` or `-n`.");let[i,r,s]=n,a=Number(s);if(isNaN(a))throw new J("Invalid number in at definition.");let l=a/1e3;return r==="+"?`+${l}`:`-${l}`}};Le.defaultConfig={sync:!0},Le.defaultOptions={duration:0,ease:"linear"},Le.CommonImagePositionMap=nu;var Z=Le;var Zi=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 Ta=Symbol("_Chained"),Aa;Aa=Ta;var yr=class yr{constructor(e){this[Aa]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[Ta]}static toActions(e){return e.flat(2).map(t=>yr.isChained(t)?t.fromChained(t):t).flat(3)}push(...e){this.__actions.push(...e)}getActions(){return this.__actions}getSelf(){return this.__self}newChain(){return this.getSelf().chain()}},ze=yr,Hn=class extends Zi{chain(e){let t=ze.isChained(this)?this:this.proxy(this,new ze(this));if(!e)return t;let n=Array.isArray(e)?e:[e];return t.push(...n),t}proxy(e,t){let n=new Proxy(e,{get:function(i,r){if(r in t)return t[r];let s=i[r];return typeof s=="function"?s.bind(n):s},set:function(i,r,s){return i[r]=s,!0}});return n}combineActions(e,t){let n=t(this.chain().newChain()),i=e.do([n]).getActions()[0];return this.chain(i)}};var ue=class extends Hn{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var Vt=class extends _{executeAction(e,t){let n=this.callee.evaluate(this.contentNode.getContent(),{gameState:e});return n?.length?[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]:super.executeAction(e,t)}getFutureActions(e,t){return[...this.callee._getFutureActions(),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=s=>{let a=s.condition?n?s.condition.toString():"Lambda(unknown)":"null",l=s.action?s.action.map(c=>c.stringify(e,t,n)).join(";"):"null";return`(${a}) {${l}}`};return super.stringifyWithContent("Condition",`if ${r(i.If)} ${i.ElseIf.length>0?`else if ${i.ElseIf.map(r).join(";")} `:""}${i.Else?`else {${r(i.Else)}}`:""}`)}};Vt.ActionTypes=ra;var oi=64;function xa(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function vr(o){return o.length?o.map(e=>typeof e=="number"?`[${e}]`:`.${e}`).join(""):"the value itself"}function eo(o,e=0,t=new Set){if(e>oi)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=>eo(n,e+1,t)):xa(o)?Object.values(o).every(n=>eo(n,e+1,t)):!1}finally{t.delete(o)}}function wa(o,e){let t=[],n=[];return{data:Sr(o,[],0,new Set,t,n,e),dates:t,undefineds:n}}function Sr(o,e,t,n,i,r,s){if(t>oi)throw new E(`A stored value nests deeper than ${oi} levels and cannot be saved
|
|
8
|
+
at ${s}, ${vr(e)}
|
|
9
9
|
A saved game this deep is almost always a data-structure bug. Flatten the value,
|
|
10
10
|
or keep the deep part outside the store and save an id for it.`);if(o===void 0)return r.push([...e]),null;if(o===null)return null;if(o instanceof Date)return i.push([...e]),o.toISOString();if(typeof o=="number"||typeof o=="string"||typeof o=="boolean")return o;if(typeof o=="object"){if(n.has(o))throw new E(`A stored value refers back to itself and cannot be saved
|
|
11
|
-
at ${s}, ${
|
|
11
|
+
at ${s}, ${vr(e)}
|
|
12
12
|
A saved game is a tree. Cutting the back-edge would save a different object graph
|
|
13
13
|
than the one you built, so this is refused rather than guessed at \u2014 break the
|
|
14
|
-
reference, or store an id in place of the object.`);if(Array.isArray(o)||
|
|
15
|
-
at ${s}, ${
|
|
16
|
-
at namespace "${this.name}"`),this.content[e]=t,this.reportChange(e,n,t),this)}get(e){return this.content[e]}equals(e,t){return this.content[e]===t}assign(e){return Object.entries(e).forEach(([t,n])=>{this.set(t,n)}),this}has(e){return this.content[e]!==void 0}keys(){return Object.keys(this.content)}values(){return Object.values(this.content)}entries(){return Object.entries(this.content)}reset(){let e=this.content;return this.content=j({},this.defaultContent),new Set([...Object.keys(e),...Object.keys(this.content)]).forEach(n=>{this.reportChange(n,e[n],this.content[n])}),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n,t)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)}),this.owner?.reportRestore(this.key)}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e,t){let n=`namespace "${this.name}"`+(t===void 0?"":`, key "${t}"`),i={any:s=>{let a=
|
|
17
|
-
at namespace "${this.name}"`),e?.data)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||
|
|
18
|
-
Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(pn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(pn.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 Ut(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(pn.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(pn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(pn.EventTypes["event:storable.restore"],{namespaces:[e]})}};pn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var ri=pn;var qf={};var Vn=class extends Hn{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 et=class extends _{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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=Ht;var tt={bgm:"bgm",sound:"sound",voice:"voice"},to=8,dn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Un(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ai=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:Un(l.volume)})};Object.values(tt).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 dn(`Audio bus id must be a non-empty string, got ${JSON.stringify(c)}.`);if(i.has(c))throw new dn(`Audio bus "${c}" is declared more than once.`);i.add(c),n(l)}),o.assertResolvable(t);let r=[],s=new Map,a=l=>{let c=s.get(l);if(c)return c;let u=t.get(l),p=u.parentId===null?null:a(u.parentId),d={id:u.id,parentId:u.parentId,volume:u.volume,depth:p?p.depth+1:1};return s.set(l,d),r.push(d),d};return t.forEach(l=>a(l.id)),new o(r,s)}static isSeeded(e){return Object.values(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 dn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new dn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>to)throw new dn(`Audio bus "${t.id}" nests deeper than ${to}: ${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<=to;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},Tr=ai.resolve();function iu(o){Tr=o}function Ar(){return Tr}function no(o,e){let t=Tr;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var Pa={[tt.bgm]:"bgmVolume",[tt.sound]:"soundVolume",[tt.voice]:"voiceVolume"};function Ea(o){let e={};return Object.entries(Pa).forEach(([t,n])=>{e[t]={get:()=>Un(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var si=class si{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,Un(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(si.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ai.resolve(this.declarations()??[]),iu(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Un(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?Un(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Un(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(si.EventTypes["event:audioBus.volumeChange"],e)}};si.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var li=si;var Da=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(Da||{}),xe=class xe extends ce{static toSound(e){return e==null?null:typeof e=="string"?new xe({src:e}):e}static isSound(e){return e instanceof xe}static voice(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=xe.DefaultUserConfig.create(t),[i]=n.extract(xe.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e,t){return Ar().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,waitForEnd:t?.waitForEnd===!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:xe.StateSerializer.serialize(this.state)}}fromData(e){return this.state=xe.StateSerializer.deserialize(e.state),this}copy(){return new xe(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return xe.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new et(this.chain(),e,new C().setContent(t)))}};xe.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",xe.DefaultUserConfig=new K({src:xe.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultConfig=new K({src:xe.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultState=new K({volume:1,rate:1,paused:!1,muted:!1}),xe.StateSerializer=new qe;var ge=xe;var Cn=class Cn{constructor(){this.src=[];this.future=[]}static catSrc(e){let t=new Set,n=new Set,i=new Set;return e.forEach(({type:r,src:s})=>{r===Cn.SrcTypes.image?t.add(s):r===Cn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof O?O.getSrcURL(e):e.type==="image"?O.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ne,B.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(k.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof Se){let n=t;if(t.is(Se,ft.setSrc)){let i=t.contentNode.getContent()[0];if(k.isImageSrc(i))return{type:"image",src:k.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(O.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(O.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:O.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof O||k.isStaticImageData(e)){if(e instanceof O){if(!k.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(O.getSrcURL(e)))return this}else if(this.isSrcRegistered(k.srcToURL(e.src)))return this;this.src.push({type:"image",src:k.isStaticImageData(e)?k.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Cn.SrcTypes.audio?t===n.src.getSrc():n.type===Cn.SrcTypes.image?t===O.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Cn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Cn;import*as ja from"howler";var Ke=class o{static from(e){return o.isPauseConstructor(e)?new o:e}static wait(e){return new o({duration:e})}static isPause(e){return this.isPauseConstructor(e)||e instanceof o}static isPauseConstructor(e){return e===o}constructor(e={}){this.config=e}};var 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 La(o,e){let{render:t,data:n,...i}=e,r=j(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var be=class be{static isWord(e){return e instanceof be}static color(e,t){return be.isWord(e)?e.copy().assign({color:t}):new be(e,{color:t})}static bold(e){return be.isWord(e)?e.copy().assign({bold:!0}):new be(e,{bold:!0})}static italic(e){return be.isWord(e)?e.copy().assign({italic:!0}):new be(e,{italic:!0})}static emphasis(e,t={}){return be.isWord(e)?e.copy().assign({emphasis:t}):new be(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return be.isWord(e)?e.copy().assign(i):new be(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=La(be.defaultConfig,t)}evaluate(e){if(Ke.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=>be.isWord(n)?n.inherit(this.config).evaluate(e):new be(n,this.config)).flat():be.isWord(t)?t.inherit(this.config).evaluate(e):[new be(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=La(this.config,e),this}copy(){return new be(this.text,this.config)}isPause(){return Ke.isPause(this.text)}isTextEvent(){return ct.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};be.defaultConfig={},be.defaultColor="#000";var oe=be;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 oe.isWord(e)?e:new oe(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[oe.isWord(e)?e:new oe(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(ut.isSingleWord):ut.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||oe.isWord(e)||Ke.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=la(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={voice:null,character:null,voiceId:null},ut.defaultState={};var fe=ut;var io=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 mn=class extends _{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};mn.ActionTypes=ra;var we=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 mn(t,mn.ActionTypes.action,new C().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new mn(this.chain(),mn.ActionTypes.action,new C().setContent(e))]}};var ou={volume:1,limit:1/0},ru=class Ia{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={...ou,...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 Ia(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}}},Ma=!1;function su(o){Ma=o}function tn(o,e){Ma||(e!==void 0?console.warn(o,e):console.warn(o))}var au=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.onSourceEnded=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){tn("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){tn("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=()=>{this.onSourceEnded?this.onSourceEnded():this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}setSourceEndedHandler(o){this.onSourceEnded=o}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){tn("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){if(this.currentSource instanceof AudioBufferSourceNode)this.currentSource.start(o,e);else if(this.currentSource instanceof HTMLAudioElement){e>0&&(this.currentSource.currentTime=e);let t=this.currentSource.play();t&&typeof t.catch=="function"&&t.catch(n=>{tn("Failed to start HTMLAudioElement playback.",n)})}}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},Ra=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}},lu=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 au(o,this.gainNode),this.sourceController.setSourceEndedHandler(()=>this.emit("ended")),this.sourceController.setSource(e),this.applyRate(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1,this._isPaused=!1;try{this.gainNode.disconnect()}catch(e){tn("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){tn("Failed to disconnect gain node on stop().",o)}}setRate(o){return o=Math.max(.001,o),this.rate=o,this.applyRate(this.sourceController.getSource()),this}applyRate(o){o instanceof HTMLAudioElement?o.playbackRate=this.rate:o instanceof AudioBufferSourceNode&&(o.playbackRate.value=this.rate)}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new Ra(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Ra(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}},cu=class{constructor(o,e,t){this.owner=e,this.releaseDelay=t,this.references=0,this.playing=0,this.dropWhenIdle=!1,this.releaseTimer=null,this.audioBuffer=o}retain(){return this.references++,this.dropWhenIdle=!1,this.cancelPendingRelease(),this}release(){this.references>0&&this.references--,this.reconsider()}addRef(){this.playing++,this.cancelPendingRelease()}releaseRef(){this.playing>0&&this.playing--,this.reconsider()}getReferenceCount(){return this.references}getPlayingCount(){return this.playing}getRefCount(){return this.playing}async unload(){this.references=0,this.dropWhenIdle=!0,this.reconsider()}async forceUnload(){this.drop()}isAlive(){return this.audioBuffer!==null}raw(){if(!this.audioBuffer)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}byteLength(){return this.audioBuffer?this.audioBuffer.length*this.audioBuffer.numberOfChannels*4:0}isIdle(){return this.audioBuffer!==null&&this.references===0&&this.playing===0}reconsider(){if(this.isIdle()){if(this.releaseDelay>0&&!this.dropWhenIdle){this.releaseTimer||(this.releaseTimer=setTimeout(()=>{this.releaseTimer=null,this.isIdle()&&this.drop()},this.releaseDelay));return}this.drop()}}cancelPendingRelease(){this.releaseTimer&&(clearTimeout(this.releaseTimer),this.releaseTimer=null)}drop(){this.cancelPendingRelease(),this.audioBuffer&&(this.audioBuffer=null,this.references=0,this.playing=0,this.owner.evict(this))}},uu=class{constructor(o,e=0){this.cache=new Map,this.loadingPromises=new Map,this.generation=0,this.audioContext=o,this.releaseDelay=Math.max(0,e)}async load(o){return(await this.acquire(o)).retain()}async acquire(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.generation,i=this.doLoad(o);this.loadingPromises.set(o,i);try{let r=await i;return n!==this.generation?(await r.forceUnload(),r):(this.cache.set(o,r),r)}finally{this.loadingPromises.get(o)===i&&this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new cu(t,this,this.releaseDelay)}get(o){let e=this.cache.get(o);return e&&e.isAlive()?e:null}release(o){let e=this.cache.get(o);return e?(e.release(),!0):!1}async unload(o){let e=this.cache.get(o);return e?(await e.unload(),!0):!1}evict(o){for(let[e,t]of this.cache)if(t===o){this.cache.delete(e);return}}clear(){this.generation++;for(let o of Array.from(this.cache.values()))o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){let o=0;for(let e of this.cache.values())o+=e.byteLength();return{entries:this.cache.size,loading:this.loadingPromises.size,decodedBytes:o}}},pu=10*1024*1024,du={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1,cacheReleaseDelay:0},Na=class Cr{constructor(e){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...du,...e},su(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new uu(this.audioContext,this.options.cacheReleaseDelay),this.masterChannel=new ru("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(e=>{let t=()=>{if(this.destroyed){this.clearUnlockHandler(),e();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,e())}).catch(n=>{tn("Failed to resume AudioContext while unlocking.",n)})};this.unlockHandler=t,document.addEventListener("click",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",t)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let e=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",e),document.removeEventListener("touchstart",e),document.removeEventListener("keydown",e)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(e,t,n){this.ensureNotDestroyed(),this.ensureReady();let{volume:i=1,rate:r=1,startTime:s=0,endTime:a,loopStart:l,load:c="auto",loop:u=!1}=t??{},p,d=null;if(typeof e=="string")if(await this.resolveLoadMode(e,c)==="stream")p=this.createStreamSource(e);else{d=await this.audioCache.acquire(e),d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=d.raw(),p=m}else{d=e,d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=e.raw(),p=m}let g=u&&a!==void 0&&a>s?{start:Cr.clampLoopStart(l,s,a),end:a}:null;p instanceof AudioBufferSourceNode?(p.loop=u,g&&(p.loopStart=g.start,p.loopEnd=g.end)):p instanceof HTMLAudioElement&&(p.loop=u);let y=new lu(this.audioContext,p,{volume:i,rate:r,startOffset:s,duration:!u&&a?a-s:0},n);if(d){let m=!1,f=()=>{m||(m=!0,d.releaseRef?.())};y.once("ended",f),y.once("stop",f)}return y}static clampLoopStart(e,t,n){return e===void 0||!Number.isFinite(e)?t:e>=t&&e<n?e:t}async resolveLoadMode(e,t){if(t==="stream"||t==="full")return t;let n=Cr.schemeOf(e);if(n==="data:"||n==="blob:")return"full";if(n!==null&&n!=="http:"&&n!=="https:")return"stream";try{let i=await fetch(e,{method:"HEAD"});if(!i.ok)return"stream";let r=i.headers.get("Content-Length");if(!r)return"stream";let s=parseInt(r,10);return isNaN(s)?"stream":s<pu?"full":"stream"}catch(i){return tn("Failed to resolve load mode via HEAD request, falling back to 'stream'.",i),"stream"}}static schemeOf(e){try{let t=typeof location<"u"&&location?.href?location.href:void 0;return new URL(e,t).protocol}catch{return null}}createStreamSource(e){let t=new Audio(e);return t.crossOrigin="anonymous","preservesPitch"in t&&(t.preservesPitch=!1),t}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(e){this.registeredChannels.add(e)}unregisterChannel(e){this.registeredChannels.delete(e)}setVolume(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(e),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(e){return this.ensureNotDestroyed(),this.ensureReady(),e===void 0?this.masterChannel.mute():this.masterChannel.mute(e),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(e,t){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(e,t)}getChannel(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(e)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(e){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(e)}release(e){return this.ensureNotDestroyed(),this.audioCache.release(e)}async unload(e){return this.ensureNotDestroyed(),this.audioCache.unload(e)}getCached(e){return this.ensureNotDestroyed(),this.audioCache.get(e)}getCacheStats(){return this.audioCache.getStats()}async play(e,t){this.ensureNotDestroyed(),this.ensureReady();let n=this.masterChannel.getTokens();for(let i of n)try{i.stop()}catch{}return this.masterChannel.play(e,t)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(e=>{tn("Failed to close AudioContext during destroy().",e)}))}isDestroyed(){return this.destroyed}};var Ie=class Ie{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.retained=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new Na({maxChannels:Ie.MaxChannels,cacheReleaseDelay:Ie.CacheGrace});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=Ie.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,Ie.BusRampTimeConstant),r.setValueAtTime(s,a+Ie.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${tt.sound}" instead.`)),this.channels.get(tt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=Ie.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let r=await this.channelFor(e).play(e.config.src,{volume:0,...this.playOptionsOf(e)}),s=e.state.muted??!1;r.mute(s),e.state.muted=s,this.state.set(e,{token:r,originalVolume:t.end}),t.duration>0?await r.fade(0,t.end,t.duration).finished:r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,!e.config.loop&&t.waitForEnd!==!1&&await new Promise(a=>{r.once("ended",()=>a())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t=Ie.defaultFade(e)){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await n.play(e.config.src,{volume:0,...this.playOptionsOf(e)}),r=e.state.muted??!1;return i.mute(r),e.state.muted=r,this.state.set(e,{token:i,originalVolume:t.end}),t.duration>0?i.fade(0,t.end,t.duration):i.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,i}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return this.arm(e,i),t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new S;if(!this.state.has(e))return i.resolve(),i;let r=this.state.get(e);return r.originalVolume=t,n===0?(r.token.setVolume(t),e.state.volume=t,i.resolve()):r.token.fade(r.token.getVolume(),t,n).finished.then(()=>{e.state.volume=t,i.resolve()}),i}mute(e,t=!0){let n=new S;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}arm(e,t){let n=(t.transport??0)+1;return t.transport=n,()=>this.state.get(e)===t&&t.transport===n}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{if(!r()){n.resolve();return}i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,i.token.fade(0,i.originalVolume,t).finished.then(()=>{if(!r()){n.resolve();return}e.state.paused=!1,n.resolve()})),n}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=Ie.clampToRegion(t,Ie.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}playOptionsOf(e){return{...Ie.clipRegionOf(e),loop:e.config.loop,rate:e.state.rate,load:this.loadModeOf(e)}}loadModeOf(e){let{src:t,streaming:n,loop:i,endTime:r}=e.config;return t.startsWith("data:")||t.startsWith("blob:")?"full":n?"stream":this.gameState.game.config.audioStreaming==="declared"?"full":i&&r===void 0?"stream":"full"}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime(),...e.state.paused?{paused:!0}:{}}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=Ie.clipRegionOf(e),r=i.endTime!==void 0&&e.config.loop,s=await n.play(e.config.src,{volume:e.state.volume,...this.playOptionsOf(e),startTime:r?i.startTime:t.position});r&&Math.abs(t.position-i.startTime)>.01&&s.seek(Ie.clampToRegion(t.position,i)),this.state.set(e,{token:s,originalVolume:e.state.volume});let a=e.state.muted??!1;s.mute(a),e.state.muted=a;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?s.pause():t.isPlaying||s.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}preload(e){let t=e.config.src;if(this.loadModeOf(e)==="stream"||this.retained.has(t))return Promise.resolve();let n=this.ready.then(()=>this.sound.load(t)).then(()=>!0).catch(i=>(this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${t}")`,i),!1));return this.retained.set(t,n),n.then(()=>{})}retainOnly(e){let t=new Set(e.map(n=>n.config.src));for(let n of[...this.retained.keys()])t.has(n)||this.releaseSource(n);for(let n of e)this.preload(n)}getCacheStats(){return this.isReady?this.sound.getCacheStats():{entries:0,loading:0,decodedBytes:0}}releaseSource(e){let t=this.retained.get(e);t&&(this.retained.delete(e),t.then(n=>{n&&this.isReady&&this.sound.release(e)}))}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.retainOnly([]),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.retained.clear(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};Ie.MaxChannels=1024,Ie.BusRampTimeConstant=.02,Ie.BusRampSettle=Ie.BusRampTimeConstant*5,Ie.CacheGrace=5e3;var oo=Ie;function Ga(o){if(typeof MessageChannel>"u"){let n=setTimeout(o,0);return()=>clearTimeout(n)}let e=!1,t=new MessageChannel;return t.port1.onmessage=()=>{t.port1.close(),t.port2.close(),e||o()},t.port2.postMessage(void 0),()=>{e=!0}}var ro=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 vu from"html-to-image";var ke=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),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.
|
|
14
|
+
reference, or store an id in place of the object.`);if(Array.isArray(o)||xa(o)){n.add(o);try{if(Array.isArray(o))return o.map((l,c)=>Sr(l,[...e,c],t+1,n,i,r,s));let a={};return Object.entries(o).forEach(([l,c])=>{a[l]=Sr(c,[...e,l],t+1,n,i,r,s)}),a}finally{n.delete(o)}}}return console.warn(`Value of type "${iu(o)}" cannot be saved and was stored as null
|
|
15
|
+
at ${s}, ${vr(e)}`),null}function iu(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function ka(o,e,t){let n=Ca(o,e,br);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 br(o){return o instanceof Date?o:typeof o=="string"||typeof o=="number"?new Date(o):new Date(NaN)}function Pa(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function Tr(o,e,t=0){if(Object.is(o,e))return!0;if(t>oi)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)=>Tr(n,e[i],t+1));if(Pa(o)&&Pa(e)){let n=Object.keys(o);return n.length===Object.keys(e).length&&n.every(i=>Object.prototype.hasOwnProperty.call(e,i)&&Tr(o[i],e[i],t+1))}return!1}var Ut=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 eo(e)}set(e,t){let n=this.content[e];return o.isSerializable(t)?(this.content[e]=t,this.reportChange(e,n,t),this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
|
|
16
|
+
at namespace "${this.name}"`),this.content[e]=t,this.reportChange(e,n,t),this)}get(e){return this.content[e]}equals(e,t){return this.content[e]===t}assign(e){return Object.entries(e).forEach(([t,n])=>{this.set(t,n)}),this}has(e){return this.content[e]!==void 0}keys(){return Object.keys(this.content)}values(){return Object.values(this.content)}entries(){return Object.entries(this.content)}reset(){let e=this.content;return this.content=j({},this.defaultContent),new Set([...Object.keys(e),...Object.keys(this.content)]).forEach(n=>{this.reportChange(n,e[n],this.content[n])}),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n,t)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)}),this.owner?.reportRestore(this.key)}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e,t){let n=`namespace "${this.name}"`+(t===void 0?"":`, key "${t}"`),i={any:s=>{let a=wa(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=>ka(i.data,i.dates,i.undefineds),date:i=>br(i.data)}[e?.type];return n?n(e):(console.warn(`Unknown stored value type "${e?.type}", reading it as-is
|
|
17
|
+
at namespace "${this.name}"`),e?.data)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||Tr(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},pn=class pn{constructor(){this.events=new X;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new Ut(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,e.attach(this),this}getNamespace(e){if(!this.namespaces[e])throw new E(`Namespace ${e} is not initialized, did you forget to register it?
|
|
18
|
+
Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(pn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(pn.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 Ut(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(pn.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(pn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(pn.EventTypes["event:storable.restore"],{namespaces:[e]})}};pn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var ri=pn;var _f={};var Vn=class extends Hn{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 et=class extends _{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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===Ht.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=Ht;var tt={bgm:"bgm",sound:"sound",voice:"voice"},to=8,dn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Un(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ai=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:Un(l.volume)})};Object.values(tt).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 dn(`Audio bus id must be a non-empty string, got ${JSON.stringify(c)}.`);if(i.has(c))throw new dn(`Audio bus "${c}" is declared more than once.`);i.add(c),n(l)}),o.assertResolvable(t);let r=[],s=new Map,a=l=>{let c=s.get(l);if(c)return c;let u=t.get(l),p=u.parentId===null?null:a(u.parentId),d={id:u.id,parentId:u.parentId,volume:u.volume,depth:p?p.depth+1:1};return s.set(l,d),r.push(d),d};return t.forEach(l=>a(l.id)),new o(r,s)}static isSeeded(e){return Object.values(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 dn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new dn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>to)throw new dn(`Audio bus "${t.id}" nests deeper than ${to}: ${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<=to;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},Ar=ai.resolve();function ou(o){Ar=o}function Cr(){return Ar}function no(o,e){let t=Ar;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var Ea={[tt.bgm]:"bgmVolume",[tt.sound]:"soundVolume",[tt.voice]:"voiceVolume"};function Da(o){let e={};return Object.entries(Ea).forEach(([t,n])=>{e[t]={get:()=>Un(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var si=class si{constructor(e,t={}){this.declarations=e;this.events=new X;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,Un(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(si.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ai.resolve(this.declarations()??[]),ou(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Un(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?Un(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Un(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(si.EventTypes["event:audioBus.volumeChange"],e)}};si.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var li=si;var La=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(La||{}),xe=class xe extends ue{static toSound(e){return e==null?null:typeof e=="string"?new xe({src:e}):e}static isSound(e){return e instanceof xe}static voice(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=xe.DefaultUserConfig.create(t),[i]=n.extract(xe.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e,t){return Cr().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,waitForEnd:t?.waitForEnd===!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:xe.StateSerializer.serialize(this.state)}}fromData(e){return this.state=xe.StateSerializer.deserialize(e.state),this}copy(){return new xe(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return xe.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new et(this.chain(),e,new C().setContent(t)))}};xe.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",xe.DefaultUserConfig=new K({src:xe.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultConfig=new K({src:xe.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultState=new K({volume:1,rate:1,paused:!1,muted:!1}),xe.StateSerializer=new qe;var ge=xe;var Cn=class Cn{constructor(){this.src=[];this.future=[]}static catSrc(e){let t=new Set,n=new Set,i=new Set;return e.forEach(({type:r,src:s})=>{r===Cn.SrcTypes.image?t.add(s):r===Cn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof O?O.getSrcURL(e):e.type==="image"?O.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ne,B.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(P.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof Se){let n=t;if(t.is(Se,mt.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===mt.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===mt.setAppearance){let i=t.contentNode.getContent()[0];if(O.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(O.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:O.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof O||P.isStaticImageData(e)){if(e instanceof O){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(O.getSrcURL(e)))return this}else if(this.isSrcRegistered(P.srcToURL(e.src)))return this;this.src.push({type:"image",src:P.isStaticImageData(e)?P.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Cn.SrcTypes.audio?t===n.src.getSrc():n.type===Cn.SrcTypes.image?t===O.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Cn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Cn;import*as qa from"howler";var Ke=class o{static from(e){return o.isPauseConstructor(e)?new o:e}static wait(e){return new o({duration:e})}static isPause(e){return this.isPauseConstructor(e)||e instanceof o}static isPauseConstructor(e){return e===o}constructor(e={}){this.config=e}};var lt=class o{static isTextEvent(e){return e instanceof o}static expression(e,t,n={}){return new o({expression:{image:e,appearance:t},sound:n.sound})}static sound(e){return new o({sound:e})}constructor(e){this.config=e}};function Ra(o,e){let{render:t,data:n,...i}=e,r=j(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var be=class be{static isWord(e){return e instanceof be}static color(e,t){return be.isWord(e)?e.copy().assign({color:t}):new be(e,{color:t})}static bold(e){return be.isWord(e)?e.copy().assign({bold:!0}):new be(e,{bold:!0})}static italic(e){return be.isWord(e)?e.copy().assign({italic:!0}):new be(e,{italic:!0})}static emphasis(e,t={}){return be.isWord(e)?e.copy().assign({emphasis:t}):new be(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return be.isWord(e)?e.copy().assign(i):new be(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=Ra(be.defaultConfig,t)}evaluate(e){if(Ke.isPause(this.text))return[this];if(lt.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>be.isWord(n)?n.inherit(this.config).evaluate(e):new be(n,this.config)).flat():be.isWord(t)?t.inherit(this.config).evaluate(e):[new be(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=Ra(this.config,e),this}copy(){return new be(this.text,this.config)}isPause(){return Ke.isPause(this.text)}isTextEvent(){return lt.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};be.defaultConfig={},be.defaultColor="#000";var oe=be;var ct=class ct{static isSentence(e){return e instanceof ct}static toSentence(e){return ct.isSentence(e)?e:new ct(e)}static format(e){let t=[];if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(this.formatWord(e[n]));else t.push(this.formatWord(e));return t}static formatWord(e){return oe.isWord(e)?e:new oe(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[oe.isWord(e)?e:new oe(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(ct.isSingleWord):ct.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||oe.isWord(e)||Ke.isPause(e)||lt.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=ct.format(e),this.config=j(ct.defaultConfig,{...t,voice:typeof t.voice=="string"?ge.voice(t.voice):ge.toSound(t.voice)}),this.state=ca(ct.defaultState)}toData(){return null}fromData(e){return this.state=j(this.state,e),this}toString(){return this.text.map(e=>e.text).join("")}setCharacter(e){return this.config.character=e,this}evaluate(e){let t=[];for(let n=0;n<this.text.length;n++){let i=this.text[n].evaluate(e);t.push(...ct.formatStaticWord(i))}return t}copy(){return new ct([...this.text],this.config)}};ct.defaultConfig={voice:null,character:null,voiceId:null},ct.defaultState={};var fe=ct;var io=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 mn=class extends _{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};mn.ActionTypes=sa;var we=class o extends ue{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 mn(t,mn.ActionTypes.action,new C().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new mn(this.chain(),mn.ActionTypes.action,new C().setContent(e))]}};var ru={volume:1,limit:1/0},su=class Ma{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={...ru,...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 Ma(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}}},Na=!1;function au(o){Na=o}function tn(o,e){Na||(e!==void 0?console.warn(o,e):console.warn(o))}var lu=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.onSourceEnded=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){tn("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){tn("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=()=>{this.onSourceEnded?this.onSourceEnded():this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}setSourceEndedHandler(o){this.onSourceEnded=o}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){tn("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){if(this.currentSource instanceof AudioBufferSourceNode)this.currentSource.start(o,e);else if(this.currentSource instanceof HTMLAudioElement){e>0&&(this.currentSource.currentTime=e);let t=this.currentSource.play();t&&typeof t.catch=="function"&&t.catch(n=>{tn("Failed to start HTMLAudioElement playback.",n)})}}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},Ia=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}},cu=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 lu(o,this.gainNode),this.sourceController.setSourceEndedHandler(()=>this.emit("ended")),this.sourceController.setSource(e),this.applyRate(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1,this._isPaused=!1;try{this.gainNode.disconnect()}catch(e){tn("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){tn("Failed to disconnect gain node on stop().",o)}}setRate(o){return o=Math.max(.001,o),this.rate=o,this.applyRate(this.sourceController.getSource()),this}applyRate(o){o instanceof HTMLAudioElement?o.playbackRate=this.rate:o instanceof AudioBufferSourceNode&&(o.playbackRate.value=this.rate)}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new Ia(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Ia(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}},uu=class{constructor(o,e,t){this.owner=e,this.releaseDelay=t,this.references=0,this.playing=0,this.dropWhenIdle=!1,this.releaseTimer=null,this.audioBuffer=o}retain(){return this.references++,this.dropWhenIdle=!1,this.cancelPendingRelease(),this}release(){this.references>0&&this.references--,this.reconsider()}addRef(){this.playing++,this.cancelPendingRelease()}releaseRef(){this.playing>0&&this.playing--,this.reconsider()}getReferenceCount(){return this.references}getPlayingCount(){return this.playing}getRefCount(){return this.playing}async unload(){this.references=0,this.dropWhenIdle=!0,this.reconsider()}async forceUnload(){this.drop()}isAlive(){return this.audioBuffer!==null}raw(){if(!this.audioBuffer)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}byteLength(){return this.audioBuffer?this.audioBuffer.length*this.audioBuffer.numberOfChannels*4:0}isIdle(){return this.audioBuffer!==null&&this.references===0&&this.playing===0}reconsider(){if(this.isIdle()){if(this.releaseDelay>0&&!this.dropWhenIdle){this.releaseTimer||(this.releaseTimer=setTimeout(()=>{this.releaseTimer=null,this.isIdle()&&this.drop()},this.releaseDelay));return}this.drop()}}cancelPendingRelease(){this.releaseTimer&&(clearTimeout(this.releaseTimer),this.releaseTimer=null)}drop(){this.cancelPendingRelease(),this.audioBuffer&&(this.audioBuffer=null,this.references=0,this.playing=0,this.owner.evict(this))}},pu=class{constructor(o,e=0){this.cache=new Map,this.loadingPromises=new Map,this.generation=0,this.audioContext=o,this.releaseDelay=Math.max(0,e)}async load(o){return(await this.acquire(o)).retain()}async acquire(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.generation,i=this.doLoad(o);this.loadingPromises.set(o,i);try{let r=await i;return n!==this.generation?(await r.forceUnload(),r):(this.cache.set(o,r),r)}finally{this.loadingPromises.get(o)===i&&this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new uu(t,this,this.releaseDelay)}get(o){let e=this.cache.get(o);return e&&e.isAlive()?e:null}release(o){let e=this.cache.get(o);return e?(e.release(),!0):!1}async unload(o){let e=this.cache.get(o);return e?(await e.unload(),!0):!1}evict(o){for(let[e,t]of this.cache)if(t===o){this.cache.delete(e);return}}clear(){this.generation++;for(let o of Array.from(this.cache.values()))o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){let o=0;for(let e of this.cache.values())o+=e.byteLength();return{entries:this.cache.size,loading:this.loadingPromises.size,decodedBytes:o}}},du=10*1024*1024,mu={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1,cacheReleaseDelay:0},Ga=class xr{constructor(e){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...mu,...e},au(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new pu(this.audioContext,this.options.cacheReleaseDelay),this.masterChannel=new su("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(e=>{let t=()=>{if(this.destroyed){this.clearUnlockHandler(),e();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,e())}).catch(n=>{tn("Failed to resume AudioContext while unlocking.",n)})};this.unlockHandler=t,document.addEventListener("click",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",t)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let e=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",e),document.removeEventListener("touchstart",e),document.removeEventListener("keydown",e)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(e,t,n){this.ensureNotDestroyed(),this.ensureReady();let{volume:i=1,rate:r=1,startTime:s=0,endTime:a,loopStart:l,load:c="auto",loop:u=!1}=t??{},p,d=null;if(typeof e=="string")if(await this.resolveLoadMode(e,c)==="stream")p=this.createStreamSource(e);else{d=await this.audioCache.acquire(e),d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=d.raw(),p=m}else{d=e,d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=e.raw(),p=m}let h=u&&a!==void 0&&a>s?{start:xr.clampLoopStart(l,s,a),end:a}:null;p instanceof AudioBufferSourceNode?(p.loop=u,h&&(p.loopStart=h.start,p.loopEnd=h.end)):p instanceof HTMLAudioElement&&(p.loop=u);let f=new cu(this.audioContext,p,{volume:i,rate:r,startOffset:s,duration:!u&&a?a-s:0},n);if(d){let m=!1,g=()=>{m||(m=!0,d.releaseRef?.())};f.once("ended",g),f.once("stop",g)}return f}static clampLoopStart(e,t,n){return e===void 0||!Number.isFinite(e)?t:e>=t&&e<n?e:t}async resolveLoadMode(e,t){if(t==="stream"||t==="full")return t;let n=xr.schemeOf(e);if(n==="data:"||n==="blob:")return"full";if(n!==null&&n!=="http:"&&n!=="https:")return"stream";try{let i=await fetch(e,{method:"HEAD"});if(!i.ok)return"stream";let r=i.headers.get("Content-Length");if(!r)return"stream";let s=parseInt(r,10);return isNaN(s)?"stream":s<du?"full":"stream"}catch(i){return tn("Failed to resolve load mode via HEAD request, falling back to 'stream'.",i),"stream"}}static schemeOf(e){try{let t=typeof location<"u"&&location?.href?location.href:void 0;return new URL(e,t).protocol}catch{return null}}createStreamSource(e){let t=new Audio(e);return t.crossOrigin="anonymous","preservesPitch"in t&&(t.preservesPitch=!1),t}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(e){this.registeredChannels.add(e)}unregisterChannel(e){this.registeredChannels.delete(e)}setVolume(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(e),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(e){return this.ensureNotDestroyed(),this.ensureReady(),e===void 0?this.masterChannel.mute():this.masterChannel.mute(e),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(e,t){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(e,t)}getChannel(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(e)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(e){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(e)}release(e){return this.ensureNotDestroyed(),this.audioCache.release(e)}async unload(e){return this.ensureNotDestroyed(),this.audioCache.unload(e)}getCached(e){return this.ensureNotDestroyed(),this.audioCache.get(e)}getCacheStats(){return this.audioCache.getStats()}async play(e,t){this.ensureNotDestroyed(),this.ensureReady();let n=this.masterChannel.getTokens();for(let i of n)try{i.stop()}catch{}return this.masterChannel.play(e,t)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(e=>{tn("Failed to close AudioContext during destroy().",e)}))}isDestroyed(){return this.destroyed}};var Ie=class Ie{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.retained=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new Ga({maxChannels:Ie.MaxChannels,cacheReleaseDelay:Ie.CacheGrace});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=Ie.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,Ie.BusRampTimeConstant),r.setValueAtTime(s,a+Ie.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${tt.sound}" instead.`)),this.channels.get(tt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=Ie.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let r=await this.channelFor(e).play(e.config.src,{volume:0,...this.playOptionsOf(e)}),s=e.state.muted??!1;r.mute(s),e.state.muted=s,this.state.set(e,{token:r,originalVolume:t.end}),t.duration>0?await r.fade(0,t.end,t.duration).finished:r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,!e.config.loop&&t.waitForEnd!==!1&&await new Promise(a=>{r.once("ended",()=>a())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t=Ie.defaultFade(e)){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await n.play(e.config.src,{volume:0,...this.playOptionsOf(e)}),r=e.state.muted??!1;return i.mute(r),e.state.muted=r,this.state.set(e,{token:i,originalVolume:t.end}),t.duration>0?i.fade(0,t.end,t.duration):i.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,i}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return this.arm(e,i),t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new S;if(!this.state.has(e))return i.resolve(),i;let r=this.state.get(e);return r.originalVolume=t,n===0?(r.token.setVolume(t),e.state.volume=t,i.resolve()):r.token.fade(r.token.getVolume(),t,n).finished.then(()=>{e.state.volume=t,i.resolve()}),i}mute(e,t=!0){let n=new S;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}arm(e,t){let n=(t.transport??0)+1;return t.transport=n,()=>this.state.get(e)===t&&t.transport===n}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{if(!r()){n.resolve();return}i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,i.token.fade(0,i.originalVolume,t).finished.then(()=>{if(!r()){n.resolve();return}e.state.paused=!1,n.resolve()})),n}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=Ie.clampToRegion(t,Ie.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}playOptionsOf(e){return{...Ie.clipRegionOf(e),loop:e.config.loop,rate:e.state.rate,load:this.loadModeOf(e)}}loadModeOf(e){let{src:t,streaming:n,loop:i,endTime:r}=e.config;return t.startsWith("data:")||t.startsWith("blob:")?"full":n?"stream":this.gameState.game.config.audioStreaming==="declared"?"full":i&&r===void 0?"stream":"full"}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime(),...e.state.paused?{paused:!0}:{}}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=Ie.clipRegionOf(e),r=i.endTime!==void 0&&e.config.loop,s=await n.play(e.config.src,{volume:e.state.volume,...this.playOptionsOf(e),startTime:r?i.startTime:t.position});r&&Math.abs(t.position-i.startTime)>.01&&s.seek(Ie.clampToRegion(t.position,i)),this.state.set(e,{token:s,originalVolume:e.state.volume});let a=e.state.muted??!1;s.mute(a),e.state.muted=a;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?s.pause():t.isPlaying||s.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}preload(e){let t=e.config.src;if(this.loadModeOf(e)==="stream"||this.retained.has(t))return Promise.resolve();let n=this.ready.then(()=>this.sound.load(t)).then(()=>!0).catch(i=>(this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${t}")`,i),!1));return this.retained.set(t,n),n.then(()=>{})}retainOnly(e){let t=new Set(e.map(n=>n.config.src));for(let n of[...this.retained.keys()])t.has(n)||this.releaseSource(n);for(let n of e)this.preload(n)}getCacheStats(){return this.isReady?this.sound.getCacheStats():{entries:0,loading:0,decodedBytes:0}}releaseSource(e){let t=this.retained.get(e);t&&(this.retained.delete(e),t.then(n=>{n&&this.isReady&&this.sound.release(e)}))}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.retainOnly([]),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.retained.clear(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};Ie.MaxChannels=1024,Ie.BusRampTimeConstant=.02,Ie.BusRampSettle=Ie.BusRampTimeConstant*5,Ie.CacheGrace=5e3;var oo=Ie;function Fa(o){if(typeof MessageChannel>"u"){let n=setTimeout(o,0);return()=>clearTimeout(n)}let e=!1,t=new MessageChannel;return t.port1.onmessage=()=>{t.port1.close(),t.port2.close(),e||o()},t.port2.postMessage(void 0),()=>{e=!0}}var ro=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 Su from"html-to-image";var ke=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),st(()=>{this.preventAttach()})}static proxy(e){let t=new S,n=new S,i=new o(n);return i.onTimelineRegistered(()=>{n.resolve()}).onSettled(()=>{let[r,s]=i.catSettled();e(r,s)}),t.onSkipControllerRegister(r=>{r.onAbort(()=>{i.abort()})}),[t,i]}static any(e){if(e.length===0)throw new E("Cannot create an 'any' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=!1;for(let s of e)i.attachChild(s),s.then(a=>{r||(r=!0,t.resolve(a))});return t.onSkipControllerRegister(s=>{s.onAbort(()=>{i.abort()})}),[t,i]}static all(e){if(e.length===0)throw new E("Cannot create an 'all' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let l=e[a];i.attachChild(l),l.then(c=>{r[a]=c,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(l=>{a=l.onAbort(()=>{r.abort()})}),i.then(l=>{a?.cancel(),n=l,i=e(l),i?st(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?st(()=>s()):st(()=>r.resolve(n)),r}get status(){return this._status}isSettled(){return this._status!=="pending"}isResolved(){return this._status==="resolved"}isCancelled(){return this._status==="cancelled"}isFailed(){return this._status==="failed"}onResolved(e){this._onResolved.push(e)}onCancelled(e){this._onCancelled.push(e)}onFailed(e){this._onFailed.push(e)}onSettled(e){this.isSettled()?st(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
|
|
19
19
|
Timeline attaching is only allowed synchronously after the timeline is created.
|
|
20
|
-
Current _ableToAttach: `+this._ableToAttach);let t=S.isAwaitable(e)?new o(e,this.guard):e;return this.children.push(t),this.guard&&t.setGuard(this.guard),t.onSettled(()=>{this.resolveStatus()}),this}setGuard(e){return this.guard=e,this}catSettled(){return this.children.reduce(([e,t],n)=>(n.isResolved()?e.push(n):n.isCancelled()&&t.push(n),[e,t]),[[],[]])}onTimelineRegistered(e){return this._onTimelineRegistered.push(e),this}resolveStatus(){let e=this.children.find(t=>t.isFailed());this.awaitable.failed||e?this.setStatus("failed",this.emitEvents.bind(this)):this.awaitable.solved&&this.children.every(t=>t.isSettled())?this.setStatus("resolved",this.emitEvents.bind(this)):this.awaitable.skipController?.isAborted()&&this.setStatus("cancelled",this.emitEvents.bind(this))}emitEvents(){if(this.isResolved())this._onResolved.forEach(e=>e());else if(this.isCancelled())this._onCancelled.forEach(e=>e());else if(this.isFailed()){let e=this.children.find(t=>t.isFailed());this._onFailed.forEach(t=>t(this.awaitable.error??e?.awaitable.error))}this._onResolved=[],this._onCancelled=[],this._onFailed=[]}setStatus(e,t){if(this.isSettled()){this.guard&&this.guard.warn("unexpectedTimelineStatusChange",`Trying to resolve a settled timeline: ${this._status} -> ${e}`);return}e!==this._status&&t?(this._status=e,t()):this._status=e}preventAttach(){this._ableToAttach=!1,this._onTimelineRegistered.forEach(e=>e())}},so=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof ke?e:new ke(e);return this.timelines.push(t),this.guard&&t.setGuard(this.guard),t}abortAll(){for(let e of this.timelines)e.abort();this.cleanupSettled()}cleanupSettled(){this.timelines=this.timelines.filter(e=>!e.isSettled())}};var ao=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new Q}addNotification(e){this.notifications.push(e),this.flush()}removeNotification(e){this.notifications=this.notifications.filter(t=>t!==e),this.flush()}clearNotifications(){this.notifications=[],this.flush()}consume(e){let t=new S,n=new ke(t);return t.registerSkipController(new 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 lo(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 mu=4e3,Va={zIndex:0,visibility:"visible"},fu={...Va,zIndex:1},Oa={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function ci(){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 xr(){return{...ci(),visibility:"hidden"}}var co=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,xr())):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?xr():ci())}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 ke(a),c=[],u=r.resolve.map(g=>{if(typeof g=="function"){let m=this.createOverlay();return c.push(m),{kind:"overlay",element:m}}return{kind:"scene",sceneId:(g.key==="target"?t.to:t.from).getId(),role:g.key}}),p={task:r,controller:s,roles:t,targets:u,overlays:c,cancelLoadGate:()=>{},stale:!1};this.running=p,s.onUpdate(g=>this.applyFrame(p,g)),s.onComplete(()=>{this.settle(p,[[t.to,ci()],[t.from,xr()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(p,[[t.from,ci()],[t.to,ci()]]),l.abort()}),this.applyFrame(p,r.animations.map(g=>g.start));let d=this.waitForSceneReady(t.to);return p.cancelLoadGate=d.cancel,d.promise.then(()=>{p.stale||s.start()}),l}applyFrame(e,t){e.task.resolve.forEach((n,i)=>{let r=e.targets[i],s=r.kind==="overlay"?r.element:this.sceneElements.get(r.sceneId)??null;if(!s)return;let a=typeof n=="function"?n:n.resolver,l=r.kind==="overlay"?Oa:r.role==="target"?fu:Va,c=j({style:l},a(...t));lo(s,c,hu)})}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,Oa),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()},mu)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(gu)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},Ha=["src","width","height"];function hu(o){if(!Ha.some(t=>t in o))return o;let e={...o};return Ha.forEach(t=>delete e[t]),e}function gu(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 uo=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=Xi(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 po=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??Xi(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 nn=class nn extends _{executeAction(e,t){if(this.type===de.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===de.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===de.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===de.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===de.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===de.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(),p=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let d=l.applyTransform(n,a),g=e.timelines.attachTimeline(s).attachChild(d);return d.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:g},(y,m,f)=>{s.isSettled()||s.abort(),d.abort(),t.transformState.forceOverwrite(y.state),nn.restoreLoop(e,t,m,f)},[c,u,p]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),l=i??{};t._setLoop(n,l,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,l),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,p)=>{nn.restoreLoop(e,t,u,p)},[s,a]);let c=new S;return c.resolve(super.executeAction(e,r)),c}stopLoop(e,t,n,i){let r=t._getLoop(),s=t._getLoopActionId();t._setLoop(null,{},null),t.markDirty();let a=new S().registerSkipController(new 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},(d,g)=>{nn.restoreLoop(e,t,d,g)},[r,s]),l(),a;let u=c.stopLoop(n,l),p=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(l),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:p},(d,g)=>{a.isSettled()||a.abort(),u.abort(),nn.restoreLoop(e,t,d,g)},[r,s]),a}static restoreLoop(e,t,n,i){if(!n&&!t._getLoop())return;t._setLoop(n?.transform??null,n?.options??{},i),t.markDirty();let r=e.getExposedState(t);r&&(n?r.applyLoop(n.transform,n.options):r.stopLoop(void 0,()=>{}))}applyTransition(e,t,n,i,r){let s=new S().registerSkipController(new 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&&nn.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&&nn.getLayerElements(c,t);if(!u)return;let p=u.indexOf(t);p!==l&&(u.splice(p,1),u.splice(l,0,t),e.flush())},[s]);let a=new S;return a.resolve(super.executeAction(e,n)),a}static getLayerElements(e,t){for(let n of e.layers.values())if(n.includes(t))return n;return null}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};nn.ActionTypes=de;var Te=nn;var $e=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 Z?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}pos(t,n,i){return this.transform(new Z({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new Z({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new Z({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new Z({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new Z({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new Z({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new Z({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new Z(t,n))}mask(t,n={}){let i=k.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l,...c}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l},c)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...l}=t,c={duration:s,ease:a,...l},u=o.wipeClipPath(n,100),p=o.wipeClipPath(n,0),d=o.createClipPathTransform([[i?p:u,{duration:0}],[i?u:p,c]]);return r?this.combineActions(new Fe,g=>g.transform(d).clearClip({duration:0})):this.transform(d)}filter(t,n){return this.effect({filter:t},n)}clearFilter(t){return this.effect({filter:"none"},t)}backdrop(t,n){return this.effect({backdropFilter:t},n)}blend(t,n){return this.effect({mixBlendMode:t},n)}transform(t){let n=this.chain(),i=new Te(n,de.applyTransform,new C().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new Te(i,de.applyLoop,new C().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new Te(n,de.stopLoop,new C().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new Te(t,de.bringToFront,new C().setContent([]));return t.chain(n)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new Z(t.map(([n,i])=>({props:{clipPath:n},options:i})))}static circleClipPath(t,n){return`circle(${t}% at ${n})`}static wipeClipPath(t,n){switch(t){case"right":return`inset(0 0 0 ${n}%)`;case"top":return`inset(0 0 ${n}% 0)`;case"bottom":return`inset(${n}% 0 0 0)`;case"left":default:return`inset(0 ${n}% 0 0)`}}show(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:1},t),r=new Te(n,de.applyTransform,new C().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:0},t),r=new Te(n,de.applyTransform,new C().setContent([i]));return n.chain(r)}};var fn=class fn extends ce{constructor(e,t={}){super(),this.config=j(fn.defaultConfig,t),this.authoredName=e||"",this.state=this.getInitialState();let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(l=>typeof l=="string")&&[t,...n].length>0&&[t,...n].every(l=>fe.isSingleWord(l))){let l=e,c=fe.format([t,...n]),u=new fe(ua(l,c),{character:this}),p=new nt(this.chain(),nt.ActionTypes.say,new C().setContent(u));return this.chain(p)}let i=t||{},r=e,s=Array.isArray(r)?new fe(r,{...i,character:this}):(fe.isSentence(r)?r:new fe(r,{...i,character:this})).copy();s.setCharacter(this);let a=new nt(this.chain(),nt.ActionTypes.say,new C().setContent(s));return this.chain(a)}setName(e){let t=new nt(this.chain(),nt.ActionTypes.setName,new C().setContent([e]));return this.chain(t)}setAvatar(e){return this.config.avatar=e===null?null:e,this}addPortrait(e,t={}){return this.config.portraits.push({image:e,avatar:t.avatar}),this}setPortraits(e){return this.config.portraits=[...e],this}apply(e,t,...n){return this.say.apply(this,[e,t,...n])}call(e,t,...n){return Array.isArray(e)&&"raw"in e?t&&fe.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):fe.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:fn.StateSerializer.serialize(this.state)}}fromData(e){return this.state=fn.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};fn.defaultCharacterColor="#000",fn.defaultConfig={portraits:[]},fn.StateSerializer=new qe;var mo=fn,on=new mo(null);var Y=class o{static isLambda(e){return e instanceof o&&"handler"in e}static isLambdaHandler(e){return typeof e=="function"}static from(e){return o.isLambda(e)?e:new o(e)}static not(e){return new o(t=>!e.evaluate(t).value)}constructor(e){this.handler=e}evaluate({gameState:e}){return{value:this.handler(this.getCtx({gameState:e}))}}getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}toString(){return`Lambda(${this.handler.toString()})`}},wr=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
|
|
21
|
-
You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:
|
|
22
|
-
You are trying to set multiple ELSE conditions for the same condition`);return this.conditions.Else.action=this.construct(Array.isArray(t)?t:[t]),this.chain()}evaluate(t,{gameState:n}){let i={gameState:n};if(t.If.condition?.evaluate(i)?.value)return t.If.action||null;for(let s of t.ElseIf)if(s.condition?.evaluate(i)?.value)return s.action||null;return t.Else.action||null}fromChained(t){return[Reflect.construct(Vt,[this,Vt.ActionTypes.action,new C().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,l=r[s+1]?.contentNode;l&&a.setChild(l),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return ze.toActions([this.conditions.If.action?.[0]||[],...this.conditions.ElseIf.flatMap(t=>t.action?.[0]||[]),this.conditions.Else.action?.[0]||[]])}createIfCondition(t,n){this.conditions.If.condition=Y.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new Vt(i,Vt.ActionTypes.action,new C().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?on.say(n).getActions():ze.toActions([n]))}};var xn=class extends _{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 p=e.getLiveGame().createStackModel([{type:this.type,node:u.action[0]?.contentNode??null}]);n.resolve({type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[p]}}),a=()=>{p.reset()},e.gameHistory.updateByToken(c,d=>{d&&d.element.type==="menu"&&(d.element.selected=u.evaluated,d.isPending=!1)})}),{id:c}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{l.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:c,action:this,element:{type:"menu",text:l.prompt,selected:null},isPending:!0,snapshot:e.getLiveGame().captureGameState()}),n}getFutureActions(e,t){let n=this.contentNode.getContent();return[...this.callee._getFutureActions(n.choices),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=i.choices.map(s=>`{${s.action.map(l=>l.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};xn.ActionTypes=sa;var wn=class wn extends ce{constructor(t,n={}){super();this.choices=[];this.prompt=fe.isSentence(t)?t:t===null?null:new fe(t),this.config=j(wn.defaultConfig,n)}static prompt(t,n={}){return new wn(t!==void 0?t:null,n)}static choose(t,n){return new wn(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return fe.isSentence(t)&&n?i.choices.push({prompt:fe.toSentence(t),action:this.narrativeToActions(n),config:{}}):(oe.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:fe.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:fe.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?Y.from(t.config.disabled):void 0,hidden:t.config?.hidden?Y.from(t.config.hidden):void 0}}):console.warn("No valid choice added to menu, ",{arg0:t,arg1:n}),i}hideIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Oe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.hideIf` before `menu.choose`");return n.config.hidden=Y.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new Oe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.disableIf` before `menu.choose`");return n.config.disabled=Y.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:Y.not(Y.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:Y.not(Y.from(t))}})}fromChained(t){return[new xn(this.chain(),xn.ActionTypes.action,new C().setContent({prompt:this.prompt,choices:t.constructChoices()}))]}_getFutureActions(t){return t.map(n=>n.action[0]||null).filter(n=>n!==null)}narrativeToActions(t){return this.constructNodes(t.flatMap(n=>typeof n=="string"?on.say(n).getActions():ze.toActions([n])))}constructNodes(t,n,i){for(let r=0;r<t.length;r++){let s=t[r].contentNode,a=t[r+1]?.contentNode;a&&s.setChild(a),r===this.choices.length-1&&n&&s.setChild(n),r===0&&i&&i.setChild(s)}return t}constructChoices(){return this.choices.map(t=>({action:this.constructNodes(t.action),prompt:t.prompt,config:t.config??{}}))}};wn.defaultConfig={},wn.targetAction=xn;var kr=wn;var ui=class ui extends _{executeAction(e,t){let n=this;if(n.is(ui,"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(ui,"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")}};ui.ActionTypes=ei;var fo=ui;var ho=class ho extends ce{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new Ut(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(ei.set,[e,t]))}assign(e){return this.chain(this.createAction(ei.assign,[e]))}equals(e,t){return new Y(n=>{let i=n.storable.getNamespace(this.namespace),r=Y.isLambda(t)||Y.isLambdaHandler(t)?Y.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new Y(n=>{let i=n.storable.getNamespace(this.namespace),r=Y.isLambda(t)||Y.isLambdaHandler(t)?Y.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new Y(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new Y(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new Y(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new oe(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new oe(i=>Y.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new Y(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=ho.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new fo(this.chain(),e,C.create(t))}};ho.NamespacePrefix="persistent";var Bn=ho,go=class go extends Bn{constructor(e){super(e,{}),this.namespace=this.prefix(e,go.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new Ut(this.namespace,this.defaultContent))}};go.LocalNamespacePrefix="local";var Wn=go;var yt={shutter:0,shutterColor:"#000",vignette:0,vignetteColor:"#000",vignetteInner:"44%",vignetteOuter:"78%"};function Pr(o){return typeof o!="number"||!Number.isFinite(o)?0:Math.max(0,Math.min(1,o))}function pi(o,e){return typeof o=="string"&&o.length>0?o:e}function Ua(o){let e=Pr(o.shutter);return{backgroundColor:pi(o.shutterColor,yt.shutterColor),clipPath:`inset(0 0 ${100-50*e}% 0)`}}function Ba(o){let e=Pr(o.shutter);return{backgroundColor:pi(o.shutterColor,yt.shutterColor),clipPath:`inset(${100-50*e}% 0 0 0)`}}function Wa(o){let e=pi(o.vignetteInner,yt.vignetteInner),t=pi(o.vignetteOuter,yt.vignetteOuter),n=`radial-gradient(circle at center, transparent ${e}, black ${t})`;return{backgroundColor:pi(o.vignetteColor,yt.vignetteColor),opacity:Pr(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 $e{static get DefaultUserConfig(){return pt._defaultUserConfig??(pt._defaultUserConfig=new K({...ie.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 Z(e,t))}resetCamera(e,t){return this.transform(new Z([{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(ie.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 ie(pt.DefaultUserConfig.create(e.get()).get())}};pt._defaultUserConfig=null,pt.DefaultConfig=new K({name:"(camera)"});var di=pt;var hn=class hn extends Vn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.elementBaseline=null;this.hashCache=new Map;this.name=t;let{camera:i,...r}=n;this.config=j(hn.defaultConfig,r),this._camera=i??new di}static empty(){return new hn("empty").entry(new _e("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 Bn(t,n);return this.registerPersistent(i),i}registerService(t,n){return this.services.set(t,n),this}getService(t){let n=this.services.get(t);if(!n)throw new Oe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){let n=this.hashCache.get(t);if(n!==void 0)return n;let i=ya(this.stringify(t));return this.hashCache.set(t,i),i}stringify(t=!1){return this.entryScene?.stringify(this,new Set,t)||""}serializeServices(){let t={};return this.services.forEach((n,i)=>{if(!n.serialize||typeof n.serialize!="function")return;let r=n.serialize();if(r!==null){{if(r instanceof Promise)throw new J(`Service ${i} serialize method should not return a promise`);if(!mr(r))throw new J(`Service ${i} serialize method should return a pure object.
|
|
20
|
+
Current _ableToAttach: `+this._ableToAttach);let t=S.isAwaitable(e)?new o(e,this.guard):e;return this.children.push(t),this.guard&&t.setGuard(this.guard),t.onSettled(()=>{this.resolveStatus()}),this}setGuard(e){return this.guard=e,this}catSettled(){return this.children.reduce(([e,t],n)=>(n.isResolved()?e.push(n):n.isCancelled()&&t.push(n),[e,t]),[[],[]])}onTimelineRegistered(e){return this._onTimelineRegistered.push(e),this}resolveStatus(){let e=this.children.find(t=>t.isFailed());this.awaitable.failed||e?this.setStatus("failed",this.emitEvents.bind(this)):this.awaitable.solved&&this.children.every(t=>t.isSettled())?this.setStatus("resolved",this.emitEvents.bind(this)):this.awaitable.skipController?.isAborted()&&this.setStatus("cancelled",this.emitEvents.bind(this))}emitEvents(){if(this.isResolved())this._onResolved.forEach(e=>e());else if(this.isCancelled())this._onCancelled.forEach(e=>e());else if(this.isFailed()){let e=this.children.find(t=>t.isFailed());this._onFailed.forEach(t=>t(this.awaitable.error??e?.awaitable.error))}this._onResolved=[],this._onCancelled=[],this._onFailed=[]}setStatus(e,t){if(this.isSettled()){this.guard&&this.guard.warn("unexpectedTimelineStatusChange",`Trying to resolve a settled timeline: ${this._status} -> ${e}`);return}e!==this._status&&t?(this._status=e,t()):this._status=e}preventAttach(){this._ableToAttach=!1,this._onTimelineRegistered.forEach(e=>e())}},so=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof ke?e:new ke(e);return this.timelines.push(t),this.guard&&t.setGuard(this.guard),t}abortAll(){for(let e of this.timelines)e.abort();this.cleanupSettled()}cleanupSettled(){this.timelines=this.timelines.filter(e=>!e.isSettled())}};var ao=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new X}addNotification(e){this.notifications.push(e),this.flush()}removeNotification(e){this.notifications=this.notifications.filter(t=>t!==e),this.flush()}clearNotifications(){this.notifications=[],this.flush()}consume(e){let t=new S,n=new ke(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 lo(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 fu=4e3,Ua={zIndex:0,visibility:"visible"},hu={...Ua,zIndex:1},Ha={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function ci(){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 wr(){return{...ci(),visibility:"hidden"}}var co=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,wr())):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?wr():ci())}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 ke(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}}),p={task:r,controller:s,roles:t,targets:u,overlays:c,cancelLoadGate:()=>{},stale:!1};this.running=p,s.onUpdate(h=>this.applyFrame(p,h)),s.onComplete(()=>{this.settle(p,[[t.to,ci()],[t.from,wr()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(p,[[t.from,ci()],[t.to,ci()]]),l.abort()}),this.applyFrame(p,r.animations.map(h=>h.start));let d=this.waitForSceneReady(t.to);return p.cancelLoadGate=d.cancel,d.promise.then(()=>{p.stale||s.start()}),l}applyFrame(e,t){e.task.resolve.forEach((n,i)=>{let r=e.targets[i],s=r.kind==="overlay"?r.element:this.sceneElements.get(r.sceneId)??null;if(!s)return;let a=typeof n=="function"?n:n.resolver,l=r.kind==="overlay"?Ha:r.role==="target"?hu:Ua,c=j({style:l},a(...t));lo(s,c,gu)})}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,Ha),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()},fu)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(yu)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},Va=["src","width","height"];function gu(o){if(!Va.some(t=>t in o))return o;let e={...o};return Va.forEach(t=>delete e[t]),e}function yu(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 uo=class{constructor(e){this.options=e;this.planned=new Set;this.desired=[];this.admitted=[];this.pending=null;this.pendingTimer=null}retain(e){this.planned=new Set(e),this.desired=e.filter(i=>!this.options.isDeclared(i));let t=!1,n=[];for(let i of this.admitted)this.desired.includes(i)?n.push(i):t=!0;this.admitted=n,this.pending&&!this.admitted.includes(this.pending)&&this.clearPending(),(this.admit()||t)&&this.options.onChange()}noteReady(e){!this.pending||this.pending!==e||(this.clearPending(),this.admit()&&this.options.onChange())}forget(e){let t=this.admitted.indexOf(e);t>=0&&this.admitted.splice(t,1),this.desired=this.desired.filter(n=>n!==e),this.pending===e&&this.clearPending(),this.admit()&&this.options.onChange()}getAdmitted(){return this.admitted}isPlanned(e){return this.planned.has(e)}clear(){this.clearPending(),this.planned=new Set,this.desired=[],this.admitted.length&&(this.admitted=[],this.options.onChange())}admit(){if(this.pending||this.admitted.length>=3)return!1;let e=this.desired.find(t=>!this.admitted.includes(t));return e?(this.admitted.push(e),this.pending=e,this.pendingTimer=setTimeout(()=>{this.pendingTimer=null,this.pending=null,this.admit()&&this.options.onChange()},5e3),!0):!1}clearPending(){this.pendingTimer!==null&&(clearTimeout(this.pendingTimer),this.pendingTimer=null),this.pending=null}};var po=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=Yi(6),{action:r,timeline:s,stackModel:a}=e,l=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:l,stackModel:a}),this.history.length>this.maxHistorySize){let c=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(c))}return{id:i}}has(e){return this.history.some(t=>t.id===e)}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),this.liveGame.getGameStateForce?.().logger?.debug("ActionHistory","Undoing",this.history[r].action.type),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var mo=class o{constructor(e){this.history=[];this.cursor=-1;this.resumingAtCursor=!1;this.actionHistoryMgr=e,this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){let t=this.history[this.cursor];if(this.resumingAtCursor&&t&&t.action===e.action)return this.history[this.cursor]={...e,token:t.token},this.resumingAtCursor=!1,this;this.resumingAtCursor=!1;let n=this.history[this.cursor+1];return n&&n.action===e.action?this.history[this.cursor+1]={...e,token:n.token}:(this.history.length=this.cursor+1,this.history.push(e)),this.cursor++,this}getHistory(){return this.history.slice(0,this.cursor+1)}getFuture(){return this.history.slice(this.cursor+1)}getCursor(){return this.cursor}getAt(e){return this.history[e]??null}indexOfToken(e){return this.history.findIndex(t=>t.token===e)}setCursor(e){return this.cursor=Math.max(-1,Math.min(e,this.history.length-1)),this.resumingAtCursor=!0,this}canUndo(){return this.cursor>0}canRedo(){return this.cursor<this.history.length-1}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.slice(0,this.cursor+1).map(e=>o.toSerialized(e))}serializeAll(){return this.history.map(e=>o.toSerialized(e))}load(e,t){this.history=[];for(let n of e){let i=n.actionId!=null?t.get(n.actionId):void 0;i&&this.history.push({token:n.token??Yi(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}this.cursor=this.history.length-1,this.resumingAtCursor=this.cursor>=0}reset(){this.history=[],this.cursor=-1,this.resumingAtCursor=!1}static toSerialized(e){return{token:e.token,actionId:e.action.getId(),element:e.element,isPending:e.isPending,snapshot:e.snapshot??null}}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(i=>i.id)),n=this.history.slice(0,this.cursor+1).filter(i=>t.has(i.token)).length;this.history=this.history.filter(i=>!t.has(i.token)),this.cursor=Math.max(-1,Math.min(this.cursor-n,this.history.length-1))}};var nn=class nn extends _{executeAction(e,t){if(this.type===de.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===de.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===de.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===de.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===de.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===de.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(),p=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let d=l.applyTransform(n,a),h=e.timelines.attachTimeline(s).attachChild(d);return d.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:h},(f,m,g)=>{s.isSettled()||s.abort(),d.abort(),t.transformState.forceOverwrite(f.state),nn.restoreLoop(e,t,m,g)},[c,u,p]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),l=i??{};t._setLoop(n,l,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,l),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,p)=>{nn.restoreLoop(e,t,u,p)},[s,a]);let c=new S;return c.resolve(super.executeAction(e,r)),c}stopLoop(e,t,n,i){let r=t._getLoop(),s=t._getLoopActionId();t._setLoop(null,{},null),t.markDirty();let a=new S().registerSkipController(new 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},(d,h)=>{nn.restoreLoop(e,t,d,h)},[r,s]),l(),a;let u=c.stopLoop(n,l),p=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(l),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:p},(d,h)=>{a.isSettled()||a.abort(),u.abort(),nn.restoreLoop(e,t,d,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&&nn.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&&nn.getLayerElements(c,t);if(!u)return;let p=u.indexOf(t);p!==l&&(u.splice(p,1),u.splice(l,0,t),e.flush())},[s]);let a=new S;return a.resolve(super.executeAction(e,n)),a}static getLayerElements(e,t){for(let n of e.layers.values())if(n.includes(t))return n;return null}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};nn.ActionTypes=de;var Te=nn;var $e=class o extends ue{constructor(){super(...arguments);this.srcManager=new Re;this.loopTransform=null;this.loopOptions={};this.loopActionId=null}_getLoop(){return this.loopTransform?{transform:this.loopTransform,options:this.loopOptions}:null}_setLoop(t,n,i){return this.loopTransform=t,this.loopOptions=t?n:{},this.loopActionId=t?i:null,this}_getLoopActionId(){return this.loopActionId}_serializeLoop(){return this.loopActionId?{actionId:this.loopActionId,options:{...this.loopOptions}}:null}_deserializeLoop(t){return this.loopTransform=null,this.loopOptions=t?{...t.options}:{},this.loopActionId=t?t.actionId:null,this}_rebindLoop(t){if(!this.loopActionId||this.loopTransform)return this;let i=t.get(this.loopActionId)?.contentNode?.getContent(),r=Array.isArray(i)?i[0]:void 0;return r instanceof Z?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}pos(t,n,i){return this.transform(new Z({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new Z({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new Z({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new Z({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new Z({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new Z({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new Z({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new Z(t,n))}mask(t,n={}){let i=P.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l,...c}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l},c)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...l}=t,c={duration:s,ease:a,...l},u=o.wipeClipPath(n,100),p=o.wipeClipPath(n,0),d=o.createClipPathTransform([[i?p:u,{duration:0}],[i?u:p,c]]);return r?this.combineActions(new Fe,h=>h.transform(d).clearClip({duration:0})):this.transform(d)}filter(t,n){return this.effect({filter:t},n)}clearFilter(t){return this.effect({filter:"none"},t)}backdrop(t,n){return this.effect({backdropFilter:t},n)}blend(t,n){return this.effect({mixBlendMode:t},n)}transform(t){let n=this.chain(),i=new Te(n,de.applyTransform,new C().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new Te(i,de.applyLoop,new C().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new Te(n,de.stopLoop,new C().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new Te(t,de.bringToFront,new C().setContent([]));return t.chain(n)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new Z(t.map(([n,i])=>({props:{clipPath:n},options:i})))}static circleClipPath(t,n){return`circle(${t}% at ${n})`}static wipeClipPath(t,n){switch(t){case"right":return`inset(0 0 0 ${n}%)`;case"top":return`inset(0 0 ${n}% 0)`;case"bottom":return`inset(${n}% 0 0 0)`;case"left":default:return`inset(0 ${n}% 0 0)`}}show(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:1},t),r=new Te(n,de.applyTransform,new C().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:0},t),r=new Te(n,de.applyTransform,new C().setContent([i]));return n.chain(r)}};var fn=class fn extends ue{constructor(e,t={}){super(),this.config=j(fn.defaultConfig,t),this.authoredName=e||"",this.state=this.getInitialState();let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(l=>typeof l=="string")&&[t,...n].length>0&&[t,...n].every(l=>fe.isSingleWord(l))){let l=e,c=fe.format([t,...n]),u=new fe(pa(l,c),{character:this}),p=new nt(this.chain(),nt.ActionTypes.say,new C().setContent(u));return this.chain(p)}let i=t||{},r=e,s=Array.isArray(r)?new fe(r,{...i,character:this}):(fe.isSentence(r)?r:new fe(r,{...i,character:this})).copy();s.setCharacter(this);let a=new nt(this.chain(),nt.ActionTypes.say,new C().setContent(s));return this.chain(a)}setName(e){let t=new nt(this.chain(),nt.ActionTypes.setName,new C().setContent([e]));return this.chain(t)}setAvatar(e){return this.config.avatar=e===null?null:e,this}addPortrait(e,t={}){return this.config.portraits.push({image:e,avatar:t.avatar}),this}setPortraits(e){return this.config.portraits=[...e],this}apply(e,t,...n){return this.say.apply(this,[e,t,...n])}call(e,t,...n){return Array.isArray(e)&&"raw"in e?t&&fe.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):fe.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:fn.StateSerializer.serialize(this.state)}}fromData(e){return this.state=fn.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};fn.defaultCharacterColor="#000",fn.defaultConfig={portraits:[]},fn.StateSerializer=new qe;var fo=fn,on=new fo(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()})`}},kr=class o extends ue{constructor(){super();this.conditions={If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static getInitialState(){return{If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static If(t,n){return new o().createIfCondition(t,n)}ElseIf(t,n){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
|
|
21
|
+
You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition: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
|
|
22
|
+
You are trying to set multiple ELSE conditions for the same condition`);return this.conditions.Else.action=this.construct(Array.isArray(t)?t:[t]),this.chain()}evaluate(t,{gameState:n}){let i={gameState:n};if(t.If.condition?.evaluate(i)?.value)return t.If.action||null;for(let s of t.ElseIf)if(s.condition?.evaluate(i)?.value)return s.action||null;return t.Else.action||null}fromChained(t){return[Reflect.construct(Vt,[this,Vt.ActionTypes.action,new C().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,l=r[s+1]?.contentNode;l&&a.setChild(l),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return ze.toActions([this.conditions.If.action?.[0]||[],...this.conditions.ElseIf.flatMap(t=>t.action?.[0]||[]),this.conditions.Else.action?.[0]||[]])}createIfCondition(t,n){this.conditions.If.condition=Q.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new Vt(i,Vt.ActionTypes.action,new C().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?on.say(n).getActions():ze.toActions([n]))}};var xn=class extends _{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 p=e.getLiveGame().createStackModel([{type:this.type,node:u.action[0]?.contentNode??null}]);n.resolve({type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[p]}}),a=()=>{p.reset()},e.gameHistory.updateByToken(c,d=>{d&&d.element.type==="menu"&&(d.element.selected=u.evaluated,d.isPending=!1)})}),{id:c}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{l.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:c,action:this,element:{type:"menu",text:l.prompt,selected:null},isPending:!0,snapshot:e.getLiveGame().captureGameState()}),n}getFutureActions(e,t){let n=this.contentNode.getContent();return[...this.callee._getFutureActions(n.choices),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=i.choices.map(s=>`{${s.action.map(l=>l.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};xn.ActionTypes=aa;var wn=class wn extends ue{constructor(t,n={}){super();this.choices=[];this.prompt=fe.isSentence(t)?t:t===null?null:new fe(t),this.config=j(wn.defaultConfig,n)}static prompt(t,n={}){return new wn(t!==void 0?t:null,n)}static choose(t,n){return new wn(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return fe.isSentence(t)&&n?i.choices.push({prompt:fe.toSentence(t),action:this.narrativeToActions(n),config:{}}):(oe.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:fe.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:fe.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?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 xn(this.chain(),xn.ActionTypes.action,new C().setContent({prompt:this.prompt,choices:t.constructChoices()}))]}_getFutureActions(t){return t.map(n=>n.action[0]||null).filter(n=>n!==null)}narrativeToActions(t){return this.constructNodes(t.flatMap(n=>typeof n=="string"?on.say(n).getActions():ze.toActions([n])))}constructNodes(t,n,i){for(let r=0;r<t.length;r++){let s=t[r].contentNode,a=t[r+1]?.contentNode;a&&s.setChild(a),r===this.choices.length-1&&n&&s.setChild(n),r===0&&i&&i.setChild(s)}return t}constructChoices(){return this.choices.map(t=>({action:this.constructNodes(t.action),prompt:t.prompt,config:t.config??{}}))}};wn.defaultConfig={},wn.targetAction=xn;var Pr=wn;var ui=class ui extends _{executeAction(e,t){let n=this;if(n.is(ui,"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(ui,"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")}};ui.ActionTypes=ei;var ho=ui;var go=class go extends ue{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new Ut(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(ei.set,[e,t]))}assign(e){return this.chain(this.createAction(ei.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 oe(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new oe(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=go.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new ho(this.chain(),e,C.create(t))}};go.NamespacePrefix="persistent";var Bn=go,yo=class yo extends Bn{constructor(e){super(e,{}),this.namespace=this.prefix(e,yo.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new Ut(this.namespace,this.defaultContent))}};yo.LocalNamespacePrefix="local";var Wn=yo;var gt={shutter:0,shutterColor:"#000",vignette:0,vignetteColor:"#000",vignetteInner:"44%",vignetteOuter:"78%"};function Er(o){return typeof o!="number"||!Number.isFinite(o)?0:Math.max(0,Math.min(1,o))}function pi(o,e){return typeof o=="string"&&o.length>0?o:e}function Ba(o){let e=Er(o.shutter);return{backgroundColor:pi(o.shutterColor,gt.shutterColor),clipPath:`inset(0 0 ${100-50*e}% 0)`}}function Wa(o){let e=Er(o.shutter);return{backgroundColor:pi(o.shutterColor,gt.shutterColor),clipPath:`inset(${100-50*e}% 0 0 0)`}}function za(o){let e=pi(o.vignetteInner,gt.vignetteInner),t=pi(o.vignetteOuter,gt.vignetteOuter),n=`radial-gradient(circle at center, transparent ${e}, black ${t})`;return{backgroundColor:pi(o.vignetteColor,gt.vignetteColor),opacity:Er(o.vignette),maskImage:n,WebkitMaskImage:n,maskSize:"100% 100%",WebkitMaskSize:"100% 100%",maskPosition:"center",WebkitMaskPosition:"center",maskRepeat:"no-repeat",WebkitMaskRepeat:"no-repeat",maskMode:"alpha",WebkitMaskMode:"alpha"}}var ut=class ut extends $e{static get DefaultUserConfig(){return ut._defaultUserConfig??(ut._defaultUserConfig=new K({...ie.DefaultTransformState.getDefaultConfig(),opacity:1,...gt}))}constructor(e={}){super();let t=ut.DefaultUserConfig.create(e),n=ut.DefaultConfig.create();this.userConfig=t,this.config=n.get(),this.transformState=this.getInitialTransformState()}pan(e,t,n){return this.pos(e,t,n)}darken(e,t,n){let i=Math.max(0,Math.min(1,e));return this.filter(`brightness(${1-i})`,{duration:t,ease:n})}shutter(e,t,n){return this.lens({shutter:ut.clampLens(e)},{duration:t,ease:n})}vignette(e,t,n){return this.lens({vignette:ut.clampLens(e)},{duration:t,ease:n})}lens(e,t){return this.transform(new Z(e,t))}resetCamera(e,t){return this.transform(new Z([{props:{filter:"none"},options:{duration:0}},{props:{position:new at("center"),scaleX:1,scaleY:1,zoom:1,rotation:0,opacity:1,shutter:gt.shutter,vignette:gt.vignette},options:{duration:e,ease:t}},{props:{shutterColor:gt.shutterColor,vignetteColor:gt.vignetteColor,vignetteInner:gt.vignetteInner,vignetteOuter:gt.vignetteOuter},options:{duration:0}}]))}static clampLens(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}bringToFront(){throw new E(`A camera cannot be brought to front. It is not an element inside a layer, it is what the layers are viewed through, so it has nothing to be in front of \u2014 waiting for it to be added to the stage will not help. Use a camera transform such as Camera.zoom or Camera.pan to change what is in view. (camera: ${this.config.name})`)}reset(){return super.reset(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}copy(){return new ut(this.userConfig.get())}getInitialTransformState(){let[e]=this.userConfig.extract(ut.DefaultUserConfig.keys());return new ie(ut.DefaultUserConfig.create(e.get()).get())}};ut._defaultUserConfig=null,ut.DefaultConfig=new K({name:"(camera)"});var di=ut;var hn=class hn extends Vn{constructor(t,n={}){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.elementBaseline=null;this.hashCache=new Map;this.name=t;let{camera:i,...r}=n;this.config=j(hn.defaultConfig,r),this._camera=i??new di}static empty(){return new hn("empty").entry(new _e("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 Bn(t,n);return this.registerPersistent(i),i}registerService(t,n){return this.services.set(t,n),this}getService(t){let n=this.services.get(t);if(!n)throw new Oe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){let n=this.hashCache.get(t);if(n!==void 0)return n;let i=va(this.stringify(t));return this.hashCache.set(t,i),i}stringify(t=!1){return this.entryScene?.stringify(this,new Set,t)||""}serializeServices(){let t={};return this.services.forEach((n,i)=>{if(!n.serialize||typeof n.serialize!="function")return;let r=n.serialize();if(r!==null){{if(r instanceof Promise)throw new J(`Service ${i} serialize method should not return a promise`);if(!fr(r))throw new J(`Service ${i} serialize method should return a pure object.
|
|
23
23
|
A pure object should:
|
|
24
24
|
1. be an object literal
|
|
25
25
|
2. not have any prototype
|
|
26
26
|
3. no circular reference
|
|
27
27
|
4. sub objects should also be pure objects or serializable data
|
|
28
28
|
Return null if nothing needs to be saved. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description
|
|
29
|
-
Returned value ${r} violates the above rules`)}t[i]=r}}),t}deserializeServices(t){this.services.forEach((n,i)=>{!n.deserialize||typeof n.deserialize!="function"||t[i]&&n.deserialize(t[i])})}getScene(t,n=!1,i){if(_e.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||J,[`Scene with name ${t} not found`]);return r}constructStory(){let t=this.entryScene;if(!t)throw new Error("Story must have an entry scene");return this.hashCache.clear(),this.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this.captureElementBaseline(),this.scheduleHashWarmUp(),this}scheduleHashWarmUp(){let t=globalThis.requestIdleCallback;typeof t=="function"&&t(()=>{try{this.hash()}catch{}})}captureElementBaseline(){let t=new Map;this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).forEach(n=>{let i=n.toData();i&&t.set(n.getId(),JSON.stringify(i))}),this.elementBaseline=t}getAllElementStates(){let t=this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]),n=this.elementBaseline,i=[];for(let r of t){if(n&&!r.isDirty())continue;let s=r.toData();s&&(n&&JSON.stringify(s)===n.get(r.getId())||i.push({id:r.getId(),data:s}))}return i}findUnmarkedElements(){let t=this.elementBaseline;return t?this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).filter(n=>{if(n.isDirty())return!1;let i=n.toData();return!!i&&JSON.stringify(i)!==t.get(n.getId())}):[]}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>hn.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${hn.MAX_DEPTH})`);let s=i.shift();if(_e.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
|
|
30
|
-
This should not happen, please report this issue to the developers`);return this._element.state}};var
|
|
31
|
-
Use video.show() to add the video to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Video Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new V(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VideoAction")}};Lt.ActionTypes=Et;var
|
|
32
|
-
Use vfx.show() to add the vfx to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Vfx Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new V(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VfxAction")}};rn.ActionTypes=en;var To=rn;var jn=class jn extends ce{constructor(e){super();let t=jn.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new J("Vfx must have a src")}preload(){return this.chain(this.createAction(en.preload,[]))}show(e){return this.chain(this.createAction(en.show,[e]))}hide(e){return this.chain(this.createAction(en.hide,[e]))}pause(){return this.chain(this.createAction(en.pause,[]))}resume(){return this.chain(this.createAction(en.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(en.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 jn.DefaultVfxState.create().get()}createAction(e,t){return new To(this.chain(),e,C.create(t))}};jn.DefaultVfxConfig=new K({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),jn.DefaultVfxState=new K({display:!1,paused:!1});var Rr=jn;var gi=class extends _{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 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")}};gi.ActionTypes=Ze;var He=class He extends $e{constructor(t){super();this.events=new Q;this.instance=null;this.status="unmounted";let n=He.DefaultUserConfig.create(t),i=He.DefaultPuppetConfig.create(n.get());if(this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(n),!this.config.backend)throw new J("Puppet must have a backend name");if(!this.config.src)throw new J("Puppet must have a src")}static get DefaultUserConfig(){return He._defaultUserConfig??(He._defaultUserConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0,motion:null,expression:null,skin:null,params:{},slots:{},...ie.DefaultTransformState.getDefaultConfig()},{position:t=>H.tryParsePosition(t)}))}static normalizeState(t){let n=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{...n,motion:typeof n.motion=="string"?n.motion:null,expression:typeof n.expression=="string"?n.expression:null,skin:typeof n.skin=="string"?n.skin:null,params:He.copyParams(n.params),slots:He.copySlots(n.slots)}}static mergeState(t,n){return He.normalizeState({...t,...n,params:{...t.params,...n.params||{}},slots:{...t.slots,...n.slots||{}}})}static copyParams(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))typeof r=="number"&&Number.isFinite(r)&&(n[i]=r);return n}static copySlots(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))(typeof r=="string"||r===null)&&(n[i]=r);return n}setMotion(t){return this.chain(this.createAction(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(ie.deserialize(t.transformState).get()),this._deserializeLoop(t.loop),this}_init(t){return new Te(this.chain(),de.init,new C().setContent([t||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}_resolveSize(t){let n=this.config.size;return n?{width:n.width,height:n.height}:{width:t.width,height:t.height}}_getStatus(){return this.getStatus()}_setStatus(t){this.status!==t&&(this.status=t,this.events.emit("event:puppet.statusChange",t))}_onStatusChange(t){return this.onStatusChange(t)}_attachInstance(t){this.instance=t}_getInstance(){return this.instance}_patchState(t){let n=He.normalizeState(this.state);return this.state=He.mergeState(this.state,t),n}async _applyState(){let t=this.instance;t&&await t.apply(He.normalizeState(this.state))}async _runCommand(t,n){let i=this.instance;return i?(await i.command(t,n),!0):!1}async _describe(){let t=this.instance;return!t||typeof t.describe!="function"?null:await t.describe()}createAction(t,n){return new gi(this.chain(),t,C.create(n))}getInitialTransformState(t){let[n]=t.extract(ie.DefaultTransformState.keys());return new ie(ie.DefaultTransformState.create(n.get()).get())}getInitialState(){let t=this.userConfig.get();return He.normalizeState({motion:t.motion,expression:t.expression,skin:t.skin,params:t.params,slots:t.slots})}};He._defaultUserConfig=null,He.DefaultPuppetConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0});var Rt=He;var yi=class extends ce{constructor(e){super(),this.scene=e}show(e){let t=new ne(this.scene.chain(),B.nvlShow,new C().setContent([e]));return this.chain(t)}hide(e){let t=new ne(this.scene.chain(),B.nvlHide,new C().setContent([e]));return this.chain(t)}end(){let e=new ne(this.scene.chain(),B.nvlEnd,new C().setContent([]));return this.chain(e)}};function Mr(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Ka(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return za(o);let i=Ir(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=Ir(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=Ir(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function Ir(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 za(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}function $a(o,e){let t=[],n=i=>{i&&typeof i!="function"&&k.isImageSrc(i)&&t.push(i)};n(e?.config.avatar),n(o.config.avatar);for(let i of o.config.portraits||[])n(Mr(i).avatar);return t}var ue=class ue{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 ti;this.htmlToImage=vu;this.imageCache=null;this.pageRouter=null;this.stageClickBuffer=null;this.advanceSuspensions=new Set;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new Q,this.logger=new io(e,"NarraLeaf-React"),this.audioManager=new oo(this),this.guard=new ro(e.config.app.guard).observe(this),this.timelines=new so(this.guard),this.notificationMgr=new ao(this,[]),this.idManager=new $i,this.actionHistory=new uo(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new po(this.actionHistory),this.stageTransition=new co(this),this.events.on(ue.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=_e.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(ue.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}getImageCache(){return this.imageCache}setImageCache(e){return this.imageCache=e,this}addElement(e){return this.state.elements.push(e),this.logger.debug("GameState","Adding element",e.scene.getId()),this}addScene(e){return this.sceneExists(e)?this:(this.state.elements.unshift({scene:e,texts:[],menus:[],layers:new Map(e.config.layers.map(t=>[t,[]]))}),this.logger.debug("GameState","Adding scene",e.getId()),this)}flush(){return this.stage.update(),this}popScene(){let e=this.state.elements.pop();return e?(this.removeElements(e.scene),this.logger.debug("GameState","Popping scene",e.scene.getId()),this):this}settlePendingLines(e){let t=this.findElementByScene(e);return!t||!t.texts.length?this:([...t.texts].forEach(n=>n.onClick()),this)}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){for(let e=this.state.elements.length-1;e>=0;e--){let t=this.state.elements[e];if(!t.suspended)return t.scene}return null}setSceneSuspended(e,t){let n=this.findElementByScene(e);return n?(n.suspended=t,this.stageTransition.syncScenePose(e,t),this.logger.debug("GameState",t?"Suspending scene":"Resuming scene",e.getId()),this.stage.update(),this):(this.logger.weakWarn("Scene not found when suspending",e.getId()),this)}isSceneSuspended(e){return this.findElementByScene(e)?.suspended===!0}getSuspendedScenes(){return this.state.elements.filter(e=>e.suspended).map(e=>e.scene)}getCurrentScene(){return this.state.elements[0]?.scene||null}isFastForwarding(){return this._fastForwarding}setFastForwarding(e){this._fastForwarding=e}hasActiveMenu(){let e=this.getLastScene();return e?(this.findElementByScene(e)?.menus.length??0)>0:!1}findCurrentPortraitForCharacter(e){let t=(e.config.portraits||[]).map(Mr);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let l=s[a];for(let c=l.length-1;c>=0;c--){let u=l[c],p=r.get(u);if(p&&this.isDisplayableVisible(u))return p}}return null}sceneExists(e){return e?this.state.elements.some(t=>t.scene===e):!!this.getLastScene()}isSceneActive(e){for(let{scene:t}of this.state.elements)if(t===e)return!0;return!1}wait(e){return new Promise(t=>setTimeout(t,e))}schedule(e,t){let n=[],i=setTimeout(()=>{e({retry:()=>{this.schedule(e,0)},onCleanup:r=>{n.push(r)}})},t);return()=>{n.forEach(r=>r()),clearTimeout(i)}}notify(e){this.notificationMgr.addNotification(e)}handle(e){if(this.currentHandling===e)return this;switch(this.currentHandling=e,e.type){case"condition:action":break}return this}createDialog(e,t,n,i){let r=this.findElementByScene(this.getLastSceneIfNot(i))?.texts;if(!r)throw this.sceneNotFound();let s=t.evaluate(we.getCtx({gameState:this}));this.game.getLiveGame().events.emit(Wt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:oe.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1)},text:oe.getText(s)}}createMenu(e,t,n){if(!e.choices.length)throw new Error("Menu must have at least one choice");let i=this.findElementByScene(this.getLastSceneIfNot(n))?.menus;if(!i)throw this.sceneNotFound();let r=e.prompt?.evaluate(we.getCtx({gameState:this}))||null,s=this.createWaitableAction({...e,words:r},a=>{i.splice(i.indexOf(s),1),t&&t(a),this.game.getLiveGame().events.emit(Wt.EventTypes["event:menu.choose"],{sentence:a.prompt,text:a.evaluated})});return i.push(s),{cancel:()=>{let a=i.indexOf(s);a!==-1&&i.splice(a,1)},prompt:r?oe.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(ue.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(ue.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(ue.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(ue.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(ue.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(ue.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(ue.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>ne.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(ue.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(ue.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(ue.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(ue.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{ne.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this.rebindLoops(),this}rebindLoops(){let[e,t]=this.getLiveGame().constructMaps();return t.forEach(n=>{n instanceof $e&&n._rebindLoop(e)}),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(ue.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(ue.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(ue.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(ue.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(ue.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 ja.Howl}registerSrcManager(e){return this.state.srcManagers.push(e),this}offSrcManager(e){return this.state.srcManagers=this.state.srcManagers.filter(t=>t!==e),this}getStorable(){return this.game.getLiveGame().getStorable()}getSceneByName(e){return this.game.getLiveGame().story?.getScene(e)||null}getStory(){if(!this.game.getLiveGame().story)throw new E("Story not loaded");return this.game.getLiveGame().story}setInterval(e,t){return setInterval(e,t)}clearInterval(e){clearInterval(e)}setTimeout(e,t){return setTimeout(e,t)}clearTimeout(e){clearTimeout(e)}forceAnimation(){let[e,t]=ke.proxy(S.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof $e&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(Z.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync(),"flush"in r&&r.flush()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new Ce("State already mounted");if(!e)throw new Ce("Invalid state key");return this.exposedState.set(e,t),this.events.emit(ue.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new E("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=null,i=!1,r=null,s=()=>{if(n=null,i)return;let l=this.getExposedState(e);l&&(i=!0,r?.cancel(),t(l))},a=()=>{n?.(),n=Ga(s)};return this.getExposedState(e)&&a(),r=this.events.on(ue.EventTypes["event.state.onExpose"],l=>{l===e&&!i&&a()}),{cancel:()=>{r?.cancel(),n?.()}}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),...e.suspended?{suspended:!0}:{},elements:{layers:Object.fromEntries(Array.from(e.layers.entries()).map(([t,n])=>[t.getId(),n.map(i=>i.getId())]))}})),audio:this.audioManager.toData(),videos:this.state.videos.map(e=>[e.getId(),e.toData()]),vfx:this.state.vfx.map(e=>[e.getId(),e.toData()]),nvlState:{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,dialogIds:this.nvlState.dialogs.map(e=>e.id),dialogs:this.nvlState.dialogs.map(e=>({id:e.id,actionId:e.actionId,text:e.text,characterId:e.character?e.character.getId():null}))}}}loadData(e,t){if(this.state.elements=[],!this.game.getLiveGame().story)throw new Error("No story loaded");let{scenes:i,audio:r,videos:s}=e;if(i.forEach(({sceneId:a,elements:l,suspended:c})=>{this.logger.debug("Loading scene: "+a);let u=t.get(a);if(!u)throw new E("Scene not found, id: "+a+`
|
|
29
|
+
Returned value ${r} violates the above rules`)}t[i]=r}}),t}deserializeServices(t){this.services.forEach((n,i)=>{!n.deserialize||typeof n.deserialize!="function"||t[i]&&n.deserialize(t[i])})}getScene(t,n=!1,i){if(_e.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||J,[`Scene with name ${t} not found`]);return r}constructStory(){let t=this.entryScene;if(!t)throw new Error("Story must have an entry scene");return this.hashCache.clear(),this.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this.captureElementBaseline(),this.scheduleHashWarmUp(),this}scheduleHashWarmUp(){let t=globalThis.requestIdleCallback;typeof t=="function"&&t(()=>{try{this.hash()}catch{}})}captureElementBaseline(){let t=new Map;this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).forEach(n=>{let i=n.toData();i&&t.set(n.getId(),JSON.stringify(i))}),this.elementBaseline=t}getAllElementStates(){let t=this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]),n=this.elementBaseline,i=[];for(let r of t){if(n&&!r.isDirty())continue;let s=r.toData();s&&(n&&JSON.stringify(s)===n.get(r.getId())||i.push({id:r.getId(),data:s}))}return i}findUnmarkedElements(){let t=this.elementBaseline;return t?this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).filter(n=>{if(n.isDirty())return!1;let i=n.toData();return!!i&&JSON.stringify(i)!==t.get(n.getId())}):[]}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>hn.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${hn.MAX_DEPTH})`);let s=i.shift();if(_e.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 vo(t).run(this)}};hn.defaultConfig={origin:"bottom left"},hn.MAX_DEPTH=32767;var mi=hn;var gn=class extends _{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Wi.setText){let i=this.callee.state.text;return this.callee.state.text=this.contentNode.getContent()[0],e.getExposedStateForce(this.callee).flush(),e.actionHistory.push(n,r=>{this.callee.state.text=r},[i]),super.executeAction(e,t)}else if(this.type===Wi.setFontSize){let i=this.callee.state.fontSize;this.callee.state.fontSize=this.contentNode.getContent()[0];let r=e.getExposedStateForce(this.callee);return r.flush(),r.updateStyleSync(),e.actionHistory.push(n,s=>{this.callee.state.fontSize=s},[i]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("TextAction")}};gn.ActionTypes=Wi;var yt=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(yt||{});import{animate as vu}from"motion/react";var Bt=class{requestAnimations(e){let t=e.map(m=>m.start),n=[],i=0,r=!1,s=!1,a=!1,l=[],c=[],u=[],p=()=>{e.forEach((m,g)=>{t[g]=m.end}),i=e.length,l.forEach(m=>m(t)),c.forEach(m=>m())};return{onUpdate:m=>(l.push(m),{cancel:()=>{let g=l.indexOf(m);g!==-1&&l.splice(g,1)}}),onComplete:m=>(c.push(m),{cancel:()=>{let g=c.indexOf(m);g!==-1&&c.splice(g,1)}}),onCanceled:m=>(u.push(m),{cancel:()=>{let g=u.indexOf(m);g!==-1&&u.splice(g,1)}}),complete:()=>{if(!(i===e.length||s)){if(!r){a=!0;return}n.forEach(m=>m.complete())}},start:()=>{if(!(r||s||i===e.length)){if(r=!0,a){p();return}e.forEach((m,g)=>{n.push(this.requestMotion(m,{onComplete:()=>{t[g]=m.end,l.forEach(b=>b(t)),i++,i===e.length&&c.forEach(b=>b())},onUpdate:b=>{t[g]=b,l.forEach(y=>y(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 vu(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};Bt.AnimationType=yt;var fi=class extends Bt{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new E(`Trying to access text state, but element is not set
|
|
30
|
+
This should not happen, please report this issue to the developers`);return this._element.state}};var So=class o extends fi{constructor(e){super(),this.fontSize=e.fontSize,this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:this.getTextState().fontSize,end:this.fontSize,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(e=>({style:{fontSize:`${e}px`}}))]}}copy(){return new o({fontSize:this.fontSize,duration:this.duration,easing:this.easing})}};var Pe=class Pe extends $e{static get DefaultUserConfig(){return Pe._defaultUserConfig??(Pe._defaultUserConfig=new K({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:"",...ie.DefaultTransformState.getDefaultConfig()},{position:e=>H.tryParsePosition(e)}))}static get DefaultTextTransformState(){return Pe._defaultTextTransformState??(Pe._defaultTextTransformState=new K({fontColor:"#000000",...ie.DefaultTransformState.getDefaultConfig()}))}constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=Pe.DefaultUserConfig.create(n),r=Pe.DefaultTextConfig.create(i.get());this.userConfig=i,this.config=r.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(i)}setText(e){let t=this.chain(),n=new gn(t,gn.ActionTypes.setText,new C().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new Z({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Fe,i=>{if(t){let s=new So({fontSize:e,duration:t,easing:n});i.chain(this._applyTransition(i,s))}let r=new gn(i,gn.ActionTypes.setFontSize,new C().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:Pe.StateSerializer.serialize(this.state),transformState:this.transformState.serialize(),loop:this._serializeLoop()}}fromData(e){return this.state=Pe.StateSerializer.deserialize(e.state),this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_init(e){return new Te(this.chain(),de.init,new C().setContent([e||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}getInitialTransformState(e){let[t]=e.extract(Pe.DefaultTextTransformState.keys());return new ie(Pe.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new Te(e,de.applyTransition,new C().setContent([t,n=>n._setElement(this)]))}getInitialState(){return Pe.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};Pe._defaultUserConfig=null,Pe.DefaultTextConfig=new K({alignX:"center",alignY:"center",className:"",layer:void 0}),Pe.DefaultTextState=new K({fontSize:16,display:!1,text:""}),Pe._defaultTextTransformState=null,Pe.StateSerializer=new qe;var kn=Pe;var bo=class extends _{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(we.getCtx({gameState:e}),n,i);return S.isAwaitable(r)?S.forward(r,{type:this.type,node:this.contentNode?.getChild()}):super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ServiceAction")}};var Dr=class extends ue{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(ha(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 bo(t,"service:action",new C().setContent([n,i]))}},Lr=class extends Dr{},hi=class extends Lr{};var zn=class extends _{executeAction(e,t){if(this.type===Tn.action)return super.executeAction(e,t);if(this.type===Tn.setZIndex){let[n]=this.contentNode.getContent(),i=this.callee.state.zIndex;return this.callee.state.zIndex=n,e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.zIndex=r},[i]),e.stage.update(),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("LayerAction")}};zn.ActionTypes=Tn;var it=class it extends $e{static get DefaultUserConfig(){return it._defaultUserConfig??(it._defaultUserConfig=new K({zIndex:0,...ie.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 zn(this.chain(),Tn.setZIndex,new C().setContent([e])))}bringToFront(){throw new E(`A layer cannot be brought to front. Layers are ordered by z-index, not by the order they were added in \u2014 use Layer.setZIndex to raise one. (layer: ${this.config.name})`)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState().get()),this}toData(){return{state: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(ie.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 zn(this.chain(),Tn.action,new C),new Te(this.chain(),de.init,new C().setContent([e,null,!1]))]}getInitialState(){return it.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(ie.DefaultTransformState.keys());return new ie(ie.DefaultTransformState.create(e.get()).get())}};it._defaultUserConfig=null,it.DefaultConfig=new K({name:"(anonymous)",zIndex:0}),it.StateSerializer=new qe,it.DefaultState=new K({zIndex:0});var Kn=it;var Lt=class Lt extends _{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(Lt,"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(Lt,"video:play"))return e.reportUnwarmedVideo(i),this.changeStateAsync(e,s=>s.play(),t);if(n.is(Lt,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(Lt,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(Lt,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(Lt,"video:show")){let s=i.state.display;return e.reportUnwarmedVideo(i),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(Lt,"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(Lt,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoOnStage(this.callee))throw new E(`Video is being used before it is added to the game
|
|
31
|
+
Use video.show() to add the video to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Video Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new V(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VideoAction")}};Lt.ActionTypes=Et;var To=Lt;var $n=class $n extends ue{constructor(e){super();let t=$n.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new J("Video must have a src")}preload(){return this.chain(this.createAction(Et.preload,[]))}show(){return this.chain(this.createAction(Et.show,[]))}hide(){return this.chain(this.createAction(Et.hide,[]))}play(){return this.chain(this.createAction(Et.play,[]))}pause(){return this.chain(this.createAction(Et.pause,[]))}resume(){return this.chain(this.createAction(Et.resume,[]))}stop(){return this.chain(this.createAction(Et.stop,[]))}seek(e){return this.chain(this.createAction(Et.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 $n.DefaultVideoState.create().get()}createAction(e,t){return new To(this.chain(),e,C.create(t))}};$n.DefaultVideoConfig=new K({src:"",muted:!1}),$n.DefaultVideoState=new K({display:!1});var Rr=$n;var rn=class rn extends _{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(rn,"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(rn,"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(rn,"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(rn,"vfx:pause"))return this.changeState(e,s=>{i.state.paused=!0,s.pause()},t);if(n.is(rn,"vfx:resume"))return this.changeState(e,s=>{i.state.paused=!1,s.resume()},t);if(n.is(rn,"vfx:setRate"))return this.changeState(e,s=>s.setRate(n.contentNode.getContent()[0]),t)}throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVfxAdded(this.callee))throw new E(`Vfx is being used before it is added to the game
|
|
32
|
+
Use vfx.show() to add the vfx to the game`);let i=this.callee,r=new S,s=e.getExposedStateAsync(i,async a=>{e.logger.debug("Vfx Component state exposed",a),await t(a),r.resolve(super.executeAction(e,n))});return r.registerSkipController(new V(s.cancel)),r}changeState(e,t,n){return this.changeStateBase(e,t,n)}changeStateAsync(e,t,n){return this.changeStateBase(e,t,n)}stringify(e,t,n){return super.stringifyWithName("VfxAction")}};rn.ActionTypes=en;var Ao=rn;var jn=class jn extends ue{constructor(e){super();let t=jn.DefaultVfxConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new J("Vfx must have a src")}preload(){return this.chain(this.createAction(en.preload,[]))}show(e){return this.chain(this.createAction(en.show,[e]))}hide(e){return this.chain(this.createAction(en.hide,[e]))}pause(){return this.chain(this.createAction(en.pause,[]))}resume(){return this.chain(this.createAction(en.resume,[]))}setPlaybackRate(e){return this.chain(this.createAction(en.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 jn.DefaultVfxState.create().get()}createAction(e,t){return new Ao(this.chain(),e,C.create(t))}};jn.DefaultVfxConfig=new K({src:"",blendMode:"normal",loop:!0,muted:!0,opacity:1,playbackRate:1,fit:"cover",zIndex:0}),jn.DefaultVfxState=new K({display:!1,paused:!1});var Ir=jn;var gi=class extends _{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 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")}};gi.ActionTypes=Ze;var He=class He extends $e{constructor(t){super();this.events=new X;this.instance=null;this.status="unmounted";let n=He.DefaultUserConfig.create(t),i=He.DefaultPuppetConfig.create(n.get());if(this.userConfig=n,this.config=i.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(n),!this.config.backend)throw new J("Puppet must have a backend name");if(!this.config.src)throw new J("Puppet must have a src")}static get DefaultUserConfig(){return He._defaultUserConfig??(He._defaultUserConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0,motion:null,expression:null,skin:null,params:{},slots:{},...ie.DefaultTransformState.getDefaultConfig()},{position:t=>H.tryParsePosition(t)}))}static normalizeState(t){let n=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{...n,motion:typeof n.motion=="string"?n.motion:null,expression:typeof n.expression=="string"?n.expression:null,skin:typeof n.skin=="string"?n.skin:null,params:He.copyParams(n.params),slots:He.copySlots(n.slots)}}static mergeState(t,n){return He.normalizeState({...t,...n,params:{...t.params,...n.params||{}},slots:{...t.slots,...n.slots||{}}})}static copyParams(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))typeof r=="number"&&Number.isFinite(r)&&(n[i]=r);return n}static copySlots(t){let n={};if(!t||typeof t!="object")return n;for(let[i,r]of Object.entries(t))(typeof r=="string"||r===null)&&(n[i]=r);return n}setMotion(t){return this.chain(this.createAction(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(ie.deserialize(t.transformState).get()),this._deserializeLoop(t.loop),this}_init(t){return new Te(this.chain(),de.init,new C().setContent([t||null,this.config.layer||null]))}reset(){super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get())}_resolveSize(t){let n=this.config.size;return n?{width:n.width,height:n.height}:{width:t.width,height:t.height}}_getStatus(){return this.getStatus()}_setStatus(t){this.status!==t&&(this.status=t,this.events.emit("event:puppet.statusChange",t))}_onStatusChange(t){return this.onStatusChange(t)}_attachInstance(t){this.instance=t}_getInstance(){return this.instance}_patchState(t){let n=He.normalizeState(this.state);return this.state=He.mergeState(this.state,t),n}async _applyState(){let t=this.instance;t&&await t.apply(He.normalizeState(this.state))}async _runCommand(t,n){let i=this.instance;return i?(await i.command(t,n),!0):!1}async _describe(){let t=this.instance;return!t||typeof t.describe!="function"?null:await t.describe()}createAction(t,n){return new gi(this.chain(),t,C.create(n))}getInitialTransformState(t){let[n]=t.extract(ie.DefaultTransformState.keys());return new ie(ie.DefaultTransformState.create(n.get()).get())}getInitialState(){let t=this.userConfig.get();return He.normalizeState({motion:t.motion,expression:t.expression,skin:t.skin,params:t.params,slots:t.slots})}};He._defaultUserConfig=null,He.DefaultPuppetConfig=new K({backend:"",src:"",options:{},size:null,className:"",layer:void 0});var Rt=He;var yi=class extends ue{constructor(e){super(),this.scene=e}show(e){let t=new ne(this.scene.chain(),B.nvlShow,new C().setContent([e]));return this.chain(t)}hide(e){let t=new ne(this.scene.chain(),B.nvlHide,new C().setContent([e]));return this.chain(t)}end(){let e=new ne(this.scene.chain(),B.nvlEnd,new C().setContent([]));return this.chain(e)}};function Nr(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function $a(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return Ka(o);let i=Mr(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=Mr(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=Mr(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function Mr(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 Ka(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}function ja(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(Nr(i).avatar);return t}var ae=class ae{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 ti;this.videoMissingReporter=null;this.reportedUnwarmedVideos=new Set;this.htmlToImage=Su;this.imageCache=null;this.pageRouter=null;this.stageClickBuffer=null;this.advanceSuspensions=new Set;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this._fastForwarding=!1;this.stage=t,this.game=e,this.events=new X,this.logger=new io(e,"NarraLeaf-React"),this.audioManager=new oo(this),this.guard=new ro(e.config.app.guard).observe(this),this.timelines=new so(this.guard),this.notificationMgr=new ao(this,[]),this.idManager=new $i,this.actionHistory=new po(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new mo(this.actionHistory),this.stageTransition=new co(this),this.videoWarmQueue=new uo({isDeclared:n=>this.state.videos.includes(n),onChange:()=>this.stage.update()}),this.events.on(ae.EventTypes["event.state.onExpose"],n=>{this.videoWarmQueue.noteReady(n)}),this.events.on(ae.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.videoWarmQueue.forget(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)}isVideoOnStage(e){return this.state.videos.includes(e)||this.videoWarmQueue.getAdmitted().includes(e)}getVideos(){let e=this.videoWarmQueue.getAdmitted();return e.length?[...this.state.videos,...e.filter(t=>!this.state.videos.includes(t))]:this.state.videos}retainWarmVideos(e){return this.videoWarmQueue.retain(e),this}useVideoMissingReporter(e){return this.videoMissingReporter=e,this}reportUnwarmedVideo(e){let t=e.config.src;return!this.videoMissingReporter||!t||this.reportedUnwarmedVideos.has(t)?this:this.videoWarmQueue.isPlanned(e)||this.isVideoOnStage(e)?this:(this.reportedUnwarmedVideos.add(t),this.videoMissingReporter({type:"video",src:t}),this)}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=_e.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(ae.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}getImageCache(){return this.imageCache}setImageCache(e){return this.imageCache=e,this}addElement(e){return this.state.elements.push(e),this.logger.debug("GameState","Adding element",e.scene.getId()),this}addScene(e){return this.sceneExists(e)?this:(this.state.elements.unshift({scene:e,texts:[],menus:[],layers:new Map(e.config.layers.map(t=>[t,[]]))}),this.logger.debug("GameState","Adding scene",e.getId()),this)}flush(){return this.stage.update(),this}popScene(){let e=this.state.elements.pop();return e?(this.removeElements(e.scene),this.logger.debug("GameState","Popping scene",e.scene.getId()),this):this}settlePendingLines(e){let t=this.findElementByScene(e);return!t||!t.texts.length?this:([...t.texts].forEach(n=>n.onClick()),this)}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){for(let e=this.state.elements.length-1;e>=0;e--){let t=this.state.elements[e];if(!t.suspended)return t.scene}return null}setSceneSuspended(e,t){let n=this.findElementByScene(e);return n?(n.suspended=t,this.stageTransition.syncScenePose(e,t),this.logger.debug("GameState",t?"Suspending scene":"Resuming scene",e.getId()),this.stage.update(),this):(this.logger.weakWarn("Scene not found when suspending",e.getId()),this)}isSceneSuspended(e){return this.findElementByScene(e)?.suspended===!0}getSuspendedScenes(){return this.state.elements.filter(e=>e.suspended).map(e=>e.scene)}getCurrentScene(){return this.state.elements[0]?.scene||null}isFastForwarding(){return this._fastForwarding}setFastForwarding(e){this._fastForwarding=e}hasActiveMenu(){let e=this.getLastScene();return e?(this.findElementByScene(e)?.menus.length??0)>0:!1}findCurrentPortraitForCharacter(e){let t=(e.config.portraits||[]).map(Nr);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let l=s[a];for(let c=l.length-1;c>=0;c--){let u=l[c],p=r.get(u);if(p&&this.isDisplayableVisible(u))return p}}return null}sceneExists(e){return e?this.state.elements.some(t=>t.scene===e):!!this.getLastScene()}isSceneActive(e){for(let{scene:t}of this.state.elements)if(t===e)return!0;return!1}wait(e){return new Promise(t=>setTimeout(t,e))}schedule(e,t){let n=[],i=setTimeout(()=>{e({retry:()=>{this.schedule(e,0)},onCleanup:r=>{n.push(r)}})},t);return()=>{n.forEach(r=>r()),clearTimeout(i)}}notify(e){this.notificationMgr.addNotification(e)}handle(e){if(this.currentHandling===e)return this;switch(this.currentHandling=e,e.type){case"condition:action":break}return this}createDialog(e,t,n,i){let r=this.findElementByScene(this.getLastSceneIfNot(i))?.texts;if(!r)throw this.sceneNotFound();let s=t.evaluate(we.getCtx({gameState:this}));this.game.getLiveGame().events.emit(Wt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:oe.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let l=r.indexOf(a);l!==-1&&r.splice(l,1)},text:oe.getText(s)}}createMenu(e,t,n){if(!e.choices.length)throw new Error("Menu must have at least one choice");let i=this.findElementByScene(this.getLastSceneIfNot(n))?.menus;if(!i)throw this.sceneNotFound();let r=e.prompt?.evaluate(we.getCtx({gameState:this}))||null,s=this.createWaitableAction({...e,words:r},a=>{i.splice(i.indexOf(s),1),t&&t(a),this.game.getLiveGame().events.emit(Wt.EventTypes["event:menu.choose"],{sentence:a.prompt,text:a.evaluated})});return i.push(s),{cancel:()=>{let a=i.indexOf(s);a!==-1&&i.splice(a,1)},prompt:r?oe.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(ae.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(ae.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(ae.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(ae.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(ae.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(ae.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>ne.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(ae.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(ae.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{ne.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this.rebindLoops(),this}rebindLoops(){let[e,t]=this.getLiveGame().constructMaps();return t.forEach(n=>{n instanceof $e&&n._rebindLoop(e)}),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(ae.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(ae.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(ae.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(ae.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(ae.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.videoWarmQueue.clear(),this.reportedUnwarmedVideos.clear(),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 qa.Howl}registerSrcManager(e){return this.state.srcManagers.push(e),this}offSrcManager(e){return this.state.srcManagers=this.state.srcManagers.filter(t=>t!==e),this}getStorable(){return this.game.getLiveGame().getStorable()}getSceneByName(e){return this.game.getLiveGame().story?.getScene(e)||null}getStory(){if(!this.game.getLiveGame().story)throw new E("Story not loaded");return this.game.getLiveGame().story}setInterval(e,t){return setInterval(e,t)}clearInterval(e){clearInterval(e)}setTimeout(e,t){return setTimeout(e,t)}clearTimeout(e){clearTimeout(e)}forceAnimation(){let[e,t]=ke.proxy(S.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof $e&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(Z.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync(),"flush"in r&&r.flush()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new Ce("State already mounted");if(!e)throw new Ce("Invalid state key");return this.exposedState.set(e,t),this.events.emit(ae.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new E("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=null,i=!1,r=null,s=()=>{if(n=null,i)return;let l=this.getExposedState(e);l&&(i=!0,r?.cancel(),t(l))},a=()=>{n?.(),n=Fa(s)};return this.getExposedState(e)&&a(),r=this.events.on(ae.EventTypes["event.state.onExpose"],l=>{l===e&&!i&&a()}),{cancel:()=>{r?.cancel(),n?.()}}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),...e.suspended?{suspended:!0}:{},elements:{layers:Object.fromEntries(Array.from(e.layers.entries()).map(([t,n])=>[t.getId(),n.map(i=>i.getId())]))}})),audio:this.audioManager.toData(),videos:this.state.videos.map(e=>[e.getId(),e.toData()]),vfx:this.state.vfx.map(e=>[e.getId(),e.toData()]),nvlState:{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,dialogIds:this.nvlState.dialogs.map(e=>e.id),dialogs:this.nvlState.dialogs.map(e=>({id:e.id,actionId:e.actionId,text:e.text,characterId:e.character?e.character.getId():null}))}}}loadData(e,t){if(this.state.elements=[],!this.game.getLiveGame().story)throw new Error("No story loaded");let{scenes:i,audio:r,videos:s}=e;if(i.forEach(({sceneId:a,elements:l,suspended:c})=>{this.logger.debug("Loading scene: "+a);let u=t.get(a);if(!u)throw new E("Scene not found, id: "+a+`
|
|
33
33
|
NarraLeaf cannot find the element with the id from the saved game`);let p={scene:u,layers:this.constructLayerMap(l.layers,t),menus:[],texts:[],suspended:c===!0};this.state.elements.push(p),this.registerSrcManager(u.srcManager),p.suspended||this.getExposedStateAsync(u,d=>{ne.initBackgroundMusic(u,d,this)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,l])=>{let c=t.get(a);if(!c)throw new E("Video not found, id: "+a+`
|
|
34
|
-
NarraLeaf cannot find the element with the id from the saved game`);return c.fromData(l),c}),this.state.vfx=(e.vfx??[]).flatMap(([a,l])=>{let c=t.get(a);return c?(c.fromData(l),[c]):(this.logger.weakWarn("NarraLeaf-React: Vfx","Vfx not found when loading a saved game, skipped. (id: "+a+")"),[])}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(l=>{let c=l.characterId&&t.get(l.characterId)||null,u=l.text||"";return{id:l.id,actionId:l.actionId||l.id,character:c,sentence:new fe(u,{character:c}),text:u}});this.nvlState={active:e.nvlState.active,visible:e.nvlState.visible,sessionId:e.nvlState.sessionId,dialogs:a,options:e.nvlState.options||null,activeDialogId:e.nvlState.activeDialogId||null,phase:e.nvlState.phase||(e.nvlState.activeDialogId?"awaitAdvance":"idle"),pendingAdvance:e.nvlState.pendingAdvance||!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active&&this.events.emit(
|
|
34
|
+
NarraLeaf cannot find the element with the id from the saved game`);return c.fromData(l),c}),this.state.vfx=(e.vfx??[]).flatMap(([a,l])=>{let c=t.get(a);return c?(c.fromData(l),[c]):(this.logger.weakWarn("NarraLeaf-React: Vfx","Vfx not found when loading a saved game, skipped. (id: "+a+")"),[])}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(l=>{let c=l.characterId&&t.get(l.characterId)||null,u=l.text||"";return{id:l.id,actionId:l.actionId||l.id,character:c,sentence:new fe(u,{character:c}),text:u}});this.nvlState={active:e.nvlState.active,visible:e.nvlState.visible,sessionId:e.nvlState.sessionId,dialogs:a,options:e.nvlState.options||null,activeDialogId:e.nvlState.activeDialogId||null,phase:e.nvlState.phase||(e.nvlState.activeDialogId?"awaitAdvance":"idle"),pendingAdvance:e.nvlState.pendingAdvance||!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active&&this.events.emit(ae.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],!0,this.nvlState.options?.showTransition),this.emitNvlStateChange()}}getLastSceneIfNot(e){let t=e||this.getLastScene();if(!t||!this.sceneExists(t))throw new E('Scene not found, please call "scene.activate()" first.');return t}createElementSnapshot(e){return{scene:e.scene,suspended:e.suspended===!0,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(i=>[i,i.toData()])]))}}fromElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(([i,r])=>(i.fromData(r),i))])),texts:[],menus:[]}}removeElements(e){let t=this.state.elements.findIndex(n=>n.scene===e);return t===-1?(this.logger.weakWarn("Scene not found when removing elements",e.getId()),this):(this.resetLayers(this.state.elements[t].layers),this.state.elements.splice(t,1),this.logger.debug("GameState","Removing elements",e.getId()),this)}resetLayers(e){let t=this.getLiveGame().story?.camera??null;e.forEach((n,i)=>{i.reset(),n.forEach(r=>{t&&r===t||r.reset()})})}syncNvlDerivedState(){this.nvlState.isTyping=this.nvlState.phase==="typing",this.nvlState.activeDialogId||(this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.nvlState.isTyping=!1)}emitNvlStateChange(){this.syncNvlDerivedState(),this.events.emit(ae.EventTypes["event:state.nvl.change"],this.getNvlState()),this.stage.update()}resolveNvlAdvance(e){let t=this.nvlAdvanceWaiters.get(e);return t?(this.nvlAdvanceWaiters.delete(e),this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),t(),!0):!1}isDisplayableVisible(e){return(e.transformState.get().opacity??0)>0}createWaitableAction(e,t){return{action:e,onClick:(i=>{t&&t(i)})}}sceneNotFound(){return new E("Scene not found, target scene may not be activated. This is an internal error, please report this to the developer.")}layerNotFound(){return new E("Layer not found, target layer may not be activated. You may forget to add the layer to the scene config")}constructLayerMap(e,t){return new Map(Object.entries(e).map(([n,i])=>{let r=t.get(n);if(!r)throw new E("Layer not found, id: "+n+`
|
|
35
35
|
NarraLeaf cannot find the element with the id from the saved game`);return[r,i.map(s=>{if(!t.has(s))throw new E("Displayable not found, id: "+s+`
|
|
36
36
|
NarraLeaf cannot find the element with the id from the saved game
|
|
37
|
-
This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};
|
|
38
|
-
To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Ee}static getOwnedSounds(t){let n=[],i=t.callee;if(Ee.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof ne&&t.type===B.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t,n){return new qe({backgroundImage:i=>i.toData(),backgroundMusic:i=>{let r=i?.toData();if(!r)return null;let s=i.getId();return s?{...r,id:s}:r}},{backgroundImage:i=>t.state.backgroundImage.fromData(i),backgroundMusic:i=>{if(!i)return null;let r=i.id?n?.get(i.id):void 0,s=r instanceof ge?r:t.state.backgroundMusic;return s?s.fromData(i):null}})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.combineActions(new Fe,()=>this.background.char(t,n))}jumpTo(t,n={}){let i=j({},n instanceof Bt?{transition:n}:n);return i.returnable?this._callScene(t,i.transition):this.combineActions(new Fe({allowFutureScene:!1}),r=>(r.chain(new ne(r,"scene:preUnmount",new C().setContent([]))).chain(this._initScene(t))._transitionToScene(i.transition,t).chain(this._exit()),r))._jumpTo(t)}_callScene(t,n){return this.combineActions(new Fe({allowFutureScene:!1}),i=>(i.chain(this._preSuspend(t)).chain(this._initScene(t))._transitionToScene(n,t),i))._callTo(t)._resume(t)}setBackgroundMusic(t,n){return this.chain(new ne(this.chain(),B.setBackgroundMusic,new C().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new yi(this),a=typeof r=="function"?r(s):r,l=this.narrativeToActions(a),c={showTransition:i,hideTransition:i},u=new ne(this.chain(),B.nvlEnd,new C().setContent([c])),p=[...l,u];super.constructNodes(p);let d=new ne(this.chain(),B.nvlBlock,new C().setContent([p,c]));return this.chain(d)}action(t){return this.actions=t,this}preloadImage(t){if(!
|
|
37
|
+
This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};ae.EventTypes={"event:state.end":"event:state.end","event:state.player.skip":"event:state.player.skip","event:state.player.lineEnd":"event:state.player.lineEnd","event:state.dialog.change":"event:state.dialog.change","event:state.player.requestFlush":"event:state.player.requestFlush","event:state.player.stageClick":"event:state.player.stageClick","event:state.scene.mount":"event:state.scene.mount","event:state.scene.unmount":"event:state.scene.unmount","event.state.onExpose":"event.state.onExpose","event:state.onRender":"event:state.onRender","event:state:flushPreloadedScenes":"event:state:flushPreloadedScenes","event:state.nvl.enter":"event:state.nvl.enter","event:state.nvl.exit":"event:state.nvl.exit","event:state.nvl.dialogComplete":"event:state.nvl.dialogComplete","event:state.nvl.dialogAppend":"event:state.nvl.dialogAppend","event:state.nvl.visibilityChange":"event:state.nvl.visibilityChange","event:state.nvl.change":"event:state.nvl.change"};var R=ae;var It=class It extends _{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:ge.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}static cutTrailingVoice(e,t){let n=It.trailingVoice.get(e);n&&n!==t&&e.audioManager.isPlaying(n)&&e.timelines.attachTimeline(e.audioManager.stop(n,0)),t?It.trailingVoice.set(e,t):It.trailingVoice.delete(e)}executeAction(e,t){if(this.type===Zt.say){let n=null,i="",r=null,s=new S(g=>g).registerSkipController(new V(()=>{n?.()})),a=new ke(s),l=this.contentNode.getContent(),c=e.isNvlMode(),u=e.getLiveGame(),p=e.createPresentationSnapshot(),d=u.lastDialog?{sentence:u.lastDialog.sentence,speaker:u.lastDialog.speaker}:null,h=It.getVoice(e,l);if(h){It.cutTrailingVoice(e,h);let g=e.audioManager.play(h);a.attachChild(g)}let f=h?e.events.on(R.EventTypes["event:state.player.lineEnd"],()=>{let g=It.endVoiceWithPreference(e,h);g&&e.timelines.attachTimeline(g),f?.cancel()}):null;if(c){let g=this.getId(),y=(e.getActiveNvlDialogForAction(g)||e.getLatestNvlDialogForAction(g))?.id||e.allocateNvlDialogId(g),v=l.evaluate(we.getCtx({gameState:e}));i=oe.getText(v),u.events.emit(Wt.EventTypes["event:character.prompt"],{character:l.config.character,sentence:l,text:i});let A=!1,x=()=>{A||(A=!0,e.events.emit(R.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:k}=e.ensureNvlDialog({id:y,actionId:g,character:this.callee,sentence:l,text:i});r=y;let T=e.consumeNvlTypingSuppression(),w=k&&!T?"typing":"awaitAdvance";e.activateNvlDialog(y,w,!k);let D=e.waitForNvlAdvance(y,()=>{e.settleNvlDialog(y),x()});n=()=>{D.cancel()}}else{let g=e.idManager.generateId(),b=e.createDialog(g,l,()=>{e.settleAdvDialog(g),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(g,this.getId()),i=b.text,n=()=>{e.settleAdvDialog(g),b.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 g=It.endVoiceWithPreference(e,h);g&&a.attachChild(g)}n?.(),r&&(e.removeNvlDialog(r),e.settleNvlDialog(r)),e.restorePresentationSnapshot(p),d?u.setLastDialog(d.sentence,d.speaker):u.lastDialog=null});return e.gameHistory.push({token:m,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,voiceId:l.config.voiceId??null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===Zt.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")}};It.ActionTypes=Zt,It.trailingVoice=new WeakMap;var nt=It;var Ee=class Ee extends Vn{constructor(t,n){super();this.srcManager=new Re;this.events=new X;this.actions=[];this.voiceCache=new Map;this._futureActions_=[];this.labelMap=new Map;let i=Ee.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=Ee.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=Ee.DefaultUserConfig.create(n),a=Ee.DefaultSceneConfig.create({...s.get(),name:t,layers:[...s.get().layers,i,r],defaultBackgroundLayer:i,defaultDisplayableLayer:r});this.userConfig=s,this.config=a.get(),this.state=this.getInitialState(),this.localPersistent=new Wn(t)}static get DefaultSceneConfig(){return Ee._defaultSceneConfig??(Ee._defaultSceneConfig=new K({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new Kn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new Kn("[[Displayable Layer]]",{zIndex:0})},{voices:t=>{let n=r=>typeof r=="object"&&r!==null,i=r=>typeof r=="function";if(!t)return null;if(n(t)&&Object.values(t).forEach(r=>{ge.isSound(r)&&Ee.validateVoice(r)}),i(t))return t;throw new Oe(`Invalid voices config: ${t}`)}}))}static validateVoice(t){if(!no(t.config.type,[tt.voice,tt.sound]))throw new Oe(`Voice must be a voice, but got ${t.config.type}.
|
|
38
|
+
To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Ee}static getOwnedSounds(t){let n=[],i=t.callee;if(Ee.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof ne&&t.type===B.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t,n){return new qe({backgroundImage:i=>i.toData(),backgroundMusic:i=>{let r=i?.toData();if(!r)return null;let s=i.getId();return s?{...r,id:s}:r}},{backgroundImage:i=>t.state.backgroundImage.fromData(i),backgroundMusic:i=>{if(!i)return null;let r=i.id?n?.get(i.id):void 0,s=r instanceof ge?r:t.state.backgroundMusic;return s?s.fromData(i):null}})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.combineActions(new Fe,()=>this.background.char(t,n))}jumpTo(t,n={}){let i=j({},n instanceof Bt?{transition:n}:n);return i.returnable?this._callScene(t,i.transition):this.combineActions(new Fe({allowFutureScene:!1}),r=>(r.chain(new ne(r,"scene:preUnmount",new C().setContent([]))).chain(this._initScene(t))._transitionToScene(i.transition,t).chain(this._exit()),r))._jumpTo(t)}_callScene(t,n){return this.combineActions(new Fe({allowFutureScene:!1}),i=>(i.chain(this._preSuspend(t)).chain(this._initScene(t))._transitionToScene(n,t),i))._callTo(t)._resume(t)}setBackgroundMusic(t,n){return this.chain(new ne(this.chain(),B.setBackgroundMusic,new C().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new yi(this),a=typeof r=="function"?r(s):r,l=this.narrativeToActions(a),c={showTransition:i,hideTransition:i},u=new ne(this.chain(),B.nvlEnd,new C().setContent([c])),p=[...l,u];super.constructNodes(p);let d=new ne(this.chain(),B.nvlBlock,new C().setContent([p,c]));return this.chain(d)}action(t){return this.actions=t,this}preloadImage(t){if(!P.isImageSrc(t))throw new Error("Invalid image source: "+t);return(Array.isArray(t)?t:[t]).forEach(i=>{this.srcManager.register({type:"image",src:i})}),this}toData(){return{state:Ee.getStateSerializer(this).serialize(this.state)}}fromData(t,n){return this.state=Ee.getStateSerializer(this,n).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new ne(this.chain(),"scene:action",new C);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>ze.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[],l=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{ze.isChained(m)||(m instanceof O?s.push(m):m instanceof kn?a.push(m):m instanceof Rt&&l.push(m))});let c=[],u=[],p=new Map;s.forEach(m=>{m.config.isWearable?u.push(m):m.config.autoInit&&c.push(m);for(let g of m.config.wearables){if(p.get(g)&&p.get(g)!==m)throw new Error(`Wearable image cannot be used multiple times
|
|
39
39
|
Maybe you bind the same wearable image to multiple parent images
|
|
40
|
-
Parent Conflict (src: `+p.get(
|
|
41
|
-
Current Parent (src: `+m.state.currentSrc+")");p.set(
|
|
42
|
-
To prevent unintended behavior and unexpected results, the sound have to be on the music bus (or any bus beneath it). Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new O({src:t.background,opacity:1,autoFit:!0,name:`[[Background Image of ${this.config.name}]]`,layer:this.config.defaultBackgroundLayer})._setIsBackground(!0),i=t.backgroundMusic?this.state?.backgroundMusic?this.state.backgroundMusic.reset():t.backgroundMusic:null;return{backgroundImage:n,backgroundMusic:i}}_jumpTo(t){return this.chain(new ne(this.chain(),"scene:jumpTo",new C().setContent([t])))}_callTo(t){return this.chain(new ne(this.chain(),"scene:callTo",new C().setContent([t])))}_resume(t){return this.chain(new ne(this.chain(),"scene:resume",new C().setContent([t])))}_preSuspend(t){return new ne(this.chain(),"scene:preSuspend",new C().setContent([t]))}_exit(){return new ne(this.chain(),"scene:exit",new C().setContent([]))}_transitionToScene(t,n){let i=this.chain();return t?i.chain(new ne(i,B.transitionToScene,new C().setContent([t,n]))):i}_init(t){return new ne(this.chain(),"scene:init",new C().setContent([t]))}_initScene(t){return[t._init(t),...t.config.layers.flatMap(n=>n._init(t)),...t._initBackground(t,t.config.defaultBackgroundLayer)]}_initBackground(t,n){return[t.state.backgroundImage._init(t,n)]}};Ee.EventTypes={"event:scene.remove":"event:scene.remove","event:scene.load":"event:scene.load","event:scene.unload":"event:scene.unload","event:scene.mount":"event:scene.mount","event:scene.unmount":"event:scene.unmount","event:scene.preUnmount":"event:scene.preUnmount","event:scene.imageLoaded":"event:scene.imageLoaded"},Ee.DefaultUserConfig=new K({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Ee._defaultSceneConfig=null;var _e=Ee;var
|
|
40
|
+
Parent Conflict (src: `+p.get(g)?.state.currentSrc+`)
|
|
41
|
+
Current Parent (src: `+m.state.currentSrc+")");p.set(g,m)}});let d=[...this._initScene(this),...c.map(m=>m._init(this)),...u.map(m=>{if(!p.has(m))throw new Error("Wearable image must have a parent image");return p.get(m)._initWearable(m)}),...a.map(m=>m._init()),...l.map(m=>m._init()),...r],h=super.constructNodes(d),f=new C(this.sceneRoot,void 0,h||void 0).setContent(this);return h?.setParent(f),this.sceneRoot?.setContentNode(f),this._futureActions_=d,this.constructLabels(t),this}constructLabels(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!1}),i=new Map;for(let r of n)if(r instanceof se&&r.type===re.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 se&&r.type===re.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"?on.say(n).getActions():ze.toActions([n]))}isSceneRootConstructed(){return!!this.sceneRoot}registerSrc(t,n=new Set){if(!this.sceneRoot)return;let i=new Set,r=new Set,s=[this.sceneRoot],a=new Set;for(;s.length;){let l=s.shift();if(!i.has(l)){if(i.add(l),l instanceof ne){let c=l.callee;if(P.isImageSrc(c.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:P.srcToURL(c.state.backgroundImage.state.currentSrc)}),l.type===B.jumpTo||l.type===B.callTo){let p=l,d=p.contentNode.getContent()[0],h=Ee.getScene(t,d);if(!h)throw l._sceneNotFoundError(l.getSceneName(d));let f=Re.getPreloadableSrc(t,l);if(f&&this.srcManager.register(f),!r.has(p)&&!n.has(h))r.add(p),a.add(h),n.add(h);else if(l.type===B.jumpTo)continue}}else if(l instanceof Se){let c=Re.getPreloadableSrc(t,l);c&&this.srcManager.register(c)}else if(l instanceof et)this.srcManager.register(l.callee);else if(l instanceof nt){let c=l.type===Zt.say?l.contentNode.getContent():null;for(let u of ja(l.callee,c))this.srcManager.register({type:"image",src:P.srcToURL(u)})}else if(l instanceof se){let u=l.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else l instanceof Te&&this.srcManager.register(l.callee.srcManager.getSrc());s.push(...l.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(l=>{l.registerSrc(t,n),this.srcManager.registerFuture(l.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let l=a.getStaticId();if(l){if(i.has(l))throw new Oe(`Duplicate static action id: ${l}`);i.add(l)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let l=a.getStaticId();a.resolveId(l||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((s,a)=>{s.resolveId(`e-${a}`)});let i=new Set;this.getAllChildren(t,this.sceneRoot||[]).forEach(s=>{Ee.getOwnedSounds(s).forEach(a=>i.add(a))});let r=0;i.forEach(s=>{s.getId()||s.resolveId(`s-${r}`),r++})}getVoice(t){if(!t)return null;let n=this.config.voices;if(n){if(typeof n=="function"){let r=n(t);return typeof r=="string"?this.voiceOfSrc(r):(Ee.validateVoice(r),r)}let i=n[t];return typeof i=="string"?this.voiceOfSrc(i):i||null}return null}voiceOfSrc(t){let n=this.voiceCache.get(t);if(n)return n;let i=ge.voice(t);return this.voiceCache.set(t,i),i}getSceneRoot(){if(!this.sceneRoot)throw new Error("Scene root is not constructed");return this.sceneRoot}stringify(t,n,i){return super.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}).map(r=>r.stringify(t,n,i)).join(";")}reset(){super.reset(),this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&!no(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}.
|
|
42
|
+
To prevent unintended behavior and unexpected results, the sound have to be on the music bus (or any bus beneath it). Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new O({src:t.background,opacity:1,autoFit:!0,name:`[[Background Image of ${this.config.name}]]`,layer:this.config.defaultBackgroundLayer})._setIsBackground(!0),i=t.backgroundMusic?this.state?.backgroundMusic?this.state.backgroundMusic.reset():t.backgroundMusic:null;return{backgroundImage:n,backgroundMusic:i}}_jumpTo(t){return this.chain(new ne(this.chain(),"scene:jumpTo",new C().setContent([t])))}_callTo(t){return this.chain(new ne(this.chain(),"scene:callTo",new C().setContent([t])))}_resume(t){return this.chain(new ne(this.chain(),"scene:resume",new C().setContent([t])))}_preSuspend(t){return new ne(this.chain(),"scene:preSuspend",new C().setContent([t]))}_exit(){return new ne(this.chain(),"scene:exit",new C().setContent([]))}_transitionToScene(t,n){let i=this.chain();return t?i.chain(new ne(i,B.transitionToScene,new C().setContent([t,n]))):i}_init(t){return new ne(this.chain(),"scene:init",new C().setContent([t]))}_initScene(t){return[t._init(t),...t.config.layers.flatMap(n=>n._init(t)),...t._initBackground(t,t.config.defaultBackgroundLayer)]}_initBackground(t,n){return[t.state.backgroundImage._init(t,n)]}};Ee.EventTypes={"event:scene.remove":"event:scene.remove","event:scene.load":"event:scene.load","event:scene.unload":"event:scene.unload","event:scene.mount":"event:scene.mount","event:scene.unmount":"event:scene.unmount","event:scene.preUnmount":"event:scene.preUnmount","event:scene.imageLoaded":"event:scene.imageLoaded"},Ee.DefaultUserConfig=new K({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Ee._defaultSceneConfig=null;var _e=Ee;var _a=3;var Qa="scene:resume",Ya=32767,bu=1e3,Qe=class o{constructor(e,t=void 0){this.liveGame=e;this.__tag=void 0;this.waitingAction=null;this.executingWaitingAction=!1;this.loopConfig=null;this.loopBodyActions=[];this.loopCondition=null;this.loopStartTime=0;this.loopDebugCheckpoint=0;this.__tag=t,this.stack=new qi().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new Ce("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new Ce("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(S.isAwaitable(i)&&!i.isSettled())throw new Ce("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!S.isAwaitable(n))throw new Ce("StackModel: Unexpected non-CalledActionResult or Awaitable in stack.");return!0})}static isStackModel(e){return e instanceof o}static createStackModel(e,t,n){let i=new o(e);return i.deserialize(t,n),i}static createCountLoop(e,t,n){let i=new o(e,"loop:count");return i.initLoop({type:"count",counter:0,limit:t,bodyActionIds:n.map(r=>r.getId()),broken:!1},n,null),i}static createConditionLoop(e,t,n,i){let r=new o(e,"loop:condition");return r.initLoop({type:"condition",counter:0,conditionActionId:n,bodyActionIds:i.map(s=>s.getId()),broken:!1},i,t),r}static isCalledActionResult(e){return!!e&&!this.isStackModel(e)&&!S.isAwaitable(e)&&"type"in e}static fromAction(e){return{type:e.type,node:e.contentNode}}static executeStackModelGroup(e,t){return e==="any"?S.any(...t.map(n=>n.execute())):S.all(...t.map(n=>n.execute()))}static isStackModelsAwaiting(e,t){if(t.length===0)throw new Error("StackModel: StackModels are empty.");return e==="any"?t.every(n=>!n.isEmpty()):t.some(n=>!n.isEmpty())}initLoop(e,t,n){this.loopConfig=e,this.loopBodyActions=t,this.loopCondition=n,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=0,this.shouldContinueLoop(this.liveGame.getGameStateForce())&&this.pushLoopBody()}shouldContinueLoop(e){return!this.loopConfig||this.loopConfig.broken?!1:this.loopConfig.type==="count"?this.loopConfig.counter<(this.loopConfig.limit??0):this.loopCondition?this.loopCondition.evaluate({gameState:e}).value:!1}pushLoopBody(){if(this.loopBodyActions.length!==0)for(let e=this.loopBodyActions.length-1;e>=0;e--)this.stack.push(o.fromAction(this.loopBodyActions[e]))}onIterationComplete(){!this.loopConfig||this.loopConfig.broken||(this.loopConfig.counter++,this.liveGame.game.config.app.debug&&this.checkInfiniteLoop(),this.shouldContinueLoop(this.liveGame.getGameStateForce())&&this.pushLoopBody())}checkInfiniteLoop(){if(!this.loopConfig)return;let e=this.loopConfig.counter;if(e>0&&e%Ya===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=Ya&&t<bu){let i=new E(`[NarraLeaf] Potential infinite loop detected!
|
|
43
43
|
Loop has executed ${e} iterations in ${t}ms.
|
|
44
44
|
This is likely a bug in your game script. Check your loop conditions.
|
|
45
|
-
Loop type: ${this.loopConfig.type}, broken: ${this.loopConfig.broken}`);throw this.liveGame.getGameStateForce().logger.error("StackModel",i.message),i}this.loopDebugCheckpoint=e,this.loopStartTime=Date.now()}}breakLoop(){if(!this.loopConfig)throw new E("Cannot break: StackModel is not a loop");this.loopConfig.broken=!0,this.stack.clear()}isLoop(){return this.loopConfig!==null}rollNext(){if(this.stack.isEmpty())return null;let e=this.stack.peek();if(S.isAwaitable(e)&&!e.isSettled())return e;if(o.isCalledActionResult(e)&&e.wait){let n=e.wait.stackModels;if(!n.length)throw new Error("StackModel: Waiting action contains empty stackModels.");if(o.isStackModelsAwaiting(e.wait.type,n))return n.forEach(i=>i.rollNext()),e;n.forEach(i=>{i.isEmpty()||i.abandon()})}this.waitingAction=null;let t=this.stack.pop();if(S.isAwaitable(t)){if(t.isFailed())throw t.error;let n=t.result;if(n)return this.stack.push(n),this.liveGame.getGameStateForce().logger.debug("next action (resolved awaitable)",n.node?.action),n}else return this.waitingAction=t,this.executeActions(t);return null}execute(){let e=null,t=!1,n=new S().registerSkipController(new V(()=>{t=!0,e?.abort()}));return(async()=>{let r=0;for(;!t;){if(r++>this.liveGame.game.config.maxStackModelLoop)throw new Error("StackModel: Suspiciously long waiting loop.");if(this.stack.isEmpty()){if(this.loopConfig&&!this.loopConfig.broken&&(this.onIterationComplete(),!this.stack.isEmpty()))continue;t=!0;break}let s=this.rollNext();if(s){if(S.isAwaitable(s)){if(s.isFailed())throw s.error;if(s.isSettled())continue;if(e=s,await new Promise(a=>{s.onSettled(a)}),s.isFailed())throw s.error;if(s.isAborted()){t=!0;break}}else if(o.isCalledActionResult(s))if(s.wait)e=o.executeStackModelGroup(s.wait.type,s.wait.stackModels),await e;else continue}}})().then(()=>n.resolve()).catch(r=>n.fail(r)),n}abortStackTop(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)?(this.stack.pop().abort(),this.waitingAction=null):o.isCalledActionResult(e)&&e.wait&&(e.wait.stackModels.forEach(t=>t.abortStackTop()),this.waitingAction=null),this.waitingAction}getWaitingAwaitable(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)&&!e.isSettled()?e:null}getTopSync(){if(this.stack.isEmpty())return null;let e=!1;for(let t=this.stack.size()-1;t>=0;t--){let n=this.stack.get(t);if(n){if(o.isCalledActionResult(n))return n;if(e)throw new Ce("StackModel: Unexpected non-CalledActionResult in stack.")}else return null;e=!0}return null}peekTopActionId(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t))return t.node?.action?.getId()??null}return null}peekExecutingActionId(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&o.isCalledActionResult(e)?e.node?.action?.getId()??null:null}snapshot(){let e=[];for(let n=this.stack.size()-1;n>=0;n--){let i=this.stack.get(n);if(!o.isCalledActionResult(i))continue;let r={actionId:i.node?.action?.getId()??null,actionType:i.node?.action?.type??null};i.wait?.stackModels&&(r.branchWaitType=i.wait.type,r.branches=i.wait.stackModels.map(s=>s.snapshot())),e.push(r)}let t={frames:e};return this.__tag&&(t.tag=this.__tag),this.loopConfig&&(t.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,broken:this.loopConfig.broken}),t}executeActions(e){if(!e.node?.action)return null;this.executingWaitingAction=!0;let t;try{t=this.liveGame.executeAction(this.liveGame.getGameStateForce(),e.node.action,{stackModel:this})}finally{this.executingWaitingAction=!1}let n=i=>i?S.isAwaitable(i)?(this.liveGame.getGameStateForce().logger.debug("next action (executed awaitable)",i),this.stack.push(i),i):i.node?.action||i.wait?.stackModels.length?(this.liveGame.getGameStateForce().logger.debug("next action (executed)",i),this.stack.push(i),i):null:null;if(Array.isArray(t)){let i=null;for(let r of t){let s=n(r);s&&(i=s)}return i}else{let i=n(t);if(i)return i}return null}isWaiting(){let e=this.stack.peek();return e?S.isAwaitable(e)?!e.isSettled():o.isCalledActionResult(e)&&e.wait?o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels):!1:!1}serialize(e=!0){let t=a=>{if(o.isCalledActionResult(a)){let l=a.node?.action?.getId()??null,c=a.node?.action?.type??null;return a.wait?.stackModels?{type:"link",actionType:c,action:l,stacks:a.wait.stackModels.map(u=>u.serialize()),stackWaitType:a.wait.type}:{type:"action",actionType:c,action:l}}return null},n=this.stack.map(t).filter(function(a){return a!==null}),i=this.stack.peek(),r=this.executingWaitingAction||S.isAwaitable(i);if(e&&this.waitingAction&&r){let a=t(this.waitingAction);a&&n.push(a)}let s={items:n};return this.loopConfig&&(s.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,conditionActionId:this.loopConfig.conditionActionId,bodyActionIds:this.loopConfig.bodyActionIds,broken:this.loopConfig.broken}),s}abandon(){let e=[];if(this.collectCallFrames(e),e.length){let t=this.liveGame.getGameStateForce();e.forEach(n=>n.abandon(t))}return this.reset(),this}collectCallFrames(e){let t=n=>{if(!o.isCalledActionResult(n))return;n.wait?.stackModels.forEach(r=>r.collectCallFrames(e));let i=n.node?.action;i&&i.type===_a&&e.push(i)};t(this.waitingAction??void 0);for(let n=this.stack.size()-1;n>=0;n--)t(this.stack.get(n))}reset(){this.stack.forEach(e=>{o.isCalledActionResult(e)?e.wait?.stackModels.forEach(t=>t.reset()):S.isAwaitable(e)&&e.abort()}),this.waitingAction&&this.waitingAction.wait?.stackModels.forEach(e=>e.reset()),this.waitingAction=null,this.stack.clear(),this.loopConfig=null,this.loopBodyActions=[],this.loopCondition=null,this.loopStartTime=0,this.loopDebugCheckpoint=0}deserialize(e,t){this.reset();let n=e.items;for(let i of n){if(this.topIsGroupStillRunning()){this.liveGame.getGameStateForce?.().logger?.debug("StackModel","Dropping an item restored above a running group",i.action);break}if(i.type==="action"){if(!i.action)continue;let{actionType:r,action:s}=i,a=t.get(s);if(!a)throw new Error(`Action not found: ${s}`);this.stack.push({type:r,node:a.contentNode,wait:null})}else if(i.type==="link"){let{actionType:r,action:s,stacks:a,stackWaitType:l}=i;if(l==null)throw new Error(`Missing stackWaitType for link action: ${s}`);this.stack.push({type:r,node:s?t.get(s)?.contentNode??null:null,wait:{type:l,stackModels:a.map(c=>o.createStackModel(this.liveGame,c,t))}})}}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let l=t.get(a);if(!l)throw new Error(`Loop body action not found: ${a}`);r.push(l)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let l=a.contentNode.getContent();Array.isArray(l)&&l.length>=2&&Y.isLambda(l[1])&&(s=l[1])}}this.loopConfig={type:i.type,counter:i.counter,limit:i.limit,conditionActionId:i.conditionActionId,bodyActionIds:i.bodyActionIds,broken:i.broken},this.loopBodyActions=r,this.loopCondition=s,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=i.counter}return this}isEmpty(){return this.stack.isEmpty()}topIsGroupStillRunning(){let e=this.stack.peek();return o.isCalledActionResult(e)&&!!e.wait&&o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels)}clearAboveCallFrame(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t)&&t.node?.action?.type===_a){for(;this.stack.size()>e+1;){let n=this.stack.pop();S.isAwaitable(n)?n.abort():o.isCalledActionResult(n)&&n.wait?.stackModels.forEach(i=>i.reset())}return this.waitingAction=null,this}}return this.reset(),this}push(...e){return this.stack.push(...e),this}};var Me=class Me{constructor(e){this.events=new Q;this.story=null;this.gameLock=new Mn;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.elementAuditCountdown=0;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new ri,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new Ut(Me.GameSpacesKey.game,Me.DefaultNamespaces.game)),this.story&&this.story.initPersistent(this._storable),this}getStorable(){return this._storable}get storable(){return this._storable}loadStory(e){return this.story=e.constructStory(),this}serialize(){this.assertGameState();let e=this.story;if(!e)throw new Error("No story loaded");if(!this.currentSavedGame||!this.stackModel)throw new Error("Failed when trying to serialize the game: The game has not started");return{name:this.currentSavedGame.name,meta:{version:qa,created:this.currentSavedGame.meta.created,updated:Date.now(),id:this.currentSavedGame.meta.id,lastSentence:this.lastDialog?.sentence||null,lastSpeaker:this.lastDialog?.speaker||null,storyHash:e.hash()},game:{...this.serializeGameState(),history:this.gameState.gameHistory.serialize()}}}serializeGameState(){this.assertGameState();let e=this.gameState,t=this.story;if(!t)throw new Error("No story loaded");let n=this._storable.toData(),i=e.toData(),r=t.getAllElementStates();this.auditElementDirtyMarks(t);let s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(l=>l.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}auditElementDirtyMarks(e){if(!this.game.config.app.debug||this.elementAuditCountdown-- >0)return;this.elementAuditCountdown=Me.ElementAuditInterval;let t=e.findUnmarkedElements();t.length&&(t.forEach(n=>n.markDirty()),this.gameState?.logger.warn("LiveGame.auditElementDirtyMarks",`${t.length} element(s) had state that no longer matches the script but were never marked dirty, so the save just written left them out. They have been marked, so the next save will carry them - but something is writing element state outside the action dispatch: ${t.map(n=>n.getId()).join(", ")}`))}captureGameState(){try{return this.serializeGameState()}catch(e){return this.gameState?.logger.warn("LiveGame.captureGameState",e),null}}deserialize(e){if(!e)throw new Error("No saved game provided when trying to deserialize game state");this.assertGameState();let t=this.gameState,n=this.story;if(!n)throw new Error("No story loaded");this.game.hooks.trigger("beforeRestore",[]),t.rollLock.lock(),this.reset(),t.stage.forceRemount();let{game:{store:i,stage:r,elementStates:s,services:a,stackModel:l,asyncStackModels:c}}=e,[u,p]=this.constructMaps();this.initNamespaces(),this._storable.load(i),p.forEach(d=>d.reset()),s.forEach(({id:d,data:g})=>{t.logger.debug("restore element",d);let y=p.get(d);if(!y)throw new Error("Element not found, id: "+d+`
|
|
46
|
-
NarraLeaf cannot find the element with the id from the saved game`);
|
|
45
|
+
Loop type: ${this.loopConfig.type}, broken: ${this.loopConfig.broken}`);throw this.liveGame.getGameStateForce().logger.error("StackModel",i.message),i}this.loopDebugCheckpoint=e,this.loopStartTime=Date.now()}}breakLoop(){if(!this.loopConfig)throw new E("Cannot break: StackModel is not a loop");this.loopConfig.broken=!0,this.stack.clear()}isLoop(){return this.loopConfig!==null}rollNext(){if(this.stack.isEmpty())return null;let e=this.stack.peek();if(S.isAwaitable(e)&&!e.isSettled())return e;if(o.isCalledActionResult(e)&&e.wait){let n=e.wait.stackModels;if(!n.length)throw new Error("StackModel: Waiting action contains empty stackModels.");if(o.isStackModelsAwaiting(e.wait.type,n))return n.forEach(i=>i.rollNext()),e;n.forEach(i=>{i.isEmpty()||i.abandon()})}this.waitingAction=null;let t=this.stack.pop();if(S.isAwaitable(t)){if(t.isFailed())throw t.error;let n=t.result;if(n)return this.stack.push(n),this.liveGame.getGameStateForce().logger.debug("next action (resolved awaitable)",n.node?.action),n}else return this.waitingAction=t,this.executeActions(t);return null}execute(){let e=null,t=!1,n=new S().registerSkipController(new V(()=>{t=!0,e?.abort()}));return(async()=>{let r=0;for(;!t;){if(r++>this.liveGame.game.config.maxStackModelLoop)throw new Error("StackModel: Suspiciously long waiting loop.");if(this.stack.isEmpty()){if(this.loopConfig&&!this.loopConfig.broken&&(this.onIterationComplete(),!this.stack.isEmpty()))continue;t=!0;break}let s=this.rollNext();if(s){if(S.isAwaitable(s)){if(s.isFailed())throw s.error;if(s.isSettled())continue;if(e=s,await new Promise(a=>{s.onSettled(a)}),s.isFailed())throw s.error;if(s.isAborted()){t=!0;break}}else if(o.isCalledActionResult(s))if(s.wait)e=o.executeStackModelGroup(s.wait.type,s.wait.stackModels),await e;else continue}}})().then(()=>n.resolve()).catch(r=>n.fail(r)),n}abortStackTop(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)?(this.stack.pop().abort(),this.waitingAction=null):o.isCalledActionResult(e)&&e.wait&&(e.wait.stackModels.forEach(t=>t.abortStackTop()),this.waitingAction=null),this.waitingAction}getWaitingAwaitable(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&S.isAwaitable(e)&&!e.isSettled()?e:null}getTopSync(){if(this.stack.isEmpty())return null;let e=!1;for(let t=this.stack.size()-1;t>=0;t--){let n=this.stack.get(t);if(n){if(o.isCalledActionResult(n))return n;if(e)throw new Ce("StackModel: Unexpected non-CalledActionResult in stack.")}else return null;e=!0}return null}peekTopActionId(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t))return t.node?.action?.getId()??null}return null}peekExecutingActionId(){if(this.stack.isEmpty())return null;let e=this.stack.peek();return e&&o.isCalledActionResult(e)?e.node?.action?.getId()??null:null}snapshot(){let e=[];for(let n=this.stack.size()-1;n>=0;n--){let i=this.stack.get(n);if(!o.isCalledActionResult(i))continue;let r={actionId:i.node?.action?.getId()??null,actionType:i.node?.action?.type??null};i.wait?.stackModels&&(r.branchWaitType=i.wait.type,r.branches=i.wait.stackModels.map(s=>s.snapshot())),e.push(r)}let t={frames:e};return this.__tag&&(t.tag=this.__tag),this.loopConfig&&(t.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,broken:this.loopConfig.broken}),t}executeActions(e){if(!e.node?.action)return null;this.executingWaitingAction=!0;let t;try{t=this.liveGame.executeAction(this.liveGame.getGameStateForce(),e.node.action,{stackModel:this})}finally{this.executingWaitingAction=!1}let n=i=>i?S.isAwaitable(i)?(this.liveGame.getGameStateForce().logger.debug("next action (executed awaitable)",i),this.stack.push(i),i):i.node?.action||i.wait?.stackModels.length?(this.liveGame.getGameStateForce().logger.debug("next action (executed)",i),this.stack.push(i),i):null:null;if(Array.isArray(t)){let i=null;for(let r of t){let s=n(r);s&&(i=s)}return i}else{let i=n(t);if(i)return i}return null}isWaiting(){let e=this.stack.peek();return e?S.isAwaitable(e)?!e.isSettled():o.isCalledActionResult(e)&&e.wait?o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels):!1:!1}serialize(e=!0){let t=a=>{if(o.isCalledActionResult(a)){let l=a.node?.action?.getId()??null,c=a.node?.action?.type??null;return a.wait?.stackModels?{type:"link",actionType:c,action:l,stacks:a.wait.stackModels.map(u=>u.serialize()),stackWaitType:a.wait.type}:{type:"action",actionType:c,action:l}}return null},n=this.stack.map(t).filter(function(a){return a!==null}),i=this.stack.peek(),r=this.executingWaitingAction||S.isAwaitable(i);if(e&&this.waitingAction&&r){let a=t(this.waitingAction);a&&n.push(a)}let s={items:n};return this.loopConfig&&(s.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,conditionActionId:this.loopConfig.conditionActionId,bodyActionIds:this.loopConfig.bodyActionIds,broken:this.loopConfig.broken}),s}abandon(){let e=[];if(this.collectCallFrames(e),e.length){let t=this.liveGame.getGameStateForce();e.forEach(n=>n.abandon(t))}return this.reset(),this}collectCallFrames(e){let t=n=>{if(!o.isCalledActionResult(n))return;n.wait?.stackModels.forEach(r=>r.collectCallFrames(e));let i=n.node?.action;i&&i.type===Qa&&e.push(i)};t(this.waitingAction??void 0);for(let n=this.stack.size()-1;n>=0;n--)t(this.stack.get(n))}reset(){this.stack.forEach(e=>{o.isCalledActionResult(e)?e.wait?.stackModels.forEach(t=>t.reset()):S.isAwaitable(e)&&e.abort()}),this.waitingAction&&this.waitingAction.wait?.stackModels.forEach(e=>e.reset()),this.waitingAction=null,this.stack.clear(),this.loopConfig=null,this.loopBodyActions=[],this.loopCondition=null,this.loopStartTime=0,this.loopDebugCheckpoint=0}deserialize(e,t){this.reset();let n=e.items;for(let i of n){if(this.topIsGroupStillRunning()){this.liveGame.getGameStateForce?.().logger?.debug("StackModel","Dropping an item restored above a running group",i.action);break}if(i.type==="action"){if(!i.action)continue;let{actionType:r,action:s}=i,a=t.get(s);if(!a)throw new Error(`Action not found: ${s}`);this.stack.push({type:r,node:a.contentNode,wait:null})}else if(i.type==="link"){let{actionType:r,action:s,stacks:a,stackWaitType:l}=i;if(l==null)throw new Error(`Missing stackWaitType for link action: ${s}`);this.stack.push({type:r,node:s?t.get(s)?.contentNode??null:null,wait:{type:l,stackModels:a.map(c=>o.createStackModel(this.liveGame,c,t))}})}}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let l=t.get(a);if(!l)throw new Error(`Loop body action not found: ${a}`);r.push(l)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let l=a.contentNode.getContent();Array.isArray(l)&&l.length>=2&&Q.isLambda(l[1])&&(s=l[1])}}this.loopConfig={type:i.type,counter:i.counter,limit:i.limit,conditionActionId:i.conditionActionId,bodyActionIds:i.bodyActionIds,broken:i.broken},this.loopBodyActions=r,this.loopCondition=s,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=i.counter}return this}isEmpty(){return this.stack.isEmpty()}topIsGroupStillRunning(){let e=this.stack.peek();return o.isCalledActionResult(e)&&!!e.wait&&o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels)}clearAboveCallFrame(){for(let e=this.stack.size()-1;e>=0;e--){let t=this.stack.get(e);if(o.isCalledActionResult(t)&&t.node?.action?.type===Qa){for(;this.stack.size()>e+1;){let n=this.stack.pop();S.isAwaitable(n)?n.abort():o.isCalledActionResult(n)&&n.wait?.stackModels.forEach(i=>i.reset())}return this.waitingAction=null,this}}return this.reset(),this}push(...e){return this.stack.push(...e),this}};var Me=class Me{constructor(e){this.events=new X;this.story=null;this.gameLock=new Mn;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.elementAuditCountdown=0;this.lastDialog=null;this.mapCache=null;this._currentActionId=null;this.game=e,this._storable=new ri,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new Ut(Me.GameSpacesKey.game,Me.DefaultNamespaces.game)),this.story&&this.story.initPersistent(this._storable),this}getStorable(){return this._storable}get storable(){return this._storable}loadStory(e){return this.story=e.constructStory(),this}serialize(){this.assertGameState();let e=this.story;if(!e)throw new Error("No story loaded");if(!this.currentSavedGame||!this.stackModel)throw new Error("Failed when trying to serialize the game: The game has not started");return{name:this.currentSavedGame.name,meta:{version:_a,created:this.currentSavedGame.meta.created,updated:Date.now(),id:this.currentSavedGame.meta.id,lastSentence:this.lastDialog?.sentence||null,lastSpeaker:this.lastDialog?.speaker||null,storyHash:e.hash()},game:{...this.serializeGameState(),history:this.gameState.gameHistory.serialize()}}}serializeGameState(){this.assertGameState();let e=this.gameState,t=this.story;if(!t)throw new Error("No story loaded");let n=this._storable.toData(),i=e.toData(),r=t.getAllElementStates();this.auditElementDirtyMarks(t);let s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(l=>l.serialize());return{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}auditElementDirtyMarks(e){if(!this.game.config.app.debug||this.elementAuditCountdown-- >0)return;this.elementAuditCountdown=Me.ElementAuditInterval;let t=e.findUnmarkedElements();t.length&&(t.forEach(n=>n.markDirty()),this.gameState?.logger.warn("LiveGame.auditElementDirtyMarks",`${t.length} element(s) had state that no longer matches the script but were never marked dirty, so the save just written left them out. They have been marked, so the next save will carry them - but something is writing element state outside the action dispatch: ${t.map(n=>n.getId()).join(", ")}`))}captureGameState(){try{return this.serializeGameState()}catch(e){return this.gameState?.logger.warn("LiveGame.captureGameState",e),null}}deserialize(e){if(!e)throw new Error("No saved game provided when trying to deserialize game state");this.assertGameState();let t=this.gameState,n=this.story;if(!n)throw new Error("No story loaded");this.game.hooks.trigger("beforeRestore",[]),t.rollLock.lock(),this.reset(),t.stage.forceRemount();let{game:{store:i,stage:r,elementStates:s,services:a,stackModel:l,asyncStackModels:c}}=e,[u,p]=this.constructMaps();this.initNamespaces(),this._storable.load(i),p.forEach(d=>d.reset()),s.forEach(({id:d,data:h})=>{t.logger.debug("restore element",d);let f=p.get(d);if(!f)throw new Error("Element not found, id: "+d+`
|
|
46
|
+
NarraLeaf cannot find the element with the id from the saved game`);f instanceof _e?f.fromData(h,p):f.fromData(h),f.markDirty()}),p.forEach(d=>{d instanceof $e&&d._rebindLoop(u)}),this.currentSavedGame=e,t.loadData(r,p),this.stackModel.deserialize(l,u),c.forEach(d=>{let h=Qe.createStackModel(this,d,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(R.EventTypes["event:state.onRender"],()=>{t.schedule(()=>{t.rollLock.unlock(),t.stage.next()},0)}),t.stage.forceUpdate()}getHistory(){return this.assertGameState(),this.gameState.gameHistory.getHistory()}getFuture(){return this.assertGameState(),this.gameState.gameHistory.getFuture()}canUndo(){return this.assertGameState(),this.gameState.gameHistory.canUndo()}canRedo(){return this.assertGameState(),this.gameState.gameHistory.canRedo()}undo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canUndo()?this.restoreToIndex(e.getCursor()-1,"LiveGame.undo"):(this.gameState.logger.warn("LiveGame.undo","No line to step back to"),!1)}redo(){this.assertGameState();let e=this.gameState.gameHistory;return e.canRedo()?this.restoreToIndex(e.getCursor()+1,"LiveGame.redo"):(this.gameState.logger.warn("LiveGame.redo","No line to step forward to"),!1)}restoreToHistory(e){this.assertGameState();let t=this.gameState.gameHistory.indexOfToken(e);return t<0?(this.gameState.logger.warn("LiveGame.restoreToHistory","No history entry for token",e),!1):this.restoreToIndex(t,"LiveGame.restoreToHistory")}restoreToIndex(e,t){this.assertGameState();let n=this.gameState.gameHistory,i=n.getAt(e);if(!i)return this.gameState.logger.warn(t,"No history entry at",e),!1;if(e<n.getCursor()&&this.gameState.actionHistory.has(i.token)){let a=n.getCursor();if(n.setCursor(e),this.undoInPlace(i,t))return this.auditRestoredLine(i,t),!0;n.setCursor(a)}if(!i.snapshot)return this.gameState.logger.warn(t,"History entry has no restore snapshot",i.token),!1;let r=i.token,s={name:this.currentSavedGame?.name??"",meta:this.currentSavedGame?.meta??this.getNewSavedGame().meta,game:{...i.snapshot,history:n.serializeAll()}};return this.deserialize(s),this.gameState.gameHistory.setCursor(this.gameState.gameHistory.indexOfToken(r)),i.action.type===Zt.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===Zt.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.
|
|
47
47
|
expected: ${n}
|
|
48
|
-
actual: ${i}`)}dispose(){this.events.clear(),this.gameState?.dispose()}notify(e,t=3e3){this.assertGameState();let n=this.gameState.idManager.generateId(),i=this.gameState.notificationMgr.consume({id:n,message:e,duration:t}),r=S.toPromiseForce(i);return{cancel:()=>{i.abort()},promise:r}}playSound(e){this.assertGameState();let t=e instanceof URL?e.toString():e,n=typeof t=="string"?new ge({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(R.EventTypes["event:state.player.skip"],!0)}async fastForward(e={}){this.assertGameState();let t=this.gameState,n=e.until??"menu",i=typeof n=="object"?n.actionId:null,r=n==="menu"||i!==null,s=e.maxSteps??t.game.config.maxStackModelLoop,a=e.stepTimeout??Me.FastForwardStepTimeout,l=i!==null?{reachedTarget:!1}:{},c=t.audioManager.getGlobalVolume();t.audioManager.setGlobalVolume(0),t.setFastForwarding(!0);try{let u=0;for(;u++<s;){if(i!==null&&this.stackModel.peekExecutingActionId()===i)return{reason:"action",reachedTarget:!0};if(r&&t.hasActiveMenu())return{reason:"menu",...l};if(this.stackModel.isEmpty())return{reason:"end",...l};let p=this.stackModel.getWaitingAwaitable();if(p){if(!await Me.settleSuspendedStep(t,p,a))return{reason:"stalled",...l}}else t.stage.next(),await Promise.resolve()}return{reason:"maxSteps",...l}}finally{t.setFastForwarding(!1),t.audioManager.setGlobalVolume(c)}}static settleSuspendedStep(e,t,n){return new Promise(i=>{let r=!1,s=null,a,l=p=>{r||(r=!0,s!==null&&(clearTimeout(s),s=null),a?.cancel?.(),i(p))};if(a=t.onSettled(()=>l(!0)),r){a?.cancel?.();return}let c=Date.now()+n,u=()=>{if(!r&&(e.events.emit(R.EventTypes["event:state.player.skip"],!0),!r)){if(Date.now()>=c){l(!1);return}s=setTimeout(u,Me.FastForwardSkipInterval)}};u()})}assertScreenshot(){this.assertGameState(),this.assertPlayerElement()}capturePng(){return this.assertScreenshot(),this.gameState.htmlToImage.toPng(this.gameState.mainContentNode,this.getScreenshotOptions())}captureJpeg(){return this.assertScreenshot(),this.gameState.htmlToImage.toJpeg(this.gameState.mainContentNode,this.getScreenshotOptions())}captureSvg(){return this.assertScreenshot(),this.gameState.htmlToImage.toSvg(this.gameState.mainContentNode,this.getScreenshotOptions())}capturePngBlob(){return this.assertScreenshot(),this.assertGameState(),this.assertPlayerElement(),this.gameState.htmlToImage.toBlob(this.gameState.mainContentNode,this.getScreenshotOptions())}onCharacterPrompt(e){return this.events.on(Me.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Me.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(Me.EventTypes["event:action.current"],e)}getCurrentActionId(){return this._currentActionId}getStackSnapshot(){return this.stackModel?{root:this.stackModel.snapshot(),async:Array.from(this.asyncStackModels).map(e=>e.snapshot())}:{root:{frames:[]},async:[]}}newGame(){this.assertGameState();let e=this.gameState,t=e.logger.group("LiveGame (newGame)",!0);this.reset(),this.initNamespaces();let n=this.getNewSavedGame();n.name="NewGame-"+Date.now(),this.currentSavedGame=n;let i=this.story?.entryScene?.getSceneRoot();i?this.stackModel.push(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 _e.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(Me.EventTypes["event:action.current"])&&this.events.emit(Me.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type}),t.callee?.markDirty();let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new Ce("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Ye(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Ce("GameState not set");return this.gameState}getAllPredictableActions(e,t,n){let i=t?.contentNode||null,r=[],s=[],a=new Set;for(;(i||s.length)&&!(n&&r.length>=n);){if(i||(i=s.pop().contentNode),[Vt].some(l=>i?.action&&i.action instanceof l)){i=null;continue}if(i.action&&i.action.is(ne,B.jumpTo)){let[l]=i.action.contentNode.getContent(),c=e.getScene(l);if(!c)throw i.action._sceneNotFoundError(i.action.getSceneName(l));if(a.has(c)){i=null;continue}a.add(c),i=c.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(se,re.do)){let[l]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=l[0]?.contentNode||null}i?.action&&r.push(i.action),i=i?.getChild()||null}return r}clearMainStack(){if(!this.stackModel)throw new Ce("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Ce("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:ha(),lastSentence:null,lastSpeaker:null,storyHash:this.story?.hash()||""},game:{store:{},stage:{scenes:[],audio:{sounds:[],groups:[]},videos:[]},elementStates:[],services:{},stackModel:{items:[]},asyncStackModels:[]}}}assertGameState(){if(!this.gameState)throw new E("No game state found, make sure you call this method in effect hooks or event handlers")}assertPlayerElement(){if(this.assertGameState(),!this.gameState.playerCurrent)throw new E("Player Element Not Mounted")}};Me.DefaultNamespaces={game:{}},Me.GameSpacesKey={game:"game"},Me.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},Me.ElementAuditInterval=50,Me.FastForwardStepTimeout=1e4,Me.FastForwardSkipInterval=16;var Wt=Me;var vi=class vi{constructor(e){this.events=new Q;this.settings={...e},this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(vi.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(vi.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))}};vi.EventTypes={"event:game.preference.change":"event:game.preference.change"};var Si=vi;import"client-only";import oc,{useEffect as Cd}from"react";import"client-only";import Xa,{useContext as Qa,useState as bu}from"react";var Nr=Xa.createContext(null);function Ja({children:o,game:e}){"use client";let t=new q({}),[n]=bu(e||t);return Xa.createElement(Nr,{value:n},o)}function N(){let o=Qa(Nr);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function Za(){return Qa(Nr)}import Tu,{createContext as Au,useContext as el}from"react";var tl="/",Ao=class Ao{constructor(e,t=Ao.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)}};Ao.rootPath=tl;var yn=Ao,Gr=Au(null);function nl({children:o}){let e=N();return Tu.createElement(Gr,{value:{router:e.router}},o)}function zt(){if(!el(Gr))throw new Error("useRouter must be used within a RouterProvider");return el(Gr).router}import ol from"react";import Du from"clsx";import Cu,{createContext as xu,useContext as wu,useLayoutEffect as ku,useReducer as Pu,useState as Eu}from"react";var sn=class sn{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(sn.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(sn.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(sn.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(sn.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(sn.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(sn.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};sn.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 Fr=sn,Or=xu(null);function il({children:o}){"use client";let[e]=Eu(()=>new Fr);return Cu.createElement(Or,{value:{ratio:e}},o)}function ye(){let o=wu(Or),[,e]=Pu(n=>n+1,0);if(!Or||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return ku(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function Kt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=ye(),s=r.getStyle();return ol.createElement("div",{className:Du("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},ol.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import Lu,{useEffect as Ru}from"react";function vn(o){let e=N(),[t,n]=Lu.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return Ru(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Hr from"react";import Co from"react";import rl from"clsx";function xo({children:o,className:e,style:t,...n}){let{ratio:i}=ye(),r=N();return Co.createElement(Kt,{className:rl("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},Co.createElement("div",{className:"absolute inset-0 w-full h-full"},Co.createElement("div",{className:"inset-0 w-full h-full"},Co.createElement("div",{className:rl("pointer-events-auto-rest",e),style:t},o))))}function Iu({children:o,className:e,style:t}){return Hr.createElement(Hr.Fragment,null,Hr.createElement(xo,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import sl from"clsx";import al from"react";function wo({className:o,children:e,...t}){let{ratio:n}=ye();return al.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:sl("w-full h-full")},al.createElement("div",{className:sl("z-20",o),...t},e))}import At,{useState as ll}from"react";import{motion as Mu}from"motion/react";function ko({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let l=N(),[c,u]=ll(!1);if(!l.config.app.inspector)return At.createElement(r,{...a,ref:s},o);let p={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:c?1e3:"auto"}};return At.createElement(r,{...p,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 Nu({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=N(),[a,l]=ll(!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 Gu(o){return At.createElement(ko,{...o,as:"div"})}function Fu(o){return At.createElement(ko,{...o,as:"span"})}function Ou(o){return At.createElement(Nu,{...o,as:"img"})}function Hu(o){return At.createElement(ko,{...o,as:"button"})}function Vu(o){return At.createElement(ko,{...o,as:Mu.div,ref:o.ref,layout:o.layout})}var Uu={Div:Gu,Span:Fu,Button:Hu,Img:Ou,mDiv:Vu},$t=Uu;import Io from"clsx";import Ve,{useEffect as Dn,useMemo as ap,useRef as Ll,useState as Jr}from"react";import{useEffect as Bu,useState as Wu}from"react";function ae(o){let[e,t]=Wu(0);Bu(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import cl from"react";var Pn=cl.createContext(null);function Mt(){let o=cl.useContext(Pn);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}function Vr({active:o,forced:e}){return o?e?"forceSkip":"requestComplete":"ignore"}function ul(o,e){let t=Vr(e);return t==="forceSkip"?(o.setIdle(!0),o.forceSkip()):t==="requestComplete"&&o.requestComplete(),t}import Po,{useCallback as zu,useLayoutEffect as bi,useMemo as pl,useRef as dl}from"react";import{useIsPresent as Ku}from"motion/react";var Nt=class Nt{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 zi,this._count=0}get state(){return this._state}get deps(){return[this._count]}isIdle(){return this._idle}setIdle(e){this._idle=e}isActive(){return this._active}setActive(e){return this._active=e,e?this.state==="ended"&&(this._idle=!0):this.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(Nt.Events.complete):this.safeEmit(Nt.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(Nt.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(Nt.Events.complete)){this.config.gameState.logger.weakWarn("DialogState","No listener for complete event. Cannot dispatch complete.");return}let e=this.config.gameState.game.preference;return this._state="ended",this.config.gameState.completeAdvDialogTyping(this.config.action.id),e.getPreference(q.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(Nt.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(Nt.Events.onFlush),this}onFlush(e){return this.events.on(Nt.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;if(!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended")return;this.releaseVoiceWait();let t=this.getPlayingVoiceToken();if(!t){this.scheduleAutoForwardDelay();return}let n=()=>{this.releaseVoiceWait(),this.scheduleAutoForwardDelay()};t.once("ended",n),t.once("stop",n),this.voiceWaitDisposer=()=>{t.off("ended",n),t.off("stop",n)}}scheduleAutoForwardDelay(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(Nt.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(q.Preferences.gameSpeed))}getPlayingVoiceToken(){let e=this.config.action.sentence;if(!e)return null;try{let t=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?.()}};Nt.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ne=Nt;function Ti({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=Ku(),s=i&&r,a=dl(!1),l=dl(o),c=l.current!==o,u=pl(()=>o.sentence?.evaluate(we.getCtx({gameState:n})),[o.sentence,n]),p=pl(()=>new Ne({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:c}),[o,n]),d=n.game.config.dialog,g=zu(y=>{!s||a.current||(a.current=!0,e?.(y))},[s,e]);return bi(()=>{a.current=!1},[p]),bi(()=>{l.current=o},[o]),bi(()=>(p.setActive(s),()=>{p.setActive(!1)}),[p,s]),bi(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",p),p.events.on(Ne.Events.complete,y=>{n.logger.log("NarraLeaf-React: Say","Complete",p.isIdle()),s&&(p.isIdle()||y?g(!1):p.setIdle(!0))}).cancel),[p,g,n,s]),bi(()=>{let y=b=>{ul(p,{active:s,forced:b===!0})},m=n.events.on(R.EventTypes["event:state.player.skip"],y),f=n.events.on(R.EventTypes["event:state.player.stageClick"],()=>y(!1));return()=>{m.cancel(),f.cancel()}},[p,n,s]),Po.createElement(Po.Fragment,null,Po.createElement(Pn,{value:p},Po.createElement(d,null)))}import{useCallback as qu,useEffect as Eo,useState as _u}from"react";function ml(o,e,{dialogId:t,active:n,forced:i}){let r=Vr({active:n,forced:i});return r==="ignore"?"ignore":o.requestNvlAdvance(t)!=="typing"?"pageHandled":r==="forceSkip"?(e.forceSkip(),"forceSkip"):(e.requestComplete(),"requestComplete")}import{useEffect as $u,useState as ju}from"react";function En(o){let e=N(),[t,n]=ju(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return $u(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var qn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(qn||{});function Do({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=N(),[s]=En("nextAction"),[a]=_u(()=>{let c=o.firedTextEvents??(o.firedTextEvents=new Set);return new Ne({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:c})}),l=qu(c=>{ml(e,a,{dialogId:o.id,active:n,forced:c})},[a,o.id,e,n]);return Eo(()=>{if(!n)return;let c=e.events.on(R.EventTypes["event:state.player.stageClick"],()=>l(!1)),u=e.events.on(R.EventTypes["event:state.player.skip"],p=>l(p===!0));return()=>{c.cancel(),u.cancel()}},[l,e,n]),Eo(()=>{if(!n)return;let c=p=>{p.repeat||r.keyMap.match("nextAction",p.key)&&l(!1)};if(r.config.useWindowListener){let p=r.getLiveGame().onWindowEvent("keydown",c);return()=>{p.cancel()}}let u=r.getLiveGame().onPlayerEvent("keydown",c);return()=>{u.cancel()}},[l,r,n,s]),Eo(()=>{let c=a.events.on(Ne.Events.complete,u=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!u&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Eo(()=>{let c=a.events.on(Ne.Events.simulateClick,()=>l(!1));return()=>{c.cancel()}},[l,a]),a}function Yu(o,e){let{expression:t,sound:n}=o.config;if(t){let{image:i,appearance:r}=t;i._setAppearanceSync(r),e.stage.update();let s=e.getExposedState(i);s&&(O.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function Lo(o,e,t){e.has(o)||(e.add(o),Yu(o,t))}function fl(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),Lo(r,e,t)}return n}var _n=new Map,Ur=new Set;function Xu(o,e){return _n.set(o,e),Ur.delete(o),()=>{_n.get(o)===e&&_n.delete(o)}}function Qu(o){_n.delete(o)}function Ju(o){return _n.get(o)??null}function Br(o){if(!o)return null;if(typeof o!="string")return o;let e=_n.get(o);return e||(Ur.has(o)||(Ur.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 Zu,useLayoutEffect as hl,useRef as Wr,useState as ep}from"react";var gl=.5,tp=.005,np=12,yl=.05,Sl=12,Ro="--nl-text-scale",bl=`var(${Ro}, 1)`;function Ai(o){return o==null||o===""?void 0:`calc(${typeof o=="number"?`${o}px`:String(o)} * ${bl})`}function Tl(){return`calc(1em * ${bl})`}function vl(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 Al({enabled:o,minFontSize:e,vertical:t,revealed:n}){let i=Wr(null),[r,s]=ep(1),a=Wr(1),l=Wr(0);a.current=r;let c=Zu(u=>{let p=i.current,d=p?.parentElement;if(!p||!d)return;let g=vl(d,t);if(!Number.isFinite(g)||g<=0)return;l.current=g;let y=()=>t?p.offsetWidth:p.offsetHeight,m=A=>{p.style.setProperty(Ro,String(A))},f=A=>(m(A),y()<=g+gl);if(f(u)){u!==a.current&&s(u);return}m(1);let b=parseFloat(getComputedStyle(p).fontSize)||0,h=b>0?Math.min(1,Math.max(yl,e/b)):yl,v;if(h>=u||!f(h))v=h;else{let A=h,x=u;for(let P=0;P<np&&x-A>tp;P++){let T=(A+x)/2;f(T)?A=T:x=T}v=A}m(v),s(v)},[e,t]);return hl(()=>{if(!o){a.current!==1&&s(1);return}c(a.current)},[o,c,n]),hl(()=>{let u=i.current?.parentElement;if(!o||!u||typeof ResizeObserver>"u")return;let p=new ResizeObserver(()=>{Math.abs(vl(u,t)-l.current)>gl&&c(1)});p.observe(u);let d=!1;return document.fonts?.ready.then(()=>{d||c(a.current)}),()=>{d=!0,p.disconnect()}},[o,c,t]),{containerRef:i,scale:r}}function Cl(o,e){return o.fontSize!==void 0?Ai(o.fontSize):o.fontScale!==void 0?wl(o.fontScale):Ai(e)}function xl(o,e){return o.fontSize!==void 0?o.fontSize:o.fontScale!==void 0?wl(o.fontScale):e}function wl(o){return`${o}em`}function zr(o){return o?{textEmphasis:`${o.fill??"filled"} ${o.mark??"dot"}`,textEmphasisPosition:`${o.position??"over"} right`}:{}}var Kr="--nl-reveal-duration",Pl="__narraleaf_text_reveal",kl={duration:0,inFlight:0};function $r(o,e,t){if(typeof o!="number"||!Number.isFinite(o)||o<=0)return kl;let n=1e3/(Math.max(.01,e)*Math.max(.01,t)),i=Math.min(o,8*n);return i<=0?kl:{duration:i,inFlight:Math.ceil(i/n)+1}}function jr(o,e,t,n,i=0){if(o.inFlight<=0||t<=0)return 0;let r=n-o.inFlight,s=Math.min(t,e+t-r);return Math.max(0,Math.min(s,t-Math.max(0,i)))}import Yn from"react";var ip=2;function Ci(o){return o==="vertical-rl"||o==="vertical-lr"}function op(o){return o===!1?0:typeof o=="number"?Number.isFinite(o)?Math.max(0,Math.round(o)):0:ip}function Yr(o,e){return Ci(o)?{writingMode:o,textOrientation:e??"mixed"}:o?{writingMode:o}:{}}var qr=/[0-9A-Za-z]+(?:[.:\-/][0-9A-Za-z]+)*/g;function rp(o,e){if(e<=0)return[{text:o,combineUpright:!1}];let t=[],n=0;qr.lastIndex=0;for(let i=qr.exec(o);i;i=qr.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 Xr(){return{wordBreak:"normal",lineBreak:"strict",overflowWrap:"break-word"}}function _r(o,e,t){let n=e?op(t):0;return n<=0?[{text:o,combineUpright:!1}]:rp(o,n)}function El(o,e){return o.some(t=>t.combineUpright)?o.map((t,n)=>t.combineUpright?Yn.createElement("span",{key:`${e}${n}`,style:{textCombineUpright:"all"}},t.text):Yn.createElement(Yn.Fragment,{key:`${e}${n}`},t.text)):o.map(t=>t.text).join("")}function sp(o){let e=[];for(let t of o){if(t.combineUpright){e.push(t);continue}for(let n of t.text)e.push({text:n,combineUpright:!1})}return e}function Qr(o,e,t,n=0){if(n<=0)return e?El(_r(o,e,t),""):o;let i=sp(_r(o,e,t)),r=i.length,s=n;for(;r>0&&s>0;)r--,s-=i[r].text.length;let a=[];if(r>0){let l=i.slice(0,r).map(c=>c.text).join("");a.push(Yn.createElement(Yn.Fragment,{key:"s"},El(_r(l,e,t),"s")))}for(let l=r;l<i.length;l++){let c=i[l];a.push(Yn.createElement("span",{key:`r${l}`,className:Pl,style:c.combineUpright?{textCombineUpright:"all"}:void 0},c.text))}return a}function*es(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Ke.isPause(n.text)){yield Ke.from(n.text);continue}if(ct.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
|
|
48
|
+
actual: ${i}`)}dispose(){this.events.clear(),this.gameState?.dispose()}notify(e,t=3e3){this.assertGameState();let n=this.gameState.idManager.generateId(),i=this.gameState.notificationMgr.consume({id:n,message:e,duration:t}),r=S.toPromiseForce(i);return{cancel:()=>{i.abort()},promise:r}}playSound(e){this.assertGameState();let t=e instanceof URL?e.toString():e,n=typeof t=="string"?new ge({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(R.EventTypes["event:state.player.skip"],!0)}async fastForward(e={}){this.assertGameState();let t=this.gameState,n=e.until??"menu",i=typeof n=="object"?n.actionId:null,r=n==="menu"||i!==null,s=e.maxSteps??t.game.config.maxStackModelLoop,a=e.stepTimeout??Me.FastForwardStepTimeout,l=i!==null?{reachedTarget:!1}:{},c=t.audioManager.getGlobalVolume();t.audioManager.setGlobalVolume(0),t.setFastForwarding(!0);try{let u=0;for(;u++<s;){if(i!==null&&this.stackModel.peekExecutingActionId()===i)return{reason:"action",reachedTarget:!0};if(r&&t.hasActiveMenu())return{reason:"menu",...l};if(this.stackModel.isEmpty())return{reason:"end",...l};let p=this.stackModel.getWaitingAwaitable();if(p){if(!await Me.settleSuspendedStep(t,p,a))return{reason:"stalled",...l}}else t.stage.next(),await Promise.resolve()}return{reason:"maxSteps",...l}}finally{t.setFastForwarding(!1),t.audioManager.setGlobalVolume(c)}}static settleSuspendedStep(e,t,n){return new Promise(i=>{let r=!1,s=null,a,l=p=>{r||(r=!0,s!==null&&(clearTimeout(s),s=null),a?.cancel?.(),i(p))};if(a=t.onSettled(()=>l(!0)),r){a?.cancel?.();return}let c=Date.now()+n,u=()=>{if(!r&&(e.events.emit(R.EventTypes["event:state.player.skip"],!0),!r)){if(Date.now()>=c){l(!1);return}s=setTimeout(u,Me.FastForwardSkipInterval)}};u()})}assertScreenshot(){this.assertGameState(),this.assertPlayerElement()}capturePng(){return this.assertScreenshot(),this.gameState.htmlToImage.toPng(this.gameState.mainContentNode,this.getScreenshotOptions())}captureJpeg(){return this.assertScreenshot(),this.gameState.htmlToImage.toJpeg(this.gameState.mainContentNode,this.getScreenshotOptions())}captureSvg(){return this.assertScreenshot(),this.gameState.htmlToImage.toSvg(this.gameState.mainContentNode,this.getScreenshotOptions())}capturePngBlob(){return this.assertScreenshot(),this.assertGameState(),this.assertPlayerElement(),this.gameState.htmlToImage.toBlob(this.gameState.mainContentNode,this.getScreenshotOptions())}onCharacterPrompt(e){return this.events.on(Me.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Me.EventTypes["event:menu.choose"],e)}onCurrentActionChange(e){return this.events.on(Me.EventTypes["event:action.current"],e)}getCurrentActionId(){return this._currentActionId}getStackSnapshot(){return this.stackModel?{root:this.stackModel.snapshot(),async:Array.from(this.asyncStackModels).map(e=>e.snapshot())}:{root:{frames:[]},async:[]}}newGame(){this.assertGameState();let e=this.gameState,t=e.logger.group("LiveGame (newGame)",!0);this.reset(),this.initNamespaces();let n=this.getNewSavedGame();n.name="NewGame-"+Date.now(),this.currentSavedGame=n;let i=this.story?.entryScene?.getSceneRoot();i?this.stackModel.push(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 _e.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(Me.EventTypes["event:action.current"])&&this.events.emit(Me.EventTypes["event:action.current"],{actionId:t.getId(),actionType:t.type}),t.callee?.markDirty();let i=t.executeAction(e,n);return S.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new Ce("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Qe(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Ce("GameState not set");return this.gameState}getAllPredictableActions(e,t,n){let i=t?.contentNode||null,r=[],s=[],a=new Set;for(;(i||s.length)&&!(n&&r.length>=n);){if(i||(i=s.pop().contentNode),[Vt].some(l=>i?.action&&i.action instanceof l)){i=null;continue}if(i.action&&i.action.is(ne,B.jumpTo)){let[l]=i.action.contentNode.getContent(),c=e.getScene(l);if(!c)throw i.action._sceneNotFoundError(i.action.getSceneName(l));if(a.has(c)){i=null;continue}a.add(c),i=c.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(se,re.do)){let[l]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=l[0]?.contentNode||null}i?.action&&r.push(i.action),i=i?.getChild()||null}return r}clearMainStack(){if(!this.stackModel)throw new Ce("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Ce("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:ga(),lastSentence:null,lastSpeaker:null,storyHash:this.story?.hash()||""},game:{store:{},stage:{scenes:[],audio:{sounds:[],groups:[]},videos:[]},elementStates:[],services:{},stackModel:{items:[]},asyncStackModels:[]}}}assertGameState(){if(!this.gameState)throw new E("No game state found, make sure you call this method in effect hooks or event handlers")}assertPlayerElement(){if(this.assertGameState(),!this.gameState.playerCurrent)throw new E("Player Element Not Mounted")}};Me.DefaultNamespaces={game:{}},Me.GameSpacesKey={game:"game"},Me.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose","event:action.current":"event:action.current"},Me.ElementAuditInterval=50,Me.FastForwardStepTimeout=1e4,Me.FastForwardSkipInterval=16;var Wt=Me;var vi=class vi{constructor(e){this.events=new X;this.settings={...e},this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(vi.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(vi.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))}};vi.EventTypes={"event:game.preference.change":"event:game.preference.change"};var Si=vi;import"client-only";import rc,{useEffect as xd}from"react";import"client-only";import Xa,{useContext as Ja,useState as Tu}from"react";var Gr=Xa.createContext(null);function Za({children:o,game:e}){"use client";let t=new q({}),[n]=Tu(e||t);return Xa.createElement(Gr,{value:n},o)}function N(){let o=Ja(Gr);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function el(){return Ja(Gr)}import Au,{createContext as Cu,useContext as tl}from"react";var nl="/",Co=class Co{constructor(e,t=Co.rootPath){this.events=new X;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,l]=s.split("=");a&&(i[decodeURIComponent(a)]=l?decodeURIComponent(l):"")}}return{path:t||"/",query:i}}buildUrl(e,t){if(Object.keys(t).length===0)return e;let n=Object.entries(t).map(([i,r])=>`${encodeURIComponent(i)}=${encodeURIComponent(r)}`).join("&");return`${e}?${n}`}getQueryParam(e){return this.currentQuery[e]}setQueryParam(e,t){return this.currentQuery[e]=t,this.updateHistory(),this.emitOnChange(),this}setQueryParams(e){return Object.assign(this.currentQuery,e),this.updateHistory(),this.emitOnChange(),this}removeQueryParam(e){return delete this.currentQuery[e],this.updateHistory(),this.emitOnChange(),this}clearQueryParams(){return this.currentQuery={},this.updateHistory(),this.emitOnChange(),this}hasQueryParam(e){return e in this.currentQuery}getQueryParamKeys(){return Object.keys(this.currentQuery)}getQueryParamCount(){return Object.keys(this.currentQuery).length}getHistory(){return[...this.history]}getHistoryIndex(){return this.historyIndex}canGoBack(){return this.historyIndex>0}canGoForward(){return this.historyIndex<this.history.length-1}navigate(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};if(this.currentPath===r)return this.currentQuery=s,this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(r,s)),this.emitOnChange(),this;this.historyIndex<this.history.length-1&&(this.history.length=this.historyIndex+1);let a=this.buildUrl(r,s);return this.history.push(a),this.history.length>this.game.config.maxRouterHistory&&(this.history.shift(),this.historyIndex--),this.historyIndex++,this.currentPath=r,this.currentQuery=s,this.emitOnChange(),this.requestPageTransition(),this}back(){if(this.canGoBack()){this.historyIndex--;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}forward(){if(this.canGoForward()){this.historyIndex++;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}replace(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};return this.currentPath=r,this.currentQuery=s,this.historyIndex>=0?this.history[this.historyIndex]=this.buildUrl(r,s):(this.history.push(this.buildUrl(r,s)),this.historyIndex=0),this.emitOnChange(),this}clear(){return this.currentPath="",this.currentQuery={},this.history=[],this.historyIndex=-1,this.emitOnChange(),this.requestPageTransition(),this}cleanHistory(){return this.history=this.currentPath?[this.buildUrl(this.currentPath,this.currentQuery)]:[],this.historyIndex=this.currentPath?0:-1,this}parsePath(e){return e.split("/").filter(t=>t.length>0)}buildPath(e){return"/"+e.join("/")}getParentPath(e){let t=this.parsePath(e);return t.length<=1?"":this.buildPath(t.slice(0,-1))}matchPath(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length<i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}exactMatch(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length!==i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}extractParams(e,t){let n={},i=this.parsePath(e),r=this.parsePath(t);if(i.length!==r.length)return n;for(let s=0;s<r.length;s++){let a=r[s];if(a.startsWith(":")){let l=a.slice(1);n[l]=i[s]}}return n}onExitComplete(e){return this.events.on("event:router.onExitComplete",e)}onceExitComplete(e){return this.events.once("event:router.onExitComplete",e)}onPageMount(e){return this.events.on("event:router.onPageMount",e)}oncePageMount(e){return this.events.once("event:router.onPageMount",e)}onUpdate(e){return this.updateSyncHooks.add(e),{cancel:()=>{this.updateSyncHooks.delete(e)}}}emitUpdateSync(){this.updateSyncHooks.forEach(e=>e())}mount(e){if(this.mountedPaths.has(e))throw new E(`Path ${e} is already mounted. This may be caused by multiple capture segments in the same path.`);return this.mountedPaths.add(e),{cancel:()=>{this.unmount(e)}}}unmount(e){this.mountedPaths.delete(e)}mountDefaultHandler(e){if(this.defaultHandlerPaths.has(e))throw new E(`Default handler path ${e} is already mounted.`);return this.defaultHandlerPaths.add(e),{cancel:()=>{this.unmountDefaultHandler(e)}}}unmountDefaultHandler(e){this.defaultHandlerPaths.delete(e)}emitOnPageMount(){this.events.emit("event:router.onPageMount")}onRootExitComplete(e){return this.events.on("event:router.onExitComplete",e)}isActive(){return this.currentPath!==""}onChange(e){return this.events.on("event:router.onChange",e)}emitOnChange(){this.events.emit("event:router.onChange")}resolvePath(e){let t=e.split("?")[0];if(t.startsWith("/"))return t;if(t==="")return this.currentPath;let n=this.parsePath(this.currentPath),i=t.split("/"),r=[];r.push(...n);for(let s=0;s<i.length;s++){let a=i[s];a===""||a==="."||(a===".."?r.length>0&&r.pop():r.push(a))}return this.buildPath(r)}normalizePath(e){let t=e.replace(/\/\/+/g,"/").replace(/\/$/,"");return t===""?"/":(t.startsWith("/"),t)}joinPath(e,...t){let n=this.normalizePath(e),s=[n.startsWith("/")?n:"/"+n,...t.filter(a=>a.length>0)].join("/");return this.normalizePath(s)}updateHistory(){this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(this.currentPath,this.currentQuery))}requestPageTransition(){let e=()=>{this.transitioning=!0,this.emitUpdateSync(),this.emitOnChange()},t=()=>{this.events.emit("event:router.onTransitionEnd"),this.transitioning=!1,this.emitUpdateSync(),this.emitOnChange(),this.events.emit("event:router.onExitComplete")};if(e(),this.isPathsUnmounting()){let n=this.events.on("event:router.onPathUnmount",()=>{this.isPathsUnmounting()||(n.cancel(),st(()=>{t()}))})}else st(()=>{t()})}registerUnmountingPath(e){this.unmountingPaths.add(e)}isPathsUnmounting(){return this.unmountingPaths.size>0}unregisterUnmountingPath(e){this.unmountingPaths.delete(e),this.events.emit("event:router.onPathUnmount")}isTransitioning(){return this.transitioning}createToken(e){return Symbol(e)}};Co.rootPath=nl;var yn=Co,Fr=Cu(null);function il({children:o}){let e=N();return Au.createElement(Fr,{value:{router:e.router}},o)}function zt(){if(!tl(Fr))throw new Error("useRouter must be used within a RouterProvider");return tl(Fr).router}import rl from"react";import Lu from"clsx";import xu,{createContext as wu,useContext as ku,useLayoutEffect as Pu,useReducer as Eu,useState as Du}from"react";var sn=class sn{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new X().setMaxListeners(1/0);this.lockers=[];this.updater=null}update(e,t,n){this.state.width=e,this.state.height=t,this.state.scale=n,this.events.emit(sn.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(sn.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(sn.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(sn.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(sn.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(sn.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};sn.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 Or=sn,Hr=wu(null);function ol({children:o}){"use client";let[e]=Du(()=>new Or);return xu.createElement(Hr,{value:{ratio:e}},o)}function ye(){let o=ku(Hr),[,e]=Eu(n=>n+1,0);if(!Hr||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return Pu(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function Kt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=ye(),s=r.getStyle();return rl.createElement("div",{className:Lu("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},rl.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import Ru,{useEffect as Iu}from"react";function vn(o){let e=N(),[t,n]=Ru.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 Vr from"react";import xo from"react";import sl from"clsx";function wo({children:o,className:e,style:t,...n}){let{ratio:i}=ye(),r=N();return xo.createElement(Kt,{className:sl("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},xo.createElement("div",{className:"absolute inset-0 w-full h-full"},xo.createElement("div",{className:"inset-0 w-full h-full"},xo.createElement("div",{className:sl("pointer-events-auto-rest",e),style:t},o))))}function Mu({children:o,className:e,style:t}){return Vr.createElement(Vr.Fragment,null,Vr.createElement(wo,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import al from"clsx";import ll from"react";function ko({className:o,children:e,...t}){let{ratio:n}=ye();return ll.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:al("w-full h-full")},ll.createElement("div",{className:al("z-20",o),...t},e))}import At,{useState as cl}from"react";import{motion as Nu}from"motion/react";function Po({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let l=N(),[c,u]=cl(!1);if(!l.config.app.inspector)return At.createElement(r,{...a,ref:s},o);let p={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:c?1e3:"auto"}};return At.createElement(r,{...p,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 Gu({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=N(),[a,l]=cl(!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 Fu(o){return At.createElement(Po,{...o,as:"div"})}function Ou(o){return At.createElement(Po,{...o,as:"span"})}function Hu(o){return At.createElement(Gu,{...o,as:"img"})}function Vu(o){return At.createElement(Po,{...o,as:"button"})}function Uu(o){return At.createElement(Po,{...o,as:Nu.div,ref:o.ref,layout:o.layout})}var Bu={Div:Fu,Span:Ou,Button:Vu,Img:Hu,mDiv:Uu},$t=Bu;import Mo from"clsx";import Ve,{useEffect as Dn,useMemo as lp,useRef as Rl,useState as Zr}from"react";import{useEffect as Wu,useState as zu}from"react";function le(o){let[e,t]=zu(0);Wu(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import ul from"react";var Pn=ul.createContext(null);function Mt(){let o=ul.useContext(Pn);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}function Ur({active:o,forced:e}){return o?e?"forceSkip":"requestComplete":"ignore"}function pl(o,e){let t=Ur(e);return t==="forceSkip"?(o.setIdle(!0),o.forceSkip()):t==="requestComplete"&&o.requestComplete(),t}import Eo,{useCallback as Ku,useLayoutEffect as bi,useMemo as dl,useRef as ml}from"react";import{useIsPresent as $u}from"motion/react";var Nt=class Nt{constructor(e){this.events=new X;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.voiceWaitDisposer=null;this.config=e,this._state="pending",this.autoForwardScheduler=new zi,this._count=0}get state(){return this._state}get deps(){return[this._count]}isIdle(){return this._idle}setIdle(e){this._idle=e}isActive(){return this._active}setActive(e){return this._active=e,e?this.state==="ended"&&(this._idle=!0):this.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(Nt.Events.complete):this.safeEmit(Nt.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(Nt.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(Nt.Events.complete)){this.config.gameState.logger.weakWarn("DialogState","No listener for complete event. Cannot dispatch complete.");return}let e=this.config.gameState.game.preference;return this._state="ended",this.config.gameState.completeAdvDialogTyping(this.config.action.id),e.getPreference(q.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(Nt.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(Nt.Events.onFlush),this}onFlush(e){return this.events.on(Nt.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;if(!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended")return;this.releaseVoiceWait();let t=this.getPlayingVoiceToken();if(!t){this.scheduleAutoForwardDelay();return}let n=()=>{this.releaseVoiceWait(),this.scheduleAutoForwardDelay()};t.once("ended",n),t.once("stop",n),this.voiceWaitDisposer=()=>{t.off("ended",n),t.off("stop",n)}}scheduleAutoForwardDelay(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(q.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(Nt.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(q.Preferences.gameSpeed))}getPlayingVoiceToken(){let e=this.config.action.sentence;if(!e)return null;try{let t=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?.()}};Nt.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ne=Nt;function Ti({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=$u(),s=i&&r,a=ml(!1),l=ml(o),c=l.current!==o,u=dl(()=>o.sentence?.evaluate(we.getCtx({gameState:n})),[o.sentence,n]),p=dl(()=>new Ne({useTypeEffect:t,action:o,evaluatedWords:u||[],gameState:n,suppressInitialAnimation:c}),[o,n]),d=n.game.config.dialog,h=Ku(f=>{!s||a.current||(a.current=!0,e?.(f))},[s,e]);return bi(()=>{a.current=!1},[p]),bi(()=>{l.current=o},[o]),bi(()=>(p.setActive(s),()=>{p.setActive(!1)}),[p,s]),bi(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",p),p.events.on(Ne.Events.complete,f=>{n.logger.log("NarraLeaf-React: Say","Complete",p.isIdle()),s&&(p.isIdle()||f?h(!1):p.setIdle(!0))}).cancel),[p,h,n,s]),bi(()=>{let f=b=>{pl(p,{active:s,forced:b===!0})},m=n.events.on(R.EventTypes["event:state.player.skip"],f),g=n.events.on(R.EventTypes["event:state.player.stageClick"],()=>f(!1));return()=>{m.cancel(),g.cancel()}},[p,n,s]),Eo.createElement(Eo.Fragment,null,Eo.createElement(Pn,{value:p},Eo.createElement(d,null)))}import{useCallback as _u,useEffect as Do,useState as Qu}from"react";function fl(o,e,{dialogId:t,active:n,forced:i}){let r=Ur({active:n,forced:i});return r==="ignore"?"ignore":o.requestNvlAdvance(t)!=="typing"?"pageHandled":r==="forceSkip"?(e.forceSkip(),"forceSkip"):(e.requestComplete(),"requestComplete")}import{useEffect as ju,useState as qu}from"react";function En(o){let e=N(),[t,n]=qu(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return ju(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var qn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(qn||{});function Lo({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=N(),[s]=En("nextAction"),[a]=Qu(()=>{let c=o.firedTextEvents??(o.firedTextEvents=new Set);return new Ne({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e,firedTextEvents:c})}),l=_u(c=>{fl(e,a,{dialogId:o.id,active:n,forced:c})},[a,o.id,e,n]);return Do(()=>{if(!n)return;let c=e.events.on(R.EventTypes["event:state.player.stageClick"],()=>l(!1)),u=e.events.on(R.EventTypes["event:state.player.skip"],p=>l(p===!0));return()=>{c.cancel(),u.cancel()}},[l,e,n]),Do(()=>{if(!n)return;let c=p=>{p.repeat||r.keyMap.match("nextAction",p.key)&&l(!1)};if(r.config.useWindowListener){let p=r.getLiveGame().onWindowEvent("keydown",c);return()=>{p.cancel()}}let u=r.getLiveGame().onPlayerEvent("keydown",c);return()=>{u.cancel()}},[l,r,n,s]),Do(()=>{let c=a.events.on(Ne.Events.complete,u=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!u&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Do(()=>{let c=a.events.on(Ne.Events.simulateClick,()=>l(!1));return()=>{c.cancel()}},[l,a]),a}function Yu(o,e){let{expression:t,sound:n}=o.config;if(t){let{image:i,appearance:r}=t;i._setAppearanceSync(r),e.stage.update();let s=e.getExposedState(i);s&&(O.isLayeredSrc(i)?s.flush():s.updateStyleSync())}n&&e.audioManager.play(n,{end:n.state.volume,duration:0})}function Ro(o,e,t){e.has(o)||(e.add(o),Yu(o,t))}function hl(o,e,t){let n=[];for(let i of o)if(i.isTextEvent()){let r=i.text;e.has(r)||n.push(r),Ro(r,e,t)}return n}var _n=new Map,Br=new Set;function Xu(o,e){return _n.set(o,e),Br.delete(o),()=>{_n.get(o)===e&&_n.delete(o)}}function Ju(o){_n.delete(o)}function Zu(o){return _n.get(o)??null}function Wr(o){if(!o)return null;if(typeof o!="string")return o;let e=_n.get(o);return e||(Br.has(o)||(Br.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 ep,useLayoutEffect as gl,useRef as zr,useState as tp}from"react";var yl=.5,np=.005,ip=12,vl=.05,bl=12,Io="--nl-text-scale",Tl=`var(${Io}, 1)`;function Ai(o){return o==null||o===""?void 0:`calc(${typeof o=="number"?`${o}px`:String(o)} * ${Tl})`}function Al(){return`calc(1em * ${Tl})`}function Sl(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 Cl({enabled:o,minFontSize:e,vertical:t,revealed:n}){let i=zr(null),[r,s]=tp(1),a=zr(1),l=zr(0);a.current=r;let c=ep(u=>{let p=i.current,d=p?.parentElement;if(!p||!d)return;let h=Sl(d,t);if(!Number.isFinite(h)||h<=0)return;l.current=h;let f=()=>t?p.offsetWidth:p.offsetHeight,m=A=>{p.style.setProperty(Io,String(A))},g=A=>(m(A),f()<=h+yl);if(g(u)){u!==a.current&&s(u);return}m(1);let b=parseFloat(getComputedStyle(p).fontSize)||0,y=b>0?Math.min(1,Math.max(vl,e/b)):vl,v;if(y>=u||!g(y))v=y;else{let A=y,x=u;for(let k=0;k<ip&&x-A>np;k++){let T=(A+x)/2;g(T)?A=T:x=T}v=A}m(v),s(v)},[e,t]);return gl(()=>{if(!o){a.current!==1&&s(1);return}c(a.current)},[o,c,n]),gl(()=>{let u=i.current?.parentElement;if(!o||!u||typeof ResizeObserver>"u")return;let p=new ResizeObserver(()=>{Math.abs(Sl(u,t)-l.current)>yl&&c(1)});p.observe(u);let d=!1;return document.fonts?.ready.then(()=>{d||c(a.current)}),()=>{d=!0,p.disconnect()}},[o,c,t]),{containerRef:i,scale:r}}function xl(o,e){return o.fontSize!==void 0?Ai(o.fontSize):o.fontScale!==void 0?kl(o.fontScale):Ai(e)}function wl(o,e){return o.fontSize!==void 0?o.fontSize:o.fontScale!==void 0?kl(o.fontScale):e}function kl(o){return`${o}em`}function Kr(o){return o?{textEmphasis:`${o.fill??"filled"} ${o.mark??"dot"}`,textEmphasisPosition:`${o.position??"over"} right`}:{}}var $r="--nl-reveal-duration",El="__narraleaf_text_reveal",Pl={duration:0,inFlight:0};function jr(o,e,t){if(typeof o!="number"||!Number.isFinite(o)||o<=0)return Pl;let n=1e3/(Math.max(.01,e)*Math.max(.01,t)),i=Math.min(o,8*n);return i<=0?Pl:{duration:i,inFlight:Math.ceil(i/n)+1}}function qr(o,e,t,n,i=0){if(o.inFlight<=0||t<=0)return 0;let r=n-o.inFlight,s=Math.min(t,e+t-r);return Math.max(0,Math.min(s,t-Math.max(0,i)))}import Qn from"react";var op=2;function Ci(o){return o==="vertical-rl"||o==="vertical-lr"}function rp(o){return o===!1?0:typeof o=="number"?Number.isFinite(o)?Math.max(0,Math.round(o)):0:op}function Yr(o,e){return Ci(o)?{writingMode:o,textOrientation:e??"mixed"}:o?{writingMode:o}:{}}var _r=/[0-9A-Za-z]+(?:[.:\-/][0-9A-Za-z]+)*/g;function sp(o,e){if(e<=0)return[{text:o,combineUpright:!1}];let t=[],n=0;_r.lastIndex=0;for(let i=_r.exec(o);i;i=_r.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 Xr(){return{wordBreak:"normal",lineBreak:"strict",overflowWrap:"break-word"}}function Qr(o,e,t){let n=e?rp(t):0;return n<=0?[{text:o,combineUpright:!1}]:sp(o,n)}function Dl(o,e){return o.some(t=>t.combineUpright)?o.map((t,n)=>t.combineUpright?Qn.createElement("span",{key:`${e}${n}`,style:{textCombineUpright:"all"}},t.text):Qn.createElement(Qn.Fragment,{key:`${e}${n}`},t.text)):o.map(t=>t.text).join("")}function ap(o){let e=[];for(let t of o){if(t.combineUpright){e.push(t);continue}for(let n of t.text)e.push({text:n,combineUpright:!1})}return e}function Jr(o,e,t,n=0){if(n<=0)return e?Dl(Qr(o,e,t),""):o;let i=ap(Qr(o,e,t)),r=i.length,s=n;for(;r>0&&s>0;)r--,s-=i[r].text.length;let a=[];if(r>0){let l=i.slice(0,r).map(c=>c.text).join("");a.push(Qn.createElement(Qn.Fragment,{key:"s"},Dl(Qr(l,e,t),"s")))}for(let l=r;l<i.length;l++){let c=i[l];a.push(Qn.createElement("span",{key:`r${l}`,className:El,style:c.combineUpright?{textCombineUpright:"all"}:void 0},c.text))}return a}function*ts(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Ke.isPause(n.text)){yield Ke.from(n.text);continue}if(lt.isTextEvent(n.text)){yield n.text;continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
|
|
49
49
|
`?yield`
|
|
50
|
-
`:yield{text:r,full:n.text,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function
|
|
50
|
+
`:yield{text:r,full:n.text,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function es(o){let e=ts(o),t=[];for(let n of e){if(Ke.isPause(n)||lt.isTextEvent(n))continue;let i=t[t.length-1];if(i&&i!==`
|
|
51
51
|
`&&n!==`
|
|
52
52
|
`&&i.tag===n.tag){let r=i.text+n.text;t[t.length-1]={...n,text:r,config:n.config,revealFrom:r.length};continue}t.push(n===`
|
|
53
|
-
`?n:{...n,revealFrom:n.text.length})}return t}function
|
|
54
|
-
`?1:n.text.length;return{offsets:e,revealed:t}}function
|
|
53
|
+
`?n:{...n,revealFrom:n.text.length})}return t}function Il(o){let e=[],t=0;for(let n of o)e.push(t),t+=n===`
|
|
54
|
+
`?1:n.text.length;return{offsets:e,revealed:t}}function cp(o,e,t=!1){let n=o[o.length-1];if(n&&n!==`
|
|
55
55
|
`&&e!==`
|
|
56
56
|
`&&n.tag===e.tag){let i=n.text+e.text;return[...o.slice(0,-1),{...e,text:i,config:e.config,revealFrom:t?i.length:n.revealFrom}]}return e===`
|
|
57
|
-
`?[...o,e]:[...o,{...e,revealFrom:t?e.text.length:0}]}function
|
|
58
|
-
`?
|
|
59
|
-
`&&
|
|
60
|
-
`)return Ve.createElement("br",{key:
|
|
61
|
-
`?await he(
|
|
62
|
-
`)return Ve.createElement("br",{key:te});let G=mt(L);return Ve.createElement("span",{key:te,style:{...G,...Xr()},className:Io("inline-block",L.config.className)},Ve.createElement(Nl,{word:L,vertical:Qe,tateChuYoko:h,done:!1,style:G,renderer:Br(L.config.render),revealTail:jr(I,X[te]??0,L.text.length,le,L.revealFrom??0)}))};return Ve.createElement("div",{...A,className:Io("whitespace-pre-wrap",u),style:{...Fn(I.duration>0,{[Kr]:`${I.duration}ms`}),...ee,...Yr(f,b),...p}},Pt.map(F))}function Gl(o){return Ve.createElement(ts,{...o,key:o.dialog?.config.action.id})}function mp({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Do({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Ve.createElement(ts,{...r,dialog:s,key:s.config.action.id})}function fp(o){let e=Mt();return Ve.createElement(ts,{...o,dialog:e,key:e.config.action.id})}function Sn(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Ve.createElement(mp,{...o}):Ve.createElement(fp,{...o})}var hp=Sn;import Go,{useEffect as gp,useLayoutEffect as yp,useMemo as Ol,useRef as vp,useState as Sp}from"react";import No from"react";var ns=No.createContext(null);function is(){let o=No.useContext(ns);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var os=No.createContext(null);function Fl(){let o=No.useContext(os);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Fo({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let l=vp(null),{register:c,unregister:u,getIndex:p}=Fl(),[d,g]=Sp(-1),{choose:y,evaluated:m,gameState:f}=is(),b=d===-1?null:m[d],h=Ol(()=>we.getCtx({gameState:f}),[f]),{hidden:v,disabled:A}=Ol(()=>{if(!b)return{hidden:!1,disabled:!1};let T=b.config.hidden?.evaluate(h)?.value??!1,w=!T&&(b.config.disabled?.evaluate(h)?.value??!1);return{hidden:T,disabled:w}},[b,h]);yp(()=>{if(!l.current)return;let T=l;c(T);let w=p(T);return g(w),l.current.dataset.index=w.toString(),()=>u(T)},[c,u,p]),gp(()=>{if(!t)return;let T=w=>{w.key.toLowerCase()===t.toLowerCase()&&!w.ctrlKey&&!w.metaKey&&(w.preventDefault(),w.stopPropagation(),x())};return window.addEventListener("keydown",T,!0),()=>{window.removeEventListener("keydown",T,!0)}},[t]);function x(){if(d===-1||!m[d]||v||A)return;let T=m[d];y({...T,evaluated:oe.getText(T.words||[])})}let P=b&&!v;return Go.createElement(Go.Fragment,null,Go.createElement("button",{className:o,style:{...e,display:P?e?.display??void 0:"none"},onClick:x,ref:l,disabled:A},P&&Go.createElement(Gl,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Ne({useTypeEffect:!1,action:{sentence:b.prompt,words:b.words,character:null},gameState:f,evaluatedWords:b.words})})))}import Oo from"react";import{AnimatePresence as bp}from"motion/react";function Ho({children:o,...e}){let t=bp;return Oo.createElement(Oo.Fragment,null,Oo.createElement("div",{...e},Oo.createElement(t,null,o)))}import Hl from"react";function an({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Hl.useContext(Pn),l=e??o?.character??a?.config.action.character??null,c=n??l?.config.color,u=i??t??l?.state.name;return Hl.createElement("div",{...s,style:{color:c?Gn(c):void 0,...r}},u)}import Cp from"clsx";import xp,{useRef as wp}from"react";import rs,{createContext as Tp,useContext as Ul,useState as Vl}from"react";var Ln=class Ln{constructor(){this.preloaded=[];this.events=new Q}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(Ln.EventTypes["event:preloaded.add"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this)}get(e){return this.preloaded.find(t=>this.getSrc(t)===e)}has(e){return Array.isArray(e)?e.every(t=>this.has(t)):this.preloaded.some(t=>this.getSrc(t)===e)}remove(e){if(Array.isArray(e)){let n=e.map(i=>this.getSrc(i));return this.preloaded=this.preloaded.filter(i=>!n.includes(this.getSrc(i))),this}let t=this.getSrc(e);return this.preloaded=this.preloaded.filter(n=>this.getSrc(n)!==t),this.events.emit(Ln.EventTypes["event:preloaded.remove"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Re.getSrc(e)}};Ln.EventTypes={"event:preloaded.add":"event:preloaded.add","event:preloaded.remove":"event:preloaded.remove","event:preloaded.change":"event:preloaded.change","event:preloaded.mount":"event:preloaded.mount","event:preloaded.ready":"event:preloaded.ready","event:preloaded.complete":"event:preloaded.complete","event:preloaded.unmount":"event:preloaded.unmount"};var ot=Ln;var Vo=class o{constructor(e){this.game=e;this.entries=new Map;this.byUrl=new Map;this.preloadTasks=new Map;this.holds=new Map;this.pinned=new Set;this.seen=new Set;this.blobBytes=0;this.decodedBytes=0;this.acquisition=null;this.missingReporter=null;this.reportedMissing=new Set;this.game.addSideEffect(()=>{this.abortAll(),this.clear()})}static getImage(e,t,n){return pa(e,{...n,signal:t})}static async decodeImage(e){if(typeof window>"u"||typeof window.Image>"u")return null;let t=new window.Image;if(t.src=e,typeof t.decode!="function")return null;try{await t.decode()}catch{return null}return t}static estimateDecodedBytes(e){return(e.naturalWidth||0)*(e.naturalHeight||0)*4}static readBudget(e){return typeof e=="number"&&!Number.isNaN(e)?Math.max(0,e):1/0}useAcquisition(e){return this.acquisition=e??null,this}useMissingReporter(e){return this.missingReporter=e??null,this}reportMissing(e){return!this.missingReporter||this.reportedMissing.has(e)?!!this.missingReporter:(this.reportedMissing.add(e),this.missingReporter({type:"image",src:e}),!0)}has(e){return this.entries.has(e)}wasCached(e){return this.seen.has(e)}add(e,t){return this.insert(e,t,0),this}remove(e){let t=this.entries.get(e);return t&&this.drop(t),this}get(e){let t=this.entries.get(e);if(t)return this.touch(t),t.url}isDecoded(e){return!!this.entries.get(e)?.decoded}clear(){for(let e of[...this.entries.values()])this.drop(e);return this.seen.clear(),this}size(){return this.entries.size}isPreloading(e){return this.preloadTasks.has(e)}preload(e,t,n){let i=n?.retainDecoded===!0,r=i||n?.decode!==!1,s=this.entries.get(t);if(s&&(!i||s.decoded))return this.touch(s),o.settledToken();let a=this.preloadTasks.get(t);if(a)return this.followTask(a,e,t,n);if(s)return this.touch(s),this.runTask(e,t,new AbortController,()=>this.decodeAgain(t,s.url));let l=t,c={};this.game.hooks.rawTrigger("preloadImage",()=>[l,(p,d)=>{l=p,c={...c,...d}}]);let u=new AbortController;return this.runTask(e,t,u,()=>this.acquireAndDecode(t,l,u.signal,c,i,r))}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.entries.values(),e=>e.url)}retain(e){let t=new Set(e);for(let n of[...this.entries.values()])n.stale=!t.has(n.name),n.stale&&!this.isPinned(n)&&this.drop(n);return this}pin(e){return this.pinned=new Set(e),this.enforce(),this}hold(e){this.holds.set(e,(this.holds.get(e)??0)+1)}release(e){let t=this.holds.get(e);if(t===void 0)return;if(t>1){this.holds.set(e,t-1);return}this.holds.delete(e);let n=this.byUrl.get(e);if(n){if(n.stale&&!this.isPinned(n)){this.drop(n);return}this.enforce()}}getStats(){let e=0,t=0;for(let n of this.entries.values())n.decoded&&e++,this.isPinned(n)&&t++;return{entries:this.entries.size,blobBytes:this.blobBytes,decodedEntries:e,decodedBytes:this.decodedBytes,pinned:t,budget:this.budget()}}budget(){return{blobBytes:o.readBudget(this.game.config?.imageCacheBudgetBytes),decodedBytes:o.readBudget(this.game.config?.decodedImageBudgetBytes)}}isPinned(e){return this.pinned.has(e.name)||this.holds.has(e.url)}touch(e){this.entries.delete(e.name),this.entries.set(e.name,e)}insert(e,t,n,i=null){let r=this.entries.get(e);if(r){if(r.url===t)return this.touch(r),r;this.drop(r)}let s={name:e,url:t,bytes:n,decoded:null,decodedBytes:0,stale:!1,release:i};return this.entries.set(e,s),this.byUrl.set(t,s),this.seen.add(e),this.blobBytes+=n,this.enforce(),s}drop(e){this.dropDecoded(e),this.handBack(e.url,e.release),this.blobBytes-=e.bytes,this.entries.delete(e.name),this.byUrl.get(e.url)===e&&this.byUrl.delete(e.url)}dropDecoded(e){e.decoded&&(this.decodedBytes-=e.decodedBytes,e.decoded=null,e.decodedBytes=0)}retainDecoded(e,t){this.dropDecoded(e),e.decoded=t,e.decodedBytes=o.estimateDecodedBytes(t),this.decodedBytes+=e.decodedBytes,this.enforce()}enforce(){let e=this.budget();if(this.blobBytes>e.blobBytes)for(let t of[...this.entries.values()]){if(this.blobBytes<=e.blobBytes)break;this.isPinned(t)||this.drop(t)}if(this.decodedBytes>e.decodedBytes)for(let t of this.entries.values()){if(this.decodedBytes<=e.decodedBytes)break;t.decoded&&!this.isPinned(t)&&this.dropDecoded(t)}}async acquireAndDecode(e,t,n,i,r,s){let a=await this.acquire(e,t,n,i);if(!a)return;let{url:l,bytes:c,release:u}=a;if(this.insert(e,l,c,u),this.entries.get(e)?.url!==l||!s)return;let p=await o.decodeImage(l),d=this.entries.get(e);if(!d||d.url!==l){this.handBack(l,u);return}p&&r&&this.retainDecoded(d,p)}async acquire(e,t,n,i){if(this.acquisition){let a=await this.acquisition({type:"image",src:e},n);return!a||!a.url?null:{url:a.url,bytes:a.bytes??0,release:a.release??null}}let{url:r,bytes:s}=await o.getImage(t,n,i);return r?{url:r,bytes:s,release:null}:null}handBack(e,t){if(t){t();return}e.startsWith("blob:")&&URL.revokeObjectURL(e)}async decodeAgain(e,t){let n=await o.decodeImage(t),i=this.entries.get(e);n&&i&&i.url===t&&!i.decoded&&this.retainDecoded(i,n)}runTask(e,t,n,i){let r={promise:Promise.resolve(),controller:n,errorHandlers:[],failed:!1};r.promise=Promise.resolve().then(i).then(()=>{this.preloadTasks.delete(t)}).catch(a=>{r.failed=!0,this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${a}`),r.errorHandlers.forEach(l=>l(a))}),this.preloadTasks.set(t,r);let s={abort:()=>{n.abort(),this.preloadTasks.delete(t)},onFinished:a=>(r.promise.then(a),s),onErrored:a=>(r.errorHandlers.push(a),s)};return s}followTask(e,t,n,i){let r={abort:()=>{},onFinished:s=>(e.promise.then(()=>{if(e.failed){s();return}this.preload(t,n,i).onFinished(s)}),r),onErrored:s=>(e.errorHandlers.push(s),r)};return r}static settledToken(){let e={abort:()=>{},onFinished:t=>(Promise.resolve().then(t),e),onErrored:()=>e};return e}};var Uo=Tp(null);function Bl({children:o}){let e=N(),[t]=Vl(()=>new ot),[n]=Vl(()=>new Vo(e));return rs.createElement(rs.Fragment,null,rs.createElement(Uo,{value:{preloaded:t,cacheManager:n}},o))}function jt(){if(!Uo)throw new Error("usePreloaded must be used within a PreloadedProvider");return Ul(Uo)}function Wl(){return Ul(Uo)}import{useLayoutEffect as zl,useRef as Ap}from"react";function Bo(o){let e=Wl()?.cacheManager??null,t=Ap(null),n=()=>{t.current?.release(),t.current=null};zl(()=>{let i=o.current;if(t.current?.element===i||(n(),!i||!e||typeof MutationObserver>"u"))return;let r=null,s=()=>{let l=i.getAttribute("src");l!==r&&(r!==null&&e.release(r),r=l,r!==null&&e.hold(r))},a=new MutationObserver(s);t.current={element:i,release:()=>{a.disconnect(),r!==null&&(e.release(r),r=null)}},s(),a.observe(i,{attributes:!0,attributeFilter:["src"]})}),zl(()=>n,[])}function Kl(){let o=Mt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return Ep(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?O.getSrcURL(s):null,l=s&&O.isTagSrc(s)?[...s.state.currentSrc]:null,c=Ka({character:n,sentence:i,portrait:s,currentSrc:a,tags:l,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=Pp(c.source);return{visible:!!u,src:u,character:c.character,portrait:c.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function kp({className:o,style:e,alt:t,...n}){let i=Kl(),{cacheManager:r}=jt(),s=wp(null);if(Bo(s),!i.visible||!i.src)return null;let a=r.get(i.src)||i.src;return xp.createElement("img",{...n,ref:s,"data-element-type":"dialog-avatar",className:Cp("dialog-avatar",o),src:a,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function Pp(o){return o?k.srcToURL(o):null}function Ep(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var ss=kp;import{useEffect as Dp}from"react";function Lp(){let o=Mt(),[e]=ae(o.deps),t=oe.getText(o.config.evaluatedWords);return Dp(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]),{done:o.isEnded(),text:t,isNarrator:o.config.action.character===null||o.config.action.character.state.name==="",metadata:o.config.action.sentence?.getMetadata()}}import{useCallback as Wo,useEffect as as,useMemo as Rp,useRef as Ip,useState as $l}from"react";function Mp(){let o=Mt(),[e]=ae(o.deps),[t,n]=$l(!0),[i,r]=$l(!0),s=Ip(null),a=o.config.gameState,l=o.config.action.sentence,c=l?.config.voiceId??null;as(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]);let u=Rp(()=>{if(!l)return null;try{return nt.getVoice(a,l)}catch{return null}},[a,l,c,l?.config.voice]);as(()=>{s.current=null,r(!0)},[l]),as(()=>{let m=!1,f=null,b=null,h=null;if(!u){n(!0);return}n(!1);let v=()=>{m||n(!0)};f=a.audioManager.getToken(u),f&&(f.isPlaying()||n(!0),b=()=>v(),h=()=>v(),f.once("ended",b),f.once("stop",h));let A=a.events.on(R.EventTypes["event:state.player.lineEnd"],()=>{v()});return()=>{m=!0,A.cancel(),f&&b&&f.off("ended",b),f&&h&&f.off("stop",h)}},[a,u]);let p=Wo(async m=>{let f=m??u;if(!f)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let b=f instanceof URL?ge.voice(f.toString()):typeof f=="string"?ge.voice(f):f,h=await a.getLiveGame().playSound(b);s.current=h;let v=()=>{r(!0)};return h.once("ended",v),h.once("stop",v),h},[a,u]),d=Wo(()=>u,[u]),g=Wo(()=>c,[c]),y=Wo(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:p,getVoice:d,getVoiceId:g,getVoiceSrc:y}}import ls,{createContext as $p,useContext as jp,useEffect as _l,useRef as qp}from"react";import{useState as Np}from"react";function zo(o){let[e]=Np(o);return e}import{AnimatePresence as Gp}from"motion/react";var Ko=Gp;import Pi,{createContext as Up,useContext as Bp,useEffect as Wp,useRef as zp}from"react";import{useEffect as xi,useLayoutEffect as Fp}from"react";function Op(){let o=zt(),[e]=ae();return xi(()=>o.onChange(e).cancel,[]),o.getPathname()}function Hp(){let{router:o,path:e}=ki(),[t]=ae();return xi(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function Vp(){let o=zt(),[e]=ae();return xi(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function $o(o,e){let t=zt();Fp(()=>t.onUpdate(()=>o(t)).cancel,e),xi(()=>{o(t)},[])}function wi(){let o=zt(),[e]=ae();return xi(()=>o.onChange(e).cancel,[]),e}var jl=Up(null);function Ei({children:o,path:e,consumedBy:t}){let i={router:zt(),path:e,consumedBy:t};return Pi.createElement(jl,{value:i},o)}function ki(){let o=Bp(jl);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new E(`Invalid useLayout call: Trying to access layout without a parent.
|
|
63
|
-
This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function Kp({children:o,name:e,propagate:t}){let n=N(),[i]=ae(),{path:r,router:s,consumedBy:a}=ki(),l=s.joinPath(r,e),c=zo(()=>s.createToken(l+"@layout")),u=s.getCurrentPath(),p=zp(!1),d=y=>{p.current=y,i()},g=s.matchPath(u,l);if(wi(),$o(y=>{let m=y.matchPath(y.getCurrentPath(),l);if(p.current&&!m){if(!o){d(!1);return}y.registerUnmountingPath(c)}m&&y.isPathsUnmounting()&&y.unregisterUnmountingPath(c),m&&!p.current&&!y.isTransitioning()&&d(!0)},[g,o]),Wp(()=>{if(!g)return;let y=s.mount(l);return()=>{y.cancel()}},[l,s,g]),a)throw new E("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Pi.createElement(Ei,{path:l},Pi.createElement(Ko,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(c),d(!1)}},g&&p.current&&o))}function ql({children:o}){return wi(),Pi.createElement(Ei,{path:yn.rootPath},Pi.createElement(xo,{"data-layout-path":yn.rootPath,key:yn.rootPath},o))}var cs=$p(null);function _p(){return jp(cs)}function Yp({children:o,name:e}){let[t]=ae(),{path:n,router:i,consumedBy:r}=ki(),s=_p(),a=s?.name??e,l=a??n+"@default",c=a?i.joinPath(n,a):n,u=zo(()=>i.createToken(c+"@page")),p=i.getCurrentPath(),d=!a,g=qp(!1),y=h=>{g.current=h,t()},m=d&&i.exactMatch(p,n)||i.exactMatch(p,c);if(r&&r!==l)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");wi(),$o(h=>{let v=d&&h.exactMatch(h.getCurrentPath(),n)||h.exactMatch(h.getCurrentPath(),c);if(g.current&&!v){if(!o){y(!1);return}h.registerUnmountingPath(u)}v&&h.isPathsUnmounting()&&h.unregisterUnmountingPath(u),v&&!g.current&&!h.isTransitioning()&&y(!0)},[m,o]),_l(()=>{if(!m)return;let h=d?i.mountDefaultHandler(c):i.mount(c);return i.emitOnPageMount(),()=>{h.cancel()}},[c,m]),_l(()=>()=>{i.unregisterUnmountingPath(u),y(!1)},[]);let f=ls.createElement(Ei,{path:n,consumedBy:l},ls.createElement(Ko,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),y(!1)}},m&&g.current&&o));return(h=>s?ls.createElement(cs,{value:{name:null}},h):h)(f)}import us,{useCallback as Xp,useEffect as ps,useImperativeHandle as Qp,useMemo as Yl,useRef as ds,useState as Jp}from"react";var Zp=50,ed={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Xl={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function td(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Ql(o,e){return e==null?o:Math.max(o,e)}function nd(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 Jl=us.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:l,dataAttributes:c,onUpdate:u,children:p},d){let g=ds(null),[y,m]=Jp({...Xl,width:"0px",height:"0px"}),f=ds(u),b=ds(null);ps(()=>{f.current=u},[u]);let h=Xp(()=>{let x=g.current;if(!x)return;let P=x.clientWidth,T=x.clientHeight;if(P<=0||T<=0||e<=0)return;let w=nd(P,T,e),D=Ql(w.width,n),z=Ql(w.height,i),me=b.current;(!me||me.width!==D||me.height!==z)&&(b.current={width:D,height:z},m({...Xl,width:`${D}px`,height:`${z}px`}));let pe=t>0?D/t:1;f.current?.({width:D,height:z,scale:pe,containerWidth:P,containerHeight:T})},[e,t,n,i]),v=Yl(()=>ca(h,typeof r=="number"?r:Zp),[h,r]);ps(()=>{h()},[h]),ps(()=>{let x=new ResizeObserver(()=>{v()});g.current&&x.observe(g.current);let P=()=>{v()};return window.addEventListener("resize",P),()=>{x.disconnect(),window.removeEventListener("resize",P)}},[v]),Qp(d,()=>({requestUpdate:h}),[h]);let A=Yl(()=>td(c),[c]);return us.createElement("div",{id:l,ref:g,style:ed,...A},us.createElement("div",{className:s,style:{...y,...a}},p))}),Zl=Jl;function id(){return N().getLiveGame()}import hs from"react";import od,{createContext as rd,useContext as sd,useEffect as ad,useState as ec}from"react";var ld={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},tc=rd({state:ld,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function qt(){return sd(tc)}function ms(){let{dialogs:o}=qt();return o}function cd(){let{isActive:o}=qt();return o}function ud(){let{isVisible:o}=qt();return o}function fs({children:o}){let t=N().getLiveGame().getGameState(),[n,i]=ec(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=ec(null);ad(()=>{let l=y=>({...y,dialogs:[...y.dialogs]}),c=t.events.on(R.EventTypes["event:state.nvl.enter"],(y,m)=>{i(l(t.getNvlState())),s(m?.showTransition||null)}),u=t.events.on(R.EventTypes["event:state.nvl.exit"],()=>{i(l(t.getNvlState()))}),p=t.events.on(R.EventTypes["event:state.nvl.dialogAppend"],()=>{i(l(t.getNvlState()))}),d=t.events.on(R.EventTypes["event:state.nvl.visibilityChange"],(y,m)=>{i(l(t.getNvlState())),s(m||null)}),g=t.events.on(R.EventTypes["event:state.nvl.change"],y=>{i(l(y))});return()=>{c.cancel(),u.cancel(),p.cancel(),d.cancel(),g.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return od.createElement(tc.Provider,{value:a},o)}import{AnimatePresence as pd,motion as dd}from"motion/react";import md from"clsx";function gs({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=qt(),{ratio:r}=ye(),s=N(),a=i?.duration?i.duration/1e3:.3;return hs.createElement(pd,null,n&&hs.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},hs.createElement(dd.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:md("w-full h-full overflow-auto",e),style:{transform:s.config.useAspectScale?`scale(${r.state.scale})`:void 0,transformOrigin:"top left",width:s.config.useAspectScale?s.config.width:"100%",height:s.config.useAspectScale?s.config.height:"100%",...t}},o)))}import Rn from"react";function ys({renderDialogItem:o,dialogs:e}){return Rn.createElement(gs,{className:"bg-black/80 text-white p-16 inset-8"},Rn.createElement("div",{"data-element-type":"nvl-dialog-list",className:"flex flex-col space-y-4 p-4"},(e??[]).map((n,i)=>{let r=n.entry.character?Rn.createElement(an,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Rn.createElement(Sn,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Rn.createElement("div",{key:`${n.entry.id}:${n.isActive?"active":"idle"}`,"data-element-type":"nvl-dialog-item","data-dialog-index":i,className:"nvl-dialog-item"},o?o({entry:n.entry,index:i,isActive:n.isActive,nametag:r,texts:s}):Rn.createElement(Rn.Fragment,null,r,s))})))}import St,{useMemo as fd}from"react";import nc from"clsx";function hd({children:o,className:e,style:t,renderDialogItem:n}){let i=ms(),{state:r}=qt();return St.createElement("div",{"data-element-type":"nvl-dialog-list",className:nc("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(gd,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?St.createElement(an,{className:"nvl-character-name font-bold mr-2"}):null,texts:St.createElement(Sn,{className:"nvl-dialog-text"})}):o?St.Children.map(o,l=>St.isValidElement(l)?St.cloneElement(l,{entry:s,index:a}):l):St.createElement(ic,{entry:s,index:a})))))}function ic({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??St.createElement(Sn,{className:"nvl-dialog-text"});return St.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:nc("nvl-dialog-item",t),style:n},r&&St.createElement(an,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function gd({entry:o,children:e}){let n=N().getLiveGame().getGameState(),i=fd(()=>o.sentence.evaluate(we.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",l=Do({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return St.createElement(Pn,{value:l},e)}import jo from"react";import{createPortal as yd}from"react-dom";var vs=jo.createContext(null),vd={Portal:()=>null,measure:()=>null,container:null};function Sd(){let o=jo.useContext(vs);return jo.useMemo(()=>{if(!o)return vd;let e=t=>{let n=o.offsetWidth;return!n||!t.width?1:t.width/n};return{container:o,Portal:({children:t})=>yd(jo.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 bd}from"react";function Td(o){let e=N();bd(()=>{if(!o)return;let t=e.getLiveGame().getGameState();if(t)return t.suspendAdvance()},[o,e])}var qo=class{constructor(e,t){this.emit=e;this.options=t;this.held=!1;this.delayTimer=null;this.repeatTimer=null}isHeld(){return this.held}press(){this.held||(this.clearTimers(),this.held=!0,this.emit(!1),this.options.delay===0?this.startRepeating():this.delayTimer=setTimeout(()=>{this.delayTimer=null,this.startRepeating()},this.options.delay))}release(){this.clearTimers(),this.held=!1}dispose(){this.release()}startRepeating(){this.repeatTimer=setInterval(()=>{this.emit(!0)},this.options.interval)}clearTimers(){this.delayTimer!==null&&(clearTimeout(this.delayTimer),this.delayTimer=null),this.repeatTimer!==null&&(clearInterval(this.repeatTimer),this.repeatTimer=null)}};function rc({state:o}){let e=N(),t=zt(),[n]=vn(q.Preferences.skipDelay),[i]=vn(q.Preferences.skipInterval),[r]=En("skipAction");return Cd(()=>{if(!e.getLiveGame().gameState.playerCurrent){o.logger.warn("KeyEventAnnouncer","Failed to listen to playerElement events");return}if(!window){o.logger.warn("KeyEventAnnouncer","Failed to listen to window events");return}let a=new qo(u=>{o.events.emit(R.EventTypes["event:state.player.skip"],u)},{delay:n,interval:i}),l=u=>{o.isAdvanceSuspended()||e.keyMap.match("skipAction",u.key)&&e.preference.getPreference(q.Preferences.skip)&&(a.isHeld()||o.logger.verbose("KeyEventAnnouncer","Skipping"),a.press())},c=u=>{e.keyMap.match("skipAction",u.key)&&a.release()};if(e.config.useWindowListener){let u=e.getLiveGame().onWindowEvent("keydown",l).cancel,p=e.getLiveGame().onWindowEvent("keyup",c).cancel;return()=>{a.dispose(),u(),p()}}else{let u=e.getLiveGame().onPlayerEvent("keydown",l).cancel,p=e.getLiveGame().onPlayerEvent("keyup",c).cancel;return()=>{a.dispose(),u(),p()}}},[t,n,i,r]),oc.createElement(oc.Fragment,null)}import ac,{useEffect as xd}from"react";function sc({onStage:o,dialogShown:e,advanceSuspended:t}){return o?e?t?"ignore":"advance":"restoreDialog":"ignore"}function wd(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var lc=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],kd=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]','[data-element-type="interactive-word"]','[data-element-type="dialog-overlay"]'];function Pd(o,e){return!o||e&&lc.some(t=>!!o.closest(t))?!1:[...kd,...lc].some(t=>!!o.closest(t))}function cc(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=N();return xd(()=>{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)||!cc(i,t))return;let s=o.mainContentNode;if(s&&(!s.contains(r)||!cc(i,s))||wd(r)||Pd(r,o.isNvlMode()))return;let a=sc({onStage:!0,dialogShown:e.preference.getPreference(q.Preferences.showDialog),advanceSuspended:o.isAdvanceSuspended()});if(a!=="ignore"){if(a==="restoreDialog"){e.preference.setPreference(q.Preferences.showDialog,!0);return}o.events.emit(R.EventTypes["event:state.player.stageClick"]),o.recordStageClick()}};if(e.config.useWindowListener){let i=e.getLiveGame().onWindowEvent("click",n);return()=>{i.cancel()}}else{let i=e.getLiveGame().onPlayerEvent("click",n);return()=>{i.cancel()}}},[e,o]),ac.createElement(ac.Fragment,null)}import{useEffect as pc}from"react";function Ss({gameState:o}){let e=o.audioManager,[t,n]=vn("globalVolume");return pc(()=>{n(e.getGlobalVolume())},[]),pc(()=>{e.setGlobalVolume(t)},[t]),null}import{useEffect as _o,useMemo as Ed,useRef as mc}from"react";function dc(o){let e=Re.catSrc(o.srcManager?.src||[]),t=Re.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=[],s=new Set,a=o.state?.backgroundImage?.state?.currentSrc;if(k.isImageSrc(a)){let l=k.srcToURL(a);l&&(s.add(l),n.push(l))}for(let l of e.image){let c=Re.getSrc(l);!c||s.has(c)||(s.add(c),i.push(c))}for(let l of t.image){let c=Re.getSrc(l);!c||s.has(c)||(s.add(c),r.push(c))}return{firstFrame:n,critical:i,lookAhead:r,all:[...n,...i,...r],criticalAudio:e.audio}}function bs(o){let e=[],t=null;return{plan(r){return o.config.preloadAllImages?n(r):i(r)}};function n(r){if(r.kind!=="scene")return null;let s=dc(r.scene),a=o.config.preloadGate==="scene"?"gate":"soon";return{entries:[...s.firstFrame.map(c=>({type:"image",src:c,band:"gate",decode:!0})),...s.critical.map(c=>({type:"image",src:c,band:a,decode:!0})),...s.lookAhead.map(c=>({type:"image",src:c,band:"idle",decode:!1}))],audio:s.criticalAudio,keep:s.all,pin:s.firstFrame}}function i(r){if(r.kind!=="advance")return null;let s=r.story;if(!s)return null;t!==r.scene&&(e=[],t=r.scene);let a=o.getLiveGame(),l=a.stackModel?.getTopSync()?.node?.action||null,c=a.getAllPredictableActions(s,l,o.config.maxPreloadActions).map(d=>Re.getPreloadableSrc(s,d)).filter(d=>d!==null);for(let d of c)d.activeType==="scene"&&!e.includes(d)&&e.push(d);let u=new Set,p=[];for(let d of Re.catSrc([...e,...c]).image){let g=Re.getSrc(d);!g||u.has(g)||(u.add(g),p.push({type:"image",src:g,band:"idle",decode:!0}))}return{entries:p,keep:[...u]}}}var rt="Preload";function fc({state:o}){let{preloaded:e,cacheManager:t}=jt(),n=N(),[i]=ae(),r=mc(new Set),s=o.getLastScene()||o.getPreloadingScene(),a=n.getLiveGame().story,l=mc(s);l.current=s;let c=Ed(()=>n.config.preload??bs(n),[n]);function u(){o.logger.debug(rt,"Preload unmounted"),e.events.emit(ot.EventTypes["event:preloaded.unmount"])}return _o(()=>o.events.on(R.EventTypes["event:state:flushPreloadedScenes"],()=>{i()}).cancel,[]),_o(()=>(t.useAcquisition(c.acquire?c.acquire.bind(c):null),t.useMissingReporter(c.onMissing?c.onMissing.bind(c):null),()=>{t.useAcquisition(null),t.useMissingReporter(null)}),[c,t]),_o(()=>{if(!a||!s)return a?o.logger.debug(rt,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(rt,"Story not found, skipping preload"),u;if(typeof fetch>"u"&&!c.acquire)return e.events.emit(ot.EventTypes["event:preloaded.complete"]),e.events.emit(ot.EventTypes["event:preloaded.ready"]),o.logger.warn(rt,"Fetch is not supported in this environment, skipping preload"),u;n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(rt,"Cache cleared")),r.current.clear();let m={value:!1};return p({kind:"scene",scene:s,story:a},{gates:!0,cancelled:m}),e.events.emit(ot.EventTypes["event:preloaded.mount"]),()=>{m.value=!0,u()}},[s,a,c]),_o(()=>{if(!a)return;let m={value:!1},f=n.getLiveGame().onCurrentActionChange(({actionId:b})=>{p({kind:"advance",actionId:b,scene:l.current,story:a},{gates:!1,cancelled:m})});return()=>{m.value=!0,f.cancel()}},[a,c,n]),null;async function p(m,f){let b=()=>{e.events.emit(ot.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(ot.EventTypes["event:preloaded.ready"])};f.gates&&!n.config.waitForPreload&&e.events.emit(ot.EventTypes["event:preloaded.ready"]);let h;try{h=await c.plan(m)}catch(v){o.logger.weakError(rt,"Preload strategy failed to plan; nothing warmed",v),f.gates&&b();return}if(!f.cancelled.value){if(!h){f.gates&&b();return}h.pin&&t.pin(h.pin),h.keep&&t.retain(h.keep),h.audio&&o.audioManager.retainOnly([...h.audio]),await d(h,f,b)}}async function d(m,f,b){let h=performance.now(),v={gate:new Nn(n.config.preloadConcurrency,0),soon:new Nn(n.config.preloadConcurrency,0),idle:new Nn(n.config.preloadConcurrency,n.config.preloadDelay)},A=o.logger.group(rt,!0);o.logger.debug(rt,"preloading:",m);let x=0;for(let T of m.entries)g(v[T.band],T)&&(x+=1);A.end();let P=()=>{let T=t.getStats(),w=D=>(D/(1024*1024)).toFixed(1);return`${x} queued in ${(performance.now()-h).toFixed(0)}ms (${w(T.blobBytes)} MB fetched, ${w(T.decodedBytes)} MB decoded, ${T.pinned} pinned)`};await v.gate.start(),f.gates&&(o.logger.info(rt,"Preload (gate)",P()),b()),!f.cancelled.value&&(await v.soon.start(),!f.cancelled.value&&(await v.idle.start(),f.cancelled.value||o.logger.info(rt,"Preload (settled)",P())))}function g(m,f){let b=`${f.band}:${f.src}`;if(r.current.has(b))return!1;if(r.current.add(b),f.type==="video")return y(m,f);let h=f.decode??f.band!=="idle";return t.has(f.src)&&(!h||t.isDecoded(f.src))?(o.logger.debug(rt,`Already warm (${f.band})`,f.src),!1):(m.addTask(()=>new Promise(v=>{t.preload(o,f.src,{retainDecoded:h,decode:h}).onFinished(()=>{o.logger.debug(rt,`Warmed (${f.band})`,f.src),v()}).onErrored(()=>{o.logger.weakError(rt,`Failed to warm (${f.band})`,f.src),v()})})),!0)}function y(m,f){let b=c.acquire;if(!b&&typeof fetch>"u")return!1;let h={type:"video",src:f.src};return m.addTask(async()=>{let v=new AbortController;try{b?await b.call(c,h,v.signal):await(await fetch(f.src,{signal:v.signal})).arrayBuffer(),o.logger.debug(rt,`Warmed video (${f.band})`,f.src)}catch(A){o.logger.weakError(rt,`Failed to warm video (${f.band})`,f.src,A)}}),!0}}import Di from"react";import Xo from"react";import Ts,{useEffect as As,useLayoutEffect as Cs,useRef as Yo,useState as xs}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,p]=xs(null),[d,g]=xs(null),y=Yo(null),m=Ts.useRef(null),[f]=xs(()=>new Ki("displayable.refGroup")),b=Yo(f.next()),h=Yo(mt()),A=N().getLiveGame().getGameState(),x=typeof a=="function"?a(u):a,[P]=ae([d,u,h]);As(()=>A.events.depends([A.events.on(R.EventTypes["event:state.player.skip"],ee)]).cancel,[d,u,h]),Cs(()=>{if(z(),!u)return;if(h.current.some(([te])=>!te.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:I,task:X}=u,le=te=>{h.current.forEach(([G],he)=>{let Ge=X.resolve[he],Xt=typeof Ge=="function"?Ge:Ge.resolver;if(!Xt)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${he}])`);let Ot=Xt(...te),Qt=j(x[he]||x[x.length-1]||{},Ot);pe(G,l?l(Qt):Qt)})},F=I.onUpdate(le);le(X.animations.map(te=>te.start));let L=!1;return Promise.all(h.current.map(([te])=>{let G=te.current;return G?.waitForLoad?G.waitForLoad():Promise.resolve()})).then(()=>{L||I.start()}),()=>{L=!0,F.cancel()}},[u]),As(()=>{if(!m.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),Cs(()=>{let I=e.toStyle(A,i);return Object.assign(m.current.style,I),D(),A.logger.debug("Displayable","Initial style applied",m.current,I),bt(),()=>{De()}},[]);let T=Yo(()=>{});T.current=()=>{u||!m.current||(z(),!(d||y.current)&&(Object.assign(m.current.style,e.toStyle(A,i)),D()))},Cs(()=>{y.current&&!o._getLoop()&&De(),T.current()});let{ratio:w}=ye();As(()=>w.onUpdate(()=>{T.current(),requestAnimationFrame(()=>T.current())}),[w]);function D(){if(c)for(let{ref:I,project:X}of c)I.current&&Object.assign(I.current.style,X(e.get()))}function z(){let I=typeof a=="function"?a(u):a;if(!h.current||!h.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");h.current.some(([X])=>!X.current)||h.current.forEach(([X],le)=>{pe(X,I[le]||I[I.length-1]||{})})}function me(I){A.logger.debug("Displayable","Transform applied",e.toStyle(A,i),m.current),P(),r?.(I)}function pe(I,X){if(!I.current)throw new E("Displayable: Trying to assign properties to unmounted element");lo(I.current,X,l)}function De(){y.current&&(y.current.stop(),y.current=null,A.logger.debug("Displayable","Loop stopped",o))}function bt(){let I=o._getLoop();if(!I){De();return}y.current||Ft(I.transform,I.options)}function Ft(I,X){d&&(d.abort(),g(null)),De(),m.current&&(y.current=I.startLoop(e,{gameState:A,ref:m,overwrites:i,companionRefs:c},X))}function Pt(I,X){return Tt(new Z({},{duration:I?.duration??0,ease:I?.ease??"linear"}),X)}function Tt(I,X){d&&(d.abort(),g(null)),De();let le=I.animate(e,{gameState:A,ref:m,overwrites:i,companionRefs:c}),F=new ke(le);return A.timelines.attachTimeline(F),le.onSkipControllerRegister(L=>{L.onAbort(()=>{F.abort(),g(null)})}),g(le),le.then(()=>{g(null),me(I),X(),bt()}),F}function Ue(I,X){u&&u.controller.complete();let le=I.createTask(A),F=I.requestAnimations(le.animations),L=new S().registerSkipController(new V(F.cancel)),te=new ke(L);L.skipController.onAbort(()=>{F.cancel()}),F.onCanceled(()=>{te.abort(),p(null),A.logger.debug("Displayable","Transition cancelled",I)}),F.onComplete(()=>{Qe(),p(null),s?.(I),X(),L.resolve()}),A.timelines.attachTimeline(te),p({task:le,controller:F,transition:I,resolve:X});let G;if(h.current=le.resolve.map(he=>{let Ge=Ts.createRef(),Xt=typeof he=="function"?void 0:he.key;if(!Xt)return[Ge,f.next()];if(Xt==="target")return G=f.next(),[Ge,G];if(Xt==="current")return[Ge,b.current];throw new E("Displayable: Invalid key type")}),!G)throw new E("Displayable: No target key found");return b.current=G,te}function dt(I){return A.logger.debug("initDisplayable",o),Tt(Z.immediate(e.get()),I)}function ee(){t&&d&&(d.abort(),g(null),A.logger.debug("transform skipped")),n&&u&&(u.controller.complete(),A.logger.debug("transition skipped"))}function mt(){return[[Ts.createRef(),b.current]]}function Qe(){h.current.forEach(([I])=>{I.current=null}),h.current=mt()}return{transformRef:m,transitionRefs:h.current,transitionTask:u,initDisplayable:dt,applyTransform:Tt,applyTransition:Ue,applyLoop:Ft,stopLoop:Pt,updateStyleSync:z,flush:P,deps:[d,u,h]}}import{useEffect as Dd}from"react";function Ct(o,e,t=[]){let i=N().getLiveGame().getGameState();return Dd(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function ws({state:o,text:e}){let{ratio:t}=ye(),[n]=ae(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,updateStyleSync:p,deps:d}=_t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:g=>({width:"fit-content",transform:Z.propToCSSTransform(o,g,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return Ct(e,{initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,flush:n,updateStyleSync:p},[...d]),Xo.createElement($t.Div,{"data-element-type":"text"},Xo.createElement($t.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([g,y])=>Xo.createElement("span",{key:y,ref:g,className:e.config.className},Xo.createElement("span",null,e.state.text)))))}import Gt,{forwardRef as Rd,useCallback as gc,useImperativeHandle as Id,useRef as Zo,useState as yc}from"react";import Qo,{useEffect as ks,useRef as Xn,forwardRef as Ld}from"react";var hc=Ld(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=Xn(null),{ratio:a}=ye(),[l,c]=Qo.useState(0),[u,p]=Qo.useState(0),d=Xn(null),g=Xn(null),y=N(),m=Xn(!1),f=Xn(null),b=Xn(null);Qo.useImperativeHandle(r,()=>s.current,[]),Bo(s),ks(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>{let x=()=>{let P=s.current;return!P||typeof P.decode!="function"?Promise.resolve():P.decode().catch(()=>{})};return m.current?x():(f.current||(f.current=new Promise(P=>{b.current=P})),f.current.then(x))},configurable:!0}})},[]),ks(()=>(h(),a.onUpdate(h)),[o]),ks(()=>{let x=new MutationObserver(P=>{P.forEach(T=>{T.type==="attributes"&&T.attributeName==="src"&&s.current&&h()})});return s.current&&x.observe(s.current,{attributes:!0}),()=>{x.disconnect()}},[o]);function h(){if(s.current&&s.current.naturalWidth){let x,P,T;if(s.current.naturalWidth*s.current.naturalHeight===1)x=a.state.width,P=a.state.height,T=`${x} / ${P}`;else{let me=t?y.config.width/s.current.naturalWidth:1;x=s.current.naturalWidth*a.state.scale*me,P=s.current.naturalHeight*a.state.scale*me,T="auto"}let w=d.current,D=!w||w.w!==x||w.h!==P||w.ar!==T,z=!!o&&g.current!==o;if(!D&&!z)return;D&&(d.current={w:x,h:P,ar:T},c(x),p(P),s.current.style.aspectRatio=T),o&&(g.current=o,o(x,P))}}function v(){h(),m.current=!0,b.current&&(b.current(),b.current=null,f.current=null),e&&e()}function A(){m.current=!0,b.current&&(b.current(),b.current=null,f.current=null)}return Qo.createElement("img",{ref:s,onLoad:v,onError:A,width:l,height:u,alt:"",src:n,style:i})});hc.displayName="AspectScaleImage";var Jo=hc;import vc from"clsx";import{motion as Md}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"},Sc=Rd(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=Zo(null),a=Zo([]),l=o.findIndex(c=>c!==null);return Id(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(()=>{})}),[]),Gt.createElement("div",{ref:s},o.map((c,u)=>c===null?null:Gt.createElement(Jo,{key:"layer-"+u,ref:p=>{a.current[u]=p},src:t(c),style:Nd,autoFit:e,onSizeChanged:u===l?n:void 0,onLoad:u===l?i:void 0})))});Sc.displayName="LayerStack";function Gd(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 Fd(o){return O.isStaticSrc(o)?o.state.currentSrc:O.getSrcURL(o)??void 0}var Od={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Hd({image:o,state:e}){let[t]=yc(()=>new Q),[n,i]=yc([]),{cacheManager:r}=jt(),s=Zo([]),a=Zo(null),l=O.isLayeredSrc(o)?O.getSrcURLs(o):null;function c(T){return!k.isInlineSrc(T)&&!r.wasCached(T)&&!r.isPreloading(T)&&!s.current.includes(T)&&(r.reportMissing(T)||e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${T}".
|
|
57
|
+
`?[...o,e]:[...o,{...e,revealFrom:t?e.text.length:0}]}function Ml(o,e,t=!1){o(n=>cp(n,e,t))}function up(o,e,t){return t||(o!==void 0?fe.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new oe(n.text,n.config)):[])}function pp(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 Ll(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function No(o){return o===void 0?void 0:Gn(o)}function Nl(o){return typeof o.tag2=="number"?o.tag2>=o.full.length-1:o.text.length>=o.full.length}function Gl({word:o,vertical:e,tateChuYoko:t,done:n,style:i,renderer:r,revealTail:s=0}){let a=o.config.ruby?Ve.createElement("ruby",{className:"align-bottom inline-block"},Ve.createElement("rt",{className:"block text-center"},o.config.ruby),Jr(o.text,e,t,s)):Jr(o.text,e,t,s);return r?Ve.createElement(r,{text:o.text,fullText:o.full,revealed:Nl(o),done:n,style:i,config:o.config,data:o.config.data},a):a}function dp(o,e){return!!e&&Nl(o)}function ns({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,writingMode:l,textOrientation:c,tateChuYoko:u,autoFit:p,autoFitMinFontSize:d,...h}){let f=N(),m=f.getLiveGame().getGameState(),g=Rl(null),[b,y]=Zr(()=>n&&!n.config.useTypeEffect?es(n.config.evaluatedWords):[]),[v,A]=le();if(!n)throw new Error("Dialog state is required");Dn(()=>{if(!(!n.config.action.sentence||g.current))return m.logger.info("Initializing the sentence",n,g.current),m.schedule(({onCleanup:ee})=>{if(!n.config.useTypeEffect){hl(n.config.evaluatedWords,n.config.firedTextEvents??new Set,m),n.dispatchComplete();return}y([]),g.current=me(),v(),g.current.onComplete(()=>{n.dispatchComplete()}),ee(()=>{g.current?.timeline?.abort()})},0)},[]),Dn(()=>n.events.depends([n.events.on(Ne.Events.requestComplete,()=>{g.current?.interact()}),n.events.on(Ne.Events.forceSkip,()=>{n.isEnded()||g.current?.forceSkip()})]).cancel,[n,A]),Dn(()=>n.onFlush(()=>{v()}).cancel,[n]),Dn(()=>f.preference.events.depends([f.preference.onPreferenceChange(q.Preferences.gameSpeed,()=>{g.current?.update()}),f.preference.onPreferenceChange(q.Preferences.autoForward,()=>{g.current?.update()}),f.preference.onPreferenceChange(q.Preferences.cps,()=>{g.current?.update()}),f.preference.onPreferenceChange(q.Preferences.textRevealDuration,()=>{v()})]).cancel,[]);let x=(p??!0)&&!f.config.disableTextScaling,{offsets:k,revealed:T}=lp(()=>Il(b),[b]),w=jr(n.config.useTypeEffect?f.preference.getPreference(q.Preferences.textRevealDuration):0,f.preference.getPreference(q.Preferences.cps),f.preference.getPreference(q.Preferences.gameSpeed)),{containerRef:D,scale:z}=Cl({enabled:x,minFontSize:d??bl,vertical:Ci(l),revealed:T});function me(){let ee=new S,dt=new ke(ee).setGuard(m.guard),Xe=new Set,I=n.config.firedTextEvents??new Set,Y=new Set,ce=new Set,G=ts(n.config.evaluatedWords),L=null,te=[],F=[],he=()=>{te.forEach(Be=>Be()),te.length=0},Ge=()=>{if(F.length!==0)return{done:!1,value:F.shift()};let{done:Be,value:We}=G.next();return{done:Be,value:We}},Yt=Be=>{let We=un=>{Be(un),Y.delete(We)};return Y.add(We),{cancel:()=>{Y.delete(We)}}},Ot=(Be,We=!1)=>{Ml(y,Be,We)},Xt=(Be=!1)=>{let We=!1;for(;!We;){let{done:un,value:Je}=Ge();if(un){We=!0;break}if(Ke.isPause(Je)){if(Be)continue;We=!0,F.push(Je);break}else lt.isTextEvent(Je)?Ro(Je,I,m):Je===`
|
|
58
|
+
`?y(rt=>[...rt,Je]):typeof Je=="object"&&"text"in Je&&!Xe.has(Je)&&(Xe.add(Je),Ot(Je,!0))}L&&!L.isSettled()?L.abort():(ce.forEach(un=>un()),ee.resolve())};return m.schedule(async Be=>{let We=!1,un=!1;for(;!We;){let{done:Je,value:rt}=Ge();if(Je){We=un=!0;break}if(lt.isTextEvent(rt)){Ro(rt,I,m);continue}let Oi=new S;if(m.timelines.attachTimeline(Oi),Oi.registerSkipController(new V(()=>{he(),We=!0,Be.retry()})),Oi.onSettled(()=>{he()}),L=Oi,Ke.isPause(rt)){let Hi=Ke.from(rt),Vi=f.preference.getPreference(q.Preferences.gameSpeed);if(Hi.config.duration){let Ui=Hi.config.duration/Vi;await Qi(Ui)}else{let Ui=f.preference.getPreference(q.Preferences.autoForward),Bi=S.race([S.create(Zc=>{let eu=Yt(tu=>{tu(),Zc.resolve()});te.push(()=>eu.cancel())}),...Ui?[S.delay(f.config.autoForwardDefaultPause/Vi)]:[]]);m.timelines.attachTimeline(Bi),await S.wait(Bi)}}else{if(rt!==`
|
|
59
|
+
`&&Xe.has(rt))continue;Xe.add(rt),Ot(rt);let{gameSpeed:Hi,cps:Vi}=f.preference.getPreferences(),Bi=1e3/((typeof rt=="object"&&"cps"in rt&&rt.cps!==void 0?rt.cps:Vi)*Hi);await Qi(Bi)}}un&&(ce.forEach(Je=>Je()),ee.resolve())},0),{getToken:()=>ee,interact:()=>{let Be=!1;Y.forEach(We=>We(()=>Be=!0)),!Be&&Xt()},update:()=>{L&&L.abort()},forceSkip:()=>{Xt(!0)},timeline:dt,onComplete:Be=>(ce.add(Be),{cancel:()=>{ce.delete(Be)}})}}let pe=n.config.action.sentence;if(!pe)return null;let De=s??"bold",bt=pe.config.fontSize??i,Ft={fontWeight:pe.config.bold?De:r,fontSize:Ai(bt)??Al(),color:No(pe.config.color??o),fontFamily:pe.config.fontFamily??a,fontStyle:pe.config.italic?"italic":void 0},Pt=ee=>({fontWeight:ee.config.bold||pe.config.bold?De:r,fontSize:xl(ee.config,bt),color:No(ee.config.color??pe.config.color??o),fontFamily:ee.config.fontFamily??pe.config.fontFamily??a,fontStyle:ee.config.italic??pe.config.italic?"italic":void 0,...Kr(ee.config.emphasis)}),Tt=Ci(l),Ue=n.isEnded(),pt=(ee,dt)=>{if(ee===`
|
|
60
|
+
`)return Ve.createElement("br",{key:dt});let Xe=Pt(ee),I=Wr(ee.config.render),Y=dp(ee,I);return Ve.createElement($t.Span,{tag:`say.word.${dt}`,key:dt,"data-element-type":Y?"interactive-word":void 0,onClick:Y?ce=>ce.stopPropagation():void 0,style:{...Xe,...Xr(),...Fn(f.config.app.debug,{outline:"1px dashed red"})},className:Mo("inline-block",ee.config.className)},Ve.createElement(Gl,{word:ee,vertical:Tt,tateChuYoko:u,done:Ue,style:Xe,renderer:I,revealTail:qr(w,k[dt]??0,ee.text.length,T,ee.revealFrom??0)}))};return Ve.createElement("div",{...h,ref:D,className:Mo("whitespace-pre-wrap",e),style:{[Io]:z,...Fn(w.duration>0,{[$r]:`${w.duration}ms`}),...Ft,...Yr(l,c),...t}},b.map(pt))}function mp({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:l,defaultColor:c,className:u,style:p,fontSize:d,fontWeight:h,fontWeightBold:f,fontFamily:m,writingMode:g,textOrientation:b,tateChuYoko:y,onCompleted:v,...A}){let x=el(),[,k]=Zr(0),T=x?.config??q.DefaultConfig,w=x?.preference.getPreferences()??q.DefaultPreference,D=s??w.cps,z=a??w.gameSpeed,me=l??T.autoForwardDefaultPause,pe=r??T.autoForwardDefaultPause,De=Ve.useMemo(()=>up(o,e,t),[o,e,t]),bt=Ve.useMemo(()=>pp(i,r,pe),[i,r,pe]),Ft=Rl(v),[Pt,Tt]=Zr(()=>n?[]:es(De));Dn(()=>{if(x)return x.preference.onPreferenceChange(()=>{k(L=>L+1)}).cancel},[x]),Dn(()=>{Ft.current=v},[v]),Dn(()=>{let L=!1,te=[],F=Math.max(.01,z),he=Ot=>new Promise(Xt=>{let Jt=setTimeout(Xt,Math.max(0,Ot));te.push(Jt)}),Ge=()=>{L||Ft.current?.()};return n?De.length===0?(Tt([]),()=>{L=!0}):((async()=>{do{let Ot=ts(De);for(Tt([]);!L;){let{done:Xt,value:Jt}=Ot.next();if(Xt)break;if(Ke.isPause(Jt)){let oa=Ke.from(Jt);await he((oa.config.duration??me)/F)}else{if(lt.isTextEvent(Jt))continue;Ml(Tt,Jt),Jt===`
|
|
61
|
+
`?await he(Ll(D,z)):await he(Ll(Jt.cps??D,z))}}if(L)return;Ge(),bt.enabled&&await he(bt.delay)}while(!L&&bt.enabled)})(),()=>{L=!0,te.forEach(Ot=>clearTimeout(Ot))}):(Tt(es(De)),Ge(),()=>{L=!0})},[De,n,bt,D,z,me]);let Ue=e?.config,pt=f??"bold",ee={fontWeight:Ue?.bold?pt:h,fontSize:Ue?.fontSize??d,color:No(Ue?.color??c),fontFamily:Ue?.fontFamily??m,fontStyle:Ue?.italic?"italic":void 0},dt=L=>({fontWeight:L.config.bold||Ue?.bold?pt:h,fontSize:wl(L.config,Ue?.fontSize??d),color:No(L.config.color??Ue?.color??c),fontFamily:L.config.fontFamily??Ue?.fontFamily??m,fontStyle:L.config.italic??Ue?.italic?"italic":void 0,...Kr(L.config.emphasis)}),Xe=Ci(g),I=jr(n?w.textRevealDuration:0,D,z),{offsets:Y,revealed:ce}=Il(Pt),G=(L,te)=>{if(L===`
|
|
62
|
+
`)return Ve.createElement("br",{key:te});let F=dt(L);return Ve.createElement("span",{key:te,style:{...F,...Xr()},className:Mo("inline-block",L.config.className)},Ve.createElement(Gl,{word:L,vertical:Xe,tateChuYoko:y,done:!1,style:F,renderer:Wr(L.config.render),revealTail:qr(I,Y[te]??0,L.text.length,ce,L.revealFrom??0)}))};return Ve.createElement("div",{...A,className:Mo("whitespace-pre-wrap",u),style:{...Fn(I.duration>0,{[$r]:`${I.duration}ms`}),...ee,...Yr(g,b),...p}},Pt.map(G))}function Fl(o){return Ve.createElement(ns,{...o,key:o.dialog?.config.action.id})}function fp({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Lo({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Ve.createElement(ns,{...r,dialog:s,key:s.config.action.id})}function hp(o){let e=Mt();return Ve.createElement(ns,{...o,dialog:e,key:e.config.action.id})}function Sn(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Ve.createElement(fp,{...o}):Ve.createElement(hp,{...o})}var gp=Sn;import Fo,{useEffect as yp,useLayoutEffect as vp,useMemo as Hl,useRef as Sp,useState as bp}from"react";import Go from"react";var is=Go.createContext(null);function os(){let o=Go.useContext(is);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var rs=Go.createContext(null);function Ol(){let o=Go.useContext(rs);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Oo({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let l=Sp(null),{register:c,unregister:u,getIndex:p}=Ol(),[d,h]=bp(-1),{choose:f,evaluated:m,gameState:g}=os(),b=d===-1?null:m[d],y=Hl(()=>we.getCtx({gameState:g}),[g]),{hidden:v,disabled:A}=Hl(()=>{if(!b)return{hidden:!1,disabled:!1};let T=b.config.hidden?.evaluate(y)?.value??!1,w=!T&&(b.config.disabled?.evaluate(y)?.value??!1);return{hidden:T,disabled:w}},[b,y]);vp(()=>{if(!l.current)return;let T=l;c(T);let w=p(T);return h(w),l.current.dataset.index=w.toString(),()=>u(T)},[c,u,p]),yp(()=>{if(!t)return;let T=w=>{w.key.toLowerCase()===t.toLowerCase()&&!w.ctrlKey&&!w.metaKey&&(w.preventDefault(),w.stopPropagation(),x())};return window.addEventListener("keydown",T,!0),()=>{window.removeEventListener("keydown",T,!0)}},[t]);function x(){if(d===-1||!m[d]||v||A)return;let T=m[d];f({...T,evaluated:oe.getText(T.words||[])})}let k=b&&!v;return Fo.createElement(Fo.Fragment,null,Fo.createElement("button",{className:o,style:{...e,display:k?e?.display??void 0:"none"},onClick:x,ref:l,disabled:A},k&&Fo.createElement(Fl,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Ne({useTypeEffect:!1,action:{sentence:b.prompt,words:b.words,character:null},gameState:g,evaluatedWords:b.words})})))}import Ho from"react";import{AnimatePresence as Tp}from"motion/react";function Vo({children:o,...e}){let t=Tp;return Ho.createElement(Ho.Fragment,null,Ho.createElement("div",{...e},Ho.createElement(t,null,o)))}import Vl from"react";function an({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Vl.useContext(Pn),l=e??o?.character??a?.config.action.character??null,c=n??l?.config.color,u=i??t??l?.state.name;return Vl.createElement("div",{...s,style:{color:c?Gn(c):void 0,...r}},u)}import xp from"clsx";import wp,{useRef as kp}from"react";import ss,{createContext as Ap,useContext as Bl,useState as Ul}from"react";var Ln=class Ln{constructor(){this.preloaded=[];this.events=new X}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(Ln.EventTypes["event:preloaded.add"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this)}get(e){return this.preloaded.find(t=>this.getSrc(t)===e)}has(e){return Array.isArray(e)?e.every(t=>this.has(t)):this.preloaded.some(t=>this.getSrc(t)===e)}remove(e){if(Array.isArray(e)){let n=e.map(i=>this.getSrc(i));return this.preloaded=this.preloaded.filter(i=>!n.includes(this.getSrc(i))),this}let t=this.getSrc(e);return this.preloaded=this.preloaded.filter(n=>this.getSrc(n)!==t),this.events.emit(Ln.EventTypes["event:preloaded.remove"],e),this.events.emit(Ln.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Re.getSrc(e)}};Ln.EventTypes={"event:preloaded.add":"event:preloaded.add","event:preloaded.remove":"event:preloaded.remove","event:preloaded.change":"event:preloaded.change","event:preloaded.mount":"event:preloaded.mount","event:preloaded.ready":"event:preloaded.ready","event:preloaded.complete":"event:preloaded.complete","event:preloaded.unmount":"event:preloaded.unmount"};var ot=Ln;var Uo=class o{constructor(e){this.game=e;this.entries=new Map;this.byUrl=new Map;this.preloadTasks=new Map;this.holds=new Map;this.pinned=new Set;this.seen=new Set;this.blobBytes=0;this.decodedBytes=0;this.acquisition=null;this.missingReporter=null;this.reportedMissing=new Set;this.game.addSideEffect(()=>{this.abortAll(),this.clear()})}static getImage(e,t,n){return da(e,{...n,signal:t})}static async decodeImage(e){if(typeof window>"u"||typeof window.Image>"u")return null;let t=new window.Image;if(t.src=e,typeof t.decode!="function")return null;try{await t.decode()}catch{return null}return t}static estimateDecodedBytes(e){return(e.naturalWidth||0)*(e.naturalHeight||0)*4}static readBudget(e){return typeof e=="number"&&!Number.isNaN(e)?Math.max(0,e):1/0}useAcquisition(e){return this.acquisition=e??null,this}useMissingReporter(e){return this.missingReporter=e??null,this}reportMissing(e){return!this.missingReporter||this.reportedMissing.has(e)?!!this.missingReporter:(this.reportedMissing.add(e),this.missingReporter({type:"image",src:e}),!0)}has(e){return this.entries.has(e)}wasCached(e){return this.seen.has(e)}add(e,t){return this.insert(e,t,0),this}remove(e){let t=this.entries.get(e);return t&&this.drop(t),this}get(e){let t=this.entries.get(e);if(t)return this.touch(t),t.url}isDecoded(e){return!!this.entries.get(e)?.decoded}clear(){for(let e of[...this.entries.values()])this.drop(e);return this.seen.clear(),this}size(){return this.entries.size}isPreloading(e){return this.preloadTasks.has(e)}preload(e,t,n){let i=n?.retainDecoded===!0,r=i||n?.decode!==!1,s=this.entries.get(t);if(s&&(!i||s.decoded))return this.touch(s),o.settledToken();let a=this.preloadTasks.get(t);if(a)return this.followTask(a,e,t,n);if(s)return this.touch(s),this.runTask(e,t,new AbortController,()=>this.decodeAgain(t,s.url));let l=t,c={};this.game.hooks.rawTrigger("preloadImage",()=>[l,(p,d)=>{l=p,c={...c,...d}}]);let u=new AbortController;return this.runTask(e,t,u,()=>this.acquireAndDecode(t,l,u.signal,c,i,r))}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.entries.values(),e=>e.url)}retain(e){let t=new Set(e);for(let n of[...this.entries.values()])n.stale=!t.has(n.name),n.stale&&!this.isPinned(n)&&this.drop(n);return this}pin(e){return this.pinned=new Set(e),this.enforce(),this}hold(e){this.holds.set(e,(this.holds.get(e)??0)+1)}release(e){let t=this.holds.get(e);if(t===void 0)return;if(t>1){this.holds.set(e,t-1);return}this.holds.delete(e);let n=this.byUrl.get(e);if(n){if(n.stale&&!this.isPinned(n)){this.drop(n);return}this.enforce()}}getStats(){let e=0,t=0;for(let n of this.entries.values())n.decoded&&e++,this.isPinned(n)&&t++;return{entries:this.entries.size,blobBytes:this.blobBytes,decodedEntries:e,decodedBytes:this.decodedBytes,pinned:t,budget:this.budget()}}budget(){return{blobBytes:o.readBudget(this.game.config?.imageCacheBudgetBytes),decodedBytes:o.readBudget(this.game.config?.decodedImageBudgetBytes)}}isPinned(e){return this.pinned.has(e.name)||this.holds.has(e.url)}touch(e){this.entries.delete(e.name),this.entries.set(e.name,e)}insert(e,t,n,i=null){let r=this.entries.get(e);if(r){if(r.url===t)return this.touch(r),r;this.drop(r)}let s={name:e,url:t,bytes:n,decoded:null,decodedBytes:0,stale:!1,release:i};return this.entries.set(e,s),this.byUrl.set(t,s),this.seen.add(e),this.blobBytes+=n,this.enforce(),s}drop(e){this.dropDecoded(e),this.handBack(e.url,e.release),this.blobBytes-=e.bytes,this.entries.delete(e.name),this.byUrl.get(e.url)===e&&this.byUrl.delete(e.url)}dropDecoded(e){e.decoded&&(this.decodedBytes-=e.decodedBytes,e.decoded=null,e.decodedBytes=0)}retainDecoded(e,t){this.dropDecoded(e),e.decoded=t,e.decodedBytes=o.estimateDecodedBytes(t),this.decodedBytes+=e.decodedBytes,this.enforce()}enforce(){let e=this.budget();if(this.blobBytes>e.blobBytes)for(let t of[...this.entries.values()]){if(this.blobBytes<=e.blobBytes)break;this.isPinned(t)||this.drop(t)}if(this.decodedBytes>e.decodedBytes)for(let t of this.entries.values()){if(this.decodedBytes<=e.decodedBytes)break;t.decoded&&!this.isPinned(t)&&this.dropDecoded(t)}}async acquireAndDecode(e,t,n,i,r,s){let a=await this.acquire(e,t,n,i);if(!a)return;let{url:l,bytes:c,release:u}=a;if(this.insert(e,l,c,u),this.entries.get(e)?.url!==l||!s)return;let p=await o.decodeImage(l),d=this.entries.get(e);if(!d||d.url!==l){this.handBack(l,u);return}p&&r&&this.retainDecoded(d,p)}async acquire(e,t,n,i){if(this.acquisition){let a=await this.acquisition({type:"image",src:e},n);return!a||!a.url?null:{url:a.url,bytes:a.bytes??0,release:a.release??null}}let{url:r,bytes:s}=await o.getImage(t,n,i);return r?{url:r,bytes:s,release:null}:null}handBack(e,t){if(t){t();return}e.startsWith("blob:")&&URL.revokeObjectURL(e)}async decodeAgain(e,t){let n=await o.decodeImage(t),i=this.entries.get(e);n&&i&&i.url===t&&!i.decoded&&this.retainDecoded(i,n)}runTask(e,t,n,i){let r={promise:Promise.resolve(),controller:n,errorHandlers:[],failed:!1};r.promise=Promise.resolve().then(i).then(()=>{this.preloadTasks.delete(t)}).catch(a=>{r.failed=!0,this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${a}`),r.errorHandlers.forEach(l=>l(a))}),this.preloadTasks.set(t,r);let s={abort:()=>{n.abort(),this.preloadTasks.delete(t)},onFinished:a=>(r.promise.then(a),s),onErrored:a=>(r.errorHandlers.push(a),s)};return s}followTask(e,t,n,i){let r={abort:()=>{},onFinished:s=>(e.promise.then(()=>{if(e.failed){s();return}this.preload(t,n,i).onFinished(s)}),r),onErrored:s=>(e.errorHandlers.push(s),r)};return r}static settledToken(){let e={abort:()=>{},onFinished:t=>(Promise.resolve().then(t),e),onErrored:()=>e};return e}};var Bo=Ap(null);function Wl({children:o}){let e=N(),[t]=Ul(()=>new ot),[n]=Ul(()=>new Uo(e));return ss.createElement(ss.Fragment,null,ss.createElement(Bo,{value:{preloaded:t,cacheManager:n}},o))}function jt(){if(!Bo)throw new Error("usePreloaded must be used within a PreloadedProvider");return Bl(Bo)}function zl(){return Bl(Bo)}import{useLayoutEffect as Kl,useRef as Cp}from"react";function Wo(o){let e=zl()?.cacheManager??null,t=Cp(null),n=()=>{t.current?.release(),t.current=null};Kl(()=>{let i=o.current;if(t.current?.element===i||(n(),!i||!e||typeof MutationObserver>"u"))return;let r=null,s=()=>{let l=i.getAttribute("src");l!==r&&(r!==null&&e.release(r),r=l,r!==null&&e.hold(r))},a=new MutationObserver(s);t.current={element:i,release:()=>{a.disconnect(),r!==null&&(e.release(r),r=null)}},s(),a.observe(i,{attributes:!0,attributeFilter:["src"]})}),Kl(()=>n,[])}function $l(){let o=Mt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return Dp(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?O.getSrcURL(s):null,l=s&&O.isTagSrc(s)?[...s.state.currentSrc]:null,c=$a({character:n,sentence:i,portrait:s,currentSrc:a,tags:l,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=Ep(c.source);return{visible:!!u,src:u,character:c.character,portrait:c.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function Pp({className:o,style:e,alt:t,...n}){let i=$l(),{cacheManager:r}=jt(),s=kp(null);if(Wo(s),!i.visible||!i.src)return null;let a=r.get(i.src)||i.src;return wp.createElement("img",{...n,ref:s,"data-element-type":"dialog-avatar",className:xp("dialog-avatar",o),src:a,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function Ep(o){return o?P.srcToURL(o):null}function Dp(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var as=Pp;import{useEffect as Lp}from"react";function Rp(){let o=Mt(),[e]=le(o.deps),t=oe.getText(o.config.evaluatedWords);return Lp(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]),{done:o.isEnded(),text:t,isNarrator:o.config.action.character===null||o.config.action.character.state.name==="",metadata:o.config.action.sentence?.getMetadata()}}import{useCallback as zo,useEffect as ls,useMemo as Ip,useRef as Mp,useState as jl}from"react";function Np(){let o=Mt(),[e]=le(o.deps),[t,n]=jl(!0),[i,r]=jl(!0),s=Mp(null),a=o.config.gameState,l=o.config.action.sentence,c=l?.config.voiceId??null;ls(()=>o.events.on(Ne.Events.onFlush,()=>{e()}).cancel,[o]);let u=Ip(()=>{if(!l)return null;try{return nt.getVoice(a,l)}catch{return null}},[a,l,c,l?.config.voice]);ls(()=>{s.current=null,r(!0)},[l]),ls(()=>{let m=!1,g=null,b=null,y=null;if(!u){n(!0);return}n(!1);let v=()=>{m||n(!0)};g=a.audioManager.getToken(u),g&&(g.isPlaying()||n(!0),b=()=>v(),y=()=>v(),g.once("ended",b),g.once("stop",y));let A=a.events.on(R.EventTypes["event:state.player.lineEnd"],()=>{v()});return()=>{m=!0,A.cancel(),g&&b&&g.off("ended",b),g&&y&&g.off("stop",y)}},[a,u]);let p=zo(async m=>{let g=m??u;if(!g)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let b=g instanceof URL?ge.voice(g.toString()):typeof g=="string"?ge.voice(g):g,y=await a.getLiveGame().playSound(b);s.current=y;let v=()=>{r(!0)};return y.once("ended",v),y.once("stop",v),y},[a,u]),d=zo(()=>u,[u]),h=zo(()=>c,[c]),f=zo(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:p,getVoice:d,getVoiceId:h,getVoiceSrc:f}}import cs,{createContext as jp,useContext as qp,useEffect as Ql,useRef as _p}from"react";import{useState as Gp}from"react";function Ko(o){let[e]=Gp(o);return e}import{AnimatePresence as Fp}from"motion/react";var $o=Fp;import Pi,{createContext as Bp,useContext as Wp,useEffect as zp,useRef as Kp}from"react";import{useEffect as xi,useLayoutEffect as Op}from"react";function Hp(){let o=zt(),[e]=le();return xi(()=>o.onChange(e).cancel,[]),o.getPathname()}function Vp(){let{router:o,path:e}=ki(),[t]=le();return xi(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function Up(){let o=zt(),[e]=le();return xi(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function jo(o,e){let t=zt();Op(()=>t.onUpdate(()=>o(t)).cancel,e),xi(()=>{o(t)},[])}function wi(){let o=zt(),[e]=le();return xi(()=>o.onChange(e).cancel,[]),e}var ql=Bp(null);function Ei({children:o,path:e,consumedBy:t}){let i={router:zt(),path:e,consumedBy:t};return Pi.createElement(ql,{value:i},o)}function ki(){let o=Wp(ql);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new E(`Invalid useLayout call: Trying to access layout without a parent.
|
|
63
|
+
This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function $p({children:o,name:e,propagate:t}){let n=N(),[i]=le(),{path:r,router:s,consumedBy:a}=ki(),l=s.joinPath(r,e),c=Ko(()=>s.createToken(l+"@layout")),u=s.getCurrentPath(),p=Kp(!1),d=f=>{p.current=f,i()},h=s.matchPath(u,l);if(wi(),jo(f=>{let m=f.matchPath(f.getCurrentPath(),l);if(p.current&&!m){if(!o){d(!1);return}f.registerUnmountingPath(c)}m&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(c),m&&!p.current&&!f.isTransitioning()&&d(!0)},[h,o]),zp(()=>{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 Pi.createElement(Ei,{path:l},Pi.createElement($o,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(c),d(!1)}},h&&p.current&&o))}function _l({children:o}){return wi(),Pi.createElement(Ei,{path:yn.rootPath},Pi.createElement(wo,{"data-layout-path":yn.rootPath,key:yn.rootPath},o))}var us=jp(null);function Qp(){return qp(us)}function Yp({children:o,name:e}){let[t]=le(),{path:n,router:i,consumedBy:r}=ki(),s=Qp(),a=s?.name??e,l=a??n+"@default",c=a?i.joinPath(n,a):n,u=Ko(()=>i.createToken(c+"@page")),p=i.getCurrentPath(),d=!a,h=_p(!1),f=y=>{h.current=y,t()},m=d&&i.exactMatch(p,n)||i.exactMatch(p,c);if(r&&r!==l)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");wi(),jo(y=>{let v=d&&y.exactMatch(y.getCurrentPath(),n)||y.exactMatch(y.getCurrentPath(),c);if(h.current&&!v){if(!o){f(!1);return}y.registerUnmountingPath(u)}v&&y.isPathsUnmounting()&&y.unregisterUnmountingPath(u),v&&!h.current&&!y.isTransitioning()&&f(!0)},[m,o]),Ql(()=>{if(!m)return;let y=d?i.mountDefaultHandler(c):i.mount(c);return i.emitOnPageMount(),()=>{y.cancel()}},[c,m]),Ql(()=>()=>{i.unregisterUnmountingPath(u),f(!1)},[]);let g=cs.createElement(Ei,{path:n,consumedBy:l},cs.createElement($o,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),f(!1)}},m&&h.current&&o));return(y=>s?cs.createElement(us,{value:{name:null}},y):y)(g)}import ps,{useCallback as Xp,useEffect as ds,useImperativeHandle as Jp,useMemo as Yl,useRef as ms,useState as Zp}from"react";var ed=50,td={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Xl={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function nd(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Jl(o,e){return e==null?o:Math.max(o,e)}function id(o,e,t){return o<=0||e<=0||t<=0?{width:o,height:e}:o/e>t?{width:e*t,height:e}:{width:o,height:o/t}}var Zl=ps.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:l,dataAttributes:c,onUpdate:u,children:p},d){let h=ms(null),[f,m]=Zp({...Xl,width:"0px",height:"0px"}),g=ms(u),b=ms(null);ds(()=>{g.current=u},[u]);let y=Xp(()=>{let x=h.current;if(!x)return;let k=x.clientWidth,T=x.clientHeight;if(k<=0||T<=0||e<=0)return;let w=id(k,T,e),D=Jl(w.width,n),z=Jl(w.height,i),me=b.current;(!me||me.width!==D||me.height!==z)&&(b.current={width:D,height:z},m({...Xl,width:`${D}px`,height:`${z}px`}));let pe=t>0?D/t:1;g.current?.({width:D,height:z,scale:pe,containerWidth:k,containerHeight:T})},[e,t,n,i]),v=Yl(()=>ua(y,typeof r=="number"?r:ed),[y,r]);ds(()=>{y()},[y]),ds(()=>{let x=new ResizeObserver(()=>{v()});h.current&&x.observe(h.current);let k=()=>{v()};return window.addEventListener("resize",k),()=>{x.disconnect(),window.removeEventListener("resize",k)}},[v]),Jp(d,()=>({requestUpdate:y}),[y]);let A=Yl(()=>nd(c),[c]);return ps.createElement("div",{id:l,ref:h,style:td,...A},ps.createElement("div",{className:s,style:{...f,...a}},p))}),ec=Zl;function od(){return N().getLiveGame()}import gs from"react";import rd,{createContext as sd,useContext as ad,useEffect as ld,useState as tc}from"react";var cd={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},nc=sd({state:cd,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function qt(){return ad(nc)}function fs(){let{dialogs:o}=qt();return o}function ud(){let{isActive:o}=qt();return o}function pd(){let{isVisible:o}=qt();return o}function hs({children:o}){let t=N().getLiveGame().getGameState(),[n,i]=tc(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=tc(null);ld(()=>{let l=f=>({...f,dialogs:[...f.dialogs]}),c=t.events.on(R.EventTypes["event:state.nvl.enter"],(f,m)=>{i(l(t.getNvlState())),s(m?.showTransition||null)}),u=t.events.on(R.EventTypes["event:state.nvl.exit"],()=>{i(l(t.getNvlState()))}),p=t.events.on(R.EventTypes["event:state.nvl.dialogAppend"],()=>{i(l(t.getNvlState()))}),d=t.events.on(R.EventTypes["event:state.nvl.visibilityChange"],(f,m)=>{i(l(t.getNvlState())),s(m||null)}),h=t.events.on(R.EventTypes["event:state.nvl.change"],f=>{i(l(f))});return()=>{c.cancel(),u.cancel(),p.cancel(),d.cancel(),h.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return rd.createElement(nc.Provider,{value:a},o)}import{AnimatePresence as dd,motion as md}from"motion/react";import fd from"clsx";function ys({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=qt(),{ratio:r}=ye(),s=N(),a=i?.duration?i.duration/1e3:.3;return gs.createElement(dd,null,n&&gs.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},gs.createElement(md.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:fd("w-full h-full overflow-auto",e),style:{transform:s.config.useAspectScale?`scale(${r.state.scale})`:void 0,transformOrigin:"top left",width:s.config.useAspectScale?s.config.width:"100%",height:s.config.useAspectScale?s.config.height:"100%",...t}},o)))}import Rn from"react";function vs({renderDialogItem:o,dialogs:e}){return Rn.createElement(ys,{className:"bg-black/80 text-white p-16 inset-8"},Rn.createElement("div",{"data-element-type":"nvl-dialog-list",className:"flex flex-col space-y-4 p-4"},(e??[]).map((n,i)=>{let r=n.entry.character?Rn.createElement(an,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Rn.createElement(Sn,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Rn.createElement("div",{key:`${n.entry.id}:${n.isActive?"active":"idle"}`,"data-element-type":"nvl-dialog-item","data-dialog-index":i,className:"nvl-dialog-item"},o?o({entry:n.entry,index:i,isActive:n.isActive,nametag:r,texts:s}):Rn.createElement(Rn.Fragment,null,r,s))})))}import vt,{useMemo as hd}from"react";import ic from"clsx";function gd({children:o,className:e,style:t,renderDialogItem:n}){let i=fs(),{state:r}=qt();return vt.createElement("div",{"data-element-type":"nvl-dialog-list",className:ic("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>vt.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},vt.createElement(yd,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?vt.createElement(an,{className:"nvl-character-name font-bold mr-2"}):null,texts:vt.createElement(Sn,{className:"nvl-dialog-text"})}):o?vt.Children.map(o,l=>vt.isValidElement(l)?vt.cloneElement(l,{entry:s,index:a}):l):vt.createElement(oc,{entry:s,index:a})))))}function oc({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??vt.createElement(Sn,{className:"nvl-dialog-text"});return vt.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:ic("nvl-dialog-item",t),style:n},r&&vt.createElement(an,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function yd({entry:o,children:e}){let n=N().getLiveGame().getGameState(),i=hd(()=>o.sentence.evaluate(we.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",l=Lo({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return vt.createElement(Pn,{value:l},e)}import qo from"react";import{createPortal as vd}from"react-dom";var Ss=qo.createContext(null),Sd={Portal:()=>null,measure:()=>null,container:null};function bd(){let o=qo.useContext(Ss);return qo.useMemo(()=>{if(!o)return Sd;let e=t=>{let n=o.offsetWidth;return!n||!t.width?1:t.width/n};return{container:o,Portal:({children:t})=>vd(qo.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 Td}from"react";function Ad(o){let e=N();Td(()=>{if(!o)return;let t=e.getLiveGame().getGameState();if(t)return t.suspendAdvance()},[o,e])}var _o=class{constructor(e,t){this.emit=e;this.options=t;this.held=!1;this.delayTimer=null;this.repeatTimer=null}isHeld(){return this.held}press(){this.held||(this.clearTimers(),this.held=!0,this.emit(!1),this.options.delay===0?this.startRepeating():this.delayTimer=setTimeout(()=>{this.delayTimer=null,this.startRepeating()},this.options.delay))}release(){this.clearTimers(),this.held=!1}dispose(){this.release()}startRepeating(){this.repeatTimer=setInterval(()=>{this.emit(!0)},this.options.interval)}clearTimers(){this.delayTimer!==null&&(clearTimeout(this.delayTimer),this.delayTimer=null),this.repeatTimer!==null&&(clearInterval(this.repeatTimer),this.repeatTimer=null)}};function sc({state:o}){let e=N(),t=zt(),[n]=vn(q.Preferences.skipDelay),[i]=vn(q.Preferences.skipInterval),[r]=En("skipAction");return xd(()=>{if(!e.getLiveGame().gameState.playerCurrent){o.logger.warn("KeyEventAnnouncer","Failed to listen to playerElement events");return}if(!window){o.logger.warn("KeyEventAnnouncer","Failed to listen to window events");return}let a=new _o(u=>{o.events.emit(R.EventTypes["event:state.player.skip"],u)},{delay:n,interval:i}),l=u=>{o.isAdvanceSuspended()||e.keyMap.match("skipAction",u.key)&&e.preference.getPreference(q.Preferences.skip)&&(a.isHeld()||o.logger.verbose("KeyEventAnnouncer","Skipping"),a.press())},c=u=>{e.keyMap.match("skipAction",u.key)&&a.release()};if(e.config.useWindowListener){let u=e.getLiveGame().onWindowEvent("keydown",l).cancel,p=e.getLiveGame().onWindowEvent("keyup",c).cancel;return()=>{a.dispose(),u(),p()}}else{let u=e.getLiveGame().onPlayerEvent("keydown",l).cancel,p=e.getLiveGame().onPlayerEvent("keyup",c).cancel;return()=>{a.dispose(),u(),p()}}},[t,n,i,r]),rc.createElement(rc.Fragment,null)}import lc,{useEffect as wd}from"react";function ac({onStage:o,dialogShown:e,advanceSuspended:t}){return o?e?t?"ignore":"advance":"restoreDialog":"ignore"}function kd(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var cc=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],Pd=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]','[data-element-type="interactive-word"]','[data-element-type="dialog-overlay"]'];function Ed(o,e){return!o||e&&cc.some(t=>!!o.closest(t))?!1:[...Pd,...cc].some(t=>!!o.closest(t))}function uc(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 pc({state:o}){let e=N();return wd(()=>{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)||!uc(i,t))return;let s=o.mainContentNode;if(s&&(!s.contains(r)||!uc(i,s))||kd(r)||Ed(r,o.isNvlMode()))return;let a=ac({onStage:!0,dialogShown:e.preference.getPreference(q.Preferences.showDialog),advanceSuspended:o.isAdvanceSuspended()});if(a!=="ignore"){if(a==="restoreDialog"){e.preference.setPreference(q.Preferences.showDialog,!0);return}o.events.emit(R.EventTypes["event:state.player.stageClick"]),o.recordStageClick()}};if(e.config.useWindowListener){let i=e.getLiveGame().onWindowEvent("click",n);return()=>{i.cancel()}}else{let i=e.getLiveGame().onPlayerEvent("click",n);return()=>{i.cancel()}}},[e,o]),lc.createElement(lc.Fragment,null)}import{useEffect as dc}from"react";function bs({gameState:o}){let e=o.audioManager,[t,n]=vn("globalVolume");return dc(()=>{n(e.getGlobalVolume())},[]),dc(()=>{e.setGlobalVolume(t)},[t]),null}import{useEffect as Qo,useMemo as Dd,useRef as fc}from"react";function mc(o){let e=Re.catSrc(o.srcManager?.src||[]),t=Re.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=[],s=new Set,a=o.state?.backgroundImage?.state?.currentSrc;if(P.isImageSrc(a)){let l=P.srcToURL(a);l&&(s.add(l),n.push(l))}for(let l of e.image){let c=Re.getSrc(l);!c||s.has(c)||(s.add(c),i.push(c))}for(let l of t.image){let c=Re.getSrc(l);!c||s.has(c)||(s.add(c),r.push(c))}return{firstFrame:n,critical:i,lookAhead:r,all:[...n,...i,...r],criticalAudio:e.audio}}function Ts(o){let e=[],t=null;return{plan(r){return o.config.preloadAllImages?n(r):i(r)}};function n(r){if(r.kind!=="scene")return null;let s=mc(r.scene),a=o.config.preloadGate==="scene"?"gate":"soon";return{entries:[...s.firstFrame.map(c=>({type:"image",src:c,band:"gate",decode:!0})),...s.critical.map(c=>({type:"image",src:c,band:a,decode:!0})),...s.lookAhead.map(c=>({type:"image",src:c,band:"idle",decode:!1}))],audio:s.criticalAudio,keep:s.all,pin:s.firstFrame}}function i(r){if(r.kind!=="advance")return null;let s=r.story;if(!s)return null;t!==r.scene&&(e=[],t=r.scene);let a=o.getLiveGame(),l=a.stackModel?.getTopSync()?.node?.action||null,c=a.getAllPredictableActions(s,l,o.config.maxPreloadActions).map(d=>Re.getPreloadableSrc(s,d)).filter(d=>d!==null);for(let d of c)d.activeType==="scene"&&!e.includes(d)&&e.push(d);let u=new Set,p=[];for(let d of Re.catSrc([...e,...c]).image){let h=Re.getSrc(d);!h||u.has(h)||(u.add(h),p.push({type:"image",src:h,band:"idle",decode:!0}))}return{entries:p,keep:[...u]}}}var St="Preload";function hc({state:o}){let{preloaded:e,cacheManager:t}=jt(),n=N(),[i]=le(),r=fc(new Set),s=o.getLastScene()||o.getPreloadingScene(),a=n.getLiveGame().story,l=fc(s);l.current=s;let c=Dd(()=>n.config.preload??Ts(n),[n]);function u(){o.logger.debug(St,"Preload unmounted"),e.events.emit(ot.EventTypes["event:preloaded.unmount"])}return Qo(()=>o.events.on(R.EventTypes["event:state:flushPreloadedScenes"],()=>{i()}).cancel,[]),Qo(()=>(t.useAcquisition(c.acquire?c.acquire.bind(c):null),t.useMissingReporter(c.onMissing?c.onMissing.bind(c):null),o.useVideoMissingReporter(c.onMissing?c.onMissing.bind(c):null),()=>{t.useAcquisition(null),t.useMissingReporter(null),o.useVideoMissingReporter(null)}),[c,t]),Qo(()=>{if(!a||!s)return a?o.logger.debug(St,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(St,"Story not found, skipping preload"),u;if(typeof fetch>"u"&&!c.acquire)return e.events.emit(ot.EventTypes["event:preloaded.complete"]),e.events.emit(ot.EventTypes["event:preloaded.ready"]),o.logger.warn(St,"Fetch is not supported in this environment, skipping preload"),u;n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(St,"Cache cleared")),r.current.clear();let f={value:!1};return p({kind:"scene",scene:s,story:a},{gates:!0,cancelled:f}),e.events.emit(ot.EventTypes["event:preloaded.mount"]),()=>{f.value=!0,u()}},[s,a,c]),Qo(()=>{if(!a)return;let f={value:!1},m=n.getLiveGame().onCurrentActionChange(({actionId:g})=>{p({kind:"advance",actionId:g,scene:l.current,story:a},{gates:!1,cancelled:f})});return()=>{f.value=!0,m.cancel()}},[a,c,n]),null;async function p(f,m){let g=()=>{e.events.emit(ot.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(ot.EventTypes["event:preloaded.ready"])};m.gates&&!n.config.waitForPreload&&e.events.emit(ot.EventTypes["event:preloaded.ready"]);let b;try{b=await c.plan(f)}catch(y){o.logger.weakError(St,"Preload strategy failed to plan; nothing warmed",y),m.gates&&g();return}if(!m.cancelled.value){if(!b){m.gates&&g();return}b.pin&&t.pin(b.pin),b.keep&&t.retain(b.keep),b.audio&&o.audioManager.retainOnly([...b.audio]),b.video&&o.retainWarmVideos([...b.video]),await d(b,m,g)}}async function d(f,m,g){let b=performance.now(),y={gate:new Nn(n.config.preloadConcurrency,0),soon:new Nn(n.config.preloadConcurrency,0),idle:new Nn(n.config.preloadConcurrency,n.config.preloadDelay)},v=o.logger.group(St,!0);o.logger.debug(St,"preloading:",f);let A=0;for(let k of f.entries)h(y[k.band],k)&&(A+=1);v.end();let x=()=>{let k=t.getStats(),T=w=>(w/(1024*1024)).toFixed(1);return`${A} queued in ${(performance.now()-b).toFixed(0)}ms (${T(k.blobBytes)} MB fetched, ${T(k.decodedBytes)} MB decoded, ${k.pinned} pinned)`};await y.gate.start(),m.gates&&(o.logger.info(St,"Preload (gate)",x()),g()),!m.cancelled.value&&(await y.soon.start(),!m.cancelled.value&&(await y.idle.start(),m.cancelled.value||o.logger.info(St,"Preload (settled)",x())))}function h(f,m){let g=`${m.band}:${m.src}`;if(r.current.has(g))return!1;r.current.add(g);let b=m.decode??m.band!=="idle";return t.has(m.src)&&(!b||t.isDecoded(m.src))?(o.logger.debug(St,`Already warm (${m.band})`,m.src),!1):(f.addTask(()=>new Promise(y=>{t.preload(o,m.src,{retainDecoded:b,decode:b}).onFinished(()=>{o.logger.debug(St,`Warmed (${m.band})`,m.src),y()}).onErrored(()=>{o.logger.weakError(St,`Failed to warm (${m.band})`,m.src),y()})})),!0)}}import Di from"react";import Xo from"react";import As,{useEffect as Cs,useLayoutEffect as xs,useRef as Yo,useState as ws}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,p]=ws(null),[d,h]=ws(null),f=Yo(null),m=As.useRef(null),[g]=ws(()=>new Ki("displayable.refGroup")),b=Yo(g.next()),y=Yo(dt()),A=N().getLiveGame().getGameState(),x=typeof a=="function"?a(u):a,[k]=le([d,u,y]);Cs(()=>A.events.depends([A.events.on(R.EventTypes["event:state.player.skip"],ee)]).cancel,[d,u,y]),xs(()=>{if(z(),!u)return;if(y.current.some(([te])=>!te.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:I,task:Y}=u,ce=te=>{y.current.forEach(([F],he)=>{let Ge=Y.resolve[he],Yt=typeof Ge=="function"?Ge:Ge.resolver;if(!Yt)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${he}])`);let Ot=Yt(...te),Xt=j(x[he]||x[x.length-1]||{},Ot);pe(F,l?l(Xt):Xt)})},G=I.onUpdate(ce);ce(Y.animations.map(te=>te.start));let L=!1;return Promise.all(y.current.map(([te])=>{let F=te.current;return F?.waitForLoad?F.waitForLoad():Promise.resolve()})).then(()=>{L||I.start()}),()=>{L=!0,G.cancel()}},[u]),Cs(()=>{if(!m.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),xs(()=>{let I=e.toStyle(A,i);return Object.assign(m.current.style,I),D(),A.logger.debug("Displayable","Initial style applied",m.current,I),bt(),()=>{De()}},[]);let T=Yo(()=>{});T.current=()=>{u||!m.current||(z(),!(d||f.current)&&(Object.assign(m.current.style,e.toStyle(A,i)),D()))},xs(()=>{f.current&&!o._getLoop()&&De(),T.current()});let{ratio:w}=ye();Cs(()=>w.onUpdate(()=>{T.current(),requestAnimationFrame(()=>T.current())}),[w]);function D(){if(c)for(let{ref:I,project:Y}of c)I.current&&Object.assign(I.current.style,Y(e.get()))}function z(){let I=typeof a=="function"?a(u):a;if(!y.current||!y.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");y.current.some(([Y])=>!Y.current)||y.current.forEach(([Y],ce)=>{pe(Y,I[ce]||I[I.length-1]||{})})}function me(I){A.logger.debug("Displayable","Transform applied",e.toStyle(A,i),m.current),k(),r?.(I)}function pe(I,Y){if(!I.current)throw new E("Displayable: Trying to assign properties to unmounted element");lo(I.current,Y,l)}function De(){f.current&&(f.current.stop(),f.current=null,A.logger.debug("Displayable","Loop stopped",o))}function bt(){let I=o._getLoop();if(!I){De();return}f.current||Ft(I.transform,I.options)}function Ft(I,Y){d&&(d.abort(),h(null)),De(),m.current&&(f.current=I.startLoop(e,{gameState:A,ref:m,overwrites:i,companionRefs:c},Y))}function Pt(I,Y){return Tt(new Z({},{duration:I?.duration??0,ease:I?.ease??"linear"}),Y)}function Tt(I,Y){d&&(d.abort(),h(null)),De();let ce=I.animate(e,{gameState:A,ref:m,overwrites:i,companionRefs:c}),G=new ke(ce);return A.timelines.attachTimeline(G),ce.onSkipControllerRegister(L=>{L.onAbort(()=>{G.abort(),h(null)})}),h(ce),ce.then(()=>{h(null),me(I),Y(),bt()}),G}function Ue(I,Y){u&&u.controller.complete();let ce=I.createTask(A),G=I.requestAnimations(ce.animations),L=new S().registerSkipController(new V(G.cancel)),te=new ke(L);L.skipController.onAbort(()=>{G.cancel()}),G.onCanceled(()=>{te.abort(),p(null),A.logger.debug("Displayable","Transition cancelled",I)}),G.onComplete(()=>{Xe(),p(null),s?.(I),Y(),L.resolve()}),A.timelines.attachTimeline(te),p({task:ce,controller:G,transition:I,resolve:Y});let F;if(y.current=ce.resolve.map(he=>{let Ge=As.createRef(),Yt=typeof he=="function"?void 0:he.key;if(!Yt)return[Ge,g.next()];if(Yt==="target")return F=g.next(),[Ge,F];if(Yt==="current")return[Ge,b.current];throw new E("Displayable: Invalid key type")}),!F)throw new E("Displayable: No target key found");return b.current=F,te}function pt(I){return A.logger.debug("initDisplayable",o),Tt(Z.immediate(e.get()),I)}function ee(){t&&d&&(d.abort(),h(null),A.logger.debug("transform skipped")),n&&u&&(u.controller.complete(),A.logger.debug("transition skipped"))}function dt(){return[[As.createRef(),b.current]]}function Xe(){y.current.forEach(([I])=>{I.current=null}),y.current=dt()}return{transformRef:m,transitionRefs:y.current,transitionTask:u,initDisplayable:pt,applyTransform:Tt,applyTransition:Ue,applyLoop:Ft,stopLoop:Pt,updateStyleSync:z,flush:k,deps:[d,u,y]}}import{useEffect as Ld}from"react";function Ct(o,e,t=[]){let i=N().getLiveGame().getGameState();return Ld(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function ks({state:o,text:e}){let{ratio:t}=ye(),[n]=le(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyLoop:l,stopLoop:c,applyTransition:u,updateStyleSync:p,deps:d}=_t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:h=>({width:"fit-content",transform:Z.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:p},[...d]),Xo.createElement($t.Div,{"data-element-type":"text"},Xo.createElement($t.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([h,f])=>Xo.createElement("span",{key:f,ref:h,className:e.config.className},Xo.createElement("span",null,e.state.text)))))}import Gt,{forwardRef as Id,useCallback as yc,useImperativeHandle as Md,useRef as er,useState as vc}from"react";import Jo,{useEffect as Ps,useRef as Yn,forwardRef as Rd}from"react";var gc=Rd(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=Yn(null),{ratio:a}=ye(),[l,c]=Jo.useState(0),[u,p]=Jo.useState(0),d=Yn(null),h=Yn(null),f=N(),m=Yn(!1),g=Yn(null),b=Yn(null);Jo.useImperativeHandle(r,()=>s.current,[]),Wo(s),Ps(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>{let x=()=>{let k=s.current;return!k||typeof k.decode!="function"?Promise.resolve():k.decode().catch(()=>{})};return m.current?x():(g.current||(g.current=new Promise(k=>{b.current=k})),g.current.then(x))},configurable:!0}})},[]),Ps(()=>(y(),a.onUpdate(y)),[o]),Ps(()=>{let x=new MutationObserver(k=>{k.forEach(T=>{T.type==="attributes"&&T.attributeName==="src"&&s.current&&y()})});return s.current&&x.observe(s.current,{attributes:!0}),()=>{x.disconnect()}},[o]);function y(){if(s.current&&s.current.naturalWidth){let x,k,T;if(s.current.naturalWidth*s.current.naturalHeight===1)x=a.state.width,k=a.state.height,T=`${x} / ${k}`;else{let me=t?f.config.width/s.current.naturalWidth:1;x=s.current.naturalWidth*a.state.scale*me,k=s.current.naturalHeight*a.state.scale*me,T="auto"}let w=d.current,D=!w||w.w!==x||w.h!==k||w.ar!==T,z=!!o&&h.current!==o;if(!D&&!z)return;D&&(d.current={w:x,h:k,ar:T},c(x),p(k),s.current.style.aspectRatio=T),o&&(h.current=o,o(x,k))}}function v(){y(),m.current=!0,b.current&&(b.current(),b.current=null,g.current=null),e&&e()}function A(){m.current=!0,b.current&&(b.current(),b.current=null,g.current=null)}return Jo.createElement("img",{ref:s,onLoad:v,onError:A,width:l,height:u,alt:"",src:n,style:i})});gc.displayName="AspectScaleImage";var Zo=gc;import Sc from"clsx";import{motion as Nd}from"motion/react";var Gd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},bc=Id(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=er(null),a=er([]),l=o.findIndex(c=>c!==null);return Md(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(()=>{})}),[]),Gt.createElement("div",{ref:s},o.map((c,u)=>c===null?null:Gt.createElement(Zo,{key:"layer-"+u,ref:p=>{a.current[u]=p},src:t(c),style:Gd,autoFit:e,onSizeChanged:u===l?n:void 0,onLoad:u===l?i:void 0})))});bc.displayName="LayerStack";function Fd(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 O.isStaticSrc(o)?o.state.currentSrc:O.getSrcURL(o)??void 0}var Hd={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Vd({image:o,state:e}){let[t]=vc(()=>new X),[n,i]=vc([]),{cacheManager:r}=jt(),s=er([]),a=er(null),l=O.isLayeredSrc(o)?O.getSrcURLs(o):null;function c(T){return!P.isInlineSrc(T)&&!r.wasCached(T)&&!r.isPreloading(T)&&!s.current.includes(T)&&(r.reportMissing(T)||e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${T}".
|
|
64
64
|
This may be caused by complicated image action behavior that cannot be predicted.
|
|
65
|
-
To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(T)),r.get(T)||T}let{transformRef:u,transitionRefs:p,transitionTask:d,initDisplayable:g,applyTransition:y,applyTransform:m,applyLoop:f,stopLoop:b,updateStyleSync:h,flush:v,deps:A}=_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(z=>z&&typeof z=="function"?{style:Od}:{style:Gd(o.state.darkness)});let w=T?T.transition._getCurrentSrc():Fd(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:k.isColor(w)?k.colorToString(w):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:k.isImageSrc(w)?k.srcToURL(w):O.DefaultImagePlaceholder},{style:{willChange:"filter",position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none",filter:"brightness(1)"}}]},propOverwrite:T=>T.src?{...T,src:c(T.src)}:T});Ct(o,{createWearable:T=>{i(w=>[...w,T])},disposeWearable:T=>{i(w=>w.filter(D=>D.getId()!==T.getId()))},initDisplayable:g,applyTransform:m,applyLoop:f,stopLoop:b,applyTransition:y,events:t,updateStyleSync:h,flush:v},[...A]);let x=gc((T,w)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${T}px`,height:`${w}px`}))},[t]),P=gc(()=>{t.emit("event:image.onLoad")},[t]);return Gt.createElement(Md.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},Gt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},l?p.map(([T,w],D)=>{let z=d?d.task.resolve[D]:null;if(z&&typeof z=="function")return Gt.createElement(Jo,{key:w,ref:T,autoFit:o.config.autoFit});let me=z?z.key==="target"?d.transition._getTargetLayers():d.transition._getPrevLayers():l;return Gt.createElement(Sc,{key:w,ref:T,src:me||l,autoFit:o.config.autoFit,resolveSrc:c,onSizeChanged:D===0?x:void 0,onLoad:D===0?P:void 0})}):p.map(([T,w],D)=>Gt.createElement(Jo,{key:w,ref:T,autoFit:o.config.autoFit,onSizeChanged:D===0?x:void 0,onLoad:D===0?P:void 0})),Gt.createElement("div",{className:vc("w-full h-full top-0 left-0 absolute")},n.map(T=>Gt.createElement("div",{className:vc("w-full h-full relative"),key:"wearable-"+T.getId()},Gt.createElement(bc,{image:T,state:e}))))))}var bc=Gt.memo(Hd),Tc=bc;import tr,{useEffect as Ps,useMemo as zd,useRef as nr}from"react";var Vd=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,Ud=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function Ac(o,e){if(typeof e!="string"||!e.length)return o;if(Vd.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=Bd(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+Wd(r+e.replace(/\\/g,"/"))}function Bd(o){let e=Ud.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function Wd(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 er=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 Es({state:o,puppet:e}){let[t]=ae(),{cacheManager:n}=jt(),i=nr(null),r=zd(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=nr(r);s.current=r;let{transformRef:a,transitionRefs:l,initDisplayable:c,applyTransform:u,applyLoop:p,stopLoop:d,applyTransition:g,updateStyleSync:y,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:p,stopLoop:d,applyTransition:g,updateStyleSync:y,flush:t},[...m]),Ps(()=>{let v=i.current;if(!v)return;let A=o.game,x=e.config.backend,P=A.getPuppetBackend(x);if(!P)return e._setStatus("missing-backend"),A.getPuppetBackendRegistry().reportMissing(x,D=>{o.logger.warn("Puppet",D)}),()=>{e._setStatus("unmounted")};let T;try{T=P.mount(v,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:h,resolveSibling:D=>h(Ac(e.config.src,D)),warn:(D,z)=>{o.logger.warn("Puppet",D,z)}})}catch(D){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${x}" threw while mounting "${e.config.src}"`,D),()=>{e._setStatus("unmounted")}}let w=!1;return e._attachInstance(T),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!w&&typeof T.ready=="function"?T.ready():void 0).then(()=>{w||e._setStatus("ready")}).catch(D=>{w||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${x}" failed to load "${e.config.src}"`,D))}),()=>{w=!0,e._attachInstance(null),e._setStatus("unmounted");try{T.dispose()}catch(D){o.logger.error("Puppet",`Backend "${x}" threw while disposing`,D)}}},[]);let f=nr(r);Ps(()=>{let v=f.current;if(v.width===r.width&&v.height===r.height)return;f.current=r;let A=e._getInstance();if(!(!A||typeof A.resize!="function"))try{A.resize(r)}catch(x){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,x)}},[r]);let b=nr(new Set);Ps(()=>{let v=b.current;return()=>{v.forEach(A=>n.release(A)),v.clear()}},[]);function h(v){if(k.isDataURI(v))return v;let A=n.get(v);return A?(b.current.has(A)||(b.current.add(A),n.hold(A)),A):v}return tr.createElement($t.Div,{"data-element-type":"puppet"},tr.createElement($t.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},l.map(([v,A])=>tr.createElement("div",{key:A,ref:v,className:e.config.className},tr.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function Ds({state:o,displayable:e}){return Di.createElement(Di.Fragment,null,e.map(t=>{if(t instanceof kn)return Di.createElement(ws,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof O)return Di.createElement(Tc,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Rt)return Di.createElement(Es,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import ir,{useEffect as Kd}from"react";import{motion as $d}from"motion/react";function Cc({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u,deps:p}=_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},[...p]),Kd(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),ir.createElement(ir.Fragment,null,ir.createElement($d.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([d,g])=>ir.createElement("div",{className:"relative w-full h-full",ref:d,key:g},t))))}async function xc(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 jd from"clsx";import{useEffect as Ls,useRef as qd}from"react";import Rs from"react";function Is({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=qd(null);return Ls(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),Ls(()=>n.events.depends([n.events.on(_e.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),Ls(()=>(n.events.emit(_e.EventTypes["event:scene.mount"]),o.events.emit(R.EventTypes["event:state.scene.mount"],n),o.logger.debug("Scene","Scene mounted",n.getId()),()=>{n.events.emit(_e.EventTypes["event:scene.unmount"]),o.events.emit(R.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),Ct(n,{setBackgroundMusic(s,a){return xc(o,n,s,a)}}),Rs.createElement("div",{className:jd(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])=>Rs.createElement(Cc,{state:o,layer:s,key:s.getId()},Rs.createElement(Ds,{state:o,displayable:a}))))}import{AnimatePresence as Qd}from"motion/react";import{useEffect as Jd,useReducer as Zd,useRef as or}from"react";import _d from"clsx";import Yt,{useCallback as Ms,useMemo as Yd,useRef as Xd}from"react";function Ns({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=N(),a=Xd([]),l=Ms(y=>(a.current.push(y),a.current.indexOf(y)),[]),c=Ms(y=>{let m=a.current.indexOf(y);m!==-1&&a.current.splice(m,1)},[]),u=Ms(y=>a.current.indexOf(y),[]),p=s.config.menu,d=Yd(()=>e.map(y=>({...y,words:y.prompt.evaluate(we.getCtx({gameState:n}))})),[e,n]);function g(y){t(y)}return Yt.createElement(Yt.Fragment,null,Yt.createElement(ns,{value:{evaluated:d,choose:g,gameState:n}},Yt.createElement(os,{value:{register:l,unregister:c,getIndex:u}},Yt.createElement(Kt,{className:"absolute"},r&&o&&Yt.createElement(Ti,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),Yt.createElement($t.Div,{color:"green",border:"dashed",className:_d("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},Yt.createElement(p,{items:d.map((y,m)=>m)})))))}function wc({items:o}){return Yt.createElement(wo,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>Yt.createElement(Fo,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import em from"clsx";import Li from"react";var kc=120;function Pc({sources:o,menuCount:e,presence:t,retained:n,lastActive:i,sceneId:r}){if(o.length===0){let l=n??(i.length>0?i.map(c=>({...c,active:!1})):null);return{items:l??[],retained:l,lastActive:i,retaining:l!==null,interactive:e>0}}let s=new Set(o.map(({slot:l})=>l));for(let[l,c]of Array.from(t.slotKeys))s.has(l)||(t.exitingKeys.add(c),t.slotKeys.delete(l));let a=o.map(({slot:l,...c})=>{let u=t.slotKeys.get(l);return(!u||t.exitingKeys.has(u))&&(u=`say-${r}-${t.nextKey++}`,t.slotKeys.set(l,u)),{...c,presenceKey:u,slot:l,active:!0}});return{items:a,retained:null,lastActive:a,retaining:!1,interactive:!0}}function Gs({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=or({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),a=or([]),l=or(null),c=or(null),[,u]=Zd(f=>f+1,0),p=()=>{c.current&&(clearTimeout(c.current),c.current=null)},d=()=>{let f=l.current;if(!f)return;let b=s.current;f.forEach(({slot:h,presenceKey:v})=>{b.slotKeys.get(h)===v&&b.slotKeys.delete(h),b.exitingKeys.add(v)}),l.current=null,c.current=null,a.current=[],u()};Jd(()=>()=>{p()},[]);let g=s.current,y=i.length>0?i.map(({action:f,onClick:b},h)=>({action:f,slot:h,useTypeEffect:!0,onFinished:()=>{b(),o.events.emit(R.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((f,b)=>{if(!f.action.prompt||!f.action.words)return[];let h=g.menuPromptIds.get(f);return h||(h=`menu-prompt-${n.getId()}-${g.nextKey++}`,g.menuPromptIds.set(f,h)),[{action:{sentence:f.action.prompt,words:f.action.words,character:null,id:h},slot:b,useTypeEffect:!1}]}),m=Pc({sources:y,menuCount:r.length,presence:g,retained:l.current,lastActive:a.current,sceneId:n.getId()});return l.current=m.retained,a.current=m.lastActive,m.retaining?c.current||(c.current=setTimeout(d,kc)):p(),Li.createElement("div",{className:em(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs",style:{pointerEvents:m.interactive?"auto":"none"}},Li.createElement(Qd,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{s.current.exitingKeys.clear()}},m.items.map(({action:f,onFinished:b,presenceKey:h,active:v,useTypeEffect:A})=>Li.createElement(Ti,{gameState:o,key:h,action:f,active:v,onFinished:b,useTypeEffect:A}))),r.map(({action:f,onClick:b},h)=>Li.createElement("div",{key:"menu-"+h,"data-element-type":"menu"},Li.createElement(Ns,{state:o,prompt:f.prompt,choices:f.choices,renderPrompt:!f.prompt,afterChoose:v=>{b(v),o.stage.next()},words:f.words}))))}import bn,{useEffect as tm,useRef as Fs}from"react";import{motion as nm}from"motion/react";function Ec({state:o,camera:e,children:t}){let n=Fs(null),i=Fs(null),r=Fs(null),{transformRef:s,transitionRefs:a,initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:p,stopLoop:d,updateStyleSync:g,deps:y}=_t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:Wa},{ref:i,project:Ua},{ref:r,project:Ba}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return Ct(e,{initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:p,stopLoop:d,updateStyleSync:g},[...y]),tm(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),bn.createElement(bn.Fragment,null,bn.createElement(nm.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,f])=>bn.createElement("div",{className:"relative w-full h-full",ref:m,key:f},t))),bn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},bn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),bn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),bn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import im from"react";import{useEffect as Os,useRef as om}from"react";import{useCallback as Dc}from"react";function Lc(o){let e=Dc(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=Dc(()=>{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 Hs({gameState:o,video:e}){let t=om(null),{show:n,hide:i}=Lc(t);Os(()=>o.events.depends([o.events.on(R.EventTypes["event:state.player.skip"],()=>{o.game.config.allowSkipVideo&&(r(),o.logger.log("NarraLeaf-React: Video","Skipped"))})]).cancel,[]),Os(()=>{i(),e.state.display&&n()},[]),Os(()=>{if(!t.current)return;let s=t.current,a=!1,l=new Set,c=()=>new E(`Failed to add event listener, ref is not available
|
|
66
|
-
at Video.tsx: useEffect`),u=g=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw c();n()},hide:()=>{if(!t.current)throw c();i()},play:()=>{if(!t.current)throw c();let y=t.current;return g||y.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(y.currentTime=0,new Promise(m=>{let f=!1,b=null,h=[],v=()=>{f||(f=!0,l.delete(v),b&&b(),h.forEach(A=>A()),m())};l.add(v),b=o.schedule(({retry:A})=>{if(f)return;if(y.readyState<3){let w=()=>{y.removeEventListener("loadeddata",w),A()};y.addEventListener("loadeddata",w),h.push(()=>y.removeEventListener("loadeddata",w));return}let x=()=>v(),P=()=>v(),T=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),v()};y.addEventListener("ended",x),y.addEventListener("stopped",P),y.addEventListener("error",T),h.push(()=>{y.removeEventListener("ended",x),y.removeEventListener("stopped",P),y.removeEventListener("error",T)}),y.play().catch(w=>{o.logger.error("Failed to play video: "+w),v()})},10)}))},pause:()=>{if(!t.current)throw c();t.current.pause()},resume:()=>{if(!t.current)throw c();return t.current.play().catch(y=>{o.logger.error("Failed to resume video: "+y)})},stop:()=>{if(!t.current)throw c();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:y=>{if(!t.current)throw c();t.current.currentTime=y}}))},p=()=>u(!1),d=()=>{o.logger.error("NarraLeaf-React: Video",`Failed to load video source: ${e.config.src}`+(s.error?` (media error code ${s.error.code})`:"")),u(!0)};return s.addEventListener("canplay",p),s.addEventListener("error",d),s.readyState>=3?u(!1):s.error&&d(),()=>{s.removeEventListener("canplay",p),s.removeEventListener("error",d),l.forEach(g=>g()),s.currentTime>0&&s.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]);function r(){t.current&&(t.current.pause(),t.current.currentTime=0,t.current.dispatchEvent(new Event("stopped")))}return im.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 rm,{useEffect as sm,useRef as am}from"react";var Rc={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 lm(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&Rc[e]?Rc[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Vs({gameState:o,vfx:e}){let t=am(null);return sm(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,l=new Set,c=new Set,u=[],p=A=>{n.style.transition="",n.style.opacity=String(A)},d=()=>{n.play().catch(A=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+A)})},g=()=>i||n.error?(o.logger.error("NarraLeaf-React: Vfx","Cannot wait for a vfx whose source failed to load: "+e.config.src),Promise.resolve()):n.readyState>=2?Promise.resolve():new Promise(A=>{let x=!1,P=()=>w(),T=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),w()},w=()=>{x||(x=!0,c.delete(w),n.removeEventListener("loadeddata",P),n.removeEventListener("error",T),A())};c.add(w),n.addEventListener("loadeddata",P),n.addEventListener("error",T),(n.readyState>=2||n.error)&&w()}),y=(A,x,P)=>{let T=x?.duration??0,w=++s;return P.instant||T<=0?(p(A),Promise.resolve()):new Promise(D=>{let z=!1,me=null,pe=()=>{z||(z=!0,c.delete(pe),me!==null&&clearTimeout(me),s===w&&t.current&&p(A),D())};c.add(pe),n.style.transition=`opacity ${T}ms ${lm(o,x?.easing)}`,n.offsetWidth,n.style.opacity=String(A),me=setTimeout(pe,T)})},m=A=>{r||(r=!0,i=A,o.mountState(e,{show:async x=>{a=!0;let P={instant:!1};l.add(P);try{if(await g(),!t.current)return;n.playbackRate=x?.rate??e.config.playbackRate,e.state.paused||d(),await y(x?.opacity??e.config.opacity,x,P)}finally{l.delete(P)}},hide:async x=>{a=!0;let P={instant:!1};l.add(P);try{await y(0,x,P),t.current&&n.pause()}finally{l.delete(P)}},pause:()=>{n.pause()},resume:()=>{d()},setRate:x=>{n.playbackRate=x}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&p(e.config.opacity)},0)))},f=()=>m(!1),b=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),m(!0)},h=o.events.on(R.EventTypes["event:state.player.skip"],()=>{l.size===0&&c.size===0||(l.forEach(A=>{A.instant=!0}),[...c].forEach(A=>A()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),v=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&d()};return document.addEventListener("visibilitychange",v),n.style.opacity="0",n.playbackRate=e.config.playbackRate,e.config.muted||o.logger.weakWarn("NarraLeaf-React: Vfx","Vfx is not muted; autoplay may be rejected by the browser. (src: "+e.config.src+")"),e.state.display&&!e.state.paused&&d(),n.addEventListener("canplay",f),n.addEventListener("error",b),n.readyState>=3?m(!1):n.error&&b(),()=>{n.removeEventListener("canplay",f),n.removeEventListener("error",b),document.removeEventListener("visibilitychange",v),h.cancel(),u.forEach(A=>A()),[...c].forEach(A=>A()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),rm.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 cm from"clsx";import um,{useCallback as pm,useEffect as rr,useRef as dm}from"react";function Us({children:o,className:e,gameState:t}){let{ratio:n}=ye(),i=N(),[r]=ae(),s=dm(null),a=i.config.minWidth,l=i.config.minHeight,c=pm(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 rr(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),rr(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),rr(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,l,a]),rr(()=>t.events.on(R.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),um.createElement(Zl,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:l,debounceMs:i.config.ratioUpdateInterval,className:cm(e),onUpdate:c},o)}import Ic,{useEffect as mm,useRef as fm,useState as Mc}from"react";function Bs({src:o,width:e,height:t}){let[n,i]=Mc({x:0,y:0}),[r,s]=Mc(!1),a=fm(null),{ratio:l}=ye();return mm(()=>{let c=u=>{if(a.current){let p=a.current.getBoundingClientRect(),d=u.clientX-p.left,g=u.clientY-p.top;i({x:d,y:g}),r||s(!0)}};return window.addEventListener("mousemove",c),()=>{window.removeEventListener("mousemove",c)}},[r]),Ic.createElement(Kt,{ref:a,className:"overflow-hidden absolute"},Ic.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 Nc from"react";import ln from"react";function Ws({error:o,errorInfo:e}){return N().config.app.debug?ln.createElement("div",{className:"text-left"},ln.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),ln.createElement("p",{className:"text-red-700"},"Message: ",o.message),ln.createElement("pre",null,"Error Stack: ",o?.stack),ln.createElement("pre",null,"Component Stack: ",e?.componentStack),ln.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):ln.createElement("div",{className:"bg-white w-full h-full"},ln.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),ln.createElement("p",null,"Please contact the game developer for further assistance."))}var sr=class extends Nc.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?Nc.createElement(Ws,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import Oc from"clsx";import U,{useEffect as xt,useReducer as Hc,useState as Qn}from"react";import{flushSync as Vc}from"react-dom";import{useRef as hm}from"react";import{useEffect as gm}from"react";function Gc({gameState:o}){let e=hm(null);return gm(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(R.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Ri,{useEffect as ym}from"react";function zs({gameState:o}){let[e]=ae(),{ratio:t}=ye(),n=o.notificationMgr;ym(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Ri.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"},Ri.createElement(i,{notifications:n.toArray()}))}function Fc({notifications:o}){return Ri.createElement(Ho,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Ri.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Ri.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Uc({story:o=mi.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:l,onError:c,children:u,active:p=!0}){let[d,g]=Hc(F=>F+1,0),[y,m]=Hc(F=>F+1,0),[f,b]=Qn(0),h=N(),[v]=Qn(()=>new R(h,{update:g,forceUpdate:()=>{v.logger.weakWarn("Player","force update"),Vc(()=>{g()})},forceRemount:()=>{v.logger.weakWarn("Player","force remount"),Vc(()=>{b(F=>F+1),g()})},next:I})),A=U.createRef(),x=U.createRef(),[P,T]=Qn(!1),w=U.useRef(!1),D=U.useRef(null),z=U.useRef(null),{preloaded:me,cacheManager:pe}=jt(),[De,bt]=Qn(!1),Ft=U.useRef(!1),[Pt,Tt]=Qn(!1),Ue=U.useRef(!1),dt=U.useRef(null),ee=U.useRef(!1),[mt]=Qn(new Map);function Qe(F){return{game:h,gameState:v,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable(),scene:F}}function I(){let F=()=>{mt.forEach(G=>G.cancel())};if(v.rollLock.isLocked())return;F();let L=!1,te=0;for(;!L;){if(te++>h.config.maxStackModelLoop)throw new E("Max stack model loop reached");let G=h.getLiveGame().next();if(!G){if(h.getLiveGame().stackModel&&!h.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(G)){if(D.current===G)break;D.current=G,G.onSettled(()=>{G.isFailed()||(D.current===G&&(D.current=null),I())}),G.onFailed(he=>{D.current===G&&(D.current=null),v.logger.error("Player",he)}),L=!0;break}if(G instanceof Mn){if(z.current===G)break;z.current=G,G.nextUnlock().then(()=>{z.current===G&&(z.current=null),I()}),L=!0;break}if(Ye.isCalledActionResult(G)&&G.wait&&Ye.isStackModelsAwaiting(G.wait.type,G.wait.stackModels)){if(D.current===G)break;if(D.current=G,G.wait){let he=Ye.executeStackModelGroup(G.wait.type,G.wait.stackModels);he.then(()=>{D.current===G&&(D.current=null),I()}),he.onFailed(Ge=>{D.current===G&&(D.current=null),v.logger.error("Player",Ge)})}L=!0;break}v.handle(G)}v.stage.update()}xt(()=>{v.audioManager.initialize()},[]),xt(()=>(v.setImageCache(pe),()=>{v.setImageCache(null)}),[pe]),xt(()=>(h.getLiveGame().setGameState(v),o&&!h.getLiveGame().isPlaying()&&h.getLiveGame().loadStory(o),o?.entryScene&&!v.getPreloadingScene()&&!v.getLastScene()&&v.preloadScene(o.entryScene),v.playerCurrent=A.current,v.mainContentNode=x.current,()=>{h.getLiveGame().setGameState(void 0),v.playerCurrent=null}),[h,o]),xt(()=>at(()=>{T(!0);let F=v.getLastScene(),L=[];F?L.push(F.events.once("event:scene.mount",()=>{v.stage.next()}).cancel):v.stage.next();let te=v.events.on(R.EventTypes["event:state.end"],()=>{l&&l({game:h,gameState:v,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable()})});return v.stage.update(),()=>{F&&L.forEach(G=>G()),te.cancel()}}),[]),xt(()=>at(()=>{P&&i&&!w.current&&(w.current=!0,v.stage.forceUpdate(),h.hooks.trigger("init",[]),i({game:h,gameState:v,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable()}))}),[P]),xt(()=>at(()=>{if(De&&s&&!Ft.current){Ft.current=!0;let F=dt.current||v.getLastScene()||v.getPreloadingScene(),L=Qe(F);s(L)}}),[De]),xt(()=>at(()=>{if(Pt&&!Ue.current){Ue.current=!0;let F=dt.current||v.getLastScene()||v.getPreloadingScene(),L=Qe(F);h.markPreloadComplete(L)&&r&&r(L)}}),[Pt]),xt(()=>v.events.on(R.EventTypes["event:state.scene.mount"],F=>{dt.current||(dt.current=F,m())}).cancel,[]),xt(()=>{if(!Pt||!p||ee.current||h.isFirstSceneReady())return;let F=dt.current||v.getLastScene();if(!F)return;let L=null,te=null,G=!1;ee.current=!0;let he=()=>{G=!0,ee.current=!1;let Ge=Qe(F);h.markFirstSceneReady(Ge)&&a&&a(Ge)};return typeof requestAnimationFrame=="function"?L=requestAnimationFrame(()=>{te=setTimeout(he,0)}):te=setTimeout(he,0),()=>{G||(ee.current=!1,L!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(L),te!==null&&clearTimeout(te))}},[p,y,d,Pt]),xt(()=>me.events.depends([me.events.on(ot.EventTypes["event:preloaded.ready"],()=>{bt(!0),v.stage.update(),o&&h.getLiveGame().isPlaying()&&I()}),me.events.on(ot.EventTypes["event:preloaded.complete"],()=>{Tt(!0)})]).cancel,[]),xt(()=>{v.flushDep=d},[d]);let X=e||h.config.width,le=t||h.config.height;return U.createElement(sr,{onError:c},U.createElement("div",{style:{width:typeof X=="number"?`${X}px`:X,height:typeof le=="number"?`${le}px`:le},className:Oc(n,"__narraleaf_content-player"),ref:A,tabIndex:0},U.createElement(Us,{className:Oc("flex-grow overflow-auto"),gameState:v},U.createElement(Ss,{gameState:v}),U.createElement(Gc,{gameState:v}),U.createElement(Kt,{className:"absolute",ref:x,style:{cursor:v.game.config.cursor?"none":"auto",overflow:v.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},h.config.cursor&&U.createElement(Bs,{src:h.config.cursor,width:h.config.cursorWidth,height:h.config.cursorHeight}),U.createElement(vm,{show:De&&p,key:f},U.createElement(fs,null,U.createElement(rc,{state:v}),U.createElement(uc,{state:v}),U.createElement(Sm,{state:v},U.createElement("div",{className:"w-full h-full absolute",style:{isolation:"isolate"},"data-element-type":"scene-group"},v.getSceneElements().map(F=>U.createElement(Is,{key:"scene-"+F.scene.getId(),state:v,elements:F}))),U.createElement(bm,{state:v}),v.getVideos().map((F,L)=>U.createElement("div",{className:"w-full h-full absolute",key:"video-"+L,"data-element-type":"video"},U.createElement(Hs,{gameState:v,video:F}))),v.getVfx().map(F=>U.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+F.getId(),"data-element-type":"vfx",style:{zIndex:F.config.zIndex,mixBlendMode:F.config.blendMode}},U.createElement(Vs,{gameState:v,vfx:F})))),v.getSceneElements().map(F=>U.createElement(Gs,{key:"scene-dialogs-"+F.scene.getId(),state:v,elements:F})),U.createElement(Tm,{NvlComponent:h.config.nvlDialog}))),U.createElement(fc,{state:v}),U.createElement(ql,null,u),U.createElement(zs,{gameState:v})))))}function vm({children:o,show:e}){return U.createElement(U.Fragment,null,e?o:null)}function Sm({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?U.createElement(Ec,{state:o,camera:t},e):U.createElement(U.Fragment,null,e)}function bm({state:o}){let e=U.useRef(null);return xt(()=>(o.stageTransition.registerOverlayHost(e.current),()=>{o.stageTransition.registerOverlayHost(null)}),[]),U.createElement("div",{className:"w-full h-full absolute pointer-events-none",ref:e,"data-element-type":"stage-transition-overlay-host"})}function Tm({NvlComponent:o}){let{dialogs:e,state:t}=qt(),i=N().getLiveGame().getGameState(),r=U.useMemo(()=>e.map((s,a)=>{let l=s.sentence.evaluate(we.getCtx({gameState:i})),c=t.activeDialogId===s.id,u=c&&t.phase==="typing";return{entry:s,index:a,isActive:c,gameState:i,words:l,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return U.createElement(o,{dialogs:r})}import"client-only";import Jn from"react";function Bc({children:o,game:e}){return Jn.createElement(Jn.Fragment,null,Jn.createElement(il,null,Jn.createElement(Ja,{game:e},Jn.createElement(Bl,null,Jn.createElement(nl,null,o)))))}var Am=(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))(Am||{});import Cm from"clsx";import wt,{useEffect as zc,useRef as xm,useState as wm}from"react";function Wc(o){return o?{className:"",ariaHidden:!1}:{className:"opacity-0",ariaHidden:!0}}import{motion as km,useIsPresent as Pm}from"motion/react";var Em={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function Dm({children:o,initial:e,transition:t,...n}){let i=N(),r=Mt(),{ratio:s}=ye(),[a]=vn(q.Preferences.showDialog),l=xm(null),[c]=En("nextAction"),u=Pm(),[p,d]=wm(null),g=Wc(a);function y(){a&&(r.config.gameState.isAdvanceSuspended()||r.requestComplete())}return zc(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
|
|
67
|
-
at Say.tsx: onElementClick`);return}let m=b=>{b.repeat||r.config.gameState.isAdvanceSuspended()||i.keyMap.match("nextAction",b.key)&&r.requestComplete()};window.addEventListener("keydown",m);let f=r.events.on(Ne.Events.simulateClick,()=>{l.current&&l.current.click()});return()=>{window.removeEventListener("keydown",m),f.cancel()}},[r,c]),zc(()=>{let m=i.preference.onPreferenceChange(q.Preferences.autoForward,f=>{f&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{m.cancel()}},[r]),wt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},wt.createElement("div",{className:Cm("absolute bottom-0 w-full h-full",g.className),"aria-hidden":g.ariaHidden,onClick:y,style:{...Fn(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},wt.createElement(vs,{value:p},wt.createElement(km.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:d})))}function Kc({children:o,...e}){let t=Mt();return!t.config.action.sentence||!t.config.action.words?null:wt.createElement(Dm,{...e},o)}var Ad=Kc;function $c(){return wt.createElement(Kc,null,wt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},wt.createElement(ss,null),wt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},wt.createElement(an,null),wt.createElement(Sn,{...Em}))))}var Ii={say:$c,menu:wc,notification:Fc,nvlDialog:ys};var ar=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 Mi=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 jc=(e=>(e.game="game",e))(jc||{}),Xe=class Xe{constructor(e){this.hooks=new ji;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new Si(Xe.DefaultPreference);this.audioBuses=new li(()=>this.config.audioBuses??[],Ea(this.preference));this.keyMap=new Mi({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new Q;this.puppetBackends=new er;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=j(Xe.DefaultConfig,e),this.plugins=new ar(this),this.router=new yn(this)}configure(e){let[t,n]=ga(e,this.freezeFields);return n.length>0&&console.warn(`NarraLeaf-React [Game] The following fields are not allowed to be configured: ${n.join(", ")}`),this.config=j(this.config,t),Object.prototype.hasOwnProperty.call(t,"audioBuses")&&this.audioBuses.invalidate(),this.getLiveGame().getGameState()?.events.emit(R.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}registerPuppetBackend(e){return this.puppetBackends.register(e),this}getPuppetBackend(e){return this.puppetBackends.get(e)}listPuppetBackends(){return this.puppetBackends.list()}getPuppetBackendRegistry(){return this.puppetBackends}onPreloadComplete(e){return this.lifecycleEvents.on(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 Wt(this)}};Xe.defaultSettings={volume:1},Xe.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,textRevealDuration:0,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:0,skipInterval:100},Xe.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",textRevealDuration:"textRevealDuration",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},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,preloadGate:"firstFrame",preloadAllImages:!0,forceClearCache:!1,maxPreloadActions:10,imageCacheBudgetBytes:256*1024*1024,decodedImageBudgetBytes:128*1024*1024,cursor:null,cursorHeight:30,cursorWidth:30,showOverflow:!1,maxRouterHistory:10,screenshotQuality:1,useAspectScale:!0,autoForwardDelay:3*1e3,autoForwardDefaultPause:1e3,allowSkipImageTransform:!0,allowSkipImageTransition:!0,allowSkipBackgroundTransform:!0,allowSkipSceneTransition:!0,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:Ii.notification,menu:Ii.menu,dialog:Ii.say,nvlDialog:Ii.nvlDialog,onError:e=>{console.error(e)},disableTextScaling:!1,stage:null,maxStackModelLoop:1e3,maxActionHistory:100,maxSceneCallDepth:8,audioBuses:[],audioStreaming:"loops"},Xe.GameSettingsNamespace=jc,Xe.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var q=Xe;var lr=class lr extends _{constructor(){super(...arguments);this._jumpTarget=null}setJumpTarget(t){return this._jumpTarget=t,this}getJumpTarget(){return this._jumpTarget}static executeActionsAsync(t,n){let i=t.game.getLiveGame().requestAsyncStackModel([{type:n.type,node:n.contentNode}]);return t.game.getLiveGame().executeAsyncStackModel(i)}checkActionChain(t){if(t.some(n=>!!n.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return t}executeAction(t,n){let i=this.contentNode,[r]=i.getContent();if(this.type===re.do)return r.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:r[0].contentNode}];if(this.type===re.doAsync){if(r.length===0)return super.executeAction(t,n);let s=lr.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===re.any){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:s}}}else if(this.type===re.all){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:s}}}else if(this.type===re.allAsync){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().requestAsyncStackModel([{type:a.type,node:a.contentNode}]));return t.timelines.attachTimeline(S.all(...s.map(a=>t.game.getLiveGame().executeAsyncStackModel(a)))),super.executeAction(t,n)}else if(this.type===re.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let l=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:[l]}}}else if(this.type===re.while){let[s,a]=this.contentNode.getContent();if(s.length===0)return super.executeAction(t,n);if(!a.evaluate({gameState:t}).value)return super.executeAction(t,n);let l=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:[l]}}}else if(this.type===re.break){if(!n.stackModel.isLoop())throw new Error("Control.breakLoop() can only be used inside a loop (repeat/while)");return n.stackModel.breakLoop(),{type:this.type,node:null}}else if(this.type===re.sleep){let[,s]=this.contentNode.getContent();if(t.isFastForwarding())return{type:this.type,node:this.contentNode.getChild()};let a;typeof s=="number"?a=S.delay(s):S.isAwaitable(s)?a=s:a=S.fromPromise(s);let l=new S,c=new ke(a);return t.timelines.attachTimeline(c),a.then(()=>{l.resolve({type:this.type,node:this.contentNode.getChild()})}),l.onSkipControllerRegister(u=>{u.onAbort(()=>{c.abort()})}),l}else if(this.type===re.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,l=new ke(a);t.timelines.attachTimeline(l);let c=t.game.preference,u=c.getPreference(q.Preferences.autoForward),p=c.getPreference(q.Preferences.gameSpeed),d=u?t.game.config.autoForwardDelay/p:null,g=!1,y=null,m=null,f=null,b=()=>{m?.cancel(),f?.cancel(),y&&(clearTimeout(y),y=null)},h=()=>{g||(g=!0,b(),a.resolve())};return m=t.events.on(R.EventTypes["event:state.player.stageClick"],h),f=t.events.on(R.EventTypes["event:state.player.skip"],h),d!==null&&(y=setTimeout(h,d)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(v=>{v.onAbort(()=>{g||(g=!0,b(),l.abort())})}),s}else{if(this.type===re.label)return super.executeAction(t,n);if(this.type===re.jump){let s=this._jumpTarget;if(!s){let[c]=this.contentNode.getContent();throw new Ce(`Jump target label "${c}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),l=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},c=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(c,u)},[l]),a.getStackModelForce().clearAboveCallFrame().push({type:this.type,node:s.contentNode}),null}}throw new Error("Unknown control action type: "+this.type)}getFutureActions(t,n){if(this.callee.config.allowFutureScene===!1&&n.allowFutureScene===!1)return[...super.getFutureActions(t,n)];if(this.type===re.break||this.type===re.waitForClick||this.type===re.label||this.type===re.jump)return super.getFutureActions(t,n);let i=this.contentNode.getContent()[0],r=super.getFutureActions(t,n);return[...i??[],...r]}stringify(t,n,i){if(this.type===re.break)return super.stringifyWithContent("Control","break");if(this.type===re.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===re.label||this.type===re.jump){let[a]=this.contentNode.getContent(),l=this.type===re.label?"label":"jump";return super.stringifyWithContent("Control",`${l}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};lr.ActionTypes=re;var se=lr;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(se.ActionTypes.do,t)}doAsync(t){return this.push(se.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(se.ActionTypes.any,t)}all(t){return this.pushUnchained(se.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(se.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(se.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=Y.from(t);return this.pushWithLambda(se.ActionTypes.while,n,i)}breakLoop(){let t=new se(this.chain(),se.ActionTypes.break,new C().setContent([]));return this.chain(t)}sleep(t){return this.push(se.ActionTypes.sleep,[],t)}waitForClick(){let t=new se(this.chain(),se.ActionTypes.waitForClick,new C().setContent([]));return this.chain(t)}label(t){let n=new se(this.chain(),se.ActionTypes.label,new C().setContent([t]));return this.chain(n)}jump(t){let n=new se(this.chain(),se.ActionTypes.jump,new C().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new C().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new C().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new C().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?on.say(n).getActions():ze.toActions([n]))}};var $=class $ extends $e{static get DefaultUserConfig(){return $._defaultUserConfig??($._defaultUserConfig=new K({name:"(anonymous)",autoInit:!0,src:$.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...ie.DefaultTransformState.getDefaultConfig()},{position:e=>H.tryParsePosition(e)}))}static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return k.isStaticImageData(t)?k.srcToURL(t):k.isColor(t)?t:k.isImageSrc(t)?k.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&&!k.isImageSrc(e)&&!k.isColor(e)}static isLayeredDefinition(e){return this.isSrcDefinitionObject(e)&&"layers"in e}static isTagDefinition(e){return this.isSrcDefinitionObject(e)&&"resolve"in e}static isLayerVariants(e){return typeof e=="object"&&e!==null}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(k.isImageSrc(t)||k.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:$.isLayeredSrc(e)?null:$.isTagSrc(e)&&e.config.src.resolve?$.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):$.isStaticSrc(e)?k.isStaticImageData(e.state.currentSrc)?k.srcToURL(e.state.currentSrc):k.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static getSrcURLs(e,t){let n=e.config.src?.slots;if(!n)return[];let i=new Set(t??e.state.currentSrc);return n.map(r=>$.resolveLayerSlot(r,i))}static resolveLayerSlot(e,t){if(e===null||typeof e=="string")return e;if(typeof e=="function")return e(t);for(let[n,i]of Object.entries(e))if(t.has(n))return i;return null}static getAllLayerSrc(e){let t=e.config.src?.slots;if(!t)return[];let n=[];for(let i of t)if(typeof i=="string")n.push(i);else if($.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new $({src:e})}constructor(e={}){super();let t=$.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new Fe,n=>{if(k.isImageSrc(e)||k.isColor(e)){if(k.isColor(e)&&!this.config.isBackground)throw new Error("Color src is not allowed for non-background image");return n.chain(this._setSrc(n,e,t))}else{let i=new Se(n,Se.ActionTypes.setAppearance,new C().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Fe,i=>i.chain(this._setDarkness(i,e,t,n)))}addWearable(e){let t=Array.isArray(e)?e:[e];for(let n of t){if(n===this)throw new J("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:$.StateSerializer.serialize(this.state),transformState:ie.TransformStateSerializer.serialize(this.transformState.get()),loop:this._serializeLoop()}}fromData(e){return this.state=$.StateSerializer.deserialize(e.state),this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_applyTransition(e,t){return new Te(this.chain(),de.applyTransition,new C().setContent([e,t]))}_init(e,t){return new Te(this.chain(),de.init,new C().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new Se(this.chain(),Se.ActionTypes.initWearable,new C().setContent([e]))}_flush(){return new Se(this.chain(),Se.ActionTypes.flush,new C)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get()),this}resolveTags(e,t){if(!$.isTagSrc(this))throw new Error(`Tag not defined
|
|
68
|
-
Tag must be defined in the image config`);let n=this.constructTagMap(this.config.src.groups),i=new Map,r=[];this.config.src.groups.forEach(a=>{i.set(a,null)});let s=a=>{a.forEach(l=>{let c=n.get(l);c&&i.set(c,l)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let l=i.get(a);if(!l)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(l)}),r}_setAppearanceSync(e){if(
|
|
65
|
+
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:p,transitionTask:d,initDisplayable:h,applyTransition:f,applyTransform:m,applyLoop:g,stopLoop:b,updateStyleSync:y,flush:v,deps:A}=_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(z=>z&&typeof z=="function"?{style:Hd}:{style:Fd(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):O.DefaultImagePlaceholder},{style:{willChange:"filter",position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none",filter:"brightness(1)"}}]},propOverwrite:T=>T.src?{...T,src:c(T.src)}:T});Ct(o,{createWearable:T=>{i(w=>[...w,T])},disposeWearable:T=>{i(w=>w.filter(D=>D.getId()!==T.getId()))},initDisplayable:h,applyTransform:m,applyLoop:g,stopLoop:b,applyTransition:f,events:t,updateStyleSync:y,flush:v},[...A]);let x=yc((T,w)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${T}px`,height:`${w}px`}))},[t]),k=yc(()=>{t.emit("event:image.onLoad")},[t]);return Gt.createElement(Nd.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},Gt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},l?p.map(([T,w],D)=>{let z=d?d.task.resolve[D]:null;if(z&&typeof z=="function")return Gt.createElement(Zo,{key:w,ref:T,autoFit:o.config.autoFit});let me=z?z.key==="target"?d.transition._getTargetLayers():d.transition._getPrevLayers():l;return Gt.createElement(bc,{key:w,ref:T,src:me||l,autoFit:o.config.autoFit,resolveSrc:c,onSizeChanged:D===0?x:void 0,onLoad:D===0?k:void 0})}):p.map(([T,w],D)=>Gt.createElement(Zo,{key:w,ref:T,autoFit:o.config.autoFit,onSizeChanged:D===0?x:void 0,onLoad:D===0?k:void 0})),Gt.createElement("div",{className:Sc("w-full h-full top-0 left-0 absolute")},n.map(T=>Gt.createElement("div",{className:Sc("w-full h-full relative"),key:"wearable-"+T.getId()},Gt.createElement(Tc,{image:T,state:e}))))))}var Tc=Gt.memo(Vd),Ac=Tc;import nr,{useEffect as Es,useMemo as Kd,useRef as ir}from"react";var Ud=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,Bd=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function Cc(o,e){if(typeof e!="string"||!e.length)return o;if(Ud.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=Wd(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+zd(r+e.replace(/\\/g,"/"))}function Wd(o){let e=Bd.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function zd(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 tr=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 Ds({state:o,puppet:e}){let[t]=le(),{cacheManager:n}=jt(),i=ir(null),r=Kd(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=ir(r);s.current=r;let{transformRef:a,transitionRefs:l,initDisplayable:c,applyTransform:u,applyLoop:p,stopLoop:d,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:p,stopLoop:d,applyTransition:h,updateStyleSync:f,flush:t},[...m]),Es(()=>{let v=i.current;if(!v)return;let A=o.game,x=e.config.backend,k=A.getPuppetBackend(x);if(!k)return e._setStatus("missing-backend"),A.getPuppetBackendRegistry().reportMissing(x,D=>{o.logger.warn("Puppet",D)}),()=>{e._setStatus("unmounted")};let T;try{T=k.mount(v,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:y,resolveSibling:D=>y(Cc(e.config.src,D)),warn:(D,z)=>{o.logger.warn("Puppet",D,z)}})}catch(D){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${x}" threw while mounting "${e.config.src}"`,D),()=>{e._setStatus("unmounted")}}let w=!1;return e._attachInstance(T),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!w&&typeof T.ready=="function"?T.ready():void 0).then(()=>{w||e._setStatus("ready")}).catch(D=>{w||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${x}" failed to load "${e.config.src}"`,D))}),()=>{w=!0,e._attachInstance(null),e._setStatus("unmounted");try{T.dispose()}catch(D){o.logger.error("Puppet",`Backend "${x}" threw while disposing`,D)}}},[]);let g=ir(r);Es(()=>{let v=g.current;if(v.width===r.width&&v.height===r.height)return;g.current=r;let A=e._getInstance();if(!(!A||typeof A.resize!="function"))try{A.resize(r)}catch(x){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,x)}},[r]);let b=ir(new Set);Es(()=>{let v=b.current;return()=>{v.forEach(A=>n.release(A)),v.clear()}},[]);function y(v){if(P.isDataURI(v))return v;let A=n.get(v);return A?(b.current.has(A)||(b.current.add(A),n.hold(A)),A):v}return nr.createElement($t.Div,{"data-element-type":"puppet"},nr.createElement($t.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},l.map(([v,A])=>nr.createElement("div",{key:A,ref:v,className:e.config.className},nr.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function Ls({state:o,displayable:e}){return Di.createElement(Di.Fragment,null,e.map(t=>{if(t instanceof kn)return Di.createElement(ks,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof O)return Di.createElement(Ac,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Rt)return Di.createElement(Ds,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import or,{useEffect as $d}from"react";import{motion as jd}from"motion/react";function xc({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:l,stopLoop:c,updateStyleSync:u,deps:p}=_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},[...p]),$d(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),or.createElement(or.Fragment,null,or.createElement(jd.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([d,h])=>or.createElement("div",{className:"relative w-full h-full",ref:d,key:h},t))))}async function wc(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 qd from"clsx";import{useEffect as Rs,useRef as _d}from"react";import Is from"react";function Ms({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=_d(null);return Rs(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),Rs(()=>n.events.depends([n.events.on(_e.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),Rs(()=>(n.events.emit(_e.EventTypes["event:scene.mount"]),o.events.emit(R.EventTypes["event:state.scene.mount"],n),o.logger.debug("Scene","Scene mounted",n.getId()),()=>{n.events.emit(_e.EventTypes["event:scene.unmount"]),o.events.emit(R.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),Ct(n,{setBackgroundMusic(s,a){return wc(o,n,s,a)}}),Is.createElement("div",{className:qd(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])=>Is.createElement(xc,{state:o,layer:s,key:s.getId()},Is.createElement(Ls,{state:o,displayable:a}))))}import{AnimatePresence as Jd}from"motion/react";import{useEffect as Zd,useReducer as em,useRef as rr}from"react";import Qd from"clsx";import Qt,{useCallback as Ns,useMemo as Yd,useRef as Xd}from"react";function Gs({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=N(),a=Xd([]),l=Ns(f=>(a.current.push(f),a.current.indexOf(f)),[]),c=Ns(f=>{let m=a.current.indexOf(f);m!==-1&&a.current.splice(m,1)},[]),u=Ns(f=>a.current.indexOf(f),[]),p=s.config.menu,d=Yd(()=>e.map(f=>({...f,words:f.prompt.evaluate(we.getCtx({gameState:n}))})),[e,n]);function h(f){t(f)}return Qt.createElement(Qt.Fragment,null,Qt.createElement(is,{value:{evaluated:d,choose:h,gameState:n}},Qt.createElement(rs,{value:{register:l,unregister:c,getIndex:u}},Qt.createElement(Kt,{className:"absolute"},r&&o&&Qt.createElement(Ti,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),Qt.createElement($t.Div,{color:"green",border:"dashed",className:Qd("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},Qt.createElement(p,{items:d.map((f,m)=>m)})))))}function kc({items:o}){return Qt.createElement(ko,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>Qt.createElement(Oo,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import tm from"clsx";import Li from"react";var Pc=120;function Ec({sources:o,menuCount:e,presence:t,retained:n,lastActive:i,sceneId:r}){if(o.length===0){let l=n??(i.length>0?i.map(c=>({...c,active:!1})):null);return{items:l??[],retained:l,lastActive:i,retaining:l!==null,interactive:e>0}}let s=new Set(o.map(({slot:l})=>l));for(let[l,c]of Array.from(t.slotKeys))s.has(l)||(t.exitingKeys.add(c),t.slotKeys.delete(l));let a=o.map(({slot:l,...c})=>{let u=t.slotKeys.get(l);return(!u||t.exitingKeys.has(u))&&(u=`say-${r}-${t.nextKey++}`,t.slotKeys.set(l,u)),{...c,presenceKey:u,slot:l,active:!0}});return{items:a,retained:null,lastActive:a,retaining:!1,interactive:!0}}function Fs({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=rr({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),a=rr([]),l=rr(null),c=rr(null),[,u]=em(g=>g+1,0),p=()=>{c.current&&(clearTimeout(c.current),c.current=null)},d=()=>{let g=l.current;if(!g)return;let b=s.current;g.forEach(({slot:y,presenceKey:v})=>{b.slotKeys.get(y)===v&&b.slotKeys.delete(y),b.exitingKeys.add(v)}),l.current=null,c.current=null,a.current=[],u()};Zd(()=>()=>{p()},[]);let h=s.current,f=i.length>0?i.map(({action:g,onClick:b},y)=>({action:g,slot:y,useTypeEffect:!0,onFinished:()=>{b(),o.events.emit(R.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((g,b)=>{if(!g.action.prompt||!g.action.words)return[];let y=h.menuPromptIds.get(g);return y||(y=`menu-prompt-${n.getId()}-${h.nextKey++}`,h.menuPromptIds.set(g,y)),[{action:{sentence:g.action.prompt,words:g.action.words,character:null,id:y},slot:b,useTypeEffect:!1}]}),m=Ec({sources:f,menuCount:r.length,presence:h,retained:l.current,lastActive:a.current,sceneId:n.getId()});return l.current=m.retained,a.current=m.lastActive,m.retaining?c.current||(c.current=setTimeout(d,Pc)):p(),Li.createElement("div",{className:tm(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs",style:{pointerEvents:m.interactive?"auto":"none"}},Li.createElement(Jd,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{s.current.exitingKeys.clear()}},m.items.map(({action:g,onFinished:b,presenceKey:y,active:v,useTypeEffect:A})=>Li.createElement(Ti,{gameState:o,key:y,action:g,active:v,onFinished:b,useTypeEffect:A}))),r.map(({action:g,onClick:b},y)=>Li.createElement("div",{key:"menu-"+y,"data-element-type":"menu"},Li.createElement(Gs,{state:o,prompt:g.prompt,choices:g.choices,renderPrompt:!g.prompt,afterChoose:v=>{b(v),o.stage.next()},words:g.words}))))}import bn,{useEffect as nm,useRef as Os}from"react";import{motion as im}from"motion/react";function Dc({state:o,camera:e,children:t}){let n=Os(null),i=Os(null),r=Os(null),{transformRef:s,transitionRefs:a,initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:p,stopLoop:d,updateStyleSync:h,deps:f}=_t({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:za},{ref:i,project:Ba},{ref:r,project:Wa}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return Ct(e,{initDisplayable:l,applyTransition:c,applyTransform:u,applyLoop:p,stopLoop:d,updateStyleSync:h},[...f]),nm(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),bn.createElement(bn.Fragment,null,bn.createElement(im.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,g])=>bn.createElement("div",{className:"relative w-full h-full",ref:m,key:g},t))),bn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},bn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),bn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),bn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import om from"react";import{useEffect as Hs,useRef as rm}from"react";import{useCallback as Lc}from"react";function Rc(o){let e=Lc(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=Lc(()=>{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 Vs({gameState:o,video:e}){let t=rm(null),{show:n,hide:i}=Rc(t);Hs(()=>o.events.depends([o.events.on(R.EventTypes["event:state.player.skip"],()=>{o.game.config.allowSkipVideo&&(r(),o.logger.log("NarraLeaf-React: Video","Skipped"))})]).cancel,[]),Hs(()=>{i(),e.state.display&&n()},[]),Hs(()=>{if(!t.current)return;let s=t.current,a=!1,l=new Set,c=()=>new E(`Failed to add event listener, ref is not available
|
|
66
|
+
at Video.tsx: useEffect`),u=h=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw c();n()},hide:()=>{if(!t.current)throw c();i()},play:()=>{if(!t.current)throw c();let 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 g=!1,b=null,y=[],v=()=>{g||(g=!0,l.delete(v),b&&b(),y.forEach(A=>A()),m())};l.add(v),b=o.schedule(({retry:A})=>{if(g)return;if(f.readyState<3){let w=()=>{f.removeEventListener("loadeddata",w),A()};f.addEventListener("loadeddata",w),y.push(()=>f.removeEventListener("loadeddata",w));return}let x=()=>v(),k=()=>v(),T=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),v()};f.addEventListener("ended",x),f.addEventListener("stopped",k),f.addEventListener("error",T),y.push(()=>{f.removeEventListener("ended",x),f.removeEventListener("stopped",k),f.removeEventListener("error",T)}),f.play().catch(w=>{o.logger.error("Failed to play video: "+w),v()})},10)}))},pause:()=>{if(!t.current)throw c();t.current.pause()},resume:()=>{if(!t.current)throw c();return t.current.play().catch(f=>{o.logger.error("Failed to resume video: "+f)})},stop:()=>{if(!t.current)throw c();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:f=>{if(!t.current)throw c();t.current.currentTime=f}}))},p=()=>u(!1),d=()=>{o.logger.error("NarraLeaf-React: Video",`Failed to load video source: ${e.config.src}`+(s.error?` (media error code ${s.error.code})`:"")),u(!0)};return s.addEventListener("canplay",p),s.addEventListener("error",d),s.readyState>=3?u(!1):s.error&&d(),()=>{s.removeEventListener("canplay",p),s.removeEventListener("error",d),l.forEach(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 om.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 sm,{useEffect as am,useRef as lm}from"react";var Ic={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 cm(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&Ic[e]?Ic[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Us({gameState:o,vfx:e}){let t=lm(null);return am(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,l=new Set,c=new Set,u=[],p=A=>{n.style.transition="",n.style.opacity=String(A)},d=()=>{n.play().catch(A=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+A)})},h=()=>i||n.error?(o.logger.error("NarraLeaf-React: Vfx","Cannot wait for a vfx whose source failed to load: "+e.config.src),Promise.resolve()):n.readyState>=2?Promise.resolve():new Promise(A=>{let x=!1,k=()=>w(),T=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),w()},w=()=>{x||(x=!0,c.delete(w),n.removeEventListener("loadeddata",k),n.removeEventListener("error",T),A())};c.add(w),n.addEventListener("loadeddata",k),n.addEventListener("error",T),(n.readyState>=2||n.error)&&w()}),f=(A,x,k)=>{let T=x?.duration??0,w=++s;return k.instant||T<=0?(p(A),Promise.resolve()):new Promise(D=>{let z=!1,me=null,pe=()=>{z||(z=!0,c.delete(pe),me!==null&&clearTimeout(me),s===w&&t.current&&p(A),D())};c.add(pe),n.style.transition=`opacity ${T}ms ${cm(o,x?.easing)}`,n.offsetWidth,n.style.opacity=String(A),me=setTimeout(pe,T)})},m=A=>{r||(r=!0,i=A,o.mountState(e,{show:async x=>{a=!0;let k={instant:!1};l.add(k);try{if(await h(),!t.current)return;n.playbackRate=x?.rate??e.config.playbackRate,e.state.paused||d(),await f(x?.opacity??e.config.opacity,x,k)}finally{l.delete(k)}},hide:async x=>{a=!0;let k={instant:!1};l.add(k);try{await f(0,x,k),t.current&&n.pause()}finally{l.delete(k)}},pause:()=>{n.pause()},resume:()=>{d()},setRate:x=>{n.playbackRate=x}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&p(e.config.opacity)},0)))},g=()=>m(!1),b=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),m(!0)},y=o.events.on(R.EventTypes["event:state.player.skip"],()=>{l.size===0&&c.size===0||(l.forEach(A=>{A.instant=!0}),[...c].forEach(A=>A()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),v=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&d()};return document.addEventListener("visibilitychange",v),n.style.opacity="0",n.playbackRate=e.config.playbackRate,e.config.muted||o.logger.weakWarn("NarraLeaf-React: Vfx","Vfx is not muted; autoplay may be rejected by the browser. (src: "+e.config.src+")"),e.state.display&&!e.state.paused&&d(),n.addEventListener("canplay",g),n.addEventListener("error",b),n.readyState>=3?m(!1):n.error&&b(),()=>{n.removeEventListener("canplay",g),n.removeEventListener("error",b),document.removeEventListener("visibilitychange",v),y.cancel(),u.forEach(A=>A()),[...c].forEach(A=>A()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),sm.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 um from"clsx";import pm,{useCallback as dm,useEffect as sr,useRef as mm}from"react";function Bs({children:o,className:e,gameState:t}){let{ratio:n}=ye(),i=N(),[r]=le(),s=mm(null),a=i.config.minWidth,l=i.config.minHeight,c=dm(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 sr(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),sr(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),sr(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,l,a]),sr(()=>t.events.on(R.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),pm.createElement(ec,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:l,debounceMs:i.config.ratioUpdateInterval,className:um(e),onUpdate:c},o)}import Mc,{useEffect as fm,useRef as hm,useState as Nc}from"react";function Ws({src:o,width:e,height:t}){let[n,i]=Nc({x:0,y:0}),[r,s]=Nc(!1),a=hm(null),{ratio:l}=ye();return fm(()=>{let c=u=>{if(a.current){let p=a.current.getBoundingClientRect(),d=u.clientX-p.left,h=u.clientY-p.top;i({x:d,y:h}),r||s(!0)}};return window.addEventListener("mousemove",c),()=>{window.removeEventListener("mousemove",c)}},[r]),Mc.createElement(Kt,{ref:a,className:"overflow-hidden absolute"},Mc.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 Gc from"react";import ln from"react";function zs({error:o,errorInfo:e}){return N().config.app.debug?ln.createElement("div",{className:"text-left"},ln.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),ln.createElement("p",{className:"text-red-700"},"Message: ",o.message),ln.createElement("pre",null,"Error Stack: ",o?.stack),ln.createElement("pre",null,"Component Stack: ",e?.componentStack),ln.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):ln.createElement("div",{className:"bg-white w-full h-full"},ln.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),ln.createElement("p",null,"Please contact the game developer for further assistance."))}var ar=class extends Gc.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?Gc.createElement(zs,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import Hc from"clsx";import U,{useEffect as xt,useReducer as Vc,useState as Xn}from"react";import{flushSync as Uc}from"react-dom";import{useRef as gm}from"react";import{useEffect as ym}from"react";function Fc({gameState:o}){let e=gm(null);return ym(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(R.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Ri,{useEffect as vm}from"react";function Ks({gameState:o}){let[e]=le(),{ratio:t}=ye(),n=o.notificationMgr;vm(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Ri.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"},Ri.createElement(i,{notifications:n.toArray()}))}function Oc({notifications:o}){return Ri.createElement(Vo,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Ri.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Ri.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Bc({story:o=mi.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:l,onError:c,children:u,active:p=!0}){let[d,h]=Vc(G=>G+1,0),[f,m]=Vc(G=>G+1,0),[g,b]=Xn(0),y=N(),[v]=Xn(()=>new R(y,{update:h,forceUpdate:()=>{v.logger.weakWarn("Player","force update"),Uc(()=>{h()})},forceRemount:()=>{v.logger.weakWarn("Player","force remount"),Uc(()=>{b(G=>G+1),h()})},next:I})),A=U.createRef(),x=U.createRef(),[k,T]=Xn(!1),w=U.useRef(!1),D=U.useRef(null),z=U.useRef(null),{preloaded:me,cacheManager:pe}=jt(),[De,bt]=Xn(!1),Ft=U.useRef(!1),[Pt,Tt]=Xn(!1),Ue=U.useRef(!1),pt=U.useRef(null),ee=U.useRef(!1),[dt]=Xn(new Map);function Xe(G){return{game:y,gameState:v,liveGame:y.getLiveGame(),storable:y.getLiveGame().getStorable(),scene:G}}function I(){let G=()=>{dt.forEach(F=>F.cancel())};if(v.rollLock.isLocked())return;G();let L=!1,te=0;for(;!L;){if(te++>y.config.maxStackModelLoop)throw new E("Max stack model loop reached");let F=y.getLiveGame().next();if(!F){if(y.getLiveGame().stackModel&&!y.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(F)){if(D.current===F)break;D.current=F,F.onSettled(()=>{F.isFailed()||(D.current===F&&(D.current=null),I())}),F.onFailed(he=>{D.current===F&&(D.current=null),v.logger.error("Player",he)}),L=!0;break}if(F instanceof Mn){if(z.current===F)break;z.current=F,F.nextUnlock().then(()=>{z.current===F&&(z.current=null),I()}),L=!0;break}if(Qe.isCalledActionResult(F)&&F.wait&&Qe.isStackModelsAwaiting(F.wait.type,F.wait.stackModels)){if(D.current===F)break;if(D.current=F,F.wait){let he=Qe.executeStackModelGroup(F.wait.type,F.wait.stackModels);he.then(()=>{D.current===F&&(D.current=null),I()}),he.onFailed(Ge=>{D.current===F&&(D.current=null),v.logger.error("Player",Ge)})}L=!0;break}v.handle(F)}v.stage.update()}xt(()=>{v.audioManager.initialize()},[]),xt(()=>(v.setImageCache(pe),()=>{v.setImageCache(null)}),[pe]),xt(()=>(y.getLiveGame().setGameState(v),o&&!y.getLiveGame().isPlaying()&&y.getLiveGame().loadStory(o),o?.entryScene&&!v.getPreloadingScene()&&!v.getLastScene()&&v.preloadScene(o.entryScene),v.playerCurrent=A.current,v.mainContentNode=x.current,()=>{y.getLiveGame().setGameState(void 0),v.playerCurrent=null}),[y,o]),xt(()=>st(()=>{T(!0);let G=v.getLastScene(),L=[];G?L.push(G.events.once("event:scene.mount",()=>{v.stage.next()}).cancel):v.stage.next();let te=v.events.on(R.EventTypes["event:state.end"],()=>{l&&l({game:y,gameState:v,liveGame:y.getLiveGame(),storable:y.getLiveGame().getStorable()})});return v.stage.update(),()=>{G&&L.forEach(F=>F()),te.cancel()}}),[]),xt(()=>st(()=>{k&&i&&!w.current&&(w.current=!0,v.stage.forceUpdate(),y.hooks.trigger("init",[]),i({game:y,gameState:v,liveGame:y.getLiveGame(),storable:y.getLiveGame().getStorable()}))}),[k]),xt(()=>st(()=>{if(De&&s&&!Ft.current){Ft.current=!0;let G=pt.current||v.getLastScene()||v.getPreloadingScene(),L=Xe(G);s(L)}}),[De]),xt(()=>st(()=>{if(Pt&&!Ue.current){Ue.current=!0;let G=pt.current||v.getLastScene()||v.getPreloadingScene(),L=Xe(G);y.markPreloadComplete(L)&&r&&r(L)}}),[Pt]),xt(()=>v.events.on(R.EventTypes["event:state.scene.mount"],G=>{pt.current||(pt.current=G,m())}).cancel,[]),xt(()=>{if(!Pt||!p||ee.current||y.isFirstSceneReady())return;let G=pt.current||v.getLastScene();if(!G)return;let L=null,te=null,F=!1;ee.current=!0;let he=()=>{F=!0,ee.current=!1;let Ge=Xe(G);y.markFirstSceneReady(Ge)&&a&&a(Ge)};return typeof requestAnimationFrame=="function"?L=requestAnimationFrame(()=>{te=setTimeout(he,0)}):te=setTimeout(he,0),()=>{F||(ee.current=!1,L!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(L),te!==null&&clearTimeout(te))}},[p,f,d,Pt]),xt(()=>me.events.depends([me.events.on(ot.EventTypes["event:preloaded.ready"],()=>{bt(!0),v.stage.update(),o&&y.getLiveGame().isPlaying()&&I()}),me.events.on(ot.EventTypes["event:preloaded.complete"],()=>{Tt(!0)})]).cancel,[]),xt(()=>{v.flushDep=d},[d]);let Y=e||y.config.width,ce=t||y.config.height;return U.createElement(ar,{onError:c},U.createElement("div",{style:{width:typeof Y=="number"?`${Y}px`:Y,height:typeof ce=="number"?`${ce}px`:ce},className:Hc(n,"__narraleaf_content-player"),ref:A,tabIndex:0},U.createElement(Bs,{className:Hc("flex-grow overflow-auto"),gameState:v},U.createElement(bs,{gameState:v}),U.createElement(Fc,{gameState:v}),U.createElement(Kt,{className:"absolute",ref:x,style:{cursor:v.game.config.cursor?"none":"auto",overflow:v.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},y.config.cursor&&U.createElement(Ws,{src:y.config.cursor,width:y.config.cursorWidth,height:y.config.cursorHeight}),U.createElement(Sm,{show:De&&p,key:g},U.createElement(hs,null,U.createElement(sc,{state:v}),U.createElement(pc,{state:v}),U.createElement(bm,{state:v},U.createElement("div",{className:"w-full h-full absolute",style:{isolation:"isolate"},"data-element-type":"scene-group"},v.getSceneElements().map(G=>U.createElement(Ms,{key:"scene-"+G.scene.getId(),state:v,elements:G}))),U.createElement(Tm,{state:v}),v.getVideos().map(G=>U.createElement("div",{className:"w-full h-full absolute",key:"video-"+G.getId(),"data-element-type":"video"},U.createElement(Vs,{gameState:v,video:G}))),v.getVfx().map(G=>U.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+G.getId(),"data-element-type":"vfx",style:{zIndex:G.config.zIndex,mixBlendMode:G.config.blendMode}},U.createElement(Us,{gameState:v,vfx:G})))),v.getSceneElements().map(G=>U.createElement(Fs,{key:"scene-dialogs-"+G.scene.getId(),state:v,elements:G})),U.createElement(Am,{NvlComponent:y.config.nvlDialog}))),U.createElement(hc,{state:v}),U.createElement(_l,null,u),U.createElement(Ks,{gameState:v})))))}function Sm({children:o,show:e}){return U.createElement(U.Fragment,null,e?o:null)}function bm({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?U.createElement(Dc,{state:o,camera:t},e):U.createElement(U.Fragment,null,e)}function Tm({state:o}){let e=U.useRef(null);return xt(()=>(o.stageTransition.registerOverlayHost(e.current),()=>{o.stageTransition.registerOverlayHost(null)}),[]),U.createElement("div",{className:"w-full h-full absolute pointer-events-none",ref:e,"data-element-type":"stage-transition-overlay-host"})}function Am({NvlComponent:o}){let{dialogs:e,state:t}=qt(),i=N().getLiveGame().getGameState(),r=U.useMemo(()=>e.map((s,a)=>{let l=s.sentence.evaluate(we.getCtx({gameState:i})),c=t.activeDialogId===s.id,u=c&&t.phase==="typing";return{entry:s,index:a,isActive:c,gameState:i,words:l,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return U.createElement(o,{dialogs:r})}import"client-only";import Jn from"react";function Wc({children:o,game:e}){return Jn.createElement(Jn.Fragment,null,Jn.createElement(ol,null,Jn.createElement(Za,{game:e},Jn.createElement(Wl,null,Jn.createElement(il,null,o)))))}var Cm=(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))(Cm||{});import xm from"clsx";import wt,{useEffect as Kc,useRef as wm,useState as km}from"react";function zc(o){return o?{className:"",ariaHidden:!1}:{className:"opacity-0",ariaHidden:!0}}import{motion as Pm,useIsPresent as Em}from"motion/react";var Dm={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function Lm({children:o,initial:e,transition:t,...n}){let i=N(),r=Mt(),{ratio:s}=ye(),[a]=vn(q.Preferences.showDialog),l=wm(null),[c]=En("nextAction"),u=Em(),[p,d]=km(null),h=zc(a);function f(){a&&(r.config.gameState.isAdvanceSuspended()||r.requestComplete())}return Kc(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
|
|
67
|
+
at Say.tsx: onElementClick`);return}let m=b=>{b.repeat||r.config.gameState.isAdvanceSuspended()||i.keyMap.match("nextAction",b.key)&&r.requestComplete()};window.addEventListener("keydown",m);let g=r.events.on(Ne.Events.simulateClick,()=>{l.current&&l.current.click()});return()=>{window.removeEventListener("keydown",m),g.cancel()}},[r,c]),Kc(()=>{let m=i.preference.onPreferenceChange(q.Preferences.autoForward,g=>{g&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{m.cancel()}},[r]),wt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},wt.createElement("div",{className:xm("absolute bottom-0 w-full h-full",h.className),"aria-hidden":h.ariaHidden,onClick:f,style:{...Fn(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},wt.createElement(Ss,{value:p},wt.createElement(Pm.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:d})))}function $c({children:o,...e}){let t=Mt();return!t.config.action.sentence||!t.config.action.words?null:wt.createElement(Lm,{...e},o)}var Cd=$c;function jc(){return wt.createElement($c,null,wt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},wt.createElement(as,null),wt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},wt.createElement(an,null),wt.createElement(Sn,{...Dm}))))}var Ii={say:jc,menu:kc,notification:Oc,nvlDialog:vs};var lr=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 Mi=class{constructor(e={}){this.keyMap=e;this.events=new X}setKeyBinding(e,t){this.keyMap[e]=t,this.events.emit("event:keyMap.change",e,t)}getKeyBinding(e){return this.keyMap[e]??null}addKeyBinding(e,t){if(t===null)return;let n=this.getKeyBinding(e)??[],i=r=>Array.isArray(r)?r:[r];Array.isArray(n)?this.setKeyBinding(e,[...n,...i(t)]):this.setKeyBinding(e,[n,...i(t)])}getKeyBindings(){return this.keyMap}onKeyBindingChange(e,t){return this.events.on("event:keyMap.change",(n,i)=>{n===e&&t(i)})}importKeyBindings(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setKeyBinding(t,e[t])}exportKeyBindings(){return this.keyMap}match(e,t){let n=this.getKeyBinding(e);return n===null?!1:Array.isArray(n)?n.includes(t)||n.some(i=>i.toLowerCase()===t.toLowerCase()):n===t||n.toLowerCase()===t.toLowerCase()}};var qc=(e=>(e.game="game",e))(qc||{}),Ye=class Ye{constructor(e){this.hooks=new ji;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new Si(Ye.DefaultPreference);this.audioBuses=new li(()=>this.config.audioBuses??[],Da(this.preference));this.keyMap=new Mi({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new X;this.puppetBackends=new tr;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=j(Ye.DefaultConfig,e),this.plugins=new lr(this),this.router=new yn(this)}configure(e){let[t,n]=ya(e,this.freezeFields);return n.length>0&&console.warn(`NarraLeaf-React [Game] The following fields are not allowed to be configured: ${n.join(", ")}`),this.config=j(this.config,t),Object.prototype.hasOwnProperty.call(t,"audioBuses")&&this.audioBuses.invalidate(),this.getLiveGame().getGameState()?.events.emit(R.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}registerPuppetBackend(e){return this.puppetBackends.register(e),this}getPuppetBackend(e){return this.puppetBackends.get(e)}listPuppetBackends(){return this.puppetBackends.list()}getPuppetBackendRegistry(){return this.puppetBackends}onPreloadComplete(e){return this.lifecycleEvents.on(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 Wt(this)}};Ye.defaultSettings={volume:1},Ye.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,textRevealDuration:0,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:0,skipInterval:100},Ye.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",textRevealDuration:"textRevealDuration",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},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,preloadGate:"firstFrame",preloadAllImages:!0,forceClearCache:!1,maxPreloadActions:10,imageCacheBudgetBytes:256*1024*1024,decodedImageBudgetBytes:128*1024*1024,cursor:null,cursorHeight:30,cursorWidth:30,showOverflow:!1,maxRouterHistory:10,screenshotQuality:1,useAspectScale:!0,autoForwardDelay:3*1e3,autoForwardDefaultPause:1e3,allowSkipImageTransform:!0,allowSkipImageTransition:!0,allowSkipBackgroundTransform:!0,allowSkipSceneTransition:!0,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:Ii.notification,menu:Ii.menu,dialog:Ii.say,nvlDialog:Ii.nvlDialog,onError:e=>{console.error(e)},disableTextScaling:!1,stage:null,maxStackModelLoop:1e3,maxActionHistory:100,maxSceneCallDepth:8,audioBuses:[],audioStreaming:"loops"},Ye.GameSettingsNamespace=qc,Ye.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var q=Ye;var cr=class cr extends _{constructor(){super(...arguments);this._jumpTarget=null}setJumpTarget(t){return this._jumpTarget=t,this}getJumpTarget(){return this._jumpTarget}static executeActionsAsync(t,n){let i=t.game.getLiveGame().requestAsyncStackModel([{type:n.type,node:n.contentNode}]);return t.game.getLiveGame().executeAsyncStackModel(i)}checkActionChain(t){if(t.some(n=>!!n.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return t}executeAction(t,n){let i=this.contentNode,[r]=i.getContent();if(this.type===re.do)return r.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:r[0].contentNode}];if(this.type===re.doAsync){if(r.length===0)return super.executeAction(t,n);let s=cr.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===re.any){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:s}}}else if(this.type===re.all){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:s}}}else if(this.type===re.allAsync){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().requestAsyncStackModel([{type:a.type,node:a.contentNode}]));return t.timelines.attachTimeline(S.all(...s.map(a=>t.game.getLiveGame().executeAsyncStackModel(a)))),super.executeAction(t,n)}else if(this.type===re.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let l=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===re.while){let[s,a]=this.contentNode.getContent();if(s.length===0)return super.executeAction(t,n);if(!a.evaluate({gameState:t}).value)return super.executeAction(t,n);let l=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===re.break){if(!n.stackModel.isLoop())throw new Error("Control.breakLoop() can only be used inside a loop (repeat/while)");return n.stackModel.breakLoop(),{type:this.type,node:null}}else if(this.type===re.sleep){let[,s]=this.contentNode.getContent();if(t.isFastForwarding())return{type:this.type,node:this.contentNode.getChild()};let a;typeof s=="number"?a=S.delay(s):S.isAwaitable(s)?a=s:a=S.fromPromise(s);let l=new S,c=new ke(a);return t.timelines.attachTimeline(c),a.then(()=>{l.resolve({type:this.type,node:this.contentNode.getChild()})}),l.onSkipControllerRegister(u=>{u.onAbort(()=>{c.abort()})}),l}else if(this.type===re.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,l=new ke(a);t.timelines.attachTimeline(l);let c=t.game.preference,u=c.getPreference(q.Preferences.autoForward),p=c.getPreference(q.Preferences.gameSpeed),d=u?t.game.config.autoForwardDelay/p:null,h=!1,f=null,m=null,g=null,b=()=>{m?.cancel(),g?.cancel(),f&&(clearTimeout(f),f=null)},y=()=>{h||(h=!0,b(),a.resolve())};return m=t.events.on(R.EventTypes["event:state.player.stageClick"],y),g=t.events.on(R.EventTypes["event:state.player.skip"],y),d!==null&&(f=setTimeout(y,d)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(v=>{v.onAbort(()=>{h||(h=!0,b(),l.abort())})}),s}else{if(this.type===re.label)return super.executeAction(t,n);if(this.type===re.jump){let s=this._jumpTarget;if(!s){let[c]=this.contentNode.getContent();throw new Ce(`Jump target label "${c}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),l=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},c=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(c,u)},[l]),a.getStackModelForce().clearAboveCallFrame().push({type:this.type,node:s.contentNode}),null}}throw new Error("Unknown control action type: "+this.type)}getFutureActions(t,n){if(this.callee.config.allowFutureScene===!1&&n.allowFutureScene===!1)return[...super.getFutureActions(t,n)];if(this.type===re.break||this.type===re.waitForClick||this.type===re.label||this.type===re.jump)return super.getFutureActions(t,n);let i=this.contentNode.getContent()[0],r=super.getFutureActions(t,n);return[...i??[],...r]}stringify(t,n,i){if(this.type===re.break)return super.stringifyWithContent("Control","break");if(this.type===re.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===re.label||this.type===re.jump){let[a]=this.contentNode.getContent(),l=this.type===re.label?"label":"jump";return super.stringifyWithContent("Control",`${l}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};cr.ActionTypes=re;var se=cr;var Fe=class o extends ue{constructor(t={}){super();this.config=t}static do(t){return new o().do(t)}static doAsync(t){return new o().doAsync(t)}static any(t){return new o().any(t)}static all(t){return new o().all(t)}static allAsync(t){return new o().allAsync(t)}static repeat(t,n){return new o().repeat(t,n)}static whileLoop(t,n){return new o().whileLoop(t,n)}static breakLoop(){return new o().breakLoop()}static sleep(t){return new o().sleep(t)}static waitForClick(){return new o().waitForClick()}static label(t){return new o().label(t)}static jump(t){return new o().jump(t)}do(t){return this.push(se.ActionTypes.do,t)}doAsync(t){return this.push(se.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(se.ActionTypes.any,t)}all(t){return this.pushUnchained(se.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(se.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(se.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=Q.from(t);return this.pushWithLambda(se.ActionTypes.while,n,i)}breakLoop(){let t=new se(this.chain(),se.ActionTypes.break,new C().setContent([]));return this.chain(t)}sleep(t){return this.push(se.ActionTypes.sleep,[],t)}waitForClick(){let t=new se(this.chain(),se.ActionTypes.waitForClick,new C().setContent([]));return this.chain(t)}label(t){let n=new se(this.chain(),se.ActionTypes.label,new C().setContent([t]));return this.chain(n)}jump(t){let n=new se(this.chain(),se.ActionTypes.jump,new C().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new C().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new C().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new C().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?on.say(n).getActions():ze.toActions([n]))}};var $=class $ extends $e{static get DefaultUserConfig(){return $._defaultUserConfig??($._defaultUserConfig=new K({name:"(anonymous)",autoInit:!0,src:$.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...ie.DefaultTransformState.getDefaultConfig()},{position:e=>H.tryParsePosition(e)}))}static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return P.isStaticImageData(t)?P.srcToURL(t):P.isColor(t)?t:P.isImageSrc(t)?P.srcToURL(t):$.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isLayeredSrc(e){return!!e.config.src?.slots}static isSrcDefinitionObject(e){return typeof e=="object"&&e!==null&&!P.isImageSrc(e)&&!P.isColor(e)}static isLayeredDefinition(e){return this.isSrcDefinitionObject(e)&&"layers"in e}static isTagDefinition(e){return this.isSrcDefinitionObject(e)&&"resolve"in e}static isLayerVariants(e){return typeof e=="object"&&e!==null}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(P.isImageSrc(t)||P.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:$.isLayeredSrc(e)?null:$.isTagSrc(e)&&e.config.src.resolve?$.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):$.isStaticSrc(e)?P.isStaticImageData(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):P.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static getSrcURLs(e,t){let n=e.config.src?.slots;if(!n)return[];let i=new Set(t??e.state.currentSrc);return n.map(r=>$.resolveLayerSlot(r,i))}static resolveLayerSlot(e,t){if(e===null||typeof e=="string")return e;if(typeof e=="function")return e(t);for(let[n,i]of Object.entries(e))if(t.has(n))return i;return null}static getAllLayerSrc(e){let t=e.config.src?.slots;if(!t)return[];let n=[];for(let i of t)if(typeof i=="string")n.push(i);else if($.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new $({src:e})}constructor(e={}){super();let t=$.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new Fe,n=>{if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Error("Color src is not allowed for non-background image");return n.chain(this._setSrc(n,e,t))}else{let i=new Se(n,Se.ActionTypes.setAppearance,new C().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Fe,i=>i.chain(this._setDarkness(i,e,t,n)))}addWearable(e){let t=Array.isArray(e)?e:[e];for(let n of t){if(n===this)throw new J("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:$.StateSerializer.serialize(this.state),transformState:ie.TransformStateSerializer.serialize(this.transformState.get()),loop:this._serializeLoop()}}fromData(e){return this.state=$.StateSerializer.deserialize(e.state),this.transformState.resetTo(ie.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_applyTransition(e,t){return new Te(this.chain(),de.applyTransition,new C().setContent([e,t]))}_init(e,t){return new Te(this.chain(),de.init,new C().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new Se(this.chain(),Se.ActionTypes.initWearable,new C().setContent([e]))}_flush(){return new Se(this.chain(),Se.ActionTypes.flush,new C)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get()),this}resolveTags(e,t){if(!$.isTagSrc(this))throw new Error(`Tag not defined
|
|
68
|
+
Tag must be defined in the image config`);let n=this.constructTagMap(this.config.src.groups),i=new Map,r=[];this.config.src.groups.forEach(a=>{i.set(a,null)});let s=a=>{a.forEach(l=>{let c=n.get(l);c&&i.set(c,l)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let l=i.get(a);if(!l)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(l)}),r}_setAppearanceSync(e){if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new J("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!$.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new J(`Trying to mix src and tags
|
|
69
69
|
To better understand the behavior of the image, you cannot mix static src and tags in the same image. `)}_invalidSrcHandlerError(){throw new Error("Invalid src handler, If you are using tags, config.src must be a function that resolves the src from the tags. If you are using src, config.src must be a string or StaticImageData")}_invalidWearableError(e){throw new Error(`Invalid wearable
|
|
70
70
|
Wearable must be an Image with isWearable set to true
|
|
71
71
|
It seems like you are trying to add a non-wearable image to wearables
|
|
72
72
|
Image below violates the rule:
|
|
73
73
|
`+e)}_invalidTagGroupDefinitionError(e,t=!1){throw new Error("Invalid tag group definition. Tags in groups must be unique and not conflicting with each other."+(e?`
|
|
74
74
|
Tag "${e}" belongs to more than one group.`:"")+(t?`
|
|
75
|
-
Layers offering the same tag set share one group, so a shared tag means two layers offer different sets. Repeat the whole set on every layer that follows the group, using null where that layer draws nothing.`:""))}_setSrc(e,t,n){return n&&e.chain(this._applyTransition(n.copy(),i=>i._setPrevSrc(Se.resolveCurrentSrc(this))._setTargetSrc(t))),new Se(e,Se.ActionTypes.setSrc,new C().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?$.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc($.getSrcFromTags(e.defaults,e.resolve)):
|
|
75
|
+
Layers offering the same tag set share one group, so a shared tag means two layers offer different sets. Repeat the whole set on every layer that follows the group, using null where that layer draws nothing.`:""))}_setSrc(e,t,n){return n&&e.chain(this._applyTransition(n.copy(),i=>i._setPrevSrc(Se.resolveCurrentSrc(this))._setTargetSrc(t))),new Se(e,Se.ActionTypes.setSrc,new C().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?$.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc($.getSrcFromTags(e.defaults,e.resolve)):P.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(P.srcToURL(this.state.currentSrc)),this}static collectLayerGroups(e){let t=[],n=new Set;for(let i of e){if(!$.isLayerVariants(i))continue;let r=Object.keys(i),s=[...r].sort().join("\0");n.has(s)||(n.add(s),t.push(r))}return t}static normalizeSrcDefinition(e){return $.isLayeredDefinition(e)?{groups:$.collectLayerGroups(e.layers),defaults:[...e.defaults],resolve:null,slots:e.layers}:$.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return $.DefaultImageConfig.create({...t,src:$.normalizeSrcDefinition(t.src)})}getInitialState(){return $.DefaultImageState.create().assign({currentSrc:$.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(ie.DefaultTransformState.keys());return new ie(ie.DefaultTransformState.create(t.get()).get())}checkConfig(){for(let e of this.config.wearables)if(!e.config.isWearable)throw this._invalidWearableError(JSON.stringify(e.config));if($.isTagSrc(this)){let e=this.config.src,t=new Set;for(let r of e.groups)for(let s of r){if(t.has(s))throw this._invalidTagGroupDefinitionError(s,!!e.slots);t.add(s)}let n=this.constructTagMap(e.groups),i=new Set;for(let r of e.defaults){if(i.has(r))throw new Error(`Tag conflict
|
|
76
76
|
Tag "${r}" is conflicting with another tag
|
|
77
77
|
Error found in config.tag.defaults`);if(!n.has(r))throw new Error(`Tag not found
|
|
78
78
|
Tag "${r}" is not defined in tagDefinitions
|
|
79
79
|
Error found in config.tag.defaults`);n.get(r)?.forEach(s=>i.add(s))}if(e.slots){let r=new Set(e.defaults);for(let s of e.groups)if(!s.some(a=>r.has(a)))throw new J(`Layer has no default
|
|
80
|
-
The group with tags "${s.join(", ")}" needs exactly one of them listed in src.defaults`)}}return this}constructTagMap(e){let t=new Map;for(let n of e)for(let i of n)t.set(i,n);return t}_setDarkness(e,t,n,i){return new Se(e,Se.ActionTypes.setDarkness,new C().setContent([t,n,i]))}};$.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",$.StateSerializer=new qe,$._defaultUserConfig=null,$.DefaultImageConfig=new K({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),$.DefaultImageState=new K({currentSrc:$.DefaultImagePlaceholder,darkness:0});var O=$;var Ae=class extends Bt{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(k.isColor(t))return{src:O.DefaultImagePlaceholder,style:{backgroundColor:k.isRGBAColor(t)?k.RGBAColorToHex(t):t}};if(k.isImageSrc(t))return{src:k.srcToURL(t)};throw new J("Image transition src cannot be identified, using: "+t)}};import{anticipate as Lm,backIn as Rm,backInOut as Im,backOut as Mm,circIn as Nm,circInOut as Gm,circOut as Fm,cubicBezier as Om,easeIn as Hm,easeInOut as _c,easeOut as Vm}from"motion/react";var qc=1;function W(o){return o<0?0:o>1?1:o}function Yc(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function Ks(o){return{position:"absolute",top:"50%",left:"50%",width:`calc(100% + ${qc*2}px)`,height:`calc(100% + ${qc*2}px)`,transform:"translate(-50%, -50%)",backgroundColor:o}}function Xc(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 Qc(o){return o==="vertical"?"to right":"to bottom"}var Um={easeIn:Hm,easeOut:Vm,easeInOut:_c,circIn:Nm,circOut:Fm,circInOut:Gm,backIn:Rm,backOut:Mm,backInOut:Im,anticipate:Lm};function $s(o){return typeof o=="function"?o:Array.isArray(o)?Om(o[0],o[1],o[2],o[3]):o==="linear"?e=>e:Um[o??"easeInOut"]??_c}function cr(o){let e=$s(o.easing),t=(1-Ni(o))/2,n=1-t;return i=>i<=t?t<=0?1:e(W(i/t)):i>=n?n>=1?1:e(W((1-i)/(1-n))):1}function Ni(o){return o.holdMs!==void 0?o.duration<=0?o.holdMs>0?1:0:W(o.holdMs/o.duration):W(o.hold??0)}var Gi=class o extends Ae{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.holdMs=e.holdMs,this.easing=e.easing}createTask(){let e=Ni({duration:this.duration,holdMs:this.holdMs}),t=$s(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 Fi=class Fi extends _{static resolveTagSrc(e,t){if(!O.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return O.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(O.isLayeredSrc(e))throw e._mixedSrcError();if(O.isStaticSrc(e))return k.isImageSrc(e.state.currentSrc)?k.srcToURL(e.state.currentSrc):e.state.currentSrc;if(O.isTagSrc(e)&&e.config.src.resolve)return O.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===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(k.isColor(n)&&!this.callee.config.isBackground)throw new J("Color src is not allowed for non-background image");let i=this.callee.state.currentSrc;return this.callee.state.currentSrc=n,e.logger.debug("Image Set Src",n),e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.currentSrc=r},[i]),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else{if(this.type===ft.flush)return super.executeAction(e,t);if(this.type===ft.setAppearance){let[n,i]=this.contentNode.getContent();if(!O.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],l=()=>{this.callee.state.currentSrc=a};if(O.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let p=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevLayers(O.getSrcURLs(this.callee))._setTargetLayers(O.getSrcURLs(this.callee,s));let g=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),y=e.timelines.attachTimeline(p).attachChild(g);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:y},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.flush(),super.executeAction(e,t)}let c=this.callee.config.src.resolve;if(!c)throw this.callee._invalidSrcHandlerError();let u=O.getSrcFromTags(s,c);if(e.logger.debug("Image - Set Appearance",s,u),i){let p=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevSrc(Fi.resolveCurrentSrc(this.callee))._setTargetSrc(u);let g=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),y=e.timelines.attachTimeline(p).attachChild(g);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:y},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===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(g=>g),u=new Gi({from:s,to:n,duration:i,easing:r});if(O.isLayeredSrc(this.callee)){let g=O.getSrcURLs(this.callee);u._setPrevLayers(g)._setTargetLayers(g)}else{let g=Fi.resolveCurrentSrc(this.callee);u._setPrevSrc(g)._setTargetSrc(g)}let p=l.applyTransition(u,()=>{this.callee.state.darkness=n,c.resolve(super.executeAction(e,t))}),d=e.timelines.attachTimeline(c).attachChild(p);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:d},()=>{c.isSettled()||c.abort(),p.abort(),a()}),c}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),l.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};Fi.ActionTypes=ft;var Se=Fi;var js=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)}},kt=class kt{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)||kt.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return kt.isHexString(e)||kt.isNamedColor(e)||kt.isRGBAColor(e)}static isNamedColor(e){return ma(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(kt.isHexString(e))return e;if(kt.isNamedColor(e))return e;if(kt.isRGBAColor(e))return kt.RGBAColorToHex(e);throw new Error("Unknown color type")}static isHexString(e){return typeof e!="string"?!1:/^#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})$/i.test(e)}static toBackgroundSrc(e){return typeof e=="string"?e:e.src}static isDataURI(e){return e.startsWith("data:")}static isInlineSrc(e){return kt.isDataURI(e)||e.startsWith("blob:")}static offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,l=this.calc(i,s),c=this.calc(r,a),u=n.invertX?{right:l}:{left:l},p=n.invertY?{bottom:c}:{top:c};return{left:"auto",right:"auto",top:"auto",bottom:"auto",...u,...p}}static calc(e,t){let n=typeof e=="string"?e:`${e}px`;if(t===void 0)return`calc(${n} + 0px)`;let i=typeof t=="string"?"+":t<0?"-":"+",r=typeof t=="string"?t:`${Math.abs(t)}px`;return`calc(${n} ${i} ${r})`}static formatLength(e){return typeof e=="number"?`${e}px`:e}static toPixel(e){return typeof e=="number"?e:parseFloat(e)}};kt.RGBColor=js;var k=kt,qs=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 qs{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},yo=class{constructor(e){this.scene=e}run(e){let t=new Map,n=new Map,i=[],r=new Set,s=this.scene.getAllChildren(e,this.scene.getSceneRoot());if(!s.length)return null;for(i.push(s[0]);i.length;){let a=i.shift();this.checkAction(e,a,{imageStates:t,scenes:n},r);let l=a.contentNode.getChild();l&&l.action&&i.push(l.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof Se)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof ne){let s=t.callee;if(i.has(s.config.name)){if(i.get(s.config.name)!==s){let a=`Scene with name: ${s.config.name} is duplicated
|
|
80
|
+
The group with tags "${s.join(", ")}" needs exactly one of them listed in src.defaults`)}}return this}constructTagMap(e){let t=new Map;for(let n of e)for(let i of n)t.set(i,n);return t}_setDarkness(e,t,n,i){return new Se(e,Se.ActionTypes.setDarkness,new C().setContent([t,n,i]))}};$.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",$.StateSerializer=new qe,$._defaultUserConfig=null,$.DefaultImageConfig=new K({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),$.DefaultImageState=new K({currentSrc:$.DefaultImagePlaceholder,darkness:0});var O=$;var Ae=class extends Bt{constructor(){super(...arguments);this._detached=!1}_setDetached(t){return this._detached=t,this}_isDetached(){return this._detached}_setPrevLayers(t){return this._prevLayers=t,this}_setTargetLayers(t){return this._targetLayers=t,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(t){return this._prevSrc=t,this}_setTargetSrc(t){return this._targetSrc=t,this}_setCurrentSrc(t){return this._currentSrc=t,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),n}asPrev(t){return super.asPrev((...n)=>j(t(...n),this._srcToProps(this._prevSrc)))}asTarget(t){return super.asTarget((...n)=>j(t(...n),this._srcToProps(this._targetSrc)))}_srcToProps(t){if(this._isLayered()||this._detached)return{};if(P.isColor(t))return{src:O.DefaultImagePlaceholder,style:{backgroundColor:P.isRGBAColor(t)?P.RGBAColorToHex(t):t}};if(P.isImageSrc(t))return{src:P.srcToURL(t)};throw new J("Image transition src cannot be identified, using: "+t)}};import{anticipate as Rm,backIn as Im,backInOut as Mm,backOut as Nm,circIn as Gm,circInOut as Fm,circOut as Om,cubicBezier as Hm,easeIn as Vm,easeInOut as Qc,easeOut as Um}from"motion/react";var _c=1;function W(o){return o<0?0:o>1?1:o}function Yc(o,e="100% 100%",t="no-repeat"){return{maskImage:o,WebkitMaskImage:o,maskSize:e,WebkitMaskSize:e,maskRepeat:t,WebkitMaskRepeat:t}}function $s(o){return{position:"absolute",top:"50%",left:"50%",width:`calc(100% + ${_c*2}px)`,height:`calc(100% + ${_c*2}px)`,transform:"translate(-50%, -50%)",backgroundColor:o}}function Xc(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 Jc(o){return o==="vertical"?"to right":"to bottom"}var Bm={easeIn:Vm,easeOut:Um,easeInOut:Qc,circIn:Gm,circOut:Om,circInOut:Fm,backIn:Im,backOut:Nm,backInOut:Mm,anticipate:Rm};function js(o){return typeof o=="function"?o:Array.isArray(o)?Hm(o[0],o[1],o[2],o[3]):o==="linear"?e=>e:Bm[o??"easeInOut"]??Qc}function ur(o){let e=js(o.easing),t=(1-Ni(o))/2,n=1-t;return i=>i<=t?t<=0?1:e(W(i/t)):i>=n?n>=1?1:e(W((1-i)/(1-n))):1}function Ni(o){return o.holdMs!==void 0?o.duration<=0?o.holdMs>0?1:0:W(o.holdMs/o.duration):W(o.hold??0)}var Gi=class o extends Ae{constructor(e){super(),this.from=e.from,this.to=e.to,this.duration=e.duration,this.holdMs=e.holdMs,this.easing=e.easing}createTask(){let e=Ni({duration:this.duration,holdMs:this.holdMs}),t=js(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 Fi=class Fi extends _{static resolveTagSrc(e,t){if(!O.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return O.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(O.isLayeredSrc(e))throw e._mixedSrcError();if(O.isStaticSrc(e))return P.isImageSrc(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):e.state.currentSrc;if(O.isTagSrc(e)&&e.config.src.resolve)return O.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===mt.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new S(s=>s);return i.createWearable(n),e.getExposedStateAsync(n,s=>{s.initDisplayable(()=>{r.resolve(super.executeAction(e,t))})}),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{i.disposeWearable(s)},[n]),r}else if(this.type===mt.setSrc){let n=this.contentNode.getContent()[0];if(P.isColor(n)&&!this.callee.config.isBackground)throw new J("Color src is not allowed for non-background image");let i=this.callee.state.currentSrc;return this.callee.state.currentSrc=n,e.logger.debug("Image Set Src",n),e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.currentSrc=r},[i]),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else{if(this.type===mt.flush)return super.executeAction(e,t);if(this.type===mt.setAppearance){let[n,i]=this.contentNode.getContent();if(!O.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],l=()=>{this.callee.state.currentSrc=a};if(O.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let p=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevLayers(O.getSrcURLs(this.callee))._setTargetLayers(O.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(p).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.flush(),super.executeAction(e,t)}let c=this.callee.config.src.resolve;if(!c)throw this.callee._invalidSrcHandlerError();let u=O.getSrcFromTags(s,c);if(e.logger.debug("Image - Set Appearance",s,u),i){let p=new S(m=>m).registerSkipController(new V(()=>super.executeAction(e,t)));i._setPrevSrc(Fi.resolveCurrentSrc(this.callee))._setTargetSrc(u);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(p).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===mt.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},l=e.getExposedStateForce(this.callee);if(i){let c=new S(h=>h),u=new Gi({from:s,to:n,duration:i,easing:r});if(O.isLayeredSrc(this.callee)){let h=O.getSrcURLs(this.callee);u._setPrevLayers(h)._setTargetLayers(h)}else{let h=Fi.resolveCurrentSrc(this.callee);u._setPrevSrc(h)._setTargetSrc(h)}let p=l.applyTransition(u,()=>{this.callee.state.darkness=n,c.resolve(super.executeAction(e,t))}),d=e.timelines.attachTimeline(c).attachChild(p);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:d},()=>{c.isSettled()||c.abort(),p.abort(),a()}),c}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),l.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};Fi.ActionTypes=mt;var Se=Fi;var qs=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)}},kt=class kt{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)||kt.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return kt.isHexString(e)||kt.isNamedColor(e)||kt.isRGBAColor(e)}static isNamedColor(e){return fa(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(kt.isHexString(e))return e;if(kt.isNamedColor(e))return e;if(kt.isRGBAColor(e))return kt.RGBAColorToHex(e);throw new Error("Unknown color type")}static isHexString(e){return typeof e!="string"?!1:/^#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})$/i.test(e)}static toBackgroundSrc(e){return typeof e=="string"?e:e.src}static isDataURI(e){return e.startsWith("data:")}static isInlineSrc(e){return kt.isDataURI(e)||e.startsWith("blob:")}static offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,l=this.calc(i,s),c=this.calc(r,a),u=n.invertX?{right:l}:{left:l},p=n.invertY?{bottom:c}:{top:c};return{left:"auto",right:"auto",top:"auto",bottom:"auto",...u,...p}}static calc(e,t){let n=typeof e=="string"?e:`${e}px`;if(t===void 0)return`calc(${n} + 0px)`;let i=typeof t=="string"?"+":t<0?"-":"+",r=typeof t=="string"?t:`${Math.abs(t)}px`;return`calc(${n} ${i} ${r})`}static formatLength(e){return typeof e=="number"?`${e}px`:e}static toPixel(e){return typeof e=="number"?e:parseFloat(e)}};kt.RGBColor=qs;var P=kt,_s=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},Oe=class o extends _s{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},vo=class{constructor(e){this.scene=e}run(e){let t=new Map,n=new Map,i=[],r=new Set,s=this.scene.getAllChildren(e,this.scene.getSceneRoot());if(!s.length)return null;for(i.push(s[0]);i.length;){let a=i.shift();this.checkAction(e,a,{imageStates:t,scenes:n},r);let l=a.contentNode.getChild();l&&l.action&&i.push(l.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof Se)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof ne){let s=t.callee;if(i.has(s.config.name)){if(i.get(s.config.name)!==s){let a=`Scene with name: ${s.config.name} is duplicated
|
|
81
81
|
Scene: ${s.config.name}
|
|
82
82
|
|
|
83
|
-
At: ${t.__stack}`;throw new Oe(a)}}else i.set(s.config.name,s);if(t.type===B.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===
|
|
83
|
+
At: ${t.__stack}`;throw new Oe(a)}}else i.set(s.config.name,s);if(t.type===B.jumpTo){let a=t.contentNode.getContent()[0],l=e.getScene(a,!0);if(r.has(l))return;r.add(l)}}}checkImage(e,t){if(t.type===mt.setSrc){let i=t.contentNode.getContent()[0];P.isImageURL(i)&&P.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},J=class o extends Error{static describeAction(e,t){return`
|
|
84
84
|
Action: (id: ${e.id}) ${e.type}`+(t?`
|
|
85
85
|
At: ${t}`:"")}static getActionTrace(e){return o.describeAction({id:e.getId(),type:String(e.type)},e.__stack)}static toMessage(e,t){let n=[];return n.push(...Array.isArray(e)?e:[e]),t&&n.push(...Array.isArray(t)?t.map(o.getActionTrace):[o.getActionTrace(t)]),n.join("")}constructor(e,t){super(Array.isArray(e)?e.join(""):e),this.name="RuntimeScriptError";let n=t===void 0?[]:Array.isArray(t)?t:[t],i=n[0];if(i&&(this.action={id:i.getId(),type:String(i.type)},this.actionStack=i.__stack),this.traceTail=n.map(o.getActionTrace).join(""),this.traceTail&&typeof this.stack=="string"){let r=this.stack.indexOf(this.message);this.stack=r===-1?`${this.name}: ${this.composedMessage}
|
|
86
|
-
${this.stack}`:this.stack.slice(0,r)+this.composedMessage+this.stack.slice(r+this.message.length)}}get composedMessage(){return this.message+this.traceTail}},E=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},Ce=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function Bm(o,e){return oe.color(o,e)}function Wm(o){return oe.bold(o)}function zm(o){return oe.italic(o)}var _s=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(e=>({style:{opacity:1-e}})),this.asTarget(e=>({style:{opacity:e}}))]}}copy(){return new o({duration:this.duration,easing:this.easing})}};var Ys=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.offset=e.offset??[0,0],this.easing=e.easing}createTask(e){let{invertX:t,invertY:n}=e.getStory().getInversionConfig();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing},{type:0,start:this.offset[0],end:0,duration:this.duration,ease:this.easing},{type:0,start:this.offset[1],end:0,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget((i,r,s)=>({style:{opacity:i,translate:`${t?-r:r}px ${n?-s:s}px`}}))]}}copy(){return new o({duration:this.duration,offset:this.offset,easing:this.easing})}};var Xs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.blur=e.blur??16,this.easing=e.easing}createTask(){let e=Math.max(0,this.blur);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:{opacity:1-W(t),filter:`blur(${e*W(t)}px)`}})),this.asTarget(t=>({style:{opacity:W(t),filter:`blur(${e*(1-W(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var Qs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.direction=e.direction??"left",this.easing=e.easing}axisSign(){switch(this.direction){case"right":return{axis:"x",sign:1};case"top":return{axis:"y",sign:-1};case"bottom":return{axis:"y",sign:1};case"left":default:return{axis:"x",sign:-1}}}translate(e){let{axis:t}=this.axisSign(),n=`${e}%`;return{translate:t==="x"?`${n} 0px`:`0px ${n}`}}createTask(){let{sign:e}=this.axisSign();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:this.translate(e*100*W(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-W(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};var Js=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.ev=e.ev??4.6,this.lift=e.lift??.04,this.hold=e.hold,this.holdMs=e.holdMs,this.easing=e.easing}burnStyle(e){let t=W(e);if(t<=0)return{filter:"none"};let n=W(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=cr({duration:this.duration,hold:this.hold,holdMs:this.holdMs,easing:this.easing});return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(n=>({style:{opacity:n<.5?1:0,...this.burnStyle(t(n))}})),this.asTarget(n=>({style:{opacity:n<.5?0:1,...this.burnStyle(t(n))}}))]}}copy(){return new o({duration:this.duration,ev:this.ev,lift:this.lift,hold:this.hold,holdMs:this.holdMs,easing:this.easing})}};function M(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function In(o,e,t){return o<e?e:o>t?t:o}var cn=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${M(t)}deg`:Xc(t);return{mask:(r,s)=>{let a=-n+(s?1-W(r):W(r))*(100+n);return s?`linear-gradient(${i}, transparent ${M(a)}%, #000 ${M(a+n)}%)`:`linear-gradient(${i}, #000 ${M(a)}%, transparent ${M(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${M(t)}deg`,`${M(t+180)}deg`]:t==="vertical"?["to bottom","to top"]:["to right","to left"];return{mask:(s,a)=>{let l=-n+W(s)*(50+n);if(!a){let c=u=>`linear-gradient(${u}, #000 ${M(l)}%, transparent ${M(l+n)}%)`;return`${c(i)}, ${c(r)}`}if(l<0){let c=W((l+n)/Math.max(n,1e-6));return`linear-gradient(${i}, transparent ${M(50-l-n)}%, rgba(0,0,0,${M(c)}) 50%, transparent ${M(50+l+n)}%)`}return`linear-gradient(${i}, transparent ${M(50-l-n)}%, #000 ${M(50-l)}%, #000 ${M(50+l)}%, transparent ${M(50+l+n)}%)`}}}static iris(e={}){let t=e.center??"50% 50%",n=Math.max(0,e.feather??12),i=e.shape??"circle";return{mask:(r,s)=>{if(s){let l=(1-W(r))*150;return`radial-gradient(${i} at ${t}, transparent ${M(l-n)}%, #000 ${M(l)}%)`}let a=W(r)*150;return`radial-gradient(${i} at ${t}, #000 ${M(a-n)}%, transparent ${M(a)}%)`}}}static clock(e={}){let t=e.center??"50% 50%",n=e.from??0,i=Math.max(0,e.feather??24),r=e.direction??"clockwise";return{mask:(s,a)=>{let l=r==="counterclockwise"!=!!a,c=-i+W(s)*(360+i);if(l){let p=Math.max(0,360-c-i),d=Math.max(p,360-c);return`conic-gradient(from ${M(n)}deg at ${t}, transparent ${M(p)}deg, #000 ${M(d)}deg)`}let u=Math.max(0,c);return`conic-gradient(from ${M(n)}deg at ${t}, #000 ${M(u)}deg, transparent ${M(Math.max(u,c+i))}deg)`}}}static fan(e={}){let t=Math.max(1,Math.round(e.blades??4)),n=e.center??"50% 50%",i=e.from??0,r=Math.max(0,e.feather??10),s=360/t;return{mask:(a,l)=>{let c=-r+(l?1-W(a):W(a))*(s+r),u=In(c,0,s),p=In(c+r,0,s),d=`repeating-conic-gradient(from ${M(i)}deg at ${n}`;return l?`${d}, transparent 0deg, transparent ${M(u)}deg, #000 ${M(p)}deg, #000 ${M(s)}deg)`:`${d}, #000 0deg, #000 ${M(u)}deg, transparent ${M(p)}deg, transparent ${M(s)}deg)`}}}static blinds(e={}){let t=e.orientation??"horizontal",n=Math.max(1,Math.round(e.slats??8)),i=Math.max(0,e.feather??0),r=In(e.stagger??0,-1,1),s=typeof t=="number"?`${M(t)}deg`:Qc(t),a=100/n,l=Math.abs(r)/n,c=1-l*(n-1),u=(d,g)=>l*(r>=0!==g?d:n-1-d),p=(d,g,y)=>{let m=-i+(y?1-g:g)*(a+i),f=In(m,0,a),b=In(m+i,0,a),h=d*a;return y?`linear-gradient(${s}, transparent ${M(h+f)}%, #000 ${M(h+b)}%, #000 ${M(h+a)}%, transparent ${M(h+a)}%)`:`linear-gradient(${s}, transparent ${M(h)}%, #000 ${M(h)}%, #000 ${M(h+f)}%, transparent ${M(h+b)}%)`};return{mask:(d,g)=>{if(r!==0){let b=[];for(let h=0;h<n;h++)b.push(p(h,W((W(d)-u(h,!!g))/c),!!g));return b.join(", ")}let y=-i+(g?1-W(d):W(d))*(a+i),m=In(y,0,a),f=In(y+i,0,a);return g?`repeating-linear-gradient(${s}, transparent 0, transparent ${M(m)}%, #000 ${M(f)}%, #000 ${M(a)}%)`:`repeating-linear-gradient(${s}, #000 0, #000 ${M(m)}%, transparent ${M(f)}%, transparent ${M(a)}%)`}}}static dots(e={}){let t=Math.max(1,e.rows??6),n=Math.max(1,e.cols??10),i=Math.max(0,e.feather??20),s=W(e.stagger??0)*.5,a=(l,c,u)=>{let p=-i+W(c)*(100+i);return u?`radial-gradient(circle farthest-corner at ${l}, transparent ${M(p)}%, #000 ${M(p+i)}%)`:`radial-gradient(circle farthest-corner at ${l}, #000 ${M(p)}%, transparent ${M(p+i)}%)`};return{size:`${M(100/n)}% ${M(100/t)}%`,repeat:"repeat",mask:(l,c)=>{let u=c?1-W(l):W(l);if(s<=0)return a("50% 50%",u,c);let p=W(u/(1-s)),d=W((u-s)/(1-s));return c?`${a("50% 50%",d,!0)}, ${a("0% 0%",p,!0)}`:`${a("50% 50%",p)}, ${a("0% 0%",d)}`}}}static invert(e){return{...e,mask:(t,n)=>e.mask(t,!n)}}static toStyle(e,t,n=!1){return Yc(e.mask(t,n),e.size,e.repeat)}};var Km=.3,Zs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold,this.holdMs=e.holdMs,this.pattern=e.pattern??null,this.inverted=e.inverted??!1,this.uncover=e.uncover??"retreat",this.easing=e.easing}coverStyle(e,t){if(!this.pattern)return{...Ks(this.color),opacity:W(e)};let n={...Ks(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...cn.toStyle(this.pattern,e,!this.inverted)}:{...n,...cn.toStyle(this.uncover,e)}:{...n,...cn.toStyle(this.pattern,e,this.inverted)}}createTask(){let e={duration:this.duration,hold:this.hold??(this.holdMs===void 0?Km:void 0),holdMs:this.holdMs,easing:this.easing},t=1-(1-Ni(e))/2,n=.5,i=cr(e);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(r=>({style:{opacity:r<n?1:0}})),this.asTarget(r=>({style:{opacity:r<n?0:1}})),r=>({src:O.DefaultImagePlaceholder,style:this.coverStyle(i(r),r>=t)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,holdMs:this.holdMs,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var ea=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.pattern=e.pattern,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(e=>({style:cn.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var Zn="http://www.w3.org/2000/svg",$m="http://www.w3.org/1999/xlink",jm=.002,qm=1,_m=.12,Ym=0,ta=class o extends Ae{constructor(t){super();this.filterId=null;this.host=null;this.cut=null;this.duration=t.duration,this.rule=k.srcToURL(t.rule),this.feather=Math.min(qm,Math.max(jm,t.feather??_m)),this.inverted=t.inverted??!1,this.easing=t.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(t=>({style:this.styleAt(t)}))]}}requestAnimations(t){let n=super.requestAnimations(t);return n.onComplete(()=>this.dispose()),n.onCanceled(()=>this.dispose()),n}copy(){return new o({duration:this.duration,rule:this.rule,feather:this.feather,inverted:this.inverted,easing:this.easing})}styleAt(t){if(t>=1)return this.dispose(),{filter:""};let n=this.ensureScaffold();if(!n)return{filter:""};let i=t*(1+this.feather),r=(this.inverted?1:-1)/this.feather,s=(this.inverted?i-1:i)/this.feather;return this.cut?.setAttribute("k3",String(r)),this.cut?.setAttribute("k4",String(s)),{filter:`url(#${n})`}}ensureScaffold(){if(typeof document>"u")return null;if(this.filterId&&this.host)return this.filterId;let t=`nl-rule-${++Ym}`,n=document.createElementNS(Zn,"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(Zn,"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(Zn,"feImage");r.setAttribute("href",this.rule),r.setAttributeNS($m,"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(Zn,"feColorMatrix");s.setAttribute("in","rule"),s.setAttribute("type","luminanceToAlpha"),s.setAttribute("result","lum");let a=document.createElementNS(Zn,"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(Zn,"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 na=class extends hi{constructor(){super();this.unlocked={};this.setupActions()}serialize(){return{unlocked:this.unlocked}}deserialize(t){this.unlocked=t.unlocked}add(t,n){return this.trigger("add",t,n)}has(t){return new Y(()=>this.unlocked[t]!==void 0)}remove(t){return this.trigger("remove",t)}clear(){return this.trigger("clear")}$remove(t){delete this.unlocked[t]}$clear(){this.unlocked={}}$get(t){return this.unlocked[t]}$set(t,n){this.unlocked[t]=n}$getAll(){return this.unlocked}$has(t){return this.unlocked[t]!==void 0}setupActions(){this.on("add",(t,n,i)=>{let r={gameState:t.gameState,game:t.game,liveGame:t.liveGame,storable:t.storable,$:t.$},s=typeof i=="function"?i(r):i;this.unlocked[n]=s}),this.on("remove",(t,n)=>{delete this.unlocked[n]}),this.on("clear",t=>{this.$clear()})}};var ur=class{static getActionId(e){return e.getId()}static setActionId(e,t){return e.setId(t),e}static getStaticId(e){return e.getStaticId()}static setStaticId(e,t){return e.setStaticId(t),e}static chainToActions(e){return e.getActions()}static wrapAction(e){let t=ze.isChained(e)?e.getActions():e;return Fe.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static getLayerSrcs(e,t){return O.getSrcURLs(e,t)}static registerDisplayable(e,t,n=null,i=null){e.findElementByDisplayable(t)||(e.createDisplayable(t,n,i),e.flush())}static setElementId(e,t){e.setId(t)}static setElementStaticId(e,t){e.setStaticId(t)}static getDisplayableTransformProps(e){return{...e.transformState.get()}}static setDisplayableTransformProps(e,t,n,i={}){let r=t.transformState;i.merge===!1?r.forceOverwrite(n):r.assign(Symbol("DevTools.setDisplayableTransformProps"),n),t.markDirty(),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}static getPuppetStatus(e){return e._getStatus()}static onPuppetStatusChange(e,t){return e._onStatusChange(t)}static async describePuppet(e,t){try{return await t._describe()}catch(n){return e.logger.error("DevTools","Puppet backend threw while describing itself",n),null}}static getPuppetState(e){return Rt.normalizeState(e.state)}static setPuppetState(e,t,n,i={}){t.state=i.merge===!1?Rt.normalizeState(n):Rt.mergeState(t.state,n),t._applyState().catch(r=>{e.logger.error("DevTools","Puppet backend threw while applying state",r)}),e.flush()}static async runPuppetCommand(e,t,n,i){try{await t._runCommand(n,i)||e.logger.weakWarn("DevTools",`Puppet command "${n}" was dropped: the puppet is not mounted.`)}catch(r){e.logger.error("DevTools",`Puppet backend threw while running "${n}"`,r)}}static listPuppetBackends(e){return e.listPuppetBackends()}static getCurrentDialog(e){if(e.isNvlMode()){let n=e.getNvlState();if(!n.activeDialogId||n.phase==="idle")return null;let i=e.getNvlDialog(n.activeDialogId);return i?{actionId:i.actionId||null,ended:n.phase==="awaitAdvance",mode:"nvl"}:null}let t=e.getAdvDialogState();return t?{actionId:t.actionId,ended:t.ended,mode:"adv"}:null}static onDialogStateChange(e,t){let n=[e.events.on(R.EventTypes["event:state.dialog.change"],t),e.events.on(R.EventTypes["event:state.nvl.change"],t)];return{cancel:()=>{for(let i of n)i.cancel()}}}};ur.DynamicPersistent=Wn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
|
|
86
|
+
${this.stack}`:this.stack.slice(0,r)+this.composedMessage+this.stack.slice(r+this.message.length)}}get composedMessage(){return this.message+this.traceTail}},E=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},Ce=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function Wm(o,e){return oe.color(o,e)}function zm(o){return oe.bold(o)}function Km(o){return oe.italic(o)}var Qs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(e=>({style:{opacity:1-e}})),this.asTarget(e=>({style:{opacity:e}}))]}}copy(){return new o({duration:this.duration,easing:this.easing})}};var Ys=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.offset=e.offset??[0,0],this.easing=e.easing}createTask(e){let{invertX:t,invertY:n}=e.getStory().getInversionConfig();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing},{type:0,start:this.offset[0],end:0,duration:this.duration,ease:this.easing},{type:0,start:this.offset[1],end:0,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget((i,r,s)=>({style:{opacity:i,translate:`${t?-r:r}px ${n?-s:s}px`}}))]}}copy(){return new o({duration:this.duration,offset:this.offset,easing:this.easing})}};var Xs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.blur=e.blur??16,this.easing=e.easing}createTask(){let e=Math.max(0,this.blur);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:{opacity:1-W(t),filter:`blur(${e*W(t)}px)`}})),this.asTarget(t=>({style:{opacity:W(t),filter:`blur(${e*(1-W(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var Js=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.direction=e.direction??"left",this.easing=e.easing}axisSign(){switch(this.direction){case"right":return{axis:"x",sign:1};case"top":return{axis:"y",sign:-1};case"bottom":return{axis:"y",sign:1};case"left":default:return{axis:"x",sign:-1}}}translate(e){let{axis:t}=this.axisSign(),n=`${e}%`;return{translate:t==="x"?`${n} 0px`:`0px ${n}`}}createTask(){let{sign:e}=this.axisSign();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:this.translate(e*100*W(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-W(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};var Zs=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.ev=e.ev??4.6,this.lift=e.lift??.04,this.hold=e.hold,this.holdMs=e.holdMs,this.easing=e.easing}burnStyle(e){let t=W(e);if(t<=0)return{filter:"none"};let n=W(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=ur({duration:this.duration,hold:this.hold,holdMs:this.holdMs,easing:this.easing});return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(n=>({style:{opacity:n<.5?1:0,...this.burnStyle(t(n))}})),this.asTarget(n=>({style:{opacity:n<.5?0:1,...this.burnStyle(t(n))}}))]}}copy(){return new o({duration:this.duration,ev:this.ev,lift:this.lift,hold:this.hold,holdMs:this.holdMs,easing:this.easing})}};function M(o){return Number.isInteger(o)?String(o):o.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function In(o,e,t){return o<e?e:o>t?t:o}var cn=class{constructor(){}static wipe(e={}){let t=e.direction??"left",n=Math.max(0,e.feather??12),i=typeof t=="number"?`${M(t)}deg`:Xc(t);return{mask:(r,s)=>{let a=-n+(s?1-W(r):W(r))*(100+n);return s?`linear-gradient(${i}, transparent ${M(a)}%, #000 ${M(a+n)}%)`:`linear-gradient(${i}, #000 ${M(a)}%, transparent ${M(a+n)}%)`}}}static barnDoor(e={}){let t=e.axis??"horizontal",n=Math.max(0,e.feather??12),[i,r]=typeof t=="number"?[`${M(t)}deg`,`${M(t+180)}deg`]:t==="vertical"?["to bottom","to top"]:["to right","to left"];return{mask:(s,a)=>{let l=-n+W(s)*(50+n);if(!a){let c=u=>`linear-gradient(${u}, #000 ${M(l)}%, transparent ${M(l+n)}%)`;return`${c(i)}, ${c(r)}`}if(l<0){let c=W((l+n)/Math.max(n,1e-6));return`linear-gradient(${i}, transparent ${M(50-l-n)}%, rgba(0,0,0,${M(c)}) 50%, transparent ${M(50+l+n)}%)`}return`linear-gradient(${i}, transparent ${M(50-l-n)}%, #000 ${M(50-l)}%, #000 ${M(50+l)}%, transparent ${M(50+l+n)}%)`}}}static iris(e={}){let t=e.center??"50% 50%",n=Math.max(0,e.feather??12),i=e.shape??"circle";return{mask:(r,s)=>{if(s){let l=(1-W(r))*150;return`radial-gradient(${i} at ${t}, transparent ${M(l-n)}%, #000 ${M(l)}%)`}let a=W(r)*150;return`radial-gradient(${i} at ${t}, #000 ${M(a-n)}%, transparent ${M(a)}%)`}}}static clock(e={}){let t=e.center??"50% 50%",n=e.from??0,i=Math.max(0,e.feather??24),r=e.direction??"clockwise";return{mask:(s,a)=>{let l=r==="counterclockwise"!=!!a,c=-i+W(s)*(360+i);if(l){let p=Math.max(0,360-c-i),d=Math.max(p,360-c);return`conic-gradient(from ${M(n)}deg at ${t}, transparent ${M(p)}deg, #000 ${M(d)}deg)`}let u=Math.max(0,c);return`conic-gradient(from ${M(n)}deg at ${t}, #000 ${M(u)}deg, transparent ${M(Math.max(u,c+i))}deg)`}}}static fan(e={}){let t=Math.max(1,Math.round(e.blades??4)),n=e.center??"50% 50%",i=e.from??0,r=Math.max(0,e.feather??10),s=360/t;return{mask:(a,l)=>{let c=-r+(l?1-W(a):W(a))*(s+r),u=In(c,0,s),p=In(c+r,0,s),d=`repeating-conic-gradient(from ${M(i)}deg at ${n}`;return l?`${d}, transparent 0deg, transparent ${M(u)}deg, #000 ${M(p)}deg, #000 ${M(s)}deg)`:`${d}, #000 0deg, #000 ${M(u)}deg, transparent ${M(p)}deg, transparent ${M(s)}deg)`}}}static blinds(e={}){let t=e.orientation??"horizontal",n=Math.max(1,Math.round(e.slats??8)),i=Math.max(0,e.feather??0),r=In(e.stagger??0,-1,1),s=typeof t=="number"?`${M(t)}deg`:Jc(t),a=100/n,l=Math.abs(r)/n,c=1-l*(n-1),u=(d,h)=>l*(r>=0!==h?d:n-1-d),p=(d,h,f)=>{let m=-i+(f?1-h:h)*(a+i),g=In(m,0,a),b=In(m+i,0,a),y=d*a;return f?`linear-gradient(${s}, transparent ${M(y+g)}%, #000 ${M(y+b)}%, #000 ${M(y+a)}%, transparent ${M(y+a)}%)`:`linear-gradient(${s}, transparent ${M(y)}%, #000 ${M(y)}%, #000 ${M(y+g)}%, transparent ${M(y+b)}%)`};return{mask:(d,h)=>{if(r!==0){let b=[];for(let y=0;y<n;y++)b.push(p(y,W((W(d)-u(y,!!h))/c),!!h));return b.join(", ")}let f=-i+(h?1-W(d):W(d))*(a+i),m=In(f,0,a),g=In(f+i,0,a);return h?`repeating-linear-gradient(${s}, transparent 0, transparent ${M(m)}%, #000 ${M(g)}%, #000 ${M(a)}%)`:`repeating-linear-gradient(${s}, #000 0, #000 ${M(m)}%, transparent ${M(g)}%, transparent ${M(a)}%)`}}}static dots(e={}){let t=Math.max(1,e.rows??6),n=Math.max(1,e.cols??10),i=Math.max(0,e.feather??20),s=W(e.stagger??0)*.5,a=(l,c,u)=>{let p=-i+W(c)*(100+i);return u?`radial-gradient(circle farthest-corner at ${l}, transparent ${M(p)}%, #000 ${M(p+i)}%)`:`radial-gradient(circle farthest-corner at ${l}, #000 ${M(p)}%, transparent ${M(p+i)}%)`};return{size:`${M(100/n)}% ${M(100/t)}%`,repeat:"repeat",mask:(l,c)=>{let u=c?1-W(l):W(l);if(s<=0)return a("50% 50%",u,c);let p=W(u/(1-s)),d=W((u-s)/(1-s));return c?`${a("50% 50%",d,!0)}, ${a("0% 0%",p,!0)}`:`${a("50% 50%",p)}, ${a("0% 0%",d)}`}}}static invert(e){return{...e,mask:(t,n)=>e.mask(t,!n)}}static toStyle(e,t,n=!1){return Yc(e.mask(t,n),e.size,e.repeat)}};var $m=.3,ea=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.color=e.color??"#000000",this.hold=e.hold,this.holdMs=e.holdMs,this.pattern=e.pattern??null,this.inverted=e.inverted??!1,this.uncover=e.uncover??"retreat",this.easing=e.easing}coverStyle(e,t){if(!this.pattern)return{...$s(this.color),opacity:W(e)};let n={...$s(this.color),opacity:1};return t&&this.uncover!=="retreat"?this.uncover==="continue"?{...n,...cn.toStyle(this.pattern,e,!this.inverted)}:{...n,...cn.toStyle(this.uncover,e)}:{...n,...cn.toStyle(this.pattern,e,this.inverted)}}createTask(){let e={duration:this.duration,hold:this.hold??(this.holdMs===void 0?$m:void 0),holdMs:this.holdMs,easing:this.easing},t=1-(1-Ni(e))/2,n=.5,i=ur(e);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:"linear"}],resolve:[this.asPrev(r=>({style:{opacity:r<n?1:0}})),this.asTarget(r=>({style:{opacity:r<n?0:1}})),r=>({src:O.DefaultImagePlaceholder,style:this.coverStyle(i(r),r>=t)})]}}copy(){return new o({duration:this.duration,color:this.color,hold:this.hold,holdMs:this.holdMs,pattern:this.pattern??void 0,inverted:this.inverted,uncover:this.uncover,easing:this.easing})}};var ta=class o extends Ae{constructor(e){super(),this.duration=e.duration,this.pattern=e.pattern,this.easing=e.easing}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget(e=>({style:cn.toStyle(this.pattern,e)}))]}}copy(){return new o({duration:this.duration,pattern:this.pattern,easing:this.easing})}};var Zn="http://www.w3.org/2000/svg",jm="http://www.w3.org/1999/xlink",qm=.002,_m=1,Qm=.12,Ym=0,na=class o extends Ae{constructor(t){super();this.filterId=null;this.host=null;this.cut=null;this.duration=t.duration,this.rule=P.srcToURL(t.rule),this.feather=Math.min(_m,Math.max(qm,t.feather??Qm)),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-${++Ym}`,n=document.createElementNS(Zn,"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(Zn,"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(Zn,"feImage");r.setAttribute("href",this.rule),r.setAttributeNS(jm,"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(Zn,"feColorMatrix");s.setAttribute("in","rule"),s.setAttribute("type","luminanceToAlpha"),s.setAttribute("result","lum");let a=document.createElementNS(Zn,"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(Zn,"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 ia=class extends hi{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 pr=class{static getActionId(e){return e.getId()}static setActionId(e,t){return e.setId(t),e}static getStaticId(e){return e.getStaticId()}static setStaticId(e,t){return e.setStaticId(t),e}static chainToActions(e){return e.getActions()}static wrapAction(e){let t=ze.isChained(e)?e.getActions():e;return Fe.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static getLayerSrcs(e,t){return O.getSrcURLs(e,t)}static registerDisplayable(e,t,n=null,i=null){e.findElementByDisplayable(t)||(e.createDisplayable(t,n,i),e.flush())}static setElementId(e,t){e.setId(t)}static setElementStaticId(e,t){e.setStaticId(t)}static getDisplayableTransformProps(e){return{...e.transformState.get()}}static setDisplayableTransformProps(e,t,n,i={}){let r=t.transformState;i.merge===!1?r.forceOverwrite(n):r.assign(Symbol("DevTools.setDisplayableTransformProps"),n),t.markDirty(),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}static getPuppetStatus(e){return e._getStatus()}static onPuppetStatusChange(e,t){return e._onStatusChange(t)}static async describePuppet(e,t){try{return await t._describe()}catch(n){return e.logger.error("DevTools","Puppet backend threw while describing itself",n),null}}static getPuppetState(e){return Rt.normalizeState(e.state)}static setPuppetState(e,t,n,i={}){t.state=i.merge===!1?Rt.normalizeState(n):Rt.mergeState(t.state,n),t._applyState().catch(r=>{e.logger.error("DevTools","Puppet backend threw while applying state",r)}),e.flush()}static async runPuppetCommand(e,t,n,i){try{await t._runCommand(n,i)||e.logger.weakWarn("DevTools",`Puppet command "${n}" was dropped: the puppet is not mounted.`)}catch(r){e.logger.error("DevTools",`Puppet backend threw while running "${n}"`,r)}}static listPuppetBackends(e){return e.listPuppetBackends()}static getCurrentDialog(e){if(e.isNvlMode()){let n=e.getNvlState();if(!n.activeDialogId||n.phase==="idle")return null;let i=e.getNvlDialog(n.activeDialogId);return i?{actionId:i.actionId||null,ended:n.phase==="awaitAdvance",mode:"nvl"}:null}let t=e.getAdvDialogState();return t?{actionId:t.actionId,ended:t.ended,mode:"adv"}:null}static onDialogStateChange(e,t){let n=[e.events.on(R.EventTypes["event:state.dialog.change"],t),e.events.on(R.EventTypes["event:state.nvl.change"],t)];return{cancel:()=>{for(let i of n)i.cancel()}}}};pr.DynamicPersistent=Wn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
|
|
87
87
|
@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.isolate{isolation:isolate}.z-20{z-index:20}.container{width:100%}.\\!hidden{display:none!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-\\[80px\\]{height:80px}.h-full{height:100%}.h-max{height:-moz-max-content;height:max-content}.w-1\\/2{width:50%}.w-\\[100px\\]{width:100px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-full{min-width:100%}.flex-grow,.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.text-center{text-align:center}.text-left{text-align:left}.align-bottom{vertical-align:bottom}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.opacity-0{opacity:0}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.__narraleaf_content-player *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.__narraleaf_content-player img{pointer-events:none;-webkit-user-drag:none;-webkit-user-select:none}.__narraleaf_content-player .pointer-disabled{pointer-events:none}.__narraleaf_content-player .pointer-disabled>:not(.pointer-disabled){pointer-events:auto}.__narraleaf_content-player img:before,.__narraleaf_content-player img:after{content:none!important;border:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.bg-cover{background-size:cover}.bg-center{background-position:50%}.pointer-events-auto-rest *{pointer-events:auto}@keyframes __narraleaf_text_reveal{0%{opacity:0}to{opacity:1}}.__narraleaf_text_reveal{animation:__narraleaf_text_reveal var(--nl-reveal-duration,0s) ease-out both}@media (prefers-reduced-motion:reduce){.__narraleaf_text_reveal{animation:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}\r
|
|
88
|
-
`,document.head.appendChild(o)}export{An as Align,dn as AudioBusError,li as AudioBusMixer,ai as AudioBusTree,
|
|
88
|
+
`,document.head.appendChild(o)}export{An as Align,dn as AudioBusError,li as AudioBusMixer,ai as AudioBusTree,as as Avatar,Xs as BlurDissolve,di as Camera,fo as Character,at as CommonPosition,On as CommonPositionType,kr as Condition,Fe as Control,ht as Coord2D,Gi as Darkness,tt as DefaultAudioBusIds,vs as DefaultNvlContainer,oc as DefaultNvlDialogItem,pr as DevTools,Cd as Dialog,Qs as Dissolve,Cm as ExposedStateType,Zs as Exposure,Ys as FadeIn,Zl as FixedAspectRatioContainer,ia as Gallery,q as Game,ko as GameMenu,Wc as GameProviders,R as GameState,O as Image,Ae as ImageTransition,Kt as Isolated,Oo as Item,qn as KeyBindingType,Mi as KeyMap,Q as Lambda,Kn as Layer,$p as Layout,Ei as LayoutRouterProvider,Wt as LiveGame,cn as Mask,to as MaxAudioBusDepth,Pr as Menu,yi as NVLToken,Ut as Namespace,an as Nametag,on as Narrator,Vo as Notifications,ys as NvlContainer,gd as NvlDialogList,hs as NvlProvider,Yp as Page,us as PageInjectContext,Ke as Pause,Bn as Persistent,Bc as Player,Si as Preference,Rt as Puppet,Js as Push,ta as Reveal,nl as RootPath,na as RuleReveal,_e as Scene,we as Script,Ea as SeededBusPreferenceKeys,fe as Sentence,hi as Service,ge as Sound,La as SoundType,Mu as Stage,ri as Storable,mi as Story,kn as Text,lt as TextEvent,fi as TextTransition,gp as Texts,mp as TextsPreview,ea as ThroughColor,Z as Transform,Bt as Transition,Ir as Vfx,Rr as Video,oe as Word,no as acceptsAudioBus,zm as b,Wm as c,Ts as createDefaultPreloadStrategy,Cr as getActiveAudioBusTree,Zu as getWordRenderer,Km as i,Xu as registerWordRenderer,Ju as unregisterWordRenderer,$l as useAvatar,Rp as useDialog,bd as useDialogOverlay,N as useGame,ud as useIsNvlMode,pd as useIsNvlVisible,En as useKeyBinding,od as useLiveGame,qt as useNvl,fs as useNvlDialogs,Vp as useParams,Hp as usePathname,vn as usePreference,Up as useQueryParams,zt as useRouter,Ad as useSuspendAdvance,os as useUIMenuContext,Np as useVoiceState};
|