narraleaf-react 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +34 -34
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
1
|
var Pe={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",init:"displayable:init"},en={say:"character:say",action:"character:action",setName:"character:setName"},$={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var Je={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},xr={action:"condition:action"},wr={action:"script:action"},kr={action:"menu:action"},kt={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute"},Ae={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"},Xn={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},Sn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},Wt={action:"layer:action",setZIndex:"layer:setZIndex"},tn={action:"video:action",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"};var Pr=(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))(Pr||{}),ro=(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});ro.DataTypes=Pr;function F(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,c)=>ro(a)===3&&ro(c)===3?a.constructor!==Object||c.constructor!==Object?c||a:F(a,c):Array.isArray(a)&&Array.isArray(c)?c&&c.length>0?[...c]:[...a]:a===void 0&&Array.isArray(c)?[...c]:c===void 0?Array.isArray(a)?[...a]:a:Array.isArray(c)?[...c]:c;for(let s in o)n(o,s)&&(i[s]=r(s,o[s],e[s]));for(let s in e)n(e,s)&&!n(i,s)&&(typeof e[s]=="object"&&e[s]!==null?e[s].constructor===Object?i[s]=F({},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 F(i,s,...a)}return i}var He=class He{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=so()}static isAwaitable(e){return e instanceof He}static fromPromise(e){let t=new He;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new He;return t.resolve(e),t}static delay(e){let t=new He;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new He;return e(t),t}static wait(e){let t=new He;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new He;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 H(()=>{e.forEach(n=>n.skipController?.abort())})),t)}static forward(e,t,n){let i=new He().registerSkipController(n||new H(()=>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 He;return e.length===0?(t.resolve(),t):(e.forEach(n=>{n.onSettled(()=>t.resolve()),n.onFailed(i=>{e.forEach(r=>{r!==n&&r.abort()}),t.fail(i)})}),t.registerSkipController(new H(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new He;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 H(()=>{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>=He.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>=He.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()}}};He.nothing=e=>e,He.maxListeners=8;var v=He;function Er(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 on(o){return typeof o=="string"?o:`#${(o.r||0).toString(16).padStart(2,"0")}${(o.g||0).toString(16).padStart(2,"0")}${(o.b||0).toString(16).padStart(2,"0")}${o.a===void 0?"":o.a.toString(16).padStart(2,"0")}`}var X=class{constructor(){this.events={};this.maxListeners=10}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),this.events[e].length>this.maxListeners&&console.warn(`NarraLeaf-React: Event ${e} has more than ${this.maxListeners} listeners (total: ${this.events[e].length}), this may cause performance issues.`),this.emit("event:EventDispatcher.register",e,t),{type:e,listener:t,cancel:()=>{this.off(e,t)}}}depends(e){return{cancel:()=>{e.forEach(t=>t.cancel())}}}off(e,t){this.events[e]&&(this.events[e]=this.events[e].filter(n=>n!==t))}emit(e,...t){if(!this.events[e])return 0;let n=this.events[e].length;return this.events[e].forEach(i=>{i(...t)}),n}once(e,t){let n=(...i)=>{t(...i),this.off(e,n)};return this.on(e,n)}async any(e,...t){if(this.events[e]||(this.events[e]=[]),this.events[e].length>0){await Promise.all(this.events[e].map(n=>n(...t)));return}return new Promise(n=>{let i="event:EventDispatcher.register",r=this.on(i,(s,a)=>{if(s===e){this.off(i,r);let c=a?.(...t);c!==null&&typeof c=="object"&&c.then?c.then(n):n(c)}}).listener})}setMaxListeners(e){return this.maxListeners=e,this}hasListeners(e){return this.events[e]?.length>0}clear(){this.events={}}};function so(o=1){let e=new Error().stack;return e?e.split(`
|
|
2
2
|
`).slice(o+1).join(`
|
|
3
|
-
`).trim():""}function ni(o){return new Promise(e=>setTimeout(e,o))}var ti=class ti{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(ti.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};ti.EventTypes={"event:skipController.abort":"event:skipController.abort"};var H=ti;var Tn=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}},nn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new Tn;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 ii(o,e,t={}){return o?e:t}function Dr(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var Yn=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 Lr(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 Ir(o,e){return new Promise((t,n)=>{fetch(o,e).then(i=>i.blob()).then(i=>{let r=new FileReader;r.onload=()=>{t(r.result)},r.readAsDataURL(i)}).catch(n)})}var bn=class{constructor(e,t){this.concurrency=e;this.delay=t;this.tasks=[]}addTask(e){this.tasks.push(e)}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())),await ni(this.delay),await e()};await e()}};function je(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function Rr(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var $e=class o{constructor(e={},t={}){this.serializer=e;this.deserializer=t}serialize(e){let t={};for(let n of Object.keys(e))n in this.serializer&&e[n]!==void 0?t[n]=this.serializer[n]?.(e[n]):t[n]=e[n];return t}deserialize(e){let t={};for(let n of Object.keys(e))typeof this.deserializer[n]=="function"&&e[n]!==void 0?t[n]=this.deserializer[n](e[n]):t[n]=e[n];return t}extend(e,t){let n={...this.serializer,...e},i={...this.deserializer,...t};return new o(n,i)}};function Nr(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 Mr(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ao(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function co(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"&&!co(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Jn=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Gr(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 Hr(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Zn=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},_n=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 ei=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 Ur(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 Fr(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,c=16777216,l=r*a>>>0,p=r*c+s*a>>>0,u=s*c+(p>>>0)>>>0;e=l,t=u}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var Cn=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=so(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};Cn.ActionTypes={action:"action"};var j=class extends Cn{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 v(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 lo=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},A=class o extends lo{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 oi={center:"center",left:"left",right:"right"};import{animate as ya}from"motion/react";var An=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(An||{}),Or={left:"33.33%",center:"50%",right:"66.66%"},Ze=class Ze{static isUnknown(e){return e===Ze.Unknown}static D2PositionToCSS(e,t=!1,n=!1,i){let r=this.calc(e.y,e.yoffset,i?.height),s=this.calc(e.x,e.xoffset,i?.width),a=n?{bottom:r}:{top:r},c=t?{right:s}:{left:s};return this.wrap({...a,...c})}static calc(e,t,n){if(!e||Ze.isUnknown(e))return"auto";let i=!(t===void 0||Ze.isUnknown(t));if(typeof n=="number"&&n>0){let s=Ze.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}return i?`calc(${typeof e=="number"?`${e}px`:e} + ${t}px)`:`calc(${e} + 0px)`}static toPercent(e,t){if(typeof e=="number")return t>0?e/t*100:null;let n=/^(-?\d+(?:\.\d+)?)%$/.exec(e.trim());return n?parseFloat(n[1]):null}static toCoord2D(e){if(nt.isCommonPositionType(e))return _e.fromCommonPosition(e);if(_e.isCoord2DPosition(e))return e;if(zt.isAlignPosition(e))return _e.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 Ze.isUnknown(e)||e===void 0?Ze.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return _e.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:Ze.isUnknown(t.x)?0:t.x,y:Ze.isUnknown(t.y)?0:t.y,xoffset:Ze.isUnknown(t.xoffset)?0:t.xoffset,yoffset:Ze.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(An).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 nt||e instanceof _e||e instanceof zt}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return _e.fromCommonPosition(new nt(e));if(this.isRawAlignPosition(e))return _e.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new _e(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}}};Ze.Unknown=Symbol("Unknown");var I=Ze,ri=class ri{static isCommonPositionType(e){return e instanceof ri}constructor(e){this.position=e}toCSS(){return{x:Or[this.position],y:"50%",xoffset:0,yoffset:0}}};ri.Positions=An;var nt=ri,_e=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:Or[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||I.isUnknown(n)?I.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:I.isUnknown(t.x)?e.x:t.x,y:I.isUnknown(t.y)?e.y:t.y,xoffset:I.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:I.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=I.orUnknown(e.x),this.y=I.orUnknown(e.y),this.xoffset=I.orUnknown(e.xoffset),this.yoffset=I.orUnknown(e.yoffset)):(this.x=I.orUnknown(e),this.y=I.orUnknown(t),this.xoffset=I.Unknown,this.yoffset=I.Unknown),this.check()}check(){let e=t=>/^-?\d+(\.\d+)?%$/.test(t);if(typeof this.x=="string"&&!e(this.x))throw new Error(`Invalid x position: ${this.x}`);if(typeof this.y=="string"&&!e(this.y))throw new Error(`Invalid y position: ${this.y}`)}toCSS(){return{x:this.x,y:this.y,xoffset:this.xoffset,yoffset:this.yoffset}}},zt=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=I.orUnknown(e.xalign),this.yalign=I.orUnknown(e.yalign),this.xoffset=I.orUnknown(e.xoffset),this.yoffset=I.orUnknown(e.yoffset)):(this.xalign=I.orUnknown(e),this.yalign=I.orUnknown(t),this.xoffset=I.Unknown,this.yoffset=I.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:I.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:I.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var Y=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new uo(this.mergeWithDefaultConfig(e))}copy(){return new o(F({},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)?F({},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}},uo=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(F({},this.config))}join(e){let t=Rr(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 va={[oi.left]:"25.33%",[oi.center]:"50%",[oi.right]:"75.66%"},rt=class rt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new rt(rt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?I.toCoord2D(I.tryParsePosition(e||t)):I.mergePosition(I.tryParsePosition(e),I.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=rt.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 ao(J.constructStyle(e,this.state,t))}toStyle(e,t){return ao(J.constructStyle(e,this.state,t))}serialize(){return rt.TransformStateSerializer.serialize(this.state)}clone(){return new rt(rt.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=rt.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}};rt.DefaultTransformState=new Y({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new nt("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}),rt.TransformStateSerializer=new $e({position:e=>I.serializePosition(I.tryParsePosition(e))},{position:e=>I.toCoord2D(e)});var be=rt,Te=class Te{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Te.defaultConfig,t||{});else{let[n,i]=[e,t||Te.defaultOptions];this.sequences.push({props:n,options:i||Te.defaultOptions}),this.config=Object.assign({},Te.defaultConfig)}}static isPosition(e){return nt.isCommonPositionType(e)||_e.isCoord2DPosition(e)||zt.isAlignPosition(e)}static immediate(e){return new Te(e,{duration:0,ease:"linear"})}static left(e,t){return new Te({position:nt.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Te({position:nt.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Te({position:nt.Positions.Center},{duration:e,ease:t})}static create(e){return new Te([],e)}static positionToCSS(e,t,n,i){return e?I.isRawPosition(e)?I.D2PositionToCSS(I.rawPositionToCoord2D(e),n,t,i):I.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?I.toCoord2D(I.tryParsePosition(e||t)):I.mergePosition(I.tryParsePosition(e),I.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...F(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,c=function(d,h,f){return typeof d>"u"?typeof f<"u"?h(f):"":h(d)},l=s[0]||(r?"":"-")+"50%",p=s[1]||(i?"":"-")+"50%";return[`translate(${l}, ${p})`,c(t.rotation,d=>`rotate(${d}deg)`,0),c(t.scaleX,d=>`scaleX(${d*a})`,1),c(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,c=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...Te.positionToCSS(t.position,i,r,c),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?on(t.fontColor):void 0,transform:Te.propToCSSTransform(e,t),...Te.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:r,sequences:s,options:a}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current});s.length||t.logger.warn("Transform","No sequences to animate.");let c=!1,l=e.lock(),p=ya(s,a),u=()=>{e.overwrite(l,r.get()).unlock(l),p.complete(),c=!0},d=new v().registerSkipController(new H(u)),h=()=>{c||e.overwrite(l,r.get()).unlock(l),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),d.resolve()};return p.then(h,(f=>{t.logger.error("Failed to animate transform. "+(f?.toString?.()||""));try{h()}catch{d.resolve()}})),p.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:r,sequences:s,options:a},this),d}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...Te.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i}){let r=t.clone(),s=r.lock(),a=this.sequences.map(({props:c,options:l})=>{let p=r.assign(s,c).toFramesDefinition(e,n);return[i,p,this.getOptions(l)]});return{finalState:r.unlock(s).freeze(),sequences:a,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0)}}copy(){return new Te(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new de("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 de("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};Te.defaultConfig={sync:!0},Te.defaultOptions={duration:0,ease:"linear"},Te.CommonImagePositionMap=va;var J=Te;var si=class{constructor(){this.id=""}setId(e){this.id=e}getId(){return this.id}reset(){}fromData(e){return this}construct(e){for(let t=0;t<e.length;t++){let n=e[t];t!==0&&e[t-1]?.contentNode.setChild(n.contentNode)}return e}};var Kr=Symbol("_Chained"),Vr;Vr=Kr;var po=class po{constructor(e){this[Vr]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[Kr]}static toActions(e){return e.flat(2).map(t=>po.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()}},Ee=po,rn=class extends si{chain(e){let t=Ee.isChained(this)?this:this.proxy(this,new Ee(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 re=class extends rn{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var pt=class extends j{executeAction(e,t){let n=this.callee.evaluate(this.contentNode.getContent(),{gameState:e});return n?.length?[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]:super.executeAction(e,t)}getFutureActions(e,t){return[...this.callee._getFutureActions(),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=s=>{let a=s.condition?n?s.condition.toString():"Lambda(unknown)":"null",c=s.action?s.action.map(l=>l.stringify(e,t,n)).join(";"):"null";return`(${a}) {${c}}`};return super.stringifyWithContent("Condition",`if ${r(i.If)} ${i.ElseIf.length>0?`else if ${i.ElseIf.map(r).join(";")} `:""}${i.Else?`else {${r(i.Else)}}`:""}`)}};pt.ActionTypes=xr;var dt=class o{static isSerializable(e){return["number","string","boolean"].includes(typeof e)||e instanceof Date||e==null?!0:Array.isArray(e)?e.every(o.isSerializable):typeof e=="object"?Object.getPrototypeOf(e)===Object.prototype&&Object.values(e).every(o.isSerializable):!1}constructor(e,t,n){this.name=e,this.key=n||e,this.content=F({},t),this.defaultContent=t}set(e,t){return o.isSerializable(t)?(this.content[e]=t,this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
|
|
4
|
-
at namespace "${this.name}"`),this.content[e]=t,this)}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(){return this.content=F({},this.defaultContent),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)})}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e){let t={any:i=>({type:"any",data:i}),date:i=>({type:"date",data:i.toString()})},n=this.toTypeName(e);return t[n](e)}unwrap(e){return{any:n=>n.data,date:n=>new Date(n.data)}[e.type](e)}},xn=class{constructor(){this.namespaces={}}static createNamespace(e,t,n){return new dt(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,this}getNamespace(e){if(!this.namespaces[e])throw new
|
|
5
|
-
Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]=t,this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return 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)}toData(){return this.entries().reduce((e,[t,n])=>(e[t]=n.toData(),e),{})}load(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.namespaces[t]||(this.namespaces[t]=new dt(t,{})),this.namespaces[t].deserialize(n)})}clear(){return this.namespaces={},this}};var qe=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===kt.play){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.stop){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=v.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,c=>{c&&this.callee.fromData(c)},[s]),a}else if(this.type===kt.setRate){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.pause){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.resume){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.mute){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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")}};qe.ActionTypes=kt;var Mt=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(Mt||{}),ve=class ve extends
|
|
6
|
-
To prevent unintended behavior, the sound marked as bgm cannot be played using \`play()\`.`);return this.pushAction(qe.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(qe.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(qe.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(qe.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(qe.ActionTypes.setRate,[e])}pause(e){return this.pushAction(qe.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(qe.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}getSrc(){return this.config.src}toData(){return{state:ve.StateSerializer.serialize(this.state)}}fromData(e){return this.state=ve.StateSerializer.deserialize(e.state),this}copy(){return new ve(this.userConfig.get())}reset(){return this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return ve.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new qe(this.chain(),e,new A().setContent(t)))}};ve.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",ve.DefaultUserConfig=new Y({src:ve.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,type:"sound"}),ve.DefaultConfig=new Y({src:ve.noSound,loop:!1,streaming:!1,seek:0,type:"sound"}),ve.DefaultState=new Y({volume:1,rate:1,paused:!1,muted:!1}),ve.StateSerializer=new $e;var me=ve;var ip={};var sn=class extends rn{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let c=a.getFutureActions(e,i).filter(l=>!r.has(l));s.push(...c)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var Bt=class Bt{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===Bt.SrcTypes.image?t.add(s):r===Bt.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof N?N.getSrcURL(e):e.type==="image"?N.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(te,$.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(x.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,Je.setSrc)){let i=t.contentNode.getContent()[0];if(x.isImageSrc(i))return{type:"image",src:x.srcToURL(i),activeType:"scene"}}else{if(t.type===Je.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===Je.setAppearance){let i=t.contentNode.getContent()[0];if(N.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(N.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:N.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof me){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof N||x.isStaticImageData(e)){if(e instanceof N){if(!x.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(N.getSrcURL(e)))return this}else if(this.isSrcRegistered(x.srcToURL(e.src)))return this;this.src.push({type:"image",src:x.isStaticImageData(e)?x.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 me?t:new me({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 me?e.getSrc():e;return this.src.some(n=>n.type===Bt.SrcTypes.audio?t===n.src.getSrc():n.type===Bt.SrcTypes.image?t===N.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Bt.SrcTypes={image:"image",video:"video",audio:"audio"};var Ue=Bt;var Gt=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Xn.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===Xn.setFontSize){let i=this.callee.state.fontSize;return this.callee.state.fontSize=this.contentNode.getContent()[0],e.getExposedStateForce(this.callee).flush(),e.actionHistory.push(n,r=>{this.callee.state.fontSize=r},[i]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("TextAction")}};Gt.ActionTypes=Xn;var De=class extends j{executeAction(e,t){if(this.type===Pe.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===Pe.applyTransition){let[n,i]=this.contentNode.getContent(),r=this.callee,s=i?i(n):n;return this.applyTransition(e,r,s,t)}else if(this.type===Pe.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}throw this.unknownTypeError()}applyTransform(e,t,n,i,r){let s=new v().registerSkipController(new H(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},c=e.getExposedStateForce(t),l=t.transformState.clone(),p=c.applyTransform(n,a),u=e.timelines.attachTimeline(s).attachChild(p);return p.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},d=>{s.isSettled()||s.abort(),p.abort(),t.transformState.forceOverwrite(d.state)},[l]),s}applyTransition(e,t,n,i,r){let s=new v().registerSkipController(new H(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},l=e.getExposedStateForce(t).applyTransition(n,a),p=e.timelines.attachTimeline(s).attachChild(l);return l.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:p},()=>{s.isSettled()||s.abort(),l.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let l=e.findElementByDisplayable(this.callee,i);l&&e.disposeDisplayable(n,l.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new v().registerSkipController(new H(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,l=>{l.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let c=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:c},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};De.ActionTypes=Pe;var mt=class o extends re{constructor(){super(...arguments);this.srcManager=new Ue}pos(t,n,i){return this.transform(new J({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new J({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new J({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new J({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new J({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new J({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new J({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new J(t,n))}mask(t,n={}){let i=x.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c,...l}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c},l)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:c="easeInOut",...l}=t,p={duration:a,ease:c,...l},u=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),p]]);return s?this.combineActions(new Le,d=>d.transform(u).clearClip({duration:0})):this.transform(u)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:c="easeInOut",...l}=t,p={duration:a,ease:c,...l},u=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),p]]);return s?this.combineActions(new Le,d=>d.transform(u).clearClip({duration:0})):this.transform(u)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...c}=t,l={duration:s,ease:a,...c},p=o.wipeClipPath(n,100),u=o.wipeClipPath(n,0),d=o.createClipPathTransform([[i?u:p,{duration:0}],[i?p:u,l]]);return r?this.combineActions(new Le,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 De(n,Pe.applyTransform,new A().setContent([t.copy()]));return n.chain(i)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new J(t.map(([n,i])=>({props:{clipPath:n},options:i})))}static circleClipPath(t,n){return`circle(${t}% at ${n})`}static wipeClipPath(t,n){switch(t){case"right":return`inset(0 0 0 ${n}%)`;case"top":return`inset(0 0 ${n}% 0)`;case"bottom":return`inset(${n}% 0 0 0)`;case"left":default:return`inset(0 ${n}% 0 0)`}}show(t){let n=this.chain(),i=t instanceof J?t.copy():new J({opacity:1},t),r=new De(n,Pe.applyTransform,new A().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof J?t.copy():new J({opacity:0},t),r=new De(n,Pe.applyTransform,new A().setContent([i]));return n.chain(r)}};var Qe=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(Qe||{});import{animate as Sa}from"motion/react";var ft=class{requestAnimations(e){let t=e.map(u=>u.start),n=[],i=0,r=[],s=[],a=[];return{onUpdate:u=>(r.push(u),{cancel:()=>{let d=r.indexOf(u);d!==-1&&r.splice(d,1)}}),onComplete:u=>(s.push(u),{cancel:()=>{let d=s.indexOf(u);d!==-1&&s.splice(d,1)}}),onCanceled:u=>(a.push(u),{cancel:()=>{let d=a.indexOf(u);d!==-1&&a.splice(d,1)}}),complete:()=>{i!==e.length&&n.forEach(u=>u.complete())},start:()=>{if(n.length>0)throw new Error("Animation controllers are already started");e.forEach((u,d)=>{n.push(this.requestMotion(u,{onComplete:()=>{t[d]=u.end,r.forEach(h=>h(t)),i++,i===e.length&&s.forEach(h=>h())},onUpdate:h=>{t[d]=h,r.forEach(f=>f(t))}}))})},cancel:()=>{n.forEach(u=>u.cancel()),a.forEach(u=>u())}}}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 Sa(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};ft.AnimationType=Qe;var wn=class extends ft{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new P(`Trying to access text state, but element is not set
|
|
7
|
-
This should not happen, please report this issue to the developers`);return this._element.state}};var ai=class o extends wn{constructor(t,n,i){super();this.textSize=t;this.duration=n;this.easing=i}createTask(){return{animations:[{type:0,start:this.getTextState().fontSize,end:this.textSize,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(t=>({style:{fontSize:`${t}px`}}))]}}copy(){return new o(this.textSize,this.duration,this.easing)}};var Xe=class Xe extends mt{constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=Xe.DefaultUserConfig.create(n),r=Xe.DefaultTextConfig.create(i.get());this.userConfig=i,this.config=r.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(i)}setText(e){let t=this.chain(),n=new Gt(t,Gt.ActionTypes.setText,new A().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new J({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Le,i=>{if(t){let s=new ai(e,t,n);i.chain(this._applyTransition(i,s))}let r=new Gt(i,Gt.ActionTypes.setFontSize,new A().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:Xe.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=Xe.StateSerializer.deserialize(e.state),this.transformState=be.deserialize(e.transformState),this}_init(e){return new De(this.chain(),Pe.init,new A().setContent([e||null,this.config.layer||null]))}reset(){this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig)}getInitialTransformState(e){let[t]=e.extract(Xe.DefaultTextTransformState.keys());return new be(Xe.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new De(e,Pe.applyTransition,new A().setContent([t,n=>n._setElement(this)]))}getInitialState(){return Xe.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};Xe.DefaultUserConfig=new Y({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:""}),Xe.DefaultTextConfig=new Y({alignX:"center",alignY:"center",className:"",layer:void 0}),Xe.DefaultTextState=new Y({fontSize:16,display:!1,text:""}),Xe.DefaultTextTransformState=new Y({fontColor:"#000000",...be.DefaultTransformState.getDefaultConfig()}),Xe.StateSerializer=new $e;var $t=Xe;var kn=class kn extends j{executeAction(e,t){let n=this;if(n.is(kn,"persistent:set")){let[i,r]=n.contentNode.getContent(),s=e.getStorable().getNamespace(n.callee.getNamespaceName()),a=s.get(i);if(typeof r=="function"){let c=s.get(i);s.set(i,r(c))}else s.set(i,r);return e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{s.set(i,c)},[a]),super.executeAction(e,t)}else if(n.is(kn,"persistent:assign")){let[i]=n.contentNode.getContent(),r=e.getStorable().getNamespace(n.callee.getNamespaceName()),s={},a=typeof i=="function"?i(r.getContent()):i;return Object.keys(a).forEach(c=>{s[c]=r.get(c),r.set(c,a[c])}),e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{Object.keys(c).forEach(l=>{r.set(l,c[l])})},[s]),super.executeAction(e,t)}throw this.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("PersistentAction")}};kn.ActionTypes=Sn;var ci=kn;var Ie=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 Re=class Re{static isWord(e){return e instanceof Re}static color(e,t){return Re.isWord(e)?e.copy().assign({color:t}):new Re(e,{color:t})}static bold(e){return Re.isWord(e)?e.copy().assign({bold:!0}):new Re(e,{bold:!0})}static italic(e){return Re.isWord(e)?e.copy().assign({italic:!0}):new Re(e,{italic:!0})}static getText(e){return e.filter(t=>!t.isPause()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=F(Re.defaultConfig,t)}evaluate(e){if(Ie.isPause(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Re.isWord(n)?n.inherit(this.config).evaluate(e):new Re(n,this.config)).flat():Re.isWord(t)?t.inherit(this.config).evaluate(e):[new Re(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this}assign(e){return this.config=F(this.config,e),this}copy(){return new Re(this.text,this.config)}isPause(){return Ie.isPause(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Re.defaultConfig={},Re.defaultColor="#000";var q=Re;var Ye=class Ye{static isSentence(e){return e instanceof Ye}static toSentence(e){return Ye.isSentence(e)?e:new Ye(e)}static format(e){let t=[];if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(this.formatWord(e[n]));else t.push(this.formatWord(e));return t}static formatWord(e){return q.isWord(e)?e:new q(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[q.isWord(e)?e:new q(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(Ye.isSingleWord):Ye.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||q.isWord(e)||Ie.isPause(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=Ye.format(e),this.config=F(Ye.defaultConfig,{...t,voice:typeof t.voice=="string"?me.voice(t.voice):me.toSound(t.voice)}),this.state=Er(Ye.defaultState)}toData(){return null}fromData(e){return this.state=F(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(...Ye.formatStaticWord(i))}return t}copy(){return new Ye([...this.text],this.config)}};Ye.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},Ye.defaultState={};var le=Ye;var Ht=class extends j{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};Ht.ActionTypes=wr;var Se=class o extends
|
|
3
|
+
`).trim():""}function ni(o){return new Promise(e=>setTimeout(e,o))}var ti=class ti{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(ti.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};ti.EventTypes={"event:skipController.abort":"event:skipController.abort"};var H=ti;var Tn=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}},nn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new Tn;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 ii(o,e,t={}){return o?e:t}function Dr(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var Yn=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 Lr(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 Ir(o,e){return new Promise((t,n)=>{fetch(o,e).then(i=>i.blob()).then(i=>{let r=new FileReader;r.onload=()=>{t(r.result)},r.readAsDataURL(i)}).catch(n)})}var bn=class{constructor(e,t){this.concurrency=e;this.delay=t;this.tasks=[]}addTask(e){this.tasks.push(e)}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())),await ni(this.delay),await e()};await e()}};function je(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function Rr(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var $e=class o{constructor(e={},t={}){this.serializer=e;this.deserializer=t}serialize(e){let t={};for(let n of Object.keys(e))n in this.serializer&&e[n]!==void 0?t[n]=this.serializer[n]?.(e[n]):t[n]=e[n];return t}deserialize(e){let t={};for(let n of Object.keys(e))typeof this.deserializer[n]=="function"&&e[n]!==void 0?t[n]=this.deserializer[n](e[n]):t[n]=e[n];return t}extend(e,t){let n={...this.serializer,...e},i={...this.deserializer,...t};return new o(n,i)}};function Nr(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 Mr(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ao(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function co(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"&&!co(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Jn=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Gr(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 Hr(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Zn=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},_n=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 ei=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 Ur(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 Fr(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,c=16777216,l=r*a>>>0,p=r*c+s*a>>>0,u=s*c+(p>>>0)>>>0;e=l,t=u}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var Cn=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=so(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};Cn.ActionTypes={action:"action"};var j=class extends Cn{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 v(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 lo=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},A=class o extends lo{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 oi={center:"center",left:"left",right:"right"};import{animate as ya}from"motion/react";var An=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(An||{}),Or={left:"33.33%",center:"50%",right:"66.66%"},Ze=class Ze{static isUnknown(e){return e===Ze.Unknown}static D2PositionToCSS(e,t=!1,n=!1,i){let r=this.calc(e.y,e.yoffset,i?.height),s=this.calc(e.x,e.xoffset,i?.width),a=n?{bottom:r}:{top:r},c=t?{right:s}:{left:s};return this.wrap({...a,...c})}static calc(e,t,n){if(!e||Ze.isUnknown(e))return"auto";let i=!(t===void 0||Ze.isUnknown(t));if(typeof n=="number"&&n>0){let s=Ze.toPercent(e,n);if(s!==null){let a=i?t/n*100:0;return`${Math.round((s+a)*1e6)/1e6}%`}}return i?`calc(${typeof e=="number"?`${e}px`:e} + ${t}px)`:`calc(${e} + 0px)`}static toPercent(e,t){if(typeof e=="number")return t>0?e/t*100:null;let n=/^(-?\d+(?:\.\d+)?)%$/.exec(e.trim());return n?parseFloat(n[1]):null}static toCoord2D(e){if(nt.isCommonPositionType(e))return _e.fromCommonPosition(e);if(_e.isCoord2DPosition(e))return e;if(zt.isAlignPosition(e))return _e.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 Ze.isUnknown(e)||e===void 0?Ze.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return _e.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:Ze.isUnknown(t.x)?0:t.x,y:Ze.isUnknown(t.y)?0:t.y,xoffset:Ze.isUnknown(t.xoffset)?0:t.xoffset,yoffset:Ze.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(An).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 nt||e instanceof _e||e instanceof zt}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return _e.fromCommonPosition(new nt(e));if(this.isRawAlignPosition(e))return _e.fromAlignPosition(e);if(this.isRawCoord2DPosition(e))return new _e(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}}};Ze.Unknown=Symbol("Unknown");var N=Ze,ri=class ri{static isCommonPositionType(e){return e instanceof ri}constructor(e){this.position=e}toCSS(){return{x:Or[this.position],y:"50%",xoffset:0,yoffset:0}}};ri.Positions=An;var nt=ri,_e=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:Or[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||N.isUnknown(n)?N.Unknown:`${n*100}%`;return new o({x:t(e.xalign),y:t(e.yalign),xoffset:e.xoffset,yoffset:e.yoffset})}static merge(e,t){return new o({x:N.isUnknown(t.x)?e.x:t.x,y:N.isUnknown(t.y)?e.y:t.y,xoffset:N.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:N.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=N.orUnknown(e.x),this.y=N.orUnknown(e.y),this.xoffset=N.orUnknown(e.xoffset),this.yoffset=N.orUnknown(e.yoffset)):(this.x=N.orUnknown(e),this.y=N.orUnknown(t),this.xoffset=N.Unknown,this.yoffset=N.Unknown),this.check()}check(){let e=t=>/^-?\d+(\.\d+)?%$/.test(t);if(typeof this.x=="string"&&!e(this.x))throw new Error(`Invalid x position: ${this.x}`);if(typeof this.y=="string"&&!e(this.y))throw new Error(`Invalid y position: ${this.y}`)}toCSS(){return{x:this.x,y:this.y,xoffset:this.xoffset,yoffset:this.yoffset}}},zt=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=N.orUnknown(e.xalign),this.yalign=N.orUnknown(e.yalign),this.xoffset=N.orUnknown(e.xoffset),this.yoffset=N.orUnknown(e.yoffset)):(this.xalign=N.orUnknown(e),this.yalign=N.orUnknown(t),this.xoffset=N.Unknown,this.yoffset=N.Unknown),this.check()}check(){if(typeof this.xalign=="number"&&isNaN(this.xalign))throw new Error("Invalid xalign position: "+this.xalign);if(typeof this.yalign=="number"&&isNaN(this.yalign))throw new Error("Invalid yalign position: "+this.yalign)}toCSS(){return{x:N.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:N.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var Y=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new uo(this.mergeWithDefaultConfig(e))}copy(){return new o(F({},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)?F({},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}},uo=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(F({},this.config))}join(e){let t=Rr(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 va={[oi.left]:"25.33%",[oi.center]:"50%",[oi.right]:"75.66%"},rt=class rt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new rt(rt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?N.toCoord2D(N.tryParsePosition(e||t)):N.mergePosition(N.tryParsePosition(e),N.tryParsePosition(t))}static mergeState(e,t){if("position"in e&&"position"in t){let n=this.mergePosition(e.position,t.position);return{...Object.assign({},e,t),position:n}}return{...Object.assign({},e,t)}}get(){return this.state}freeze(){return this.frozen=!0,this}assign(e,t){if(this.frozen)throw new Error("Trying to write a frozen transform state.");if(!this.canWrite(e))throw new Error("Trying to write a locked transform state.");return this.state=rt.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 ao(J.constructStyle(e,this.state,t))}toStyle(e,t){return ao(J.constructStyle(e,this.state,t))}serialize(){return rt.TransformStateSerializer.serialize(this.state)}clone(){return new rt(rt.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=rt.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}};rt.DefaultTransformState=new Y({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new nt("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}),rt.TransformStateSerializer=new $e({position:e=>N.serializePosition(N.tryParsePosition(e))},{position:e=>N.toCoord2D(e)});var be=rt,Te=class Te{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Te.defaultConfig,t||{});else{let[n,i]=[e,t||Te.defaultOptions];this.sequences.push({props:n,options:i||Te.defaultOptions}),this.config=Object.assign({},Te.defaultConfig)}}static isPosition(e){return nt.isCommonPositionType(e)||_e.isCoord2DPosition(e)||zt.isAlignPosition(e)}static immediate(e){return new Te(e,{duration:0,ease:"linear"})}static left(e,t){return new Te({position:nt.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Te({position:nt.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Te({position:nt.Positions.Center},{duration:e,ease:t})}static create(e){return new Te([],e)}static positionToCSS(e,t,n,i){return e?N.isRawPosition(e)?N.D2PositionToCSS(N.rawPositionToCoord2D(e),n,t,i):N.D2PositionToCSS(e.toCSS(),n,t,i):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?N.toCoord2D(N.tryParsePosition(e||t)):N.mergePosition(N.tryParsePosition(e),N.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...F(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,c=function(d,h,f){return typeof d>"u"?typeof f<"u"?h(f):"":h(d)},l=s[0]||(r?"":"-")+"50%",p=s[1]||(i?"":"-")+"50%";return[`translate(${l}, ${p})`,c(t.rotation,d=>`rotate(${d}deg)`,0),c(t.scaleX,d=>`scaleX(${d*a})`,1),c(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,c=a&&a.width>0&&a.height>0?{width:a.width,height:a.height}:void 0;return{...Te.positionToCSS(t.position,i,r,c),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?on(t.fontColor):void 0,transform:Te.propToCSSTransform(e,t),...Te.constructVisualEffectStyle(t),...s?s(t):{}}}static constructVisualEffectStyle(e){let t=e;return{maskImage:t.maskImage,WebkitMaskImage:t.maskImage,maskSize:t.maskSize,WebkitMaskSize:t.maskSize,maskPosition:t.maskPosition,WebkitMaskPosition:t.maskPosition,maskRepeat:t.maskRepeat,WebkitMaskRepeat:t.maskRepeat,maskMode:t.maskMode,WebkitMaskMode:t.maskMode,clipPath:t.clipPath,filter:t.filter,backdropFilter:t.backdropFilter,WebkitBackdropFilter:t.backdropFilter,mixBlendMode:t.mixBlendMode}}animate(e,{gameState:t,ref:n,overwrites:i}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:r,sequences:s,options:a}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current});s.length||t.logger.warn("Transform","No sequences to animate.");let c=!1,l=e.lock(),p=ya(s,a),u=()=>{e.overwrite(l,r.get()).unlock(l),p.complete(),c=!0},d=new v().registerSkipController(new H(u)),h=()=>{c||e.overwrite(l,r.get()).unlock(l),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),d.resolve()};return p.then(h,(f=>{t.logger.error("Failed to animate transform. "+(f?.toString?.()||""));try{h()}catch{d.resolve()}})),p.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:r,sequences:s,options:a},this),d}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...Te.defaultOptions};let{duration:t,ease:n,delay:i,at:r}=e;return{duration:this.toSeconds(t,void 0),ease:n,delay:this.toSeconds(i,void 0),at:this.atToSeconds(r)}}constructAnimation({gameState:e,transformState:t,overwrites:n={},current:i}){let r=t.clone(),s=r.lock(),a=this.sequences.map(({props:c,options:l})=>{let p=r.assign(s,c).toFramesDefinition(e,n);return[i,p,this.getOptions(l)]});return{finalState:r.unlock(s).freeze(),sequences:a,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0)}}copy(){return new Te(this.sequences,this.config)}commit(e){if(!this.stagedChanges.length)return this;let t=this.constructCommit(this.stagedChanges,this.getSequenceOptions());return this.sequences.push({props:t.props,options:{...this.getSequenceOptions(),...e}}),this.stagedChanges=[],this}zoom(e){return this.pushChange({key:"zoom",props:e})}scaleX(e){return this.pushChange({key:"scaleX",props:e})}scaleY(e){return this.pushChange({key:"scaleY",props:e})}scale(e,t){return this.pushChange({key:"scaleX",props:e}).pushChange({key:"scaleY",props:t})}rotation(e){return this.pushChange({key:"rotation",props:e})}position(e){return this.pushChange({key:"position",props:e})}opacity(e){return this.pushChange({key:"opacity",props:e})}fontColor(e){return this.pushChange({key:"fontColor",props:e})}effect(e){for(let t of Object.keys(e))this.pushChange({key:t,props:e[t]});return this}maskImage(e){return this.pushChange({key:"maskImage",props:e})}clipPath(e){return this.pushChange({key:"clipPath",props:e})}filter(e){return this.pushChange({key:"filter",props:e})}backdropFilter(e){return this.pushChange({key:"backdropFilter",props:e})}mixBlendMode(e){return this.pushChange({key:"mixBlendMode",props:e})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new de("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 de("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};Te.defaultConfig={sync:!0},Te.defaultOptions={duration:0,ease:"linear"},Te.CommonImagePositionMap=va;var J=Te;var si=class{constructor(){this.id=""}setId(e){this.id=e}getId(){return this.id}reset(){}fromData(e){return this}construct(e){for(let t=0;t<e.length;t++){let n=e[t];t!==0&&e[t-1]?.contentNode.setChild(n.contentNode)}return e}};var Kr=Symbol("_Chained"),Vr;Vr=Kr;var po=class po{constructor(e){this[Vr]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[Kr]}static toActions(e){return e.flat(2).map(t=>po.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()}},Ee=po,rn=class extends si{chain(e){let t=Ee.isChained(this)?this:this.proxy(this,new Ee(this));if(!e)return t;let n=Array.isArray(e)?e:[e];return t.push(...n),t}proxy(e,t){let n=new Proxy(e,{get:function(i,r){if(r in t)return t[r];let s=i[r];return typeof s=="function"?s.bind(n):s},set:function(i,r,s){return i[r]=s,!0}});return n}combineActions(e,t){let n=t(this.chain().newChain()),i=e.do([n]).getActions()[0];return this.chain(i)}};var oe=class extends rn{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var pt=class extends j{executeAction(e,t){let n=this.callee.evaluate(this.contentNode.getContent(),{gameState:e});return n?.length?[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]:super.executeAction(e,t)}getFutureActions(e,t){return[...this.callee._getFutureActions(),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=s=>{let a=s.condition?n?s.condition.toString():"Lambda(unknown)":"null",c=s.action?s.action.map(l=>l.stringify(e,t,n)).join(";"):"null";return`(${a}) {${c}}`};return super.stringifyWithContent("Condition",`if ${r(i.If)} ${i.ElseIf.length>0?`else if ${i.ElseIf.map(r).join(";")} `:""}${i.Else?`else {${r(i.Else)}}`:""}`)}};pt.ActionTypes=xr;var dt=class o{static isSerializable(e){return["number","string","boolean"].includes(typeof e)||e instanceof Date||e==null?!0:Array.isArray(e)?e.every(o.isSerializable):typeof e=="object"?Object.getPrototypeOf(e)===Object.prototype&&Object.values(e).every(o.isSerializable):!1}constructor(e,t,n){this.name=e,this.key=n||e,this.content=F({},t),this.defaultContent=t}set(e,t){return o.isSerializable(t)?(this.content[e]=t,this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
|
|
4
|
+
at namespace "${this.name}"`),this.content[e]=t,this)}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(){return this.content=F({},this.defaultContent),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)})}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e){let t={any:i=>({type:"any",data:i}),date:i=>({type:"date",data:i.toString()})},n=this.toTypeName(e);return t[n](e)}unwrap(e){return{any:n=>n.data,date:n=>new Date(n.data)}[e.type](e)}},xn=class{constructor(){this.namespaces={}}static createNamespace(e,t,n){return new dt(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,this}getNamespace(e){if(!this.namespaces[e])throw new E(`Namespace ${e} is not initialized, did you forget to register it?
|
|
5
|
+
Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]=t,this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return 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)}toData(){return this.entries().reduce((e,[t,n])=>(e[t]=n.toData(),e),{})}load(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.namespaces[t]||(this.namespaces[t]=new dt(t,{})),this.namespaces[t].deserialize(n)})}clear(){return this.namespaces={},this}};var qe=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===kt.play){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.stop){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=v.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,c=>{c&&this.callee.fromData(c)},[s]),a}else if(this.type===kt.setRate){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.pause){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.resume){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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===kt.mute){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=v.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")}};qe.ActionTypes=kt;var Mt=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(Mt||{}),ve=class ve extends oe{static toSound(e){return e==null?null:typeof e=="string"?new ve({src:e}):e}static isSound(e){return e instanceof ve}static voice(e){let t=typeof e=="string"?{src:e}:e;return new ve({...t,type:"voice"})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new ve({...t,type:"bgm"})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new ve({...t,type:"sound"})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=ve.DefaultUserConfig.create(t),[i]=n.extract(ve.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){if(this.config.type==="bgm")throw new xe(`Sound (src: ${this.config.src}) is marked as bgm, but it is being played as a normal sound.
|
|
6
|
+
To prevent unintended behavior, the sound marked as bgm cannot be played using \`play()\`.`);return this.pushAction(qe.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(qe.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(qe.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(qe.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(qe.ActionTypes.setRate,[e])}pause(e){return this.pushAction(qe.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(qe.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}getSrc(){return this.config.src}toData(){return{state:ve.StateSerializer.serialize(this.state)}}fromData(e){return this.state=ve.StateSerializer.deserialize(e.state),this}copy(){return new ve(this.userConfig.get())}reset(){return this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return ve.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new qe(this.chain(),e,new A().setContent(t)))}};ve.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",ve.DefaultUserConfig=new Y({src:ve.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,type:"sound"}),ve.DefaultConfig=new Y({src:ve.noSound,loop:!1,streaming:!1,seek:0,type:"sound"}),ve.DefaultState=new Y({volume:1,rate:1,paused:!1,muted:!1}),ve.StateSerializer=new $e;var me=ve;var op={};var sn=class extends rn{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let c=a.getFutureActions(e,i).filter(l=>!r.has(l));s.push(...c)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var Bt=class Bt{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===Bt.SrcTypes.image?t.add(s):r===Bt.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 I?I.getSrcURL(e):e.type==="image"?I.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(te,$.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(x.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof re){let n=t;if(t.is(re,Je.setSrc)){let i=t.contentNode.getContent()[0];if(x.isImageSrc(i))return{type:"image",src:x.srcToURL(i),activeType:"scene"}}else{if(t.type===Je.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===Je.setAppearance){let i=t.contentNode.getContent()[0];if(I.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(I.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:I.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 me){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof I||x.isStaticImageData(e)){if(e instanceof I){if(!x.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(I.getSrcURL(e)))return this}else if(this.isSrcRegistered(x.srcToURL(e.src)))return this;this.src.push({type:"image",src:x.isStaticImageData(e)?x.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 me?t:new me({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 me?e.getSrc():e;return this.src.some(n=>n.type===Bt.SrcTypes.audio?t===n.src.getSrc():n.type===Bt.SrcTypes.image?t===I.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)}};Bt.SrcTypes={image:"image",video:"video",audio:"audio"};var Ue=Bt;var Gt=class extends j{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Xn.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===Xn.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")}};Gt.ActionTypes=Xn;var De=class extends j{executeAction(e,t){if(this.type===Pe.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===Pe.applyTransition){let[n,i]=this.contentNode.getContent(),r=this.callee,s=i?i(n):n;return this.applyTransition(e,r,s,t)}else if(this.type===Pe.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}throw this.unknownTypeError()}applyTransform(e,t,n,i,r){let s=new v().registerSkipController(new H(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},c=e.getExposedStateForce(t),l=t.transformState.clone(),p=c.applyTransform(n,a),u=e.timelines.attachTimeline(s).attachChild(p);return p.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},d=>{s.isSettled()||s.abort(),p.abort(),t.transformState.forceOverwrite(d.state)},[l]),s}applyTransition(e,t,n,i,r){let s=new v().registerSkipController(new H(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},l=e.getExposedStateForce(t).applyTransition(n,a),p=e.timelines.attachTimeline(s).attachChild(l);return l.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:p},()=>{s.isSettled()||s.abort(),l.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let l=e.findElementByDisplayable(this.callee,i);l&&e.disposeDisplayable(n,l.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new v().registerSkipController(new H(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,l=>{l.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let c=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:c},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};De.ActionTypes=Pe;var mt=class o extends oe{constructor(){super(...arguments);this.srcManager=new Ue}pos(t,n,i){return this.transform(new J({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new J({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new J({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new J({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new J({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new J({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new J({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new J(t,n))}mask(t,n={}){let i=x.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c,...l}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c},l)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:c="easeInOut",...l}=t,p={duration:a,ease:c,...l},u=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),p]]);return s?this.combineActions(new Le,d=>d.transform(u).clearClip({duration:0})):this.transform(u)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:c="easeInOut",...l}=t,p={duration:a,ease:c,...l},u=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),p]]);return s?this.combineActions(new Le,d=>d.transform(u).clearClip({duration:0})):this.transform(u)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...c}=t,l={duration:s,ease:a,...c},p=o.wipeClipPath(n,100),u=o.wipeClipPath(n,0),d=o.createClipPathTransform([[i?u:p,{duration:0}],[i?p:u,l]]);return r?this.combineActions(new Le,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 De(n,Pe.applyTransform,new A().setContent([t.copy()]));return n.chain(i)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new J(t.map(([n,i])=>({props:{clipPath:n},options:i})))}static circleClipPath(t,n){return`circle(${t}% at ${n})`}static wipeClipPath(t,n){switch(t){case"right":return`inset(0 0 0 ${n}%)`;case"top":return`inset(0 0 ${n}% 0)`;case"bottom":return`inset(${n}% 0 0 0)`;case"left":default:return`inset(0 ${n}% 0 0)`}}show(t){let n=this.chain(),i=t instanceof J?t.copy():new J({opacity:1},t),r=new De(n,Pe.applyTransform,new A().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof J?t.copy():new J({opacity:0},t),r=new De(n,Pe.applyTransform,new A().setContent([i]));return n.chain(r)}};var Qe=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(Qe||{});import{animate as Sa}from"motion/react";var ft=class{requestAnimations(e){let t=e.map(u=>u.start),n=[],i=0,r=[],s=[],a=[];return{onUpdate:u=>(r.push(u),{cancel:()=>{let d=r.indexOf(u);d!==-1&&r.splice(d,1)}}),onComplete:u=>(s.push(u),{cancel:()=>{let d=s.indexOf(u);d!==-1&&s.splice(d,1)}}),onCanceled:u=>(a.push(u),{cancel:()=>{let d=a.indexOf(u);d!==-1&&a.splice(d,1)}}),complete:()=>{i!==e.length&&n.forEach(u=>u.complete())},start:()=>{if(n.length>0)throw new Error("Animation controllers are already started");e.forEach((u,d)=>{n.push(this.requestMotion(u,{onComplete:()=>{t[d]=u.end,r.forEach(h=>h(t)),i++,i===e.length&&s.forEach(h=>h())},onUpdate:h=>{t[d]=h,r.forEach(f=>f(t))}}))})},cancel:()=>{n.forEach(u=>u.cancel()),a.forEach(u=>u())}}}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 Sa(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};ft.AnimationType=Qe;var wn=class extends ft{_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
|
|
7
|
+
This should not happen, please report this issue to the developers`);return this._element.state}};var ai=class o extends wn{constructor(t,n,i){super();this.textSize=t;this.duration=n;this.easing=i}createTask(){return{animations:[{type:0,start:this.getTextState().fontSize,end:this.textSize,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(t=>({style:{fontSize:`${t}px`}}))]}}copy(){return new o(this.textSize,this.duration,this.easing)}};var Xe=class Xe extends mt{constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=Xe.DefaultUserConfig.create(n),r=Xe.DefaultTextConfig.create(i.get());this.userConfig=i,this.config=r.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(i)}setText(e){let t=this.chain(),n=new Gt(t,Gt.ActionTypes.setText,new A().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new J({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new Le,i=>{if(t){let s=new ai(e,t,n);i.chain(this._applyTransition(i,s))}let r=new Gt(i,Gt.ActionTypes.setFontSize,new A().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:Xe.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=Xe.StateSerializer.deserialize(e.state),this.transformState=be.deserialize(e.transformState),this}_init(e){return new De(this.chain(),Pe.init,new A().setContent([e||null,this.config.layer||null]))}reset(){this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig)}getInitialTransformState(e){let[t]=e.extract(Xe.DefaultTextTransformState.keys());return new be(Xe.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new De(e,Pe.applyTransition,new A().setContent([t,n=>n._setElement(this)]))}getInitialState(){return Xe.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};Xe.DefaultUserConfig=new Y({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:""}),Xe.DefaultTextConfig=new Y({alignX:"center",alignY:"center",className:"",layer:void 0}),Xe.DefaultTextState=new Y({fontSize:16,display:!1,text:""}),Xe.DefaultTextTransformState=new Y({fontColor:"#000000",...be.DefaultTransformState.getDefaultConfig()}),Xe.StateSerializer=new $e;var $t=Xe;var kn=class kn extends j{executeAction(e,t){let n=this;if(n.is(kn,"persistent:set")){let[i,r]=n.contentNode.getContent(),s=e.getStorable().getNamespace(n.callee.getNamespaceName()),a=s.get(i);if(typeof r=="function"){let c=s.get(i);s.set(i,r(c))}else s.set(i,r);return e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{s.set(i,c)},[a]),super.executeAction(e,t)}else if(n.is(kn,"persistent:assign")){let[i]=n.contentNode.getContent(),r=e.getStorable().getNamespace(n.callee.getNamespaceName()),s={},a=typeof i=="function"?i(r.getContent()):i;return Object.keys(a).forEach(c=>{s[c]=r.get(c),r.set(c,a[c])}),e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{Object.keys(c).forEach(l=>{r.set(l,c[l])})},[s]),super.executeAction(e,t)}throw this.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("PersistentAction")}};kn.ActionTypes=Sn;var ci=kn;var Ie=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 Re=class Re{static isWord(e){return e instanceof Re}static color(e,t){return Re.isWord(e)?e.copy().assign({color:t}):new Re(e,{color:t})}static bold(e){return Re.isWord(e)?e.copy().assign({bold:!0}):new Re(e,{bold:!0})}static italic(e){return Re.isWord(e)?e.copy().assign({italic:!0}):new Re(e,{italic:!0})}static getText(e){return e.filter(t=>!t.isPause()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=F(Re.defaultConfig,t)}evaluate(e){if(Ie.isPause(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Re.isWord(n)?n.inherit(this.config).evaluate(e):new Re(n,this.config)).flat():Re.isWord(t)?t.inherit(this.config).evaluate(e):[new Re(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this}assign(e){return this.config=F(this.config,e),this}copy(){return new Re(this.text,this.config)}isPause(){return Ie.isPause(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Re.defaultConfig={},Re.defaultColor="#000";var q=Re;var Ye=class Ye{static isSentence(e){return e instanceof Ye}static toSentence(e){return Ye.isSentence(e)?e:new Ye(e)}static format(e){let t=[];if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(this.formatWord(e[n]));else t.push(this.formatWord(e));return t}static formatWord(e){return q.isWord(e)?e:new q(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[q.isWord(e)?e:new q(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(Ye.isSingleWord):Ye.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||q.isWord(e)||Ie.isPause(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=Ye.format(e),this.config=F(Ye.defaultConfig,{...t,voice:typeof t.voice=="string"?me.voice(t.voice):me.toSound(t.voice)}),this.state=Er(Ye.defaultState)}toData(){return null}fromData(e){return this.state=F(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(...Ye.formatStaticWord(i))}return t}copy(){return new Ye([...this.text],this.config)}};Ye.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},Ye.defaultState={};var le=Ye;var Ht=class extends j{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};Ht.ActionTypes=wr;var Se=class o extends oe{static getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}static execute(e){return new o(e)}constructor(e){super(),this.handler=e;let t=this.chain(),n=new Ht(t,Ht.ActionTypes.action,new A().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new Ht(this.chain(),Ht.ActionTypes.action,new A().setContent(e))]}};var li=class{constructor(e){this.config=e;this.watching=null;this.warnings=[]}observe(e){return this.watching=e,this}warn(e,t){return this.warnings.push([e,t]),this.watching?.logger.warn(t),t}getWarnings(){return[...this.warnings]}};var we=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()}),je(()=>{this.preventAttach()})}static proxy(e){let t=new v,n=new v,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 v,n=new v,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 v,n=new v,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let c=e[a];i.attachChild(c),c.then(l=>{r[a]=l,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new v,s=()=>{if(i){let a;i.onSkipControllerRegister(c=>{a=c.onAbort(()=>{r.abort()})}),i.then(c=>{a?.cancel(),n=c,i=e(c),i?je(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new H(()=>(i&&i.abort(),t))),i=e(t),i?je(()=>s()):je(()=>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()?je(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.
|
|
8
8
|
Timeline attaching is only allowed synchronously after the timeline is created.
|
|
9
|
-
Current _ableToAttach: `+this._ableToAttach);let t=v.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())}},ui=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof we?e:new we(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 an=class an extends j{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:me.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}executeAction(e,t){if(this.type===en.say){let n=null,i="",r=null,s=new v(g=>g).registerSkipController(new H(()=>{n?.()})),a=new we(s),c=this.contentNode.getContent(),l=e.isNvlMode(),p=e.getLiveGame(),u=e.createPresentationSnapshot(),d=p.lastDialog?{sentence:p.lastDialog.sentence,speaker:p.lastDialog.speaker}:null,h=an.getVoice(e,c);if(h){let g=e.audioManager.play(h);a.attachChild(g)}let f=h?e.events.on(
|
|
9
|
+
Current _ableToAttach: `+this._ableToAttach);let t=v.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())}},ui=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof we?e:new we(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 an=class an extends j{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:me.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}executeAction(e,t){if(this.type===en.say){let n=null,i="",r=null,s=new v(g=>g).registerSkipController(new H(()=>{n?.()})),a=new we(s),c=this.contentNode.getContent(),l=e.isNvlMode(),p=e.getLiveGame(),u=e.createPresentationSnapshot(),d=p.lastDialog?{sentence:p.lastDialog.sentence,speaker:p.lastDialog.speaker}:null,h=an.getVoice(e,c);if(h){let g=e.audioManager.play(h);a.attachChild(g)}let f=h?e.events.on(P.EventTypes["event:state.player.lineEnd"],()=>{let g=an.endVoiceWithPreference(e,h);g&&e.timelines.attachTimeline(g),f?.cancel()}):null;if(l){let g=this.getId(),m=(e.getActiveNvlDialogForAction(g)||e.getLatestNvlDialogForAction(g))?.id||e.allocateNvlDialogId(g),y=c.evaluate(Se.getCtx({gameState:e}));i=q.getText(y),p.events.emit(ht.EventTypes["event:character.prompt"],{character:c.config.character,sentence:c,text:i});let S=!1,L=()=>{S||(S=!0,e.events.emit(P.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(b),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:C}=e.ensureNvlDialog({id:m,actionId:g,character:this.callee,sentence:c,text:i});r=m;let R=e.consumeNvlTypingSuppression(),B=C&&!R?"typing":"awaitAdvance";e.activateNvlDialog(m,B,!C);let K=e.waitForNvlAdvance(m,()=>{e.settleNvlDialog(m),L()});n=()=>{K.cancel()}}else{let g=e.idManager.generateId(),T=e.createDialog(g,c,()=>{e.settleAdvDialog(g),e.gameHistory.resolvePending(b),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(g,this.getId()),i=T.text,n=()=>{e.settleAdvDialog(g),T.cancel()}}p.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:b}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(f?.cancel(),h&&e.audioManager.isPlaying(h)){let g=an.endVoiceWithPreference(e,h);g&&a.attachChild(g)}n?.(),r&&(e.removeNvlDialog(r),e.settleNvlDialog(r)),e.restorePresentationSnapshot(u),d?p.setLastDialog(d.sentence,d.speaker):p.lastDialog=null});return e.gameHistory.push({token:b,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,character:this.callee.state.name},isPending:!0}),s}else if(this.type===en.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")}};an.ActionTypes=en;var st=an;var Pn=class Pn extends oe{constructor(e,t={}){super(),this.config=F(Pn.defaultConfig,t),this.state={name:e||""};let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(c=>typeof c=="string")&&[t,...n].length>0&&[t,...n].every(c=>le.isSingleWord(c))){let c=e,l=le.format([t,...n]),p=new le(Lr(c,l),{character:this}),u=new st(this.chain(),st.ActionTypes.say,new A().setContent(p));return this.chain(u)}let i=t||{},r=e,s=Array.isArray(r)?new le(r,{...i,character:this}):(le.isSentence(r)?r:new le(r,{...i,character:this})).copy();s.setCharacter(this);let a=new st(this.chain(),st.ActionTypes.say,new A().setContent(s));return this.chain(a)}setName(e){let t=new st(this.chain(),st.ActionTypes.setName,new A().setContent([e]));return this.chain(t)}setAvatar(e){return this.config.avatar=e===null?null:e,this}addPortrait(e,t={}){return this.config.portraits.push({image:e,avatar:t.avatar}),this}setPortraits(e){return this.config.portraits=[...e],this}apply(e,t,...n){return this.say.apply(this,[e,t,...n])}call(e,t,...n){return Array.isArray(e)&&"raw"in e?t&&le.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):le.isSentence(e)?this.say(e):this.say(e,t)}};Pn.defaultCharacterColor="#000",Pn.defaultConfig={portraits:[]};var pi=Pn,Pt=new pi(null);var O=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()})`}},mo=class o extends oe{constructor(){super();this.conditions={If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static getInitialState(){return{If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static If(t,n){return new o().createIfCondition(t,n)}ElseIf(t,n){if(this.conditions.Else.action)throw new xe(`ELSE condition already set
|
|
10
10
|
You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:O.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new xe(`ELSE condition already set
|
|
11
|
-
You are trying to set multiple ELSE conditions for the same condition`);return this.conditions.Else.action=this.construct(Array.isArray(t)?t:[t]),this.chain()}evaluate(t,{gameState:n}){let i={gameState:n};if(t.If.condition?.evaluate(i)?.value)return t.If.action||null;for(let s of t.ElseIf)if(s.condition?.evaluate(i)?.value)return s.action||null;return t.Else.action||null}fromChained(t){return[Reflect.construct(pt,[this,pt.ActionTypes.action,new A().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,c=r[s+1]?.contentNode;c&&a.setChild(c),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return Ee.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=O.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new pt(i,pt.ActionTypes.action,new A().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Pt.say(n).getActions():Ee.toActions([n]))}};var di=class di extends
|
|
12
|
-
To prevent unintended behavior and unexpected results, the sound have to be marked as voice. Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Ve}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t){return new $e({backgroundImage:n=>n.toData(),backgroundMusic:n=>n?.toData()||null},{backgroundImage:n=>t.state.backgroundImage.fromData(n),backgroundMusic:n=>t.state.backgroundMusic&&n?t.state.backgroundMusic.fromData(n):null})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.chain().chain(Le.do([this.background.char(t,n)]))}jumpTo(t,n={}){return this.combineActions(new Le({allowFutureScene:!1}),i=>{let s=F({},n instanceof ft?{transition:n}:n);return i.chain(new te(i,"scene:preUnmount",new A().setContent([]))).chain(this._initScene(t))._transitionToScene(s.transition,t.state.backgroundImage.state.currentSrc).chain(this._exit()),i})._jumpTo(t)}setBackgroundMusic(t,n){return this.chain(new te(this.chain(),$.setBackgroundMusic,new A().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new En(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},p=new te(this.chain(),$.nvlEnd,new A().setContent([l])),u=[...c,p];super.constructNodes(u);let d=new te(this.chain(),$.nvlBlock,new A().setContent([u,l]));return this.chain(d)}action(t){return this.actions=t,this}preloadImage(t){if(!x.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:Ve.getStateSerializer(this).serialize(this.state)}}fromData(t){return this.state=Ve.getStateSerializer(this).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new te(this.chain(),"scene:action",new A);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(f=>Ee.isChained(f)?f.fromChained(f):f).flat(2),s=[],a=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(f=>{Ee.isChained(f)||(f instanceof
|
|
11
|
+
You are trying to set multiple ELSE conditions for the same condition`);return this.conditions.Else.action=this.construct(Array.isArray(t)?t:[t]),this.chain()}evaluate(t,{gameState:n}){let i={gameState:n};if(t.If.condition?.evaluate(i)?.value)return t.If.action||null;for(let s of t.ElseIf)if(s.condition?.evaluate(i)?.value)return s.action||null;return t.Else.action||null}fromChained(t){return[Reflect.construct(pt,[this,pt.ActionTypes.action,new A().setContent(t.conditions)])]}construct(t,n,i){let r=this.narrativeToActions(t);for(let s=0;s<r.length;s++){let a=r[s].contentNode,c=r[s+1]?.contentNode;c&&a.setChild(c),s===r.length-1&&n&&a.setChild(n),s===0&&i&&i.setChild(a)}return r}_getFutureActions(){return Ee.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=O.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new pt(i,pt.ActionTypes.action,new A().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Pt.say(n).getActions():Ee.toActions([n]))}};var di=class di extends oe{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new dt(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(Sn.set,[e,t]))}assign(e){return this.chain(this.createAction(Sn.assign,[e]))}equals(e,t){return new O(n=>{let i=n.storable.getNamespace(this.namespace),r=O.isLambda(t)||O.isLambdaHandler(t)?O.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new O(n=>{let i=n.storable.getNamespace(this.namespace),r=O.isLambda(t)||O.isLambdaHandler(t)?O.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new O(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new O(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new O(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new q(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new q(i=>O.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new O(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=di.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new ci(this.chain(),e,A.create(t))}};di.NamespacePrefix="persistent";var cn=di,mi=class mi extends cn{constructor(e){super(e,{}),this.namespace=this.prefix(e,mi.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new dt(this.namespace,this.defaultContent))}};mi.LocalNamespacePrefix="local";var ln=mi;var un=class extends j{executeAction(e,t){if(this.type===Wt.action)return super.executeAction(e,t);if(this.type===Wt.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")}};un.ActionTypes=Wt;var it=class it extends mt{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 un(this.chain(),Wt.setZIndex,new A().setContent([e])))}toData(){return{state:it.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=it.StateSerializer.deserialize(e.state),this.transformState=be.deserialize(e.transformState),this}copy(){return new it(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new un(this.chain(),Wt.action,new A),new De(this.chain(),Pe.init,new A().setContent([e,null,!1]))]}getInitialState(){return it.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(be.DefaultTransformState.keys());return new be(be.DefaultTransformState.create(e.get()).get())}};it.DefaultUserConfig=new Y({zIndex:0,...be.DefaultTransformState.getDefaultConfig(),opacity:1}),it.DefaultConfig=new Y({name:"(anonymous)",zIndex:0}),it.StateSerializer=new $e,it.DefaultState=new Y({zIndex:0});var pn=it;var En=class extends oe{constructor(e){super(),this.scene=e}show(e){let t=new te(this.scene.chain(),$.nvlShow,new A().setContent([e]));return this.chain(t)}hide(e){let t=new te(this.scene.chain(),$.nvlHide,new A().setContent([e]));return this.chain(t)}end(){let e=new te(this.scene.chain(),$.nvlEnd,new A().setContent([]));return this.chain(e)}};var Ve=class Ve extends sn{constructor(t,n){super();this.srcManager=new Ue;this.events=new X;this.actions=[];this._futureActions_=[];let i=Ve.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=Ve.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=Ve.DefaultUserConfig.create(n),a=Ve.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 ln(t)}static validateVoice(t){if(t.config.type!=="voice"&&t.config.type!=="sound")throw new xe(`Voice must be a voice, but got ${t.config.type}.
|
|
12
|
+
To prevent unintended behavior and unexpected results, the sound have to be marked as voice. Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Ve}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t){return new $e({backgroundImage:n=>n.toData(),backgroundMusic:n=>n?.toData()||null},{backgroundImage:n=>t.state.backgroundImage.fromData(n),backgroundMusic:n=>t.state.backgroundMusic&&n?t.state.backgroundMusic.fromData(n):null})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.chain().chain(Le.do([this.background.char(t,n)]))}jumpTo(t,n={}){return this.combineActions(new Le({allowFutureScene:!1}),i=>{let s=F({},n instanceof ft?{transition:n}:n);return i.chain(new te(i,"scene:preUnmount",new A().setContent([]))).chain(this._initScene(t))._transitionToScene(s.transition,t.state.backgroundImage.state.currentSrc).chain(this._exit()),i})._jumpTo(t)}setBackgroundMusic(t,n){return this.chain(new te(this.chain(),$.setBackgroundMusic,new A().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new En(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},p=new te(this.chain(),$.nvlEnd,new A().setContent([l])),u=[...c,p];super.constructNodes(u);let d=new te(this.chain(),$.nvlBlock,new A().setContent([u,l]));return this.chain(d)}action(t){return this.actions=t,this}preloadImage(t){if(!x.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:Ve.getStateSerializer(this).serialize(this.state)}}fromData(t){return this.state=Ve.getStateSerializer(this).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new te(this.chain(),"scene:action",new A);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(f=>Ee.isChained(f)?f.fromChained(f):f).flat(2),s=[],a=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(f=>{Ee.isChained(f)||(f instanceof I?s.push(f):f instanceof $t&&a.push(f))});let c=[],l=[],p=new Map;s.forEach(f=>{f.config.isWearable?l.push(f):f.config.autoInit&&c.push(f);for(let b of f.config.wearables){if(p.get(b)&&p.get(b)!==f)throw new Error(`Wearable image cannot be used multiple times
|
|
13
13
|
Maybe you bind the same wearable image to multiple parent images
|
|
14
14
|
Parent Conflict (src: `+p.get(b)?.state.currentSrc+`)
|
|
15
|
-
Current Parent (src: `+f.state.currentSrc+")");p.set(b,f)}});let u=[...this._initScene(this),...c.map(f=>f._init(this)),...l.map(f=>{if(!p.has(f))throw new Error("Wearable image must have a parent image");return p.get(f)._initWearable(f)}),...a.map(f=>f._init()),...r],d=super.constructNodes(u),h=new A(this.sceneRoot,void 0,d||void 0).setContent(this);return d?.setParent(h),this.sceneRoot?.setContentNode(h),this._futureActions_=u,this}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Pt.say(n).getActions():Ee.toActions([n]))}isSceneRootConstructed(){return!!this.sceneRoot}registerSrc(t,n=new Set){if(!this.sceneRoot)return;let i=new Set,r=new Set,s=[this.sceneRoot],a=new Set;for(;s.length;){let c=s.shift();if(!i.has(c)){if(i.add(c),c instanceof te){let l=c.callee;if(x.isImageSrc(l.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:x.srcToURL(l.state.backgroundImage.state.currentSrc)}),c.type===$.jumpTo){let p=c,u=Ve.getScene(t,p.contentNode.getContent()[0]);if(!u)throw c._sceneNotFoundError(c.getSceneName(p.contentNode.getContent()[0]));let d=Ue.getPreloadableSrc(t,c);if(d&&this.srcManager.register(d),r.has(p)||n.has(u))continue;r.add(p),a.add(u),n.add(u)}}else if(c instanceof
|
|
16
|
-
To prevent unintended behavior and unexpected results, the sound have to be marked as bgm. Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new N({src:t.background,opacity:1,autoFit:!0,name:`[[Background Image of ${this.config.name}]]`,layer:this.config.defaultBackgroundLayer})._setIsBackground(!0),i=t.backgroundMusic?this.state?.backgroundMusic?this.state.backgroundMusic.reset():t.backgroundMusic:null;return{backgroundImage:n,backgroundMusic:i}}_jumpTo(t){return this.chain(new te(this.chain(),"scene:jumpTo",new A().setContent([t])))}_exit(){return new te(this.chain(),"scene:exit",new A().setContent([]))}_transitionToScene(t,n){let i=this.chain();if(t&&n){let r=this.state.backgroundImage.char(n,t);i.chain(r.getActions())}return i}_init(t){return new te(this.chain(),"scene:init",new A().setContent([t]))}_initScene(t){return[t._init(t),...t.config.layers.flatMap(n=>n._init(t)),...t._initBackground(t,t.config.defaultBackgroundLayer)]}_initBackground(t,n){return[t.state.backgroundImage._init(t,n)]}};Ve.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"},Ve.DefaultUserConfig=new Y({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Ve.DefaultSceneConfig=new Y({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new pn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new pn("[[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=>{me.isSound(r)&&Ve.validateVoice(r)}),i(t))return t;throw new xe(`Invalid voices config: ${t}`)}});var et=Ve;import*as Yr from"howler";var fi=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 Ta={volume:1,limit:1/0},ba=class Br{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={...Ta,...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 Br(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}}},$r=!1;function Ca(o){$r=o}function Ut(o,e){$r||(e!==void 0?console.warn(o,e):console.warn(o))}var Aa=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){Ut("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){Ut("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=o=>{this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){Ut("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){this.currentSource instanceof AudioBufferSourceNode?this.currentSource.start(o,e):this.currentSource instanceof HTMLAudioElement&&this.currentSource.play()}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},zr=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}},xa=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 Aa(o,this.gainNode),this.sourceController.setSource(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1;try{this.gainNode.disconnect()}catch(e){Ut("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){Ut("Failed to disconnect gain node on stop().",o)}}setRate(o){o=Math.max(.001,o),this.rate=o;let e=this.sourceController.getSource();return e instanceof HTMLAudioElement?e.playbackRate=o:e instanceof AudioBufferSourceNode&&(e.playbackRate.value=o),this}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new zr(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new zr(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}},wa=class{constructor(o){this.alive=!0,this.refCount=0,this.audioBuffer=o}addRef(){this.refCount++}releaseRef(){this.refCount>0&&this.refCount--}getRefCount(){return this.refCount}async unload(){this.refCount>0||(this.alive=!1)}async forceUnload(){this.alive=!1,this.refCount=0}isAlive(){return this.alive}raw(){if(!this.alive)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}},ka=10*1024*1024,Pa=class{constructor(o){this.cache=new Map,this.loadingPromises=new Map,this.audioContext=o}async load(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.doLoad(o);this.loadingPromises.set(o,n);try{let i=await n;return this.cache.set(o,i),i}finally{this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new wa(t)}clear(){for(let o of this.cache.values())o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){return{cached:this.cache.size,loading:this.loadingPromises.size}}},Ea={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},jr=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...Ea,...o},Ca(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Pa(this.audioContext),this.masterChannel=new ba("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(o=>{let e=()=>{if(this.destroyed){this.clearUnlockHandler(),o();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,o())}).catch(t=>{Ut("Failed to resume AudioContext while unlocking.",t)})};this.unlockHandler=e,document.addEventListener("click",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",e)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let o=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",o),document.removeEventListener("touchstart",o),document.removeEventListener("keydown",o)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(o,e,t){this.ensureNotDestroyed(),this.ensureReady();let{volume:n=1,rate:i=1,startTime:r=0,endTime:s,load:a="auto",loop:c=!1}=e??{},l,p=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")l=this.createStreamSource(o);else{p=await this.audioCache.load(o),p.addRef?.();let d=this.audioContext.createBufferSource();d.buffer=p.raw(),l=d}else{p=o,p.addRef?.();let d=this.audioContext.createBufferSource();d.buffer=o.raw(),l=d}let u=new xa(this.audioContext,l,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(l instanceof AudioBufferSourceNode?(l.loop=c,c&&s!==void 0&&(l.loopStart=r,l.loopEnd=s)):l instanceof HTMLAudioElement&&(l.loop=c),p){let d=!1,h=()=>{d||(d=!0,p.releaseRef?.())};u.once("ended",h),u.once("stop",h)}return u}async resolveLoadMode(o,e){if(e==="stream"||e==="full")return e;try{let t=await fetch(o,{method:"HEAD"});if(!t.ok)return"stream";let n=t.headers.get("Content-Length");if(!n)return"stream";let i=parseInt(n,10);return isNaN(i)?"stream":i<ka?"full":"stream"}catch(t){return Ut("Failed to resolve load mode via HEAD request, falling back to 'stream'.",t),"stream"}}createStreamSource(o){let e=new Audio(o);return e.crossOrigin="anonymous",e}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(o){this.registeredChannels.add(o)}unregisterChannel(o){this.registeredChannels.delete(o)}setVolume(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(o),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(o){return this.ensureNotDestroyed(),this.ensureReady(),o===void 0?this.masterChannel.mute():this.masterChannel.mute(o),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(o,e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(o,e)}getChannel(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(o)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(o){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(o)}async play(o,e){this.ensureNotDestroyed(),this.ensureReady();let t=this.masterChannel.getTokens();for(let n of t)try{n.stop()}catch{}return this.masterChannel.play(o,e)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(o=>{Ut("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var hi=class{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.channelVolumes=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1;Object.values(Mt).forEach(t=>{this.channelVolumes.set(t,1)})}initialize(){if(this.isReady||this.isInitializing)return;let e=new jr;this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),Object.values(Mt).forEach(t=>{let n=this.channelVolumes.get(t)??1,i=e.getChannel(t)??e.createChannel(t,{volume:n});i.setVolume(n),this.channels.set(t,i)}),this.isReady=!0,this.isInitializing=!1,this.setupGroupVolume()}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}play(e,t={end:1,duration:0}){let n=new v;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channels.get(e.config.type),r=await this.sound.load(e.config.src),s=await i.play(r,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),a=e.state.muted??!1;s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:r,originalVolume:t.end}),t.duration>0?await s.fade(0,t.end,t.duration).finished:s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(c=>{s.once("ended",()=>c())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t={end:1,duration:0}){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channels.get(e.config.type);if(!n)throw new P(`Channel not found for sound type: "${e.config.type}"`);let i=await this.sound.load(e.config.src),r=await n.play(i,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),s=e.state.muted??!1;return r.mute(s),e.state.muted=s,this.state.set(e,{token:r,cachedAudio:i,originalVolume:t.end}),t.duration>0?r.fade(0,t.end,t.duration):r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,r}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new v;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new v;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 v;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}pause(e,t=0){let n=new v;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new v;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),i.token.fade(0,i.originalVolume,t).finished.then(()=>{e.state.paused=!1,n.resolve()})),n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,v.resolve(void 0)):v.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime()}]),groups:[...this.channelVolumes.entries()].map(([e,t])=>[e,t])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setGroupVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r)throw new P(`Sound not found (id: "${n}")
|
|
17
|
-
NarraLeaf cannot find the element with the id from the saved game`);this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channels.get(e.config.type),i=await this.sound.load(e.config.src),r=await n.play(i,{volume:e.state.volume,startTime:t.position,loop:e.config.loop,rate:1});this.state.set(e,{token:r,cachedAudio:i,originalVolume:e.state.volume});let s=e.state.muted??!1;r.mute(s),e.state.muted=s,e.state.paused?r.pause():t.isPlaying||r.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),Object.values(Mt).forEach(e=>{if(this.channelVolumes.set(e,1),this.isReady){let t=this.channels.get(e);t&&t.setVolume(1)}}),this.setupGroupVolume()}setGroupVolume(e,t){if(this.channelVolumes.set(e,t),this.isReady){let n=this.channels.get(e);n&&n.setVolume(t)}}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}getGroupVolume(e){return this.channelVolumes.get(e)??1}destroy(){this.reset(),this.sound.destroy()}setupGroupVolume(){let{soundVolume:e,bgmVolume:t,voiceVolume:n}=this.gameState.game.preference.getPreferences();this.setGroupVolume("sound",e),this.setGroupVolume("bgm",t),this.setGroupVolume("voice",n)}};import*as Da from"html-to-image";var gi=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 v,n=new we(t);return t.registerSkipController(new H(()=>{this.removeNotification(e)})),this.addNotification(e),e.duration&&this.gameState.schedule(()=>{t.resolve(),this.removeNotification(e)},e.duration),this.gameState.timelines.attachTimeline(n),t}onFlush(e){return this.events.on("event:notifications.flush",e)}toArray(){return[...this.notifications]}flush(){this.events.emit("event:notifications.flush")}};var yi=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=Gr(6),{action:r,timeline:s,stackModel:a}=e,c=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:c,stackModel:a}),this.history.length>this.maxHistorySize){let l=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(p=>p(l))}return{id:i}}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),console.log("NarraLeaf-React [ActionHistory] Undoing",this.history[r].action.type,this.history[r]),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var vi=class{constructor(e){this.history=[];this.actionHistoryMgr=e,this.actionHistoryMgr.onUndo(t=>{this.crossFilter(t)}),this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){return this.history.push(e),this}getHistory(){return this.history}reset(){this.history=[]}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(n=>n.id));this.history=this.history.filter(n=>!t.has(n.token))}};var jt=class extends j{executeAction(e,t){let n=new v().registerSkipController(new H(()=>{c.cancel()})),i=e.timelines.attachTimeline(n),r=this.contentNode.getContent(),s=e.createPresentationSnapshot(),a=null,c=e.createMenu(r,p=>{let u=e.getLiveGame().createStackModel([{type:this.type,node:p.action[0]?.contentNode??null}]);n.resolve({type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[u]}}),a=()=>{u.reset()},e.gameHistory.updateByToken(l,d=>{d&&d.element.type==="menu"&&(d.element.selected=p.evaluated,d.isPending=!1)})}),{id:l}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{c.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:l,action:this,element:{type:"menu",text:c.prompt,selected:null},isPending:!0}),n}getFutureActions(e,t){let n=this.contentNode.getContent();return[...this.callee._getFutureActions(n.choices),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=i.choices.map(s=>`{${s.action.map(c=>c.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};jt.ActionTypes=kr;var qt=class qt extends
|
|
15
|
+
Current Parent (src: `+f.state.currentSrc+")");p.set(b,f)}});let u=[...this._initScene(this),...c.map(f=>f._init(this)),...l.map(f=>{if(!p.has(f))throw new Error("Wearable image must have a parent image");return p.get(f)._initWearable(f)}),...a.map(f=>f._init()),...r],d=super.constructNodes(u),h=new A(this.sceneRoot,void 0,d||void 0).setContent(this);return d?.setParent(h),this.sceneRoot?.setContentNode(h),this._futureActions_=u,this}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Pt.say(n).getActions():Ee.toActions([n]))}isSceneRootConstructed(){return!!this.sceneRoot}registerSrc(t,n=new Set){if(!this.sceneRoot)return;let i=new Set,r=new Set,s=[this.sceneRoot],a=new Set;for(;s.length;){let c=s.shift();if(!i.has(c)){if(i.add(c),c instanceof te){let l=c.callee;if(x.isImageSrc(l.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:x.srcToURL(l.state.backgroundImage.state.currentSrc)}),c.type===$.jumpTo){let p=c,u=Ve.getScene(t,p.contentNode.getContent()[0]);if(!u)throw c._sceneNotFoundError(c.getSceneName(p.contentNode.getContent()[0]));let d=Ue.getPreloadableSrc(t,c);if(d&&this.srcManager.register(d),r.has(p)||n.has(u))continue;r.add(p),a.add(u),n.add(u)}}else if(c instanceof re){let l=Ue.getPreloadableSrc(t,c);l&&this.srcManager.register(l)}else if(c instanceof qe)this.srcManager.register(c.callee);else if(c instanceof fe){let p=c.getFutureActions(t,{allowFutureScene:!0});s.push(...p)}else c instanceof De&&this.srcManager.register(c.callee.srcManager.getSrc());s.push(...c.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(c=>{c.registerSrc(t,n),this.srcManager.registerFuture(c.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let c=a.getStaticId();if(c){if(i.has(c))throw new xe(`Duplicate static action id: ${c}`);i.add(c)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let c=a.getStaticId();a.resolveId(c||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((i,r)=>{i.setId(`e-${r}`)})}getVoice(t){if(!t)return null;let n=this.config.voices;if(n){if(typeof n=="function"){let r=n(t);return typeof r=="string"?me.voice(r):(Ve.validateVoice(r),r)}let i=n[t];return typeof i=="string"?me.voice(i):i||null}return null}getSceneRoot(){if(!this.sceneRoot)throw new Error("Scene root is not constructed");return this.sceneRoot}stringify(t,n,i){return super.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}).map(r=>r.stringify(t,n,i)).join(";")}reset(){this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&t.backgroundMusic.config.type!=="bgm")throw new xe(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
|
|
16
|
+
To prevent unintended behavior and unexpected results, the sound have to be marked as bgm. Please use \`Sound.bgm()\` to create the sound.`);let n=this.state?.backgroundImage?this.state.backgroundImage.reset():new I({src:t.background,opacity:1,autoFit:!0,name:`[[Background Image of ${this.config.name}]]`,layer:this.config.defaultBackgroundLayer})._setIsBackground(!0),i=t.backgroundMusic?this.state?.backgroundMusic?this.state.backgroundMusic.reset():t.backgroundMusic:null;return{backgroundImage:n,backgroundMusic:i}}_jumpTo(t){return this.chain(new te(this.chain(),"scene:jumpTo",new A().setContent([t])))}_exit(){return new te(this.chain(),"scene:exit",new A().setContent([]))}_transitionToScene(t,n){let i=this.chain();if(t&&n){let r=this.state.backgroundImage.char(n,t);i.chain(r.getActions())}return i}_init(t){return new te(this.chain(),"scene:init",new A().setContent([t]))}_initScene(t){return[t._init(t),...t.config.layers.flatMap(n=>n._init(t)),...t._initBackground(t,t.config.defaultBackgroundLayer)]}_initBackground(t,n){return[t.state.backgroundImage._init(t,n)]}};Ve.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"},Ve.DefaultUserConfig=new Y({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Ve.DefaultSceneConfig=new Y({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new pn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new pn("[[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=>{me.isSound(r)&&Ve.validateVoice(r)}),i(t))return t;throw new xe(`Invalid voices config: ${t}`)}});var et=Ve;import*as Yr from"howler";var fi=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 Ta={volume:1,limit:1/0},ba=class Br{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={...Ta,...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 Br(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}}},$r=!1;function Ca(o){$r=o}function Ut(o,e){$r||(e!==void 0?console.warn(o,e):console.warn(o))}var Aa=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){Ut("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){Ut("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=o=>{this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){Ut("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){this.currentSource instanceof AudioBufferSourceNode?this.currentSource.start(o,e):this.currentSource instanceof HTMLAudioElement&&this.currentSource.play()}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},zr=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}},xa=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 Aa(o,this.gainNode),this.sourceController.setSource(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1;try{this.gainNode.disconnect()}catch(e){Ut("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){Ut("Failed to disconnect gain node on stop().",o)}}setRate(o){o=Math.max(.001,o),this.rate=o;let e=this.sourceController.getSource();return e instanceof HTMLAudioElement?e.playbackRate=o:e instanceof AudioBufferSourceNode&&(e.playbackRate.value=o),this}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new zr(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new zr(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}},wa=class{constructor(o){this.alive=!0,this.refCount=0,this.audioBuffer=o}addRef(){this.refCount++}releaseRef(){this.refCount>0&&this.refCount--}getRefCount(){return this.refCount}async unload(){this.refCount>0||(this.alive=!1)}async forceUnload(){this.alive=!1,this.refCount=0}isAlive(){return this.alive}raw(){if(!this.alive)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}},ka=10*1024*1024,Pa=class{constructor(o){this.cache=new Map,this.loadingPromises=new Map,this.audioContext=o}async load(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.doLoad(o);this.loadingPromises.set(o,n);try{let i=await n;return this.cache.set(o,i),i}finally{this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new wa(t)}clear(){for(let o of this.cache.values())o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){return{cached:this.cache.size,loading:this.loadingPromises.size}}},Ea={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},jr=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...Ea,...o},Ca(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Pa(this.audioContext),this.masterChannel=new ba("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(o=>{let e=()=>{if(this.destroyed){this.clearUnlockHandler(),o();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,o())}).catch(t=>{Ut("Failed to resume AudioContext while unlocking.",t)})};this.unlockHandler=e,document.addEventListener("click",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",e)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let o=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",o),document.removeEventListener("touchstart",o),document.removeEventListener("keydown",o)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(o,e,t){this.ensureNotDestroyed(),this.ensureReady();let{volume:n=1,rate:i=1,startTime:r=0,endTime:s,load:a="auto",loop:c=!1}=e??{},l,p=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")l=this.createStreamSource(o);else{p=await this.audioCache.load(o),p.addRef?.();let d=this.audioContext.createBufferSource();d.buffer=p.raw(),l=d}else{p=o,p.addRef?.();let d=this.audioContext.createBufferSource();d.buffer=o.raw(),l=d}let u=new xa(this.audioContext,l,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(l instanceof AudioBufferSourceNode?(l.loop=c,c&&s!==void 0&&(l.loopStart=r,l.loopEnd=s)):l instanceof HTMLAudioElement&&(l.loop=c),p){let d=!1,h=()=>{d||(d=!0,p.releaseRef?.())};u.once("ended",h),u.once("stop",h)}return u}async resolveLoadMode(o,e){if(e==="stream"||e==="full")return e;try{let t=await fetch(o,{method:"HEAD"});if(!t.ok)return"stream";let n=t.headers.get("Content-Length");if(!n)return"stream";let i=parseInt(n,10);return isNaN(i)?"stream":i<ka?"full":"stream"}catch(t){return Ut("Failed to resolve load mode via HEAD request, falling back to 'stream'.",t),"stream"}}createStreamSource(o){let e=new Audio(o);return e.crossOrigin="anonymous",e}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(o){this.registeredChannels.add(o)}unregisterChannel(o){this.registeredChannels.delete(o)}setVolume(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(o),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(o){return this.ensureNotDestroyed(),this.ensureReady(),o===void 0?this.masterChannel.mute():this.masterChannel.mute(o),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(o,e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(o,e)}getChannel(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(o)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(o){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(o)}async play(o,e){this.ensureNotDestroyed(),this.ensureReady();let t=this.masterChannel.getTokens();for(let n of t)try{n.stop()}catch{}return this.masterChannel.play(o,e)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(o=>{Ut("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var hi=class{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.channelVolumes=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1;Object.values(Mt).forEach(t=>{this.channelVolumes.set(t,1)})}initialize(){if(this.isReady||this.isInitializing)return;let e=new jr;this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),Object.values(Mt).forEach(t=>{let n=this.channelVolumes.get(t)??1,i=e.getChannel(t)??e.createChannel(t,{volume:n});i.setVolume(n),this.channels.set(t,i)}),this.isReady=!0,this.isInitializing=!1,this.setupGroupVolume()}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}play(e,t={end:1,duration:0}){let n=new v;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channels.get(e.config.type),r=await this.sound.load(e.config.src),s=await i.play(r,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),a=e.state.muted??!1;s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:r,originalVolume:t.end}),t.duration>0?await s.fade(0,t.end,t.duration).finished:s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(c=>{s.once("ended",()=>c())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t={end:1,duration:0}){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channels.get(e.config.type);if(!n)throw new E(`Channel not found for sound type: "${e.config.type}"`);let i=await this.sound.load(e.config.src),r=await n.play(i,{volume:0,startTime:e.config.seek,loop:e.config.loop,rate:1}),s=e.state.muted??!1;return r.mute(s),e.state.muted=s,this.state.set(e,{token:r,cachedAudio:i,originalVolume:t.end}),t.duration>0?r.fade(0,t.end,t.duration):r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,r}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new v;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new v;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 v;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}pause(e,t=0){let n=new v;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new v;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),i.token.fade(0,i.originalVolume,t).finished.then(()=>{e.state.paused=!1,n.resolve()})),n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,v.resolve(void 0)):v.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime()}]),groups:[...this.channelVolumes.entries()].map(([e,t])=>[e,t])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setGroupVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r)throw new E(`Sound not found (id: "${n}")
|
|
17
|
+
NarraLeaf cannot find the element with the id from the saved game`);this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channels.get(e.config.type),i=await this.sound.load(e.config.src),r=await n.play(i,{volume:e.state.volume,startTime:t.position,loop:e.config.loop,rate:1});this.state.set(e,{token:r,cachedAudio:i,originalVolume:e.state.volume});let s=e.state.muted??!1;r.mute(s),e.state.muted=s,e.state.paused?r.pause():t.isPlaying||r.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),Object.values(Mt).forEach(e=>{if(this.channelVolumes.set(e,1),this.isReady){let t=this.channels.get(e);t&&t.setVolume(1)}}),this.setupGroupVolume()}setGroupVolume(e,t){if(this.channelVolumes.set(e,t),this.isReady){let n=this.channels.get(e);n&&n.setVolume(t)}}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}getGroupVolume(e){return this.channelVolumes.get(e)??1}destroy(){this.reset(),this.sound.destroy()}setupGroupVolume(){let{soundVolume:e,bgmVolume:t,voiceVolume:n}=this.gameState.game.preference.getPreferences();this.setGroupVolume("sound",e),this.setGroupVolume("bgm",t),this.setGroupVolume("voice",n)}};import*as Da from"html-to-image";var gi=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 v,n=new we(t);return t.registerSkipController(new H(()=>{this.removeNotification(e)})),this.addNotification(e),e.duration&&this.gameState.schedule(()=>{t.resolve(),this.removeNotification(e)},e.duration),this.gameState.timelines.attachTimeline(n),t}onFlush(e){return this.events.on("event:notifications.flush",e)}toArray(){return[...this.notifications]}flush(){this.events.emit("event:notifications.flush")}};var yi=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=Gr(6),{action:r,timeline:s,stackModel:a}=e,c=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:c,stackModel:a}),this.history.length>this.maxHistorySize){let l=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(p=>p(l))}return{id:i}}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),console.log("NarraLeaf-React [ActionHistory] Undoing",this.history[r].action.type,this.history[r]),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var vi=class{constructor(e){this.history=[];this.actionHistoryMgr=e,this.actionHistoryMgr.onUndo(t=>{this.crossFilter(t)}),this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){return this.history.push(e),this}getHistory(){return this.history}reset(){this.history=[]}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(n=>n.id));this.history=this.history.filter(n=>!t.has(n.token))}};var jt=class extends j{executeAction(e,t){let n=new v().registerSkipController(new H(()=>{c.cancel()})),i=e.timelines.attachTimeline(n),r=this.contentNode.getContent(),s=e.createPresentationSnapshot(),a=null,c=e.createMenu(r,p=>{let u=e.getLiveGame().createStackModel([{type:this.type,node:p.action[0]?.contentNode??null}]);n.resolve({type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[u]}}),a=()=>{u.reset()},e.gameHistory.updateByToken(l,d=>{d&&d.element.type==="menu"&&(d.element.selected=p.evaluated,d.isPending=!1)})}),{id:l}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{c.cancel(),a?.(),e.restorePresentationSnapshot(s)});return e.gameHistory.push({token:l,action:this,element:{type:"menu",text:c.prompt,selected:null},isPending:!0}),n}getFutureActions(e,t){let n=this.contentNode.getContent();return[...this.callee._getFutureActions(n.choices),...super.getFutureActions(e,t)]}stringify(e,t,n){let i=this.contentNode.getContent(),r=i.choices.map(s=>`{${s.action.map(c=>c.stringify(e,t,n)).join(";")}}`);return super.stringifyWithContent("Menu",`(${i.prompt}) {[${r.join(",")}]}`)}};jt.ActionTypes=kr;var qt=class qt extends oe{constructor(t,n={}){super();this.choices=[];this.prompt=le.isSentence(t)?t:t===null?null:new le(t),this.config=F(qt.defaultConfig,n)}static prompt(t,n={}){return new qt(t!==void 0?t:null,n)}static choose(t,n){return new qt(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return le.isSentence(t)&&n?i.choices.push({prompt:le.toSentence(t),action:this.narrativeToActions(n),config:{}}):(q.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:le.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:le.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?O.from(t.config.disabled):void 0,hidden:t.config?.hidden?O.from(t.config.hidden):void 0}}):console.warn("No valid choice added to menu, ",{arg0:t,arg1:n}),i}hideIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new xe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.hideIf` before `menu.choose`");return n.config.hidden=O.from(t),this.chain()}disableIf(t){let n=this.choices[this.choices.length-1];if(!n)throw new xe("Trying to configure the last choice of a menu, but no choice added. This may be caused by calling `menu.disableIf` before `menu.choose`");return n.config.disabled=O.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:O.not(O.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:O.not(O.from(t))}})}fromChained(t){return[new jt(this.chain(),jt.ActionTypes.action,new A().setContent({prompt:this.prompt,choices:t.constructChoices()}))]}_getFutureActions(t){return t.map(n=>n.action[0]||null).filter(n=>n!==null)}narrativeToActions(t){return this.constructNodes(t.flatMap(n=>typeof n=="string"?Pt.say(n).getActions():Ee.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??{}}))}};qt.defaultConfig={},qt.targetAction=jt;var fo=qt;var Et=class Et extends sn{constructor(t,n=Et.defaultConfig){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.name=t,this.config=F(Et.defaultConfig,n)}static empty(){return new Et("empty").entry(new et("empty"))}entry(t){return this.entryScene=t,this}registerPersistent(t){return this.persistent.push(t),this}createPersistent(t,n){let i=new cn(t,n);return this.registerPersistent(i),i}registerService(t,n){return this.services.set(t,n),this}getService(t){let n=this.services.get(t);if(!n)throw new xe(`Trying to access service ${t} before it's registered, please use "story.registerService" to register the service`);return n}hash(t=!1){return Fr(this.stringify(t))}stringify(t=!1){return this.entryScene?.stringify(this,new Set,t)||""}serializeServices(){let t={};return this.services.forEach((n,i)=>{if(!n.serialize||typeof n.serialize!="function")return;let r=n.serialize();if(r!==null){{if(r instanceof Promise)throw new de(`Service ${i} serialize method should not return a promise`);if(!co(r))throw new de(`Service ${i} serialize method should return a pure object.
|
|
18
18
|
A pure object should:
|
|
19
19
|
1. be an object literal
|
|
20
20
|
2. not have any prototype
|
|
21
21
|
3. no circular reference
|
|
22
22
|
4. sub objects should also be pure objects or serializable data
|
|
23
23
|
Return null if nothing needs to be saved. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description
|
|
24
|
-
Returned value ${r} violates the above rules`)}t[i]=r}}),t}deserializeServices(t){this.services.forEach((n,i)=>{!n.deserialize||typeof n.deserialize!="function"||t[i]&&n.deserialize(t[i])})}getScene(t,n=!1,i){if(et.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||de,[`Scene with name ${t} not found`]);return r}constructStory(){let t=this.entryScene;if(!t)throw new Error("Story must have an entry scene");return this.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this}getAllElementStates(){return this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).map(n=>({id:n.getId(),data:n.toData()})).filter(n=>!!n.data)}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>Et.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${Et.MAX_DEPTH})`);let s=i.shift();if(et.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 Si(t).run(this)}};Et.defaultConfig={origin:"bottom left"},Et.MAX_DEPTH=32767;var Dn=Et;var Ti=class extends j{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(Se.getCtx({gameState:e}),n,i);return v.isAwaitable(r)?v.forward(r,{type:this.type,node:this.contentNode?.getChild()}):super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ServiceAction")}};var ho=class extends
|
|
25
|
-
Use video.show() to add the video to the game`);let i=this.callee,r=new v,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 H(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")}};gt.ActionTypes=tn;var bi=gt;var dn=class dn extends re{constructor(e){super();let t=dn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new de("Video must have a src")}show(){return this.chain(this.createAction(tn.show,[]))}hide(){return this.chain(this.createAction(tn.hide,[]))}play(){return this.chain(this.createAction(tn.play,[]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return this.state=this.getInitialState(),this}getInitialState(){return dn.DefaultVideoState.create().get()}createAction(e,t){return new bi(this.chain(),e,A.create(t))}};dn.DefaultVideoConfig=new Y({src:"",muted:!1}),dn.DefaultVideoState=new Y({display:!1});var yo=dn;function Qr(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Xr(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return qr(o);let i=vo(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=vo(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=vo(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function vo(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 qr(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}var ne=class ne{constructor(e,t){this.state={sounds:[],videos:[],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 Tn;this.htmlToImage=Da;this.pageRouter=null;this.stageClickBuffer=null;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this.stage=t,this.game=e,this.events=new X,this.logger=new fi(e,"NarraLeaf-React"),this.audioManager=new hi(this),this.guard=new li(e.config.app.guard).observe(this),this.timelines=new ui(this.guard),this.notificationMgr=new gi(this,[]),this.idManager=new Zn,this.actionHistory=new yi(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new vi(this.actionHistory)}get deps(){return this.flushDep}addVideo(e){return this.state.videos.push(e),this}removeVideo(e){let t=this.state.videos.indexOf(e);return t===-1?(this.logger.weakWarn("Video not found when removing",e.getId()),this):(this.state.videos.splice(t,1),this)}isVideoAdded(e){return this.state.videos.includes(e)}getVideos(){return this.state.videos}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=et.isScene(e)?e:e.entryScene;if(!t)throw new P("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(ne.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}addElement(e){return this.state.elements.push(e),this.logger.debug("GameState","Adding element",e.scene.getId()),this}addScene(e){return this.sceneExists(e)?this:(this.state.elements.unshift({scene:e,texts:[],menus:[],layers:new Map(e.config.layers.map(t=>[t,[]]))}),this.logger.debug("GameState","Adding scene",e.getId()),this)}flush(){return this.stage.update(),this}popScene(){let e=this.state.elements.pop();return e?(this.removeElements(e.scene),this.logger.debug("GameState","Popping scene",e.scene.getId()),this):this}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){return this.state.elements[this.state.elements.length-1]?.scene||null}getCurrentScene(){return this.state.elements[0]?.scene||null}findCurrentPortraitForCharacter(e){let t=(e.config.portraits||[]).map(Qr);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let c=s[a];for(let l=c.length-1;l>=0;l--){let p=c[l],u=r.get(p);if(u&&this.isDisplayableVisible(p))return u}}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(Se.getCtx({gameState:this}));this.game.getLiveGame().events.emit(ht.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:q.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1)},text:q.getText(s)}}createMenu(e,t,n){if(!e.choices.length)throw new Error("Menu must have at least one choice");let i=this.findElementByScene(this.getLastSceneIfNot(n))?.menus;if(!i)throw this.sceneNotFound();let r=e.prompt?.evaluate(Se.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(ht.EventTypes["event:menu.choose"],{sentence:a.prompt,text:a.evaluated})});return i.push(s),{cancel:()=>{let a=i.indexOf(s);a!==-1&&i.splice(a,1)},prompt:r?q.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(ne.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(ne.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(ne.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(ne.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(ne.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(ne.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(ne.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>te.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(ne.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(ne.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(ne.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(ne.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{te.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(ne.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(ne.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(ne.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(ne.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(ne.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}consumeStageClick(e=200){if(!this.stageClickBuffer)return!1;let{timestamp:t}=this.stageClickBuffer,n=Date.now()-t;return this.stageClickBuffer=null,n>=0&&n<=e}createDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i);if(!r)throw this.sceneNotFound();let s=r.layers.get(n||i.config.defaultDisplayableLayer);if(!s)throw this.layerNotFound();return s.push(e),this}disposeDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i)?.layers.get(n||i.config.defaultDisplayableLayer);if(!r)throw this.layerNotFound();let s=r.indexOf(e);if(s===-1)throw new P(`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.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 Yr.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 P("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]=we.proxy(v.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof mt&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(J.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new Fe("State already mounted");if(!e)throw new Fe("Invalid state key");return this.exposedState.set(e,t),this.events.emit(ne.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 P("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=this.getExposedState(e);if(n)return{cancel:this.schedule(()=>{t(n)},0)};{let i=this.events.on(ne.EventTypes["event.state.onExpose"],(r,s)=>{r===e&&(t(s),i.cancel())});return i}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),elements:{layers:Object.fromEntries(Array.from(e.layers.entries()).map(([t,n])=>[t.getId(),n.map(i=>i.getId())]))}})),audio:this.audioManager.toData(),videos:this.state.videos.map(e=>[e.getId(),e.toData()]),nvlState:{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,dialogIds:this.nvlState.dialogs.map(e=>e.id),dialogs:this.nvlState.dialogs.map(e=>({id:e.id,actionId:e.actionId,text:e.text,characterId:e.character?e.character.getId():null}))}}}loadData(e,t){if(this.state.elements=[],!this.game.getLiveGame().story)throw new Error("No story loaded");let{scenes:i,audio:r,videos:s}=e;if(i.forEach(({sceneId:a,elements:c})=>{this.logger.debug("Loading scene: "+a);let l=t.get(a);if(!l)throw new P("Scene not found, id: "+a+`
|
|
26
|
-
NarraLeaf cannot find the element with the id from the saved game`);let p={scene:l,layers:this.constructLayerMap(c.layers,t),menus:[],texts:[]};this.state.elements.push(p),this.registerSrcManager(l.srcManager),this.getExposedStateAsync(l,u=>{te.initBackgroundMusic(l,u)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,c])=>{let l=t.get(a);if(!l)throw new
|
|
27
|
-
NarraLeaf cannot find the element with the id from the saved game`);return l.fromData(c),l}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(c=>{let l=c.characterId&&t.get(c.characterId)||null,p=c.text||"";return{id:c.id,actionId:c.actionId||c.id,character:l,sentence:new le(p,{character:l}),text:p}});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(ne.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(ne.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
|
|
28
|
-
NarraLeaf cannot find the element with the id from the saved game`);return[r,i.map(s=>{if(!t.has(s))throw new
|
|
24
|
+
Returned value ${r} violates the above rules`)}t[i]=r}}),t}deserializeServices(t){this.services.forEach((n,i)=>{!n.deserialize||typeof n.deserialize!="function"||t[i]&&n.deserialize(t[i])})}getScene(t,n=!1,i){if(et.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||de,[`Scene with name ${t} not found`]);return r}constructStory(){let t=this.entryScene;if(!t)throw new Error("Story must have an entry scene");return this.constructSceneRoots(t),t.registerSrc(this),t.assignActionId(this),t.assignElementId(this),this.runStaticCheck(t),this}getAllElementStates(){return this.getAllChildrenElements(this,this.entryScene?.getSceneRoot()||[]).map(n=>({id:n.getId(),data:n.toData()})).filter(n=>!!n.data)}constructSceneRoots(t){let n=new Set,i=[],r=0;for(t.constructSceneRoot(this),i.push(t.getSceneRoot());i.length;){if(r++,r>Et.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${Et.MAX_DEPTH})`);let s=i.shift();if(et.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 Si(t).run(this)}};Et.defaultConfig={origin:"bottom left"},Et.MAX_DEPTH=32767;var Dn=Et;var Ti=class extends j{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(Se.getCtx({gameState:e}),n,i);return v.isAwaitable(r)?v.forward(r,{type:this.type,node:this.contentNode?.getChild()}):super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ServiceAction")}};var ho=class extends oe{constructor(){super(...arguments);this._handlers={}}on(t,n){return this._registerActionHandler(t,n),this}trigger(t,...n){let i=this.chain();return i.chain(this._createAction(i,t,n))}triggerAction(t,n,i){let r=this._handlers[n];if(!r){t.gameState.logger.warn(`(in User-Defined Service) Trying to trigger action ${n} before it's registered, please use "service.on" to register the action`);return}if(Mr(r)){let s=[],a=new v().registerSkipController(new H(()=>{for(let l of s)l?.()}));return r({...t,onAbort:l=>{s.push(l)}},...i).then(()=>a.resolve()),a}r({...t,onAbort:()=>{}},...i)}_registerActionHandler(t,n){this._handlers[t]=n}_createAction(t,n,i){return new Ti(t,"service:action",new A().setContent([n,i]))}},go=class extends ho{},Ln=class extends go{};var gt=class gt extends j{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(gt,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(gt,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(gt,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(gt,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(gt,"video:show")){let s=i.state.display;return e.isVideoAdded(i)||(e.addVideo(i),e.stage.update()),i.state.display=!0,e.actionHistory.push(r,a=>{i.state.display=a},[s]),this.changeState(e,a=>a.show(),t)}else if(n.is(gt,"video:hide")){let s=i.state.display;return this.changeState(e,a=>{i.state.display=!1,e.actionHistory.push(r,c=>{i.state.display=c},[s]),a.hide(),e.removeVideo(i),e.stage.update()},t)}else if(n.is(gt,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new E(`Video is being used before it is added to the game
|
|
25
|
+
Use video.show() to add the video to the game`);let i=this.callee,r=new v,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 H(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")}};gt.ActionTypes=tn;var bi=gt;var dn=class dn extends oe{constructor(e){super();let t=dn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new de("Video must have a src")}show(){return this.chain(this.createAction(tn.show,[]))}hide(){return this.chain(this.createAction(tn.hide,[]))}play(){return this.chain(this.createAction(tn.play,[]))}toData(){return{state:{display:this.state.display}}}fromData(e){let{state:t}=e;return this.state={display:t.display},this}reset(){return this.state=this.getInitialState(),this}getInitialState(){return dn.DefaultVideoState.create().get()}createAction(e,t){return new bi(this.chain(),e,A.create(t))}};dn.DefaultVideoConfig=new Y({src:"",muted:!1}),dn.DefaultVideoState=new Y({display:!1});var yo=dn;function Qr(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Xr(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return qr(o);let i=vo(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=vo(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=vo(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function vo(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 qr(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}var ne=class ne{constructor(e,t){this.state={sounds:[],videos:[],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 Tn;this.htmlToImage=Da;this.pageRouter=null;this.stageClickBuffer=null;this.nvlAdvanceWaiters=new Map;this.advDialogState=null;this.stage=t,this.game=e,this.events=new X,this.logger=new fi(e,"NarraLeaf-React"),this.audioManager=new hi(this),this.guard=new li(e.config.app.guard).observe(this),this.timelines=new ui(this.guard),this.notificationMgr=new gi(this,[]),this.idManager=new Zn,this.actionHistory=new yi(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new vi(this.actionHistory)}get deps(){return this.flushDep}addVideo(e){return this.state.videos.push(e),this}removeVideo(e){let t=this.state.videos.indexOf(e);return t===-1?(this.logger.weakWarn("Video not found when removing",e.getId()),this):(this.state.videos.splice(t,1),this)}isVideoAdded(e){return this.state.videos.includes(e)}getVideos(){return this.state.videos}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=et.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(ne.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}addElement(e){return this.state.elements.push(e),this.logger.debug("GameState","Adding element",e.scene.getId()),this}addScene(e){return this.sceneExists(e)?this:(this.state.elements.unshift({scene:e,texts:[],menus:[],layers:new Map(e.config.layers.map(t=>[t,[]]))}),this.logger.debug("GameState","Adding scene",e.getId()),this)}flush(){return this.stage.update(),this}popScene(){let e=this.state.elements.pop();return e?(this.removeElements(e.scene),this.logger.debug("GameState","Popping scene",e.scene.getId()),this):this}removeScene(e){return this.removeElements(e),this.logger.debug("GameState","Removing scene",e.getId()),this}getSceneElements(){return this.state.elements}getLastScene(){return this.state.elements[this.state.elements.length-1]?.scene||null}getCurrentScene(){return this.state.elements[0]?.scene||null}findCurrentPortraitForCharacter(e){let t=(e.config.portraits||[]).map(Qr);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let c=s[a];for(let l=c.length-1;l>=0;l--){let p=c[l],u=r.get(p);if(u&&this.isDisplayableVisible(p))return u}}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(Se.getCtx({gameState:this}));this.game.getLiveGame().events.emit(ht.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:q.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1)},text:q.getText(s)}}createMenu(e,t,n){if(!e.choices.length)throw new Error("Menu must have at least one choice");let i=this.findElementByScene(this.getLastSceneIfNot(n))?.menus;if(!i)throw this.sceneNotFound();let r=e.prompt?.evaluate(Se.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(ht.EventTypes["event:menu.choose"],{sentence:a.prompt,text:a.evaluated})});return i.push(s),{cancel:()=>{let a=i.indexOf(s);a!==-1&&i.splice(a,1)},prompt:r?q.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(ne.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(ne.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(ne.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(ne.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(ne.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(ne.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(ne.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>te.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(ne.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(ne.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(ne.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(ne.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{te.restoreSceneSnapshot(t,this)}),this.restoreNvlSnapshot(e.nvlState),this}clearNvlDialogs(){return this.nvlState.dialogs=[],this.emitNvlStateChange(),this}setNvlActiveDialog(e,t){return this.nvlState.activeDialogId=e,this.nvlState.phase=e?t?"typing":"awaitAdvance":"idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),this}setNvlTyping(e){return this.nvlState.phase=e?"typing":this.nvlState.activeDialogId?"awaitAdvance":"idle",this.syncNvlDerivedState(),this.emitNvlStateChange(),this}getNvlDialog(e){return this.nvlState.dialogs.find(t=>t.id===e)||null}getActiveNvlDialogForAction(e){if(!this.nvlState.activeDialogId)return null;let t=this.getNvlDialog(this.nvlState.activeDialogId);return!t||t.actionId!==e?null:t}getLatestNvlDialogForAction(e){for(let t=this.nvlState.dialogs.length-1;t>=0;t--){let n=this.nvlState.dialogs[t];if(n.actionId===e)return n}return null}allocateNvlDialogId(e){let t=-1;for(let n of this.nvlState.dialogs){if(n.actionId!==e)continue;let i=n.id.startsWith(`${e}:`)?Number.parseInt(n.id.slice(e.length+1),10):Number.NaN;Number.isNaN(i)||(t=Math.max(t,i))}return`${e}:${t+1}`}ensureNvlDialog(e){let t=this.getNvlDialog(e.id);return t?(t.character=e.character,t.sentence=e.sentence,t.text=e.text,this.events.emit(ne.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(ne.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(ne.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(ne.EventTypes["event:state.dialog.change"])),this)}settleAdvDialog(e){return this.advDialogState?.dialogId===e&&(this.advDialogState=null,this.events.emit(ne.EventTypes["event:state.dialog.change"])),this}getAdvDialogState(){return this.advDialogState}recordStageClick(){return this.stageClickBuffer={timestamp:Date.now()},this}consumeStageClick(e=200){if(!this.stageClickBuffer)return!1;let{timestamp:t}=this.stageClickBuffer,n=Date.now()-t;return this.stageClickBuffer=null,n>=0&&n<=e}createDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i);if(!r)throw this.sceneNotFound();let s=r.layers.get(n||i.config.defaultDisplayableLayer);if(!s)throw this.layerNotFound();return s.push(e),this}disposeDisplayable(e,t=null,n=null){let i=this.getLastSceneIfNot(t),r=this.findElementByScene(i)?.layers.get(n||i.config.defaultDisplayableLayer);if(!r)throw this.layerNotFound();let s=r.indexOf(e);if(s===-1)throw new 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.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 Yr.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]=we.proxy(v.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof mt&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(J.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new Fe("State already mounted");if(!e)throw new Fe("Invalid state key");return this.exposedState.set(e,t),this.events.emit(ne.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new E("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=this.getExposedState(e);if(n)return{cancel:this.schedule(()=>{t(n)},0)};{let i=this.events.on(ne.EventTypes["event.state.onExpose"],(r,s)=>{r===e&&(t(s),i.cancel())});return i}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),elements:{layers:Object.fromEntries(Array.from(e.layers.entries()).map(([t,n])=>[t.getId(),n.map(i=>i.getId())]))}})),audio:this.audioManager.toData(),videos:this.state.videos.map(e=>[e.getId(),e.toData()]),nvlState:{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,dialogIds:this.nvlState.dialogs.map(e=>e.id),dialogs:this.nvlState.dialogs.map(e=>({id:e.id,actionId:e.actionId,text:e.text,characterId:e.character?e.character.getId():null}))}}}loadData(e,t){if(this.state.elements=[],!this.game.getLiveGame().story)throw new Error("No story loaded");let{scenes:i,audio:r,videos:s}=e;if(i.forEach(({sceneId:a,elements:c})=>{this.logger.debug("Loading scene: "+a);let l=t.get(a);if(!l)throw new E("Scene not found, id: "+a+`
|
|
26
|
+
NarraLeaf cannot find the element with the id from the saved game`);let p={scene:l,layers:this.constructLayerMap(c.layers,t),menus:[],texts:[]};this.state.elements.push(p),this.registerSrcManager(l.srcManager),this.getExposedStateAsync(l,u=>{te.initBackgroundMusic(l,u)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,c])=>{let l=t.get(a);if(!l)throw new E("Video not found, id: "+a+`
|
|
27
|
+
NarraLeaf cannot find the element with the id from the saved game`);return l.fromData(c),l}),e.nvlState){let a=(e.nvlState.dialogs||[]).map(c=>{let l=c.characterId&&t.get(c.characterId)||null,p=c.text||"";return{id:c.id,actionId:c.actionId||c.id,character:l,sentence:new le(p,{character:l}),text:p}});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(ne.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(ne.EventTypes["event:state.nvl.visibilityChange"],!0,this.nvlState.options?.showTransition),this.emitNvlStateChange()}}getLastSceneIfNot(e){let t=e||this.getLastScene();if(!t||!this.sceneExists(t))throw new E('Scene not found, please call "scene.activate()" first.');return t}createElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(i=>[i,i.toData()])]))}}fromElementSnapshot(e){return{scene:e.scene,layers:new Map(Array.from(e.layers.entries()).map(([t,n])=>[t,n.map(([i,r])=>(i.fromData(r),i))])),texts:[],menus:[]}}removeElements(e){let t=this.state.elements.findIndex(n=>n.scene===e);return t===-1?(this.logger.weakWarn("Scene not found when removing elements",e.getId()),this):(this.resetLayers(this.state.elements[t].layers),this.state.elements.splice(t,1),this.logger.debug("GameState","Removing elements",e.getId()),this)}resetLayers(e){e.forEach(t=>{t.forEach(n=>{n.reset()})})}syncNvlDerivedState(){this.nvlState.isTyping=this.nvlState.phase==="typing",this.nvlState.activeDialogId||(this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.nvlState.isTyping=!1)}emitNvlStateChange(){this.syncNvlDerivedState(),this.events.emit(ne.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+`
|
|
28
|
+
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+`
|
|
29
29
|
NarraLeaf cannot find the element with the id from the saved game
|
|
30
|
-
This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};ne.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
|
|
30
|
+
This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};ne.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 P=ne;var Jr=32767,La=1e3,Oe=class o{constructor(e,t=void 0){this.liveGame=e;this.__tag=void 0;this.waitingAction=null;this.loopConfig=null;this.loopBodyActions=[];this.loopCondition=null;this.loopStartTime=0;this.loopDebugCheckpoint=0;this.__tag=t,this.stack=new ei().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new Fe("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new Fe("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(v.isAwaitable(i)&&!i.isSettled())throw new Fe("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!v.isAwaitable(n))throw new Fe("StackModel: Unexpected non-CalledActionResult or Awaitable in stack.");return!0})}static isStackModel(e){return e instanceof o}static createStackModel(e,t,n){let i=new o(e);return i.deserialize(t,n),i}static createCountLoop(e,t,n){let i=new o(e,"loop:count");return i.initLoop({type:"count",counter:0,limit:t,bodyActionIds:n.map(r=>r.getId()),broken:!1},n,null),i}static createConditionLoop(e,t,n,i){let r=new o(e,"loop:condition");return r.initLoop({type:"condition",counter:0,conditionActionId:n,bodyActionIds:i.map(s=>s.getId()),broken:!1},i,t),r}static isCalledActionResult(e){return!!e&&!this.isStackModel(e)&&!v.isAwaitable(e)&&"type"in e}static fromAction(e){return{type:e.type,node:e.contentNode}}static executeStackModelGroup(e,t){return e==="any"?v.any(...t.map(n=>n.execute())):v.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%Jr===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=Jr&&t<La){let i=new E(`[NarraLeaf] Potential infinite loop detected!
|
|
31
31
|
Loop has executed ${e} iterations in ${t}ms.
|
|
32
32
|
This is likely a bug in your game script. Check your loop conditions.
|
|
33
|
-
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
|
|
34
|
-
NarraLeaf cannot find the element with the id from the saved game`);f.reset(),f.fromData(h)}),this.currentSavedGame=e,t.loadData(r,u),this.stackModel.deserialize(c,p),l.forEach(d=>{let h=Oe.createStackModel(this,d,p);this.asyncStackModels.add(h),t.timelines.attachTimeline(this.executeAsyncStackModel(h))}),n.deserializeServices(a),this.game.hooks.trigger("afterRestore",[]),t.events.once(E.EventTypes["event:state.onRender"],()=>{t.schedule(()=>{t.rollLock.unlock(),t.stage.next()},0)}),t.stage.forceUpdate()}getHistory(){return this.assertGameState(),this.gameState.gameHistory.getHistory()}undo(e){if(this.assertGameState(),!this.gameState.actionHistory.ableToUndo(this.gameState.gameHistory)){this.gameState.logger.warn("LiveGame.undo","No action to undo");return}let t=this.gameLock.register().lock();this.stackModel.abortStackTop();let n=e?this.gameState.actionHistory.undoUntil(e):this.gameState.actionHistory.undo(this.gameState.gameHistory);if(n){let[i]=this.constructMaps(),{rootStackSnapshot:r,stackModel:s}=n;n.action.type===en.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(r,i),s===this.stackModel&&this.stackModel.push(Oe.fromAction(n.action)),this.gameLock.off(t.unlock()),this.gameState.logger.info("LiveGame.undo","Undo until",e,"action",n),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0)}else this.gameState.logger.warn("LiveGame.undo","No action found"),this.gameLock.off(t.unlock())}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=v.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 me({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(E.EventTypes["event:state.player.skip"],!0)}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(Dt.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Dt.EventTypes["event:menu.choose"],e)}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(Oe.fromAction(i)):e.logger.warn("No scene root found");let r=this.story?.getAllElementMap(this.story,this.story?.entryScene?.getSceneRoot()||[]);return r?r.forEach(s=>{e.logger.debug("reset element",s),s.reset()}):e.logger.warn("No elements found"),e.stage.forceUpdate(),e.stage.next(),t.end(),this}waitForRouterExit(){let e=null;return{promise:new Promise(t=>{e=this.game.router.onceExitComplete(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}waitForPageMount(){let e=null;return{promise:new Promise(t=>{e=this.game.router.oncePageMount(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}requestFullScreen(e){this.assertGameState();let t="LiveGame.requestFullScreen";try{let n=this.gameState.playerCurrent;if(!n){this.gameState.logger.warn(t,"No player element found");return}if(n.requestFullscreen)return n.requestFullscreen(e);this.gameState.logger.warn(t,"Fullscreen is not supported")}catch(n){this.gameState.logger.error(t,n)}}exitFullScreen(){this.assertGameState();let e="LiveGame.exitFullScreen";try{if(document.exitFullscreen)return document.exitFullscreen();this.gameState.logger.warn(e,"Fullscreen is not supported")}catch(t){this.gameState.logger.error(e,t)}}constructMaps(){let e=this.story;if(!e)throw new Error("No story loaded");if(this.mapCache)return this.mapCache;let t=new Map,n=new Map;return e.forEachChild(e,e.entryScene?.getSceneRoot()||[],i=>{t.set(i.getId(),i),n.set(i.callee.getId(),i.callee)},{allowFutureScene:!0}),this.mapCache=[t,n],this.mapCache}getScreenshotOptions(){return{quality:this.game.config.screenshotQuality}}onPlayerEvent(e,t,n){this.assertPlayerElement();let i=this.gameState.playerCurrent;return i?(i.addEventListener(e,t,n),{cancel:()=>i.removeEventListener(e,t,n)}):(this.gameState.logger.warn("LiveGame.onEvent","No player element found"),{cancel:()=>{}})}onWindowEvent(e,t,n){return window.addEventListener(e,t,n),{cancel:()=>window.removeEventListener(e,t,n)}}reset(){this.assertGameState();let e=this.gameState;this.resetStackModels(),this.stackModel.reset(),this.currentSavedGame=null,this.lastDialog=null,e.forceReset()}next(){this.assertGameState();let e=this.gameState;if(this.gameLock.isLocked())return this.gameLock;if(!this.story)throw new Error("No story loaded");return this.stackModel.isEmpty()?(e.logger.weakWarn("Game Actions","Action stack is empty"),this.currentSavedGame?e.events.emit("event:state.end"):this.currentSavedGame=null,null):this.stackModel.rollNext()}setLastDialog(e,t){this.lastDialog={sentence:e,speaker:t}}requestAsyncStackModel(e){this.assertGameState();let t=new Oe(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 Oe(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");let i=t.executeAction(e,n);return v.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new Fe("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Oe(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Fe("GameState not set");return this.gameState}getAllPredictableActions(e,t,n){let i=t?.contentNode||null,r=[],s=[],a=new Set;for(;(i||s.length)&&!(n&&r.length>=n);){if(i||(i=s.pop().contentNode),[pt].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(te,$.jumpTo)){let[c]=i.action.contentNode.getContent(),l=e.getScene(c);if(!l)throw i.action._sceneNotFoundError(i.action.getSceneName(c));if(a.has(l)){i=null;continue}a.add(l),i=l.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(fe,Ae.do)){let[c]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=c[0]?.contentNode||null}i.action&&r.push(i.action),i=i.getChild()}return r}clearMainStack(){if(!this.stackModel)throw new Fe("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Fe("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:Hr(),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 P("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 P("Player Element Not Mounted")}};Dt.DefaultNamespaces={game:{}},Dt.GameSpacesKey={game:"game"},Dt.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose"};var ht=Dt;var In=class In{constructor(e){this.settings=e;this.events=new X;this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(In.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(In.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))}};In.EventTypes={"event:game.preference.change":"event:game.preference.change"};var Rn=In;import"client-only";import Gs,{useEffect as ul,useRef as zo}from"react";import"client-only";import Zr,{useContext as _r,useState as Ia}from"react";var So=Zr.createContext(null);function es({children:o,game:e}){"use client";let t=new Z({}),[n]=Ia(e||t);return Zr.createElement(So,{value:n},o)}function D(){let o=_r(So);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function ts(){return _r(So)}import Ra,{createContext as Na,useContext as ns}from"react";var is="/",Ci=class Ci{constructor(e,t=Ci.rootPath){this.events=new X;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,c]=s.split("=");a&&(i[decodeURIComponent(a)]=c?decodeURIComponent(c):"")}}return{path:t||"/",query:i}}buildUrl(e,t){if(Object.keys(t).length===0)return e;let n=Object.entries(t).map(([i,r])=>`${encodeURIComponent(i)}=${encodeURIComponent(r)}`).join("&");return`${e}?${n}`}getQueryParam(e){return this.currentQuery[e]}setQueryParam(e,t){return this.currentQuery[e]=t,this.updateHistory(),this.emitOnChange(),this}setQueryParams(e){return Object.assign(this.currentQuery,e),this.updateHistory(),this.emitOnChange(),this}removeQueryParam(e){return delete this.currentQuery[e],this.updateHistory(),this.emitOnChange(),this}clearQueryParams(){return this.currentQuery={},this.updateHistory(),this.emitOnChange(),this}hasQueryParam(e){return e in this.currentQuery}getQueryParamKeys(){return Object.keys(this.currentQuery)}getQueryParamCount(){return Object.keys(this.currentQuery).length}getHistory(){return[...this.history]}getHistoryIndex(){return this.historyIndex}canGoBack(){return this.historyIndex>0}canGoForward(){return this.historyIndex<this.history.length-1}navigate(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};if(this.currentPath===r)return this.currentQuery=s,this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(r,s)),this.emitOnChange(),this;this.historyIndex<this.history.length-1&&(this.history.length=this.historyIndex+1);let a=this.buildUrl(r,s);return this.history.push(a),this.history.length>this.game.config.maxRouterHistory&&(this.history.shift(),this.historyIndex--),this.historyIndex++,this.currentPath=r,this.currentQuery=s,this.emitOnChange(),this.requestPageTransition(),this}back(){if(this.canGoBack()){this.historyIndex--;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}forward(){if(this.canGoForward()){this.historyIndex++;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}replace(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};return this.currentPath=r,this.currentQuery=s,this.historyIndex>=0?this.history[this.historyIndex]=this.buildUrl(r,s):(this.history.push(this.buildUrl(r,s)),this.historyIndex=0),this.emitOnChange(),this}clear(){return this.currentPath="",this.currentQuery={},this.history=[],this.historyIndex=-1,this.emitOnChange(),this.requestPageTransition(),this}cleanHistory(){return this.history=this.currentPath?[this.buildUrl(this.currentPath,this.currentQuery)]:[],this.historyIndex=this.currentPath?0:-1,this}parsePath(e){return e.split("/").filter(t=>t.length>0)}buildPath(e){return"/"+e.join("/")}getParentPath(e){let t=this.parsePath(e);return t.length<=1?"":this.buildPath(t.slice(0,-1))}matchPath(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length<i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}exactMatch(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length!==i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}extractParams(e,t){let n={},i=this.parsePath(e),r=this.parsePath(t);if(i.length!==r.length)return n;for(let s=0;s<r.length;s++){let a=r[s];if(a.startsWith(":")){let c=a.slice(1);n[c]=i[s]}}return n}onExitComplete(e){return this.events.on("event:router.onExitComplete",e)}onceExitComplete(e){return this.events.once("event:router.onExitComplete",e)}onPageMount(e){return this.events.on("event:router.onPageMount",e)}oncePageMount(e){return this.events.once("event:router.onPageMount",e)}onUpdate(e){return this.updateSyncHooks.add(e),{cancel:()=>{this.updateSyncHooks.delete(e)}}}emitUpdateSync(){this.updateSyncHooks.forEach(e=>e())}mount(e){if(this.mountedPaths.has(e))throw new P(`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 P(`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(),je(()=>{t()}))})}else je(()=>{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)}};Ci.rootPath=is;var Ft=Ci,To=Na(null);function os({children:o}){let e=D();return Ra.createElement(To,{value:{router:e.router}},o)}function yt(){if(!ns(To))throw new Error("useRouter must be used within a RouterProvider");return ns(To).router}import ss from"react";import Ka from"clsx";import Ma,{createContext as Ga,useContext as Ha,useLayoutEffect as Ua,useReducer as Fa,useState as Oa}from"react";var Lt=class Lt{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(Lt.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(Lt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(Lt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(Lt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(Lt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(Lt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};Lt.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 bo=Lt,Co=Ga(null);function rs({children:o}){"use client";let[e]=Oa(()=>new bo);return Ma.createElement(Co,{value:{ratio:e}},o)}function he(){let o=Ha(Co),[,e]=Fa(n=>n+1,0);if(!Co||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return Ua(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function vt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=he(),s=r.getStyle();return ss.createElement("div",{className:Ka("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},ss.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import Va,{useEffect as Wa}from"react";function at(o){let e=D(),[t,n]=Va.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return Wa(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Ao from"react";import Ai from"react";import as from"clsx";function xi({children:o,className:e,style:t,...n}){let{ratio:i}=he(),r=D();return Ai.createElement(vt,{className:as("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},Ai.createElement("div",{className:"absolute inset-0 w-full h-full"},Ai.createElement("div",{className:"inset-0 w-full h-full"},Ai.createElement("div",{className:as("pointer-events-auto-rest",e),style:t},o))))}function za({children:o,className:e,style:t}){return Ao.createElement(Ao.Fragment,null,Ao.createElement(xi,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import cs from"clsx";import ls from"react";function wi({className:o,children:e,...t}){let{ratio:n}=he();return ls.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:cs("w-full h-full")},ls.createElement("div",{className:cs("z-20",o),...t},e))}import ot,{useState as us}from"react";import{motion as Ba}from"motion/react";function ki({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=D(),[l,p]=us(!1);if(!c.config.app.inspector)return ot.createElement(r,{...a,ref:s},o);let u={...a,onMouseEnter:()=>p(!0),onMouseLeave:()=>p(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:l?1e3:"auto"}};return ot.createElement(r,{...u,ref:s},n&&l&&ot.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function $a({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=D(),[a,c]=us(!1);if(!s.config.app.inspector)return ot.createElement(i,{...r});let l={...r,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),style:{...r.style||{},outline:`${o} ${n}px ${e}`,zIndex:a?1e3:"auto"}};return ot.createElement("div",null,ot.createElement(i,{...l}),t&&a&&ot.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function ja(o){return ot.createElement(ki,{...o,as:"div"})}function qa(o){return ot.createElement(ki,{...o,as:"span"})}function Qa(o){return ot.createElement($a,{...o,as:"img"})}function Xa(o){return ot.createElement(ki,{...o,as:"button"})}function Ya(o){return ot.createElement(ki,{...o,as:Ba.div,ref:o.ref,layout:o.layout})}var Ja={Div:ja,Span:qa,Button:Xa,Img:Qa,mDiv:Ya},Qt=Ja;import Li from"clsx";import Ne,{useEffect as fn,useRef as hs,useState as xo}from"react";import{useEffect as Za,useState as _a}from"react";function ie(o){let[e,t]=_a(0);Za(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import ps from"react";var Xt=ps.createContext(null);function ct(){let o=ps.useContext(Xt);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import Pi,{useCallback as ec,useLayoutEffect as Nn,useMemo as ds,useRef as ms}from"react";import{useIsPresent as tc}from"motion/react";var lt=class lt{constructor(e){this.events=new X;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.config=e,this._state="pending",this.autoForwardScheduler=new Yn,this._count=0}get state(){return this._state}get deps(){return[this._count]}isIdle(){return this._idle}setIdle(e){this._idle=e}isActive(){return this._active}setActive(e){return this._active=e,e||this.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(lt.Events.complete):this.safeEmit(lt.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(lt.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(lt.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(Z.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(lt.Events.complete),this.emitFlush(),this}isEnded(){return this.state==="ended"}setPause(e){this.isEnded()||(e?this._state="paused":this._state="pending")}isForceSkipped(){return this._forceSkipped}tryScheduleAutoForward(){this.isEnded()&&this.scheduleAutoForward()}cancelAutoForward(){this.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(lt.Events.onFlush),this}onFlush(e){return this.events.on(lt.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(Z.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(lt.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(Z.Preferences.gameSpeed))}};lt.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ce=lt;function Mn({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=tc(),s=i&&r,a=ms(!1),c=ms(o),l=c.current!==o,p=ds(()=>o.sentence?.evaluate(Se.getCtx({gameState:n})),[o.sentence,n]),u=ds(()=>new Ce({useTypeEffect:t,action:o,evaluatedWords:p||[],gameState:n,suppressInitialAnimation:l}),[o,n,t,p]),d=n.game.config.dialog,h=ec(f=>{!s||a.current||(a.current=!0,e?.(f))},[s,e]);return Nn(()=>{a.current=!1},[u]),Nn(()=>{c.current=o},[o]),Nn(()=>(u.setActive(s),()=>{u.setActive(!1)}),[u,s]),Nn(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",u),u.events.on(Ce.Events.complete,f=>{n.logger.log("NarraLeaf-React: Say","Complete",u.isIdle()),s&&(u.isIdle()||f?h(!1):u.setIdle(!0))}).cancel),[u,h,n,s]),Nn(()=>n.events.on(E.EventTypes["event:state.player.skip"],f=>{s&&(f?(u.setIdle(!0),u.forceSkip()):u.isIdle()?h(!0):u.forceSkip())}).cancel,[u,h,n,s]),Pi.createElement(Pi.Fragment,null,Pi.createElement(Xt,{value:u},Pi.createElement(d,null)))}import{useEffect as Ei,useState as oc}from"react";import{useEffect as nc,useState as ic}from"react";function Yt(o){let e=D(),[t,n]=ic(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return nc(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var mn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(mn||{});function Di({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=D(),[s]=Yt("nextAction"),[a]=oc(()=>new Ce({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e}));return Ei(()=>{if(!n)return;let c=()=>{e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()},l=()=>{e.requestNvlSkip(o.id)==="typing"&&a.forceSkip()},p=e.events.on(E.EventTypes["event:state.player.stageClick"],c),u=e.events.on(E.EventTypes["event:state.player.skip"],l);return()=>{p.cancel(),u.cancel()}},[a,o.id,e,n]),Ei(()=>{if(!n)return;let c=p=>{if(!r.keyMap.match("nextAction",p.key))return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()};if(r.config.useWindowListener){let p=r.getLiveGame().onWindowEvent("keyup",c);return()=>{p.cancel()}}let l=r.getLiveGame().onPlayerEvent("keyup",c);return()=>{l.cancel()}},[a,o.id,r,e,n,s]),Ei(()=>{let c=a.events.on(Ce.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Ei(()=>{let c=a.events.on(Ce.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function*ko(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Ie.isPause(n.text)){yield Ie.from(n.text);continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
|
|
33
|
+
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(v.isAwaitable(e)&&!e.isSettled())return e;if(o.isCalledActionResult(e)&&e.wait){let n=e.wait.stackModels;if(!n.length)throw new Error("StackModel: Waiting action contains empty stackModels.");if(o.isStackModelsAwaiting(e.wait.type,n))return n.forEach(i=>i.rollNext()),e}this.waitingAction=null;let t=this.stack.pop();if(v.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 v().registerSkipController(new H(()=>{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(v.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&&v.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}getTopSync(){if(this.stack.isEmpty())return null;let e=!1;for(let t=this.stack.size()-1;t>=0;t--){let n=this.stack.get(t);if(n){if(o.isCalledActionResult(n))return n;if(e)throw new Fe("StackModel: Unexpected non-CalledActionResult in stack.")}else return null;e=!0}return null}executeActions(e){if(!e.node?.action)return null;let t=this.liveGame.executeAction(this.liveGame.getGameStateForce(),e.node.action,{stackModel:this}),n=i=>i?v.isAwaitable(i)?(this.liveGame.getGameStateForce().logger.debug("next action (executed awaitable)",i),this.stack.push(i),i):i.node?.action?(this.liveGame.getGameStateForce().logger.debug("next action (executed)",i),this.stack.push(i),i):null:null;if(Array.isArray(t)){let i=null;for(let r of t){let s=n(r);s&&(i=s)}return i}else{let i=n(t);if(i)return i}return null}isWaiting(){let e=this.stack.peek();return e?v.isAwaitable(e)?!e.isSettled():o.isCalledActionResult(e)&&e.wait?o.isStackModelsAwaiting(e.wait.type,e.wait.stackModels):!1:!1}serialize(e=!0){let t=r=>{if(o.isCalledActionResult(r)){let s=r.node?.action?.getId()??null,a=r.node?.action?.type??null;return r.wait?.stackModels?{type:"link",actionType:a,action:s,stacks:r.wait.stackModels.map(c=>c.serialize()),stackWaitType:r.wait.type}:{type:"action",actionType:a,action:s}}return null},n=this.stack.map(t).filter(function(r){return r!==null});if(e&&this.waitingAction){let r=t(this.waitingAction);r&&n.push(r)}let i={items:n};return this.loopConfig&&(i.loop={type:this.loopConfig.type,counter:this.loopConfig.counter,limit:this.loopConfig.limit,conditionActionId:this.loopConfig.conditionActionId,bodyActionIds:this.loopConfig.bodyActionIds,broken:this.loopConfig.broken}),i}reset(){this.stack.forEach(e=>{o.isCalledActionResult(e)?e.wait?.stackModels.forEach(t=>t.reset()):v.isAwaitable(e)&&e.abort()}),this.waitingAction&&this.waitingAction.wait?.stackModels.forEach(e=>e.reset()),this.waitingAction=null,this.stack.clear(),this.loopConfig=null,this.loopBodyActions=[],this.loopCondition=null,this.loopStartTime=0,this.loopDebugCheckpoint=0}deserialize(e,t){this.reset();let n=e.items;for(let i of n)if(i.type==="action"){if(!i.action)continue;let{actionType:r,action:s}=i,a=t.get(s);if(!a)throw new Error(`Action not found: ${s}`);this.stack.push({type:r,node:a.contentNode,wait:null})}else if(i.type==="link"){let{actionType:r,action:s,stacks:a,stackWaitType:c}=i;if(c==null)throw new Error(`Missing stackWaitType for link action: ${s}`);this.stack.push({type:r,node:s?t.get(s)?.contentNode??null:null,wait:{type:c,stackModels:a.map(l=>o.createStackModel(this.liveGame,l,t))}})}if(e.loop){let i=e.loop,r=[];for(let a of i.bodyActionIds){let c=t.get(a);if(!c)throw new Error(`Loop body action not found: ${a}`);r.push(c)}let s=null;if(i.type==="condition"&&i.conditionActionId){let a=t.get(i.conditionActionId);if(a){let c=a.contentNode.getContent();Array.isArray(c)&&c.length>=2&&O.isLambda(c[1])&&(s=c[1])}}this.loopConfig={type:i.type,counter:i.counter,limit:i.limit,conditionActionId:i.conditionActionId,bodyActionIds:i.bodyActionIds,broken:i.broken},this.loopBodyActions=r,this.loopCondition=s,this.loopStartTime=Date.now(),this.loopDebugCheckpoint=i.counter}return this}isEmpty(){return this.stack.isEmpty()}push(...e){return this.stack.push(...e),this}};var Dt=class Dt{constructor(e){this.events=new X;this.story=null;this.gameLock=new nn;this.currentSavedGame=null;this.gameState=void 0;this.stackModel=null;this.asyncStackModels=new Set;this.lastDialog=null;this.mapCache=null;this.game=e,this._storable=new xn,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new dt(Dt.GameSpacesKey.game,Dt.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.gameState,t=this.story;if(!t)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");let n=this._storable.toData(),i=e.toData(),r=t.getAllElementStates(),s=this.stackModel.serialize(),a=Array.from(this.asyncStackModels).map(c=>c.serialize());return{name:this.currentSavedGame.name,meta:{created:this.currentSavedGame.meta.created,updated:Date.now(),id:this.currentSavedGame.meta.id,lastSentence:this.lastDialog?.sentence||null,lastSpeaker:this.lastDialog?.speaker||null,storyHash:t.hash()},game:{store:n,stage:i,elementStates:r,stackModel:s,asyncStackModels:a,services:t.serializeServices()}}}deserialize(e){if(!e)throw new Error("No saved game provided when trying to deserialize game state");this.assertGameState();let t=this.gameState,n=this.story;if(!n)throw new Error("No story loaded");this.game.hooks.trigger("beforeRestore",[]),t.rollLock.lock(),this.reset(),t.stage.forceRemount();let{game:{store:i,stage:r,elementStates:s,services:a,stackModel:c,asyncStackModels:l}}=e,[p,u]=this.constructMaps();this.initNamespaces(),this._storable.load(i),s.forEach(({id:d,data:h})=>{t.logger.debug("restore element",d);let f=u.get(d);if(!f)throw new Error("Element not found, id: "+d+`
|
|
34
|
+
NarraLeaf cannot find the element with the id from the saved game`);f.reset(),f.fromData(h)}),this.currentSavedGame=e,t.loadData(r,u),this.stackModel.deserialize(c,p),l.forEach(d=>{let h=Oe.createStackModel(this,d,p);this.asyncStackModels.add(h),t.timelines.attachTimeline(this.executeAsyncStackModel(h))}),n.deserializeServices(a),this.game.hooks.trigger("afterRestore",[]),t.events.once(P.EventTypes["event:state.onRender"],()=>{t.schedule(()=>{t.rollLock.unlock(),t.stage.next()},0)}),t.stage.forceUpdate()}getHistory(){return this.assertGameState(),this.gameState.gameHistory.getHistory()}undo(e){if(this.assertGameState(),!this.gameState.actionHistory.ableToUndo(this.gameState.gameHistory)){this.gameState.logger.warn("LiveGame.undo","No action to undo");return}let t=this.gameLock.register().lock();this.stackModel.abortStackTop();let n=e?this.gameState.actionHistory.undoUntil(e):this.gameState.actionHistory.undo(this.gameState.gameHistory);if(n){let[i]=this.constructMaps(),{rootStackSnapshot:r,stackModel:s}=n;n.action.type===en.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(r,i),s===this.stackModel&&this.stackModel.push(Oe.fromAction(n.action)),this.gameLock.off(t.unlock()),this.gameState.logger.info("LiveGame.undo","Undo until",e,"action",n),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0)}else this.gameState.logger.warn("LiveGame.undo","No action found"),this.gameLock.off(t.unlock())}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=v.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 me({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(P.EventTypes["event:state.player.skip"],!0)}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(Dt.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(Dt.EventTypes["event:menu.choose"],e)}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(Oe.fromAction(i)):e.logger.warn("No scene root found");let r=this.story?.getAllElementMap(this.story,this.story?.entryScene?.getSceneRoot()||[]);return r?r.forEach(s=>{e.logger.debug("reset element",s),s.reset()}):e.logger.warn("No elements found"),e.stage.forceUpdate(),e.stage.next(),t.end(),this}waitForRouterExit(){let e=null;return{promise:new Promise(t=>{e=this.game.router.onceExitComplete(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}waitForPageMount(){let e=null;return{promise:new Promise(t=>{e=this.game.router.oncePageMount(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}requestFullScreen(e){this.assertGameState();let t="LiveGame.requestFullScreen";try{let n=this.gameState.playerCurrent;if(!n){this.gameState.logger.warn(t,"No player element found");return}if(n.requestFullscreen)return n.requestFullscreen(e);this.gameState.logger.warn(t,"Fullscreen is not supported")}catch(n){this.gameState.logger.error(t,n)}}exitFullScreen(){this.assertGameState();let e="LiveGame.exitFullScreen";try{if(document.exitFullscreen)return document.exitFullscreen();this.gameState.logger.warn(e,"Fullscreen is not supported")}catch(t){this.gameState.logger.error(e,t)}}constructMaps(){let e=this.story;if(!e)throw new Error("No story loaded");if(this.mapCache)return this.mapCache;let t=new Map,n=new Map;return e.forEachChild(e,e.entryScene?.getSceneRoot()||[],i=>{t.set(i.getId(),i),n.set(i.callee.getId(),i.callee)},{allowFutureScene:!0}),this.mapCache=[t,n],this.mapCache}getScreenshotOptions(){return{quality:this.game.config.screenshotQuality}}onPlayerEvent(e,t,n){this.assertPlayerElement();let i=this.gameState.playerCurrent;return i?(i.addEventListener(e,t,n),{cancel:()=>i.removeEventListener(e,t,n)}):(this.gameState.logger.warn("LiveGame.onEvent","No player element found"),{cancel:()=>{}})}onWindowEvent(e,t,n){return window.addEventListener(e,t,n),{cancel:()=>window.removeEventListener(e,t,n)}}reset(){this.assertGameState();let e=this.gameState;this.resetStackModels(),this.stackModel.reset(),this.currentSavedGame=null,this.lastDialog=null,e.forceReset()}next(){this.assertGameState();let e=this.gameState;if(this.gameLock.isLocked())return this.gameLock;if(!this.story)throw new Error("No story loaded");return this.stackModel.isEmpty()?(e.logger.weakWarn("Game Actions","Action stack is empty"),this.currentSavedGame?e.events.emit("event:state.end"):this.currentSavedGame=null,null):this.stackModel.rollNext()}setLastDialog(e,t){this.lastDialog={sentence:e,speaker:t}}requestAsyncStackModel(e){this.assertGameState();let t=new Oe(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 Oe(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");let i=t.executeAction(e,n);return v.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new Fe("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Oe(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Fe("GameState not set");return this.gameState}getAllPredictableActions(e,t,n){let i=t?.contentNode||null,r=[],s=[],a=new Set;for(;(i||s.length)&&!(n&&r.length>=n);){if(i||(i=s.pop().contentNode),[pt].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(te,$.jumpTo)){let[c]=i.action.contentNode.getContent(),l=e.getScene(c);if(!l)throw i.action._sceneNotFoundError(i.action.getSceneName(c));if(a.has(l)){i=null;continue}a.add(l),i=l.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(fe,Ae.do)){let[c]=i.action.contentNode.getContent();i.getChild()?.action&&s.push(i.getChild().action),i=c[0]?.contentNode||null}i.action&&r.push(i.action),i=i.getChild()}return r}clearMainStack(){if(!this.stackModel)throw new Fe("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Fe("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:Hr(),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")}};Dt.DefaultNamespaces={game:{}},Dt.GameSpacesKey={game:"game"},Dt.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose"};var ht=Dt;var In=class In{constructor(e){this.settings=e;this.events=new X;this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(In.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(In.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))}};In.EventTypes={"event:game.preference.change":"event:game.preference.change"};var Rn=In;import"client-only";import Gs,{useEffect as ul,useRef as zo}from"react";import"client-only";import Zr,{useContext as _r,useState as Ia}from"react";var So=Zr.createContext(null);function es({children:o,game:e}){"use client";let t=new Z({}),[n]=Ia(e||t);return Zr.createElement(So,{value:n},o)}function D(){let o=_r(So);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function ts(){return _r(So)}import Ra,{createContext as Na,useContext as ns}from"react";var is="/",Ci=class Ci{constructor(e,t=Ci.rootPath){this.events=new X;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,c]=s.split("=");a&&(i[decodeURIComponent(a)]=c?decodeURIComponent(c):"")}}return{path:t||"/",query:i}}buildUrl(e,t){if(Object.keys(t).length===0)return e;let n=Object.entries(t).map(([i,r])=>`${encodeURIComponent(i)}=${encodeURIComponent(r)}`).join("&");return`${e}?${n}`}getQueryParam(e){return this.currentQuery[e]}setQueryParam(e,t){return this.currentQuery[e]=t,this.updateHistory(),this.emitOnChange(),this}setQueryParams(e){return Object.assign(this.currentQuery,e),this.updateHistory(),this.emitOnChange(),this}removeQueryParam(e){return delete this.currentQuery[e],this.updateHistory(),this.emitOnChange(),this}clearQueryParams(){return this.currentQuery={},this.updateHistory(),this.emitOnChange(),this}hasQueryParam(e){return e in this.currentQuery}getQueryParamKeys(){return Object.keys(this.currentQuery)}getQueryParamCount(){return Object.keys(this.currentQuery).length}getHistory(){return[...this.history]}getHistoryIndex(){return this.historyIndex}canGoBack(){return this.historyIndex>0}canGoForward(){return this.historyIndex<this.history.length-1}navigate(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};if(this.currentPath===r)return this.currentQuery=s,this.historyIndex>=0&&(this.history[this.historyIndex]=this.buildUrl(r,s)),this.emitOnChange(),this;this.historyIndex<this.history.length-1&&(this.history.length=this.historyIndex+1);let a=this.buildUrl(r,s);return this.history.push(a),this.history.length>this.game.config.maxRouterHistory&&(this.history.shift(),this.historyIndex--),this.historyIndex++,this.currentPath=r,this.currentQuery=s,this.emitOnChange(),this.requestPageTransition(),this}back(){if(this.canGoBack()){this.historyIndex--;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}forward(){if(this.canGoForward()){this.historyIndex++;let{path:e,query:t}=this.parseUrl(this.history[this.historyIndex]);this.currentPath=e,this.currentQuery=t,this.emitOnChange(),this.requestPageTransition()}return this}replace(e,t){let{path:n,query:i}=this.parseUrl(e),r=this.resolvePath(n),s={...i,...t};return this.currentPath=r,this.currentQuery=s,this.historyIndex>=0?this.history[this.historyIndex]=this.buildUrl(r,s):(this.history.push(this.buildUrl(r,s)),this.historyIndex=0),this.emitOnChange(),this}clear(){return this.currentPath="",this.currentQuery={},this.history=[],this.historyIndex=-1,this.emitOnChange(),this.requestPageTransition(),this}cleanHistory(){return this.history=this.currentPath?[this.buildUrl(this.currentPath,this.currentQuery)]:[],this.historyIndex=this.currentPath?0:-1,this}parsePath(e){return e.split("/").filter(t=>t.length>0)}buildPath(e){return"/"+e.join("/")}getParentPath(e){let t=this.parsePath(e);return t.length<=1?"":this.buildPath(t.slice(0,-1))}matchPath(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length<i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}exactMatch(e,t){let n=this.parsePath(e),i=this.parsePath(t);if(n.length!==i.length)return!1;for(let r=0;r<i.length;r++){let s=n[r],a=i[r];if(a!=="*"){if(a.startsWith(":"))continue;if(s!==a)return!1}}return!0}extractParams(e,t){let n={},i=this.parsePath(e),r=this.parsePath(t);if(i.length!==r.length)return n;for(let s=0;s<r.length;s++){let a=r[s];if(a.startsWith(":")){let c=a.slice(1);n[c]=i[s]}}return n}onExitComplete(e){return this.events.on("event:router.onExitComplete",e)}onceExitComplete(e){return this.events.once("event:router.onExitComplete",e)}onPageMount(e){return this.events.on("event:router.onPageMount",e)}oncePageMount(e){return this.events.once("event:router.onPageMount",e)}onUpdate(e){return this.updateSyncHooks.add(e),{cancel:()=>{this.updateSyncHooks.delete(e)}}}emitUpdateSync(){this.updateSyncHooks.forEach(e=>e())}mount(e){if(this.mountedPaths.has(e))throw new 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(),je(()=>{t()}))})}else je(()=>{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)}};Ci.rootPath=is;var Ft=Ci,To=Na(null);function os({children:o}){let e=D();return Ra.createElement(To,{value:{router:e.router}},o)}function yt(){if(!ns(To))throw new Error("useRouter must be used within a RouterProvider");return ns(To).router}import ss from"react";import Ka from"clsx";import Ma,{createContext as Ga,useContext as Ha,useLayoutEffect as Ua,useReducer as Fa,useState as Oa}from"react";var Lt=class Lt{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(Lt.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(Lt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(Lt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(Lt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(Lt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(Lt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};Lt.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 bo=Lt,Co=Ga(null);function rs({children:o}){"use client";let[e]=Oa(()=>new bo);return Ma.createElement(Co,{value:{ratio:e}},o)}function he(){let o=Ha(Co),[,e]=Fa(n=>n+1,0);if(!Co||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return Ua(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function vt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=he(),s=r.getStyle();return ss.createElement("div",{className:Ka("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},ss.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import Va,{useEffect as Wa}from"react";function at(o){let e=D(),[t,n]=Va.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return Wa(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import Ao from"react";import Ai from"react";import as from"clsx";function xi({children:o,className:e,style:t,...n}){let{ratio:i}=he(),r=D();return Ai.createElement(vt,{className:as("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},Ai.createElement("div",{className:"absolute inset-0 w-full h-full"},Ai.createElement("div",{className:"inset-0 w-full h-full"},Ai.createElement("div",{className:as("pointer-events-auto-rest",e),style:t},o))))}function za({children:o,className:e,style:t}){return Ao.createElement(Ao.Fragment,null,Ao.createElement(xi,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import cs from"clsx";import ls from"react";function wi({className:o,children:e,...t}){let{ratio:n}=he();return ls.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:cs("w-full h-full")},ls.createElement("div",{className:cs("z-20",o),...t},e))}import ot,{useState as us}from"react";import{motion as Ba}from"motion/react";function ki({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=D(),[l,p]=us(!1);if(!c.config.app.inspector)return ot.createElement(r,{...a,ref:s},o);let u={...a,onMouseEnter:()=>p(!0),onMouseLeave:()=>p(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:l?1e3:"auto"}};return ot.createElement(r,{...u,ref:s},n&&l&&ot.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function $a({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=D(),[a,c]=us(!1);if(!s.config.app.inspector)return ot.createElement(i,{...r});let l={...r,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),style:{...r.style||{},outline:`${o} ${n}px ${e}`,zIndex:a?1e3:"auto"}};return ot.createElement("div",null,ot.createElement(i,{...l}),t&&a&&ot.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function ja(o){return ot.createElement(ki,{...o,as:"div"})}function qa(o){return ot.createElement(ki,{...o,as:"span"})}function Qa(o){return ot.createElement($a,{...o,as:"img"})}function Xa(o){return ot.createElement(ki,{...o,as:"button"})}function Ya(o){return ot.createElement(ki,{...o,as:Ba.div,ref:o.ref,layout:o.layout})}var Ja={Div:ja,Span:qa,Button:Xa,Img:Qa,mDiv:Ya},Qt=Ja;import Li from"clsx";import Ne,{useEffect as fn,useRef as hs,useState as xo}from"react";import{useEffect as Za,useState as _a}from"react";function ie(o){let[e,t]=_a(0);Za(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import ps from"react";var Xt=ps.createContext(null);function ct(){let o=ps.useContext(Xt);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import Pi,{useCallback as ec,useLayoutEffect as Nn,useMemo as ds,useRef as ms}from"react";import{useIsPresent as tc}from"motion/react";var lt=class lt{constructor(e){this.events=new X;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.config=e,this._state="pending",this.autoForwardScheduler=new Yn,this._count=0}get state(){return this._state}get deps(){return[this._count]}isIdle(){return this._idle}setIdle(e){this._idle=e}isActive(){return this._active}setActive(e){return this._active=e,e||this.cancelAutoForward(),this}requestComplete(){this._active&&(this.state==="ended"?this.safeEmit(lt.Events.complete):this.safeEmit(lt.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(lt.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(lt.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(Z.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(lt.Events.complete),this.emitFlush(),this}isEnded(){return this.state==="ended"}setPause(e){this.isEnded()||(e?this._state="paused":this._state="pending")}isForceSkipped(){return this._forceSkipped}tryScheduleAutoForward(){this.isEnded()&&this.scheduleAutoForward()}cancelAutoForward(){this.autoForwardScheduler.cancelTask()}emitFlush(){return this._count++,this.events.emit(lt.Events.onFlush),this}onFlush(e){return this.events.on(lt.Events.onFlush,e)}safeEmit(e,...t){return this.events.emit(e,...t)===0&&this.config.gameState.logger.weakWarn("DialogState",`Failed to emit event: ${e}. Target Component is not mounted.`),this}scheduleAutoForward(){let e=this.config.gameState.game.preference;!this._active||!e.getPreference(Z.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(lt.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(Z.Preferences.gameSpeed))}};lt.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var Ce=lt;function Mn({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=tc(),s=i&&r,a=ms(!1),c=ms(o),l=c.current!==o,p=ds(()=>o.sentence?.evaluate(Se.getCtx({gameState:n})),[o.sentence,n]),u=ds(()=>new Ce({useTypeEffect:t,action:o,evaluatedWords:p||[],gameState:n,suppressInitialAnimation:l}),[o,n,t,p]),d=n.game.config.dialog,h=ec(f=>{!s||a.current||(a.current=!0,e?.(f))},[s,e]);return Nn(()=>{a.current=!1},[u]),Nn(()=>{c.current=o},[o]),Nn(()=>(u.setActive(s),()=>{u.setActive(!1)}),[u,s]),Nn(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",u),u.events.on(Ce.Events.complete,f=>{n.logger.log("NarraLeaf-React: Say","Complete",u.isIdle()),s&&(u.isIdle()||f?h(!1):u.setIdle(!0))}).cancel),[u,h,n,s]),Nn(()=>n.events.on(P.EventTypes["event:state.player.skip"],f=>{s&&(f?(u.setIdle(!0),u.forceSkip()):u.isIdle()?h(!0):u.forceSkip())}).cancel,[u,h,n,s]),Pi.createElement(Pi.Fragment,null,Pi.createElement(Xt,{value:u},Pi.createElement(d,null)))}import{useEffect as Ei,useState as oc}from"react";import{useEffect as nc,useState as ic}from"react";function Yt(o){let e=D(),[t,n]=ic(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return nc(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var mn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(mn||{});function Di({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=D(),[s]=Yt("nextAction"),[a]=oc(()=>new Ce({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e}));return Ei(()=>{if(!n)return;let c=()=>{e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()},l=()=>{e.requestNvlSkip(o.id)==="typing"&&a.forceSkip()},p=e.events.on(P.EventTypes["event:state.player.stageClick"],c),u=e.events.on(P.EventTypes["event:state.player.skip"],l);return()=>{p.cancel(),u.cancel()}},[a,o.id,e,n]),Ei(()=>{if(!n)return;let c=p=>{if(!r.keyMap.match("nextAction",p.key))return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()};if(r.config.useWindowListener){let p=r.getLiveGame().onWindowEvent("keyup",c);return()=>{p.cancel()}}let l=r.getLiveGame().onPlayerEvent("keyup",c);return()=>{l.cancel()}},[a,o.id,r,e,n,s]),Ei(()=>{let c=a.events.on(Ce.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Ei(()=>{let c=a.events.on(Ce.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function*ko(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Ie.isPause(n.text)){yield Ie.from(n.text);continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
|
|
35
35
|
`?yield`
|
|
36
36
|
`:yield{text:r,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function wo(o){let e=ko(o),t=[];for(let n of e)Ie.isPause(n)||t.push(n);return t}function gs(o,e){o(t=>{let n=t[t.length-1];return n&&n!==`
|
|
37
37
|
`&&e!==`
|
|
38
|
-
`&&n.tag===e.tag?[...t.slice(0,-1),{...e,text:n.text+e.text,config:e.config}]:[...t,e]})}function rc(o,e,t){return t||(o!==void 0?le.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new q(n.text,n.config)):[])}function sc(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 fs(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Ii(o){return o===void 0?void 0:on(o)}function Po({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,...c}){let l=D(),p=l.getLiveGame().getGameState(),u=hs(null),[d,h]=xo(()=>n&&!n.config.useTypeEffect?wo(n.config.evaluatedWords):[]),[f,b]=ie();if(!n)throw new Error("Dialog state is required");fn(()=>{if(!(!n.config.action.sentence||u.current))return p.logger.info("Initializing the sentence",n,u.current),p.schedule(({onCleanup:C})=>{if(!n.config.useTypeEffect){n.dispatchComplete();return}h([]),u.current=g(),f(),u.current.onComplete(()=>{n.dispatchComplete()}),C(()=>{u.current?.timeline?.abort()})},0)},[]),fn(()=>n.events.depends([n.events.on(Ce.Events.requestComplete,()=>{u.current?.interact()}),n.events.on(Ce.Events.forceSkip,()=>{n.isEnded()||u.current?.forceSkip()})]).cancel,[n,b]),fn(()=>l.preference.events.depends([l.preference.onPreferenceChange(Z.Preferences.gameSpeed,()=>{u.current?.update()}),l.preference.onPreferenceChange(Z.Preferences.autoForward,()=>{u.current?.update()}),l.preference.onPreferenceChange(Z.Preferences.cps,()=>{u.current?.update()})]).cancel,[]);function g(){let C=new v,R=new we(C).setGuard(p.guard),B=new Set,K=new Set,
|
|
39
|
-
`?h(k=>[...k,ee]):typeof ee=="object"&&"text"in ee&&!B.has(ee)&&(B.add(ee),_(ee))}ke&&!ke.isSettled()?ke.abort():(
|
|
40
|
-
`&&B.has(k))continue;B.add(k),_(k);let{gameSpeed:wt,cps:jn}=l.preference.getPreferences(),Qn=1e3/((typeof k=="object"&&"cps"in k&&k.cps!==void 0?k.cps:jn)*wt);await ni(Qn)}}G&&(
|
|
41
|
-
`?Ne.createElement("br",{key:R}):Ne.createElement(Qt.Span,{tag:`say.word.${R}`,key:R,style:{...S(C),...ii(l.config.app.debug,{outline:"1px dashed red"})},className:Li("inline-block break-all",C.config.className)},C.config.ruby?Ne.createElement("ruby",{className:"align-bottom inline-block"},Ne.createElement("rt",{className:"block text-center"},C.config.ruby),C.text):C.text);return Ne.createElement("div",{...c,className:Li("whitespace-pre-wrap",e),style:{...y,...t}},d.map(L))}function ac({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:c,defaultColor:l,className:p,style:u,fontSize:d,fontWeight:h,fontWeightBold:f,fontFamily:b,onCompleted:g,...T}){let m=ts(),[,y]=xo(0),S=m?.config??Z.DefaultConfig,L=m?.preference.getPreferences()??Z.DefaultPreference,C=s??L.cps,R=a??L.gameSpeed,B=c??S.autoForwardDefaultPause,K=r??S.autoForwardDefaultPause,
|
|
42
|
-
`?await ce(fs(C,R)):await ce(fs(k.cps??C,R))}if(M)return;V(),Ge.enabled&&await ce(Ge.delay)}while(!M&&Ge.enabled)})(),()=>{M=!0,ye.forEach(G=>clearTimeout(G))}):(ze(wo(
|
|
43
|
-
`?Ne.createElement("br",{key:ye}):Ne.createElement("span",{key:ye,style:_(M),className:Li("inline-block break-all",M.config.className)},M.config.ruby?Ne.createElement("ruby",{className:"align-bottom inline-block"},Ne.createElement("rt",{className:"block text-center"},M.config.ruby),M.text):M.text);return Ne.createElement("div",{...T,className:Li("whitespace-pre-wrap",p),style:{...
|
|
44
|
-
This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function Hc({children:o,name:e,propagate:t}){let n=D(),[i]=ie(),{path:r,router:s,consumedBy:a}=Un(),c=s.joinPath(r,e),l=Fi(()=>s.createToken(c+"@layout")),p=s.getCurrentPath(),u=Gc(!1),d=f=>{u.current=f,i()},h=s.matchPath(p,c);if(Hn(),Ki(f=>{let b=f.matchPath(f.getCurrentPath(),c);if(u.current&&!b){if(!o){d(!1);return}f.registerUnmountingPath(l)}b&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(l),b&&!u.current&&!f.isTransitioning()&&d(!0)},[h,o]),Mc(()=>{if(!h)return;let f=s.mount(c);return()=>{f.cancel()}},[c,s,h]),a)throw new P("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Fn.createElement(On,{path:c},Fn.createElement(Oi,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),d(!1)}},h&&u.current&&o))}function xs({children:o}){return Hn(),Fn.createElement(On,{path:Ft.rootPath},Fn.createElement(xi,{"data-layout-path":Ft.rootPath,key:Ft.rootPath},o))}var Mo=Uc(null);function Kc(){return Fc(Mo)}function Vc({children:o,name:e}){let[t]=ie(),{path:n,router:i,consumedBy:r}=Un(),s=Kc(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,p=Fi(()=>i.createToken(l+"@page")),u=i.getCurrentPath(),d=!a,h=Oc(!1),f=m=>{h.current=m,t()},b=d&&i.exactMatch(u,n)||i.exactMatch(u,l);if(r&&r!==c)throw new P("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");Hn(),Ki(m=>{let y=d&&m.exactMatch(m.getCurrentPath(),n)||m.exactMatch(m.getCurrentPath(),l);if(h.current&&!y){if(!o){f(!1);return}m.registerUnmountingPath(p)}y&&m.isPathsUnmounting()&&m.unregisterUnmountingPath(p),y&&!h.current&&!m.isTransitioning()&&f(!0)},[b,o]),ws(()=>{if(!b)return;let m=d?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{m.cancel()}},[l,b]),ws(()=>()=>{i.unregisterUnmountingPath(p),f(!1)},[]);let g=No.createElement(On,{path:n,consumedBy:c},No.createElement(Oi,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(p),f(!1)}},b&&h.current&&o));return(m=>s?No.createElement(Mo,{value:{name:null}},m):m)(g)}import Go,{useCallback as Wc,useEffect as Ho,useImperativeHandle as zc,useMemo as ks,useRef as Uo,useState as Bc}from"react";var $c=50,jc={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Ps={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function qc(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Es(o,e){return e==null?o:Math.max(o,e)}function Qc(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 Ds=Go.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:c,dataAttributes:l,onUpdate:p,children:u},d){let h=Uo(null),[f,b]=Bc({...Ps,width:"0px",height:"0px"}),g=Uo(p),T=Uo(null);Ho(()=>{g.current=p},[p]);let m=Wc(()=>{let L=h.current;if(!L)return;let C=L.clientWidth,R=L.clientHeight;if(C<=0||R<=0||e<=0)return;let B=Qc(C,R,e),K=Es(B.width,n),ae=Es(B.height,i),Ge=T.current;(!Ge||Ge.width!==K||Ge.height!==ae)&&(T.current={width:K,height:ae},b({...Ps,width:`${K}px`,height:`${ae}px`}));let ke=t>0?K/t:1;g.current?.({width:K,height:ae,scale:ke,containerWidth:C,containerHeight:R})},[e,t,n,i]),y=ks(()=>Dr(m,typeof r=="number"?r:$c),[m,r]);Ho(()=>{m()},[m]),Ho(()=>{let L=new ResizeObserver(()=>{y()});h.current&&L.observe(h.current);let C=()=>{y()};return window.addEventListener("resize",C),()=>{L.disconnect(),window.removeEventListener("resize",C)}},[y]),zc(d,()=>({requestUpdate:m}),[m]);let S=ks(()=>qc(l),[l]);return Go.createElement("div",{id:c,ref:h,style:jc,...S},Go.createElement("div",{className:s,style:{...f,...a}},u))}),Ls=Ds;function Xc(){return D().getLiveGame()}import Ko from"react";import Yc,{createContext as Jc,useContext as Zc,useEffect as _c,useState as Is}from"react";var el={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Rs=Jc({state:el,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function St(){return Zc(Rs)}function Fo(){let{dialogs:o}=St();return o}function tl(){let{isActive:o}=St();return o}function nl(){let{isVisible:o}=St();return o}function Oo({children:o}){let t=D().getLiveGame().getGameState(),[n,i]=Is(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=Is(null);_c(()=>{let c=f=>({...f,dialogs:[...f.dialogs]}),l=t.events.on(E.EventTypes["event:state.nvl.enter"],(f,b)=>{i(c(t.getNvlState())),s(b?.showTransition||null)}),p=t.events.on(E.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState()))}),u=t.events.on(E.EventTypes["event:state.nvl.dialogAppend"],()=>{i(c(t.getNvlState()))}),d=t.events.on(E.EventTypes["event:state.nvl.visibilityChange"],(f,b)=>{i(c(t.getNvlState())),s(b||null)}),h=t.events.on(E.EventTypes["event:state.nvl.change"],f=>{i(c(f))});return()=>{l.cancel(),p.cancel(),u.cancel(),d.cancel(),h.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return Yc.createElement(Rs.Provider,{value:a},o)}import{AnimatePresence as il,motion as ol}from"motion/react";import rl from"clsx";function Vo({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=St(),{ratio:r}=he(),s=D(),a=i?.duration?i.duration/1e3:.3;return Ko.createElement(il,null,n&&Ko.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},Ko.createElement(ol.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:rl("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 Jt from"react";function Wo({renderDialogItem:o,dialogs:e}){return Jt.createElement(Vo,{className:"bg-black/80 text-white p-16 inset-8"},Jt.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?Jt.createElement(It,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Jt.createElement(Ot,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Jt.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}):Jt.createElement(Jt.Fragment,null,r,s))})))}import tt,{useMemo as sl}from"react";import Ns from"clsx";function al({children:o,className:e,style:t,renderDialogItem:n}){let i=Fo(),{state:r}=St();return tt.createElement("div",{"data-element-type":"nvl-dialog-list",className:Ns("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>tt.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},tt.createElement(cl,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?tt.createElement(It,{className:"nvl-character-name font-bold mr-2"}):null,texts:tt.createElement(Ot,{className:"nvl-dialog-text"})}):o?tt.Children.map(o,c=>tt.isValidElement(c)?tt.cloneElement(c,{entry:s,index:a}):c):tt.createElement(Ms,{entry:s,index:a})))))}function Ms({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??tt.createElement(Ot,{className:"nvl-dialog-text"});return tt.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:Ns("nvl-dialog-item",t),style:n},r&&tt.createElement(It,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function cl({entry:o,children:e}){let n=D().getLiveGame().getGameState(),i=sl(()=>o.sentence.evaluate(Se.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=Di({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return tt.createElement(Xt,{value:c},e)}function Hs({state:o}){let e=D(),t=yt(),n=zo(null),i=zo(null),r=zo(!1),[s]=at(Z.Preferences.skipDelay),[a]=at(Z.Preferences.skipInterval),[c]=Yt("skipAction");return ul(()=>{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 p=()=>{i.current&&(clearTimeout(i.current),i.current=null),n.current&&(clearInterval(n.current),n.current=null),r.current=!1},u=h=>{if(e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(Z.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let f=()=>{n.current=setInterval(()=>{o.events.emit(E.EventTypes["event:state.player.skip"],!1)},a)};p(),o.events.emit(E.EventTypes["event:state.player.skip"],!1),r.current=!0,s===0?f():i.current=setTimeout(f,s)}},d=h=>{e.keyMap.match("skipAction",h.key)&&p()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",u).cancel,f=e.getLiveGame().onWindowEvent("keyup",d).cancel;return()=>{p(),h(),f()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",u).cancel,f=e.getLiveGame().onPlayerEvent("keyup",d).cancel;return()=>{p(),h(),f()}}},[t,s,a,c]),Gs.createElement(Gs.Fragment,null)}import Us,{useEffect as pl}from"react";function dl(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Fs=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],ml=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]'];function fl(o,e){return!o||e&&Fs.some(t=>!!o.closest(t))?!1:[...ml,...Fs].some(t=>!!o.closest(t))}function Os(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 Ks({state:o}){let e=D();return pl(()=>{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)||!Os(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!Os(i,s))||dl(r)||fl(r,o.isNvlMode())||(o.events.emit(E.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]),Us.createElement(Us.Fragment,null)}import{useEffect as Kn}from"react";function Bo({gameState:o}){let e=o.audioManager,[t]=at("voiceVolume"),[n]=at("bgmVolume"),[i]=at("soundVolume"),[r,s]=at("globalVolume");return Kn(()=>{s(e.getGlobalVolume())},[]),Kn(()=>{e.setGroupVolume("voice",t)},[t]),Kn(()=>{e.setGroupVolume("bgm",n)},[n]),Kn(()=>{e.setGroupVolume("sound",i)},[i]),Kn(()=>{e.setGlobalVolume(r)},[r]),null}import{useEffect as Wi,useRef as yl}from"react";import $o,{createContext as hl,useContext as gl,useState as Vs}from"react";var Zt=class Zt{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(Zt.EventTypes["event:preloaded.add"],e),this.events.emit(Zt.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(Zt.EventTypes["event:preloaded.remove"],e),this.events.emit(Zt.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Ue.getSrc(e)}};Zt.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 Me=Zt;var Vi=class o{constructor(e){this.game=e;this.src=new Map;this.preloadTasks=new Map;this.game.addSideEffect(()=>{this.abortAll(),this.src.clear()})}static getImage(e,t,n){return Ir(e,{...n,signal:t})}static decodeImage(e){if(typeof window>"u"||typeof window.Image>"u")return Promise.resolve();let t=new window.Image;return t.src=e,typeof t.decode!="function"?Promise.resolve():t.decode().catch(()=>{})}has(e){return this.src.has(e)}add(e,t){return this.src.set(e,t),this}remove(e){return this.src.delete(e),this}get(e){return this.src.get(e)}clear(){return this.src.clear(),this}size(){return this.src.size}isPreloading(e){return this.preloadTasks.has(e)}preload(e,t){if(this.src.has(t)||this.preloadTasks.has(t)){let u={abort:()=>{},onFinished:()=>u,onErrored:()=>u};return u}let n=t,i={};this.game.hooks.rawTrigger("preloadImage",()=>[n,(u,d)=>{n=u,i={...i,...d}}]);let r=new AbortController,s=r.signal,a=[],l={promise:o.getImage(n,s,i).then(async u=>{this.preloadTasks.delete(t),u&&(this.add(t,u),await o.decodeImage(u))}).catch(u=>{this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${u}`),a.forEach(d=>d(u))}),controller:r};this.preloadTasks.set(t,l);let p={abort:()=>{r.abort(),this.preloadTasks.delete(t)},onFinished:u=>(l.promise.then(u),p),onErrored:u=>(a.push(u),p)};return p}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.src.values())}filter(e){for(let t of this.src.keys())e.includes(t)||this.src.delete(t);return this}};var jo=hl(null);function Ws({children:o}){let e=D(),[t]=Vs(()=>new Me),[n]=Vs(()=>new Vi(e));return $o.createElement($o.Fragment,null,$o.createElement(jo,{value:{preloaded:t,cacheManager:n}},o))}function hn(){if(!jo)throw new Error("usePreloaded must be used within a PreloadedProvider");return gl(jo)}function zs({state:o}){let{preloaded:e,cacheManager:t}=hn(),n=D(),i=yl(new Set),[r]=ie(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),c=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,l=n.getLiveGame().story;function p(){o.logger.debug(s,"Preload unmounted"),e.events.emit(Me.EventTypes["event:preloaded.unmount"])}return Wi(()=>o.events.on(E.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Wi(()=>{if(typeof fetch>"u")return e.events.emit(Me.EventTypes["event:preloaded.complete"]),e.events.emit(Me.EventTypes["event:preloaded.ready"]),o.logger.warn(s,"Fetch is not supported in this environment, skipping preload"),p;if(!n.config.preloadAllImages)return e.events.emit(Me.EventTypes["event:preloaded.complete"]),e.events.emit(Me.EventTypes["event:preloaded.ready"]),o.logger.debug(s,"Preload all images is disabled, skipping preload"),p;if(n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(s,"Cache cleared")),!l||!a)return l?o.logger.debug(s,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(s,"Story not found, skipping preload"),p;let u=performance.now(),d=Ue.catSrc([...a.srcManager?.src||[],...a.srcManager?.getFutureSrc()||[]]),h=new bn(n.config.preloadConcurrency,n.config.preloadDelay),f=[],b=o.logger.group(s,!0),g=[];o.logger.debug(s,"preloading:",d,a);for(let T of d.image){let m=Ue.getSrc(T);if(m){if(f.push(m),t.has(m)||t.isPreloading(m)||g.includes(m)){o.logger.debug(s,`Image already loaded (${d.image.indexOf(T)+1}/${d.image.length})`,m),g.push(m);continue}g.push(m),h.addTask(()=>new Promise(y=>{t.preload(o,m).onFinished(()=>{o.logger.debug(s,`Image loaded (${d.image.indexOf(T)+1}/${d.image.length})`,m),y()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${d.image.indexOf(T)+1}/${d.image.length})`,m),y()})}))}}return b.end(),h.start().then(()=>{o.logger.info(s,"Image preload",`loaded ${t.size()} images in ${performance.now()-u}ms`),e.events.emit(Me.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(Me.EventTypes["event:preloaded.ready"]),t.filter(f)}),n.config.waitForPreload||e.events.emit(Me.EventTypes["event:preloaded.ready"]),e.events.emit(Me.EventTypes["event:preloaded.mount"]),p},[a,l]),Wi(()=>{i.current.clear()},[a]),Wi(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!l){o.logger.weakWarn(s,"Story not found, skipping preload");return}let u=performance.now(),d=n.getLiveGame().getAllPredictableActions(l,c,n.config.maxPreloadActions).map(m=>Ue.getPreloadableSrc(l,m)).filter(function(m){return m!==null});d.filter(function(m){return m?.activeType==="scene"}).forEach(m=>{i.current.has(m)||i.current.add(m)});let f=Ue.catSrc([...i.current,...d]),b=new bn(n.config.preloadConcurrency,n.config.preloadDelay),g=[],T=o.logger.group(s);o.logger.debug(s,"preloading:",f);for(let m of f.image){let y=Ue.getSrc(m);if(y){if(g.push(y),t.has(y)||t.isPreloading(y)){o.logger.debug(s,`Image already loaded (${f.image.indexOf(m)+1}/${f.image.length})`,y);continue}b.addTask(()=>new Promise(S=>{t.preload(o,y).onFinished(()=>{o.logger.debug(s,`Image loaded (${f.image.indexOf(m)+1}/${f.image.length})`,y),S()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${f.image.indexOf(m)+1}/${f.image.length})`,y),S()})}))}}T.end(),b.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-u}ms`),t.filter(g)})},[c,l]),null}import vl from"clsx";import Tt,{useCallback as qo,useMemo as Sl,useRef as Tl}from"react";function Qo({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=D(),a=Tl([]),c=qo(f=>(a.current.push(f),a.current.indexOf(f)),[]),l=qo(f=>{let b=a.current.indexOf(f);b!==-1&&a.current.splice(b,1)},[]),p=qo(f=>a.current.indexOf(f),[]),u=s.config.menu,d=Sl(()=>e.map(f=>({...f,words:f.prompt.evaluate(Se.getCtx({gameState:n}))})),[]);function h(f){t(f)}return Tt.createElement(Tt.Fragment,null,Tt.createElement(Eo,{value:{evaluated:d,choose:h,gameState:n}},Tt.createElement(Lo,{value:{register:c,unregister:l,getIndex:p}},Tt.createElement(vt,{className:"absolute"},r&&o&&Tt.createElement(Mn,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),Tt.createElement(Qt.Div,{color:"green",border:"dashed",className:vl("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},Tt.createElement(u,{items:d.map((f,b)=>b)})))))}function Bs({items:o}){return Tt.createElement(wi,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>Tt.createElement(Mi,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Xi from"react";import zi from"react";import Xo,{useEffect as Yo,useLayoutEffect as Jo,useRef as Zo,useState as _o}from"react";function gn({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c}){let[l,p]=_o(null),[u,d]=_o(null),h=Xo.useRef(null),[f]=_o(()=>new Jn("displayable.refGroup")),b=Zo(f.next()),g=Zo(ze()),m=D().getLiveGame().getGameState(),y=typeof a=="function"?a(l):a,[S]=ie([u,l,g]);Yo(()=>m.events.depends([m.events.on(E.EventTypes["event:state.player.skip"],xt)]).cancel,[u,l,g]),Jo(()=>{if(R(),!l)return;if(g.current.some(([Q])=>!Q.current))throw new P("Displayable: Trying to access transition groups before they are mounted");let{controller:U,task:oe}=l;return U.onUpdate(Q=>{g.current.forEach(([M],ye)=>{let pe=oe.resolve[ye],ce=typeof pe=="function"?pe:pe.resolver;if(!ce)throw new P(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${ye}])`);let V=ce(...Q),w=F(y[ye]||y[y.length-1]||{},V);K(M,c?c(w):w)})}).cancel},[l]),Yo(()=>{if(!h.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),Jo(()=>{let U=e.toStyle(m,i);Object.assign(h.current.style,U),m.logger.debug("Displayable","Initial style applied",h.current,U)},[]);let L=Zo(()=>{});L.current=()=>{u||l||!h.current||Object.assign(h.current.style,e.toStyle(m,i))},Jo(()=>{L.current()});let{ratio:C}=he();Yo(()=>C.onUpdate(()=>{L.current(),requestAnimationFrame(()=>L.current())}),[C]);function R(){let U=typeof a=="function"?a(l):a;if(!g.current||!g.current.length)throw new P("Displayable: Transition group refs are not initialized correctly");if(g.current.some(([oe])=>!oe.current))throw new P("Displayable: Trying to access transition groups before they are mounted");g.current.forEach(([oe],_)=>{if(!oe.current)throw new P("Displayable: Trying to assign properties to unmounted element");K(oe,U[_]||U[U.length-1]||{})})}function B(U){m.logger.debug("Displayable","Transform applied",e.toStyle(m,i),h.current),S(),r?.(U)}function K(U,oe){if(!U.current)throw new P("Displayable: Trying to assign properties to unmounted element");let _=U.current,Q={},M={};Object.keys(oe).forEach(pe=>{let ce=pe;ce==="style"&&oe.style?Object.assign(Q,oe.style):oe[ce]!==void 0&&ce!=="key"&&(M[ce]=oe[ce])}),Object.keys(Q).length>0&&Object.assign(_.style,Q);let ye=c?c(M):M;for(let[pe,ce]of Object.entries(ye))_.getAttribute(pe)!==ce&&_.setAttribute(pe,ce)}function ae(U,oe){u&&(u.abort(),d(null));let _=U.animate(e,{gameState:m,ref:h,overwrites:i}),Q=new we(_);return m.timelines.attachTimeline(Q),_.onSkipControllerRegister(M=>{M.onAbort(()=>{Q.abort(),d(null)})}),d(_),_.then(()=>{d(null),B(U),oe()}),Q}function Ge(U,oe){l&&l.controller.complete();let _=U.createTask(m),Q=U.requestAnimations(_.animations),M=new v().registerSkipController(new H(Q.cancel)),ye=new we(M);M.skipController.onAbort(()=>{Q.cancel()}),Q.onCanceled(()=>{ye.abort(),p(null),m.logger.debug("Displayable","Transition cancelled",U)}),m.timelines.attachTimeline(ye),p({task:_,controller:Q,transition:U,resolve:oe});let pe;if(g.current=_.resolve.map(V=>{let w=Xo.createRef(),G=typeof V=="function"?void 0:V.key;if(!G)return[w,f.next()];if(G==="target")return pe=f.next(),[w,pe];if(G==="current")return[w,b.current];throw new P("Displayable: Invalid key type")}),!pe)throw new P("Displayable: No target key found");b.current=pe;let ce=g.current.map(([V])=>{let w=V.current;return w?.waitForLoad?w.waitForLoad():Promise.resolve()});return Promise.all(ce).then(()=>{Q.start(),Q.onComplete(()=>{ge(),p(null),s?.(U),oe(),M.resolve()})}),ye}function ke(U){return m.logger.debug("initDisplayable",o),ae(J.immediate(e.get()),U)}function xt(){t&&u&&(u.abort(),d(null),m.logger.debug("transform skipped")),n&&l&&(l.controller.complete(),m.logger.debug("transition skipped"))}function ze(){return[[Xo.createRef(),b.current]]}function ge(){g.current.forEach(([U])=>{U.current=null}),g.current=ze()}return{transformRef:h,transitionRefs:g.current,transitionTask:l,initDisplayable:ke,applyTransform:ae,applyTransition:Ge,updateStyleSync:R,deps:[u,l,g]}}import{useEffect as bl}from"react";function Kt(o,e,t=[]){let i=D().getLiveGame().getGameState();return bl(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function er({state:o,text:e}){let{ratio:t}=he(),[n]=ie(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyTransition:c,updateStyleSync:l,deps:p}=gn({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:u=>({width:"fit-content",transform:J.propToCSSTransform(o,u,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return Kt(e,{initDisplayable:s,applyTransform:a,applyTransition:c,flush:n,updateStyleSync:l},[...p]),zi.createElement(Qt.Div,{"data-element-type":"text"},zi.createElement(Qt.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([u,d])=>zi.createElement("span",{key:d,ref:u,className:e.config.className},zi.createElement("span",null,e.state.text)))))}import bt,{forwardRef as Al,useImperativeHandle as xl,useRef as qi,useState as js}from"react";import Bi,{useEffect as tr,useRef as $i,forwardRef as Cl}from"react";var $s=Cl(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=$i(null),{ratio:a}=he(),[c,l]=Bi.useState(()=>a.state.width),[p,u]=Bi.useState(()=>a.state.height),d=D(),h=$i(!1),f=$i(null),b=$i(null);Bi.useImperativeHandle(r,()=>s.current,[]),tr(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>h.current,configurable:!0},waitForLoad:{value:()=>{let m=()=>{let y=s.current;return!y||typeof y.decode!="function"?Promise.resolve():y.decode().catch(()=>{})};return h.current?m():(f.current||(f.current=new Promise(y=>{b.current=y})),f.current.then(m))},configurable:!0}})},[]),tr(()=>(g(),a.onUpdate(g)),[o]),tr(()=>{let m=new MutationObserver(y=>{y.forEach(S=>{S.type==="attributes"&&S.attributeName==="src"&&s.current&&g()})});return s.current&&m.observe(s.current,{attributes:!0}),()=>{m.disconnect()}},[o]);function g(){if(s.current&&s.current.naturalWidth)if(s.current.naturalWidth*s.current.naturalHeight===1){let m=a.state.width,y=a.state.height,S=`${m} / ${y}`;l(m),u(y),s.current.style.aspectRatio=S,o&&o(m,y)}else{let m=t?d.config.width/s.current.naturalWidth:1,y=s.current.naturalWidth*a.state.scale*m,S=s.current.naturalHeight*a.state.scale*m;l(y),u(S),s.current.style.aspectRatio="auto",o&&o(y,S)}}function T(){g(),h.current=!0,b.current&&(b.current(),b.current=null,f.current=null),e&&e()}return Bi.createElement("img",{ref:s,onLoad:T,width:c,height:p,alt:"",src:n,style:i})});$s.displayName="AspectScaleImage";var ji=$s;import qs from"clsx";import{motion as wl}from"motion/react";var kl={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},Qs=Al(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=qi(null),a=qi([]),c=o.findIndex(l=>l!==null);return xl(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(l=>!l?.isLoaded||l.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(l=>l?.waitForLoad?l.waitForLoad():Promise.resolve())).then(()=>{})}),[]),bt.createElement("div",{ref:s},o.map((l,p)=>l===null?null:bt.createElement(ji,{key:"layer-"+p,ref:u=>{a.current[p]=u},src:t(l),style:kl,autoFit:e,onSizeChanged:p===c?n:void 0,onLoad:p===c?i:void 0})))});Qs.displayName="LayerStack";function Pl(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})`}}var El={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Qi({image:o,state:e}){let[t]=js(()=>new X),[n,i]=js([]),{cacheManager:r}=hn(),s=qi([]),a=qi(null),c=N.isLayeredSrc(o)?N.getSrcURLs(o):null;function l(S){return!x.isDataURI(S)&&!r.has(S)&&!r.isPreloading(S)&&!s.current.includes(S)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${S}".
|
|
38
|
+
`&&n.tag===e.tag?[...t.slice(0,-1),{...e,text:n.text+e.text,config:e.config}]:[...t,e]})}function rc(o,e,t){return t||(o!==void 0?le.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new q(n.text,n.config)):[])}function sc(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 fs(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Ii(o){return o===void 0?void 0:on(o)}function Po({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,...c}){let l=D(),p=l.getLiveGame().getGameState(),u=hs(null),[d,h]=xo(()=>n&&!n.config.useTypeEffect?wo(n.config.evaluatedWords):[]),[f,b]=ie();if(!n)throw new Error("Dialog state is required");fn(()=>{if(!(!n.config.action.sentence||u.current))return p.logger.info("Initializing the sentence",n,u.current),p.schedule(({onCleanup:C})=>{if(!n.config.useTypeEffect){n.dispatchComplete();return}h([]),u.current=g(),f(),u.current.onComplete(()=>{n.dispatchComplete()}),C(()=>{u.current?.timeline?.abort()})},0)},[]),fn(()=>n.events.depends([n.events.on(Ce.Events.requestComplete,()=>{u.current?.interact()}),n.events.on(Ce.Events.forceSkip,()=>{n.isEnded()||u.current?.forceSkip()})]).cancel,[n,b]),fn(()=>l.preference.events.depends([l.preference.onPreferenceChange(Z.Preferences.gameSpeed,()=>{u.current?.update()}),l.preference.onPreferenceChange(Z.Preferences.autoForward,()=>{u.current?.update()}),l.preference.onPreferenceChange(Z.Preferences.cps,()=>{u.current?.update()})]).cancel,[]);function g(){let C=new v,R=new we(C).setGuard(p.guard),B=new Set,K=new Set,se=new Set,Ge=ko(n.config.evaluatedWords),ke=null,xt=[],ze=[],ge=()=>{xt.forEach(V=>V()),xt.length=0},U=()=>{if(ze.length!==0)return{done:!1,value:ze.shift()};let{done:V,value:w}=Ge.next();return{done:V,value:w}},ae=V=>{let w=G=>{V(G),K.delete(w)};return K.add(w),{cancel:()=>{K.delete(w)}}},_=V=>{gs(h,V)},Q=(V=!1)=>{let w=!1;for(;!w;){let{done:G,value:ee}=U();if(G){w=!0;break}if(Ie.isPause(ee)){if(V)continue;w=!0,ze.push(ee);break}else ee===`
|
|
39
|
+
`?h(k=>[...k,ee]):typeof ee=="object"&&"text"in ee&&!B.has(ee)&&(B.add(ee),_(ee))}ke&&!ke.isSettled()?ke.abort():(se.forEach(G=>G()),C.resolve())};return p.schedule(async V=>{let w=!1,G=!1;for(;!w;){let{done:ee,value:k}=U();if(ee){w=G=!0;break}let Be=new v;if(p.timelines.attachTimeline(Be),Be.registerSkipController(new H(()=>{ge(),w=!0,V.retry()})),Be.onSettled(()=>{ge()}),ke=Be,Ie.isPause(k)){let wt=Ie.from(k),jn=l.preference.getPreference(Z.Preferences.gameSpeed);if(wt.config.duration){let qn=wt.config.duration/jn;await ni(qn)}else{let qn=l.preference.getPreference(Z.Preferences.autoForward),Qn=v.race([v.create(fa=>{let ha=ae(ga=>{ga(),fa.resolve()});xt.push(()=>ha.cancel())}),...qn?[v.delay(l.config.autoForwardDefaultPause/jn)]:[]]);p.timelines.attachTimeline(Qn),await v.wait(Qn)}}else{if(k!==`
|
|
40
|
+
`&&B.has(k))continue;B.add(k),_(k);let{gameSpeed:wt,cps:jn}=l.preference.getPreferences(),Qn=1e3/((typeof k=="object"&&"cps"in k&&k.cps!==void 0?k.cps:jn)*wt);await ni(Qn)}}G&&(se.forEach(ee=>ee()),C.resolve())},0),{getToken:()=>C,interact:()=>{let V=!1;K.forEach(w=>w(()=>V=!0)),!V&&Q()},update:()=>{ke&&ke.abort()},forceSkip:()=>{Q(!0)},timeline:R,onComplete:V=>(se.add(V),{cancel:()=>{se.delete(V)}})}}let T=n.config.action.sentence;if(!T)return null;let m=s??"bold",y={fontWeight:T.config.bold?m:r,fontSize:T.config.fontSize??i,color:Ii(T.config.color??o),fontFamily:T.config.fontFamily??a,fontStyle:T.config.italic?"italic":void 0},S=C=>({fontWeight:C.config.bold||T.config.bold?m:r,fontSize:C.config.fontSize??T.config.fontSize??i,color:Ii(C.config.color??T.config.color??o),fontFamily:C.config.fontFamily??T.config.fontFamily??a,fontStyle:C.config.italic??T.config.italic?"italic":void 0}),L=(C,R)=>C===`
|
|
41
|
+
`?Ne.createElement("br",{key:R}):Ne.createElement(Qt.Span,{tag:`say.word.${R}`,key:R,style:{...S(C),...ii(l.config.app.debug,{outline:"1px dashed red"})},className:Li("inline-block break-all",C.config.className)},C.config.ruby?Ne.createElement("ruby",{className:"align-bottom inline-block"},Ne.createElement("rt",{className:"block text-center"},C.config.ruby),C.text):C.text);return Ne.createElement("div",{...c,className:Li("whitespace-pre-wrap",e),style:{...y,...t}},d.map(L))}function ac({text:o,sentence:e,words:t,useTypeEffect:n=!0,loop:i=!0,restartDelay:r,cps:s,gameSpeed:a,pauseDuration:c,defaultColor:l,className:p,style:u,fontSize:d,fontWeight:h,fontWeightBold:f,fontFamily:b,onCompleted:g,...T}){let m=ts(),[,y]=xo(0),S=m?.config??Z.DefaultConfig,L=m?.preference.getPreferences()??Z.DefaultPreference,C=s??L.cps,R=a??L.gameSpeed,B=c??S.autoForwardDefaultPause,K=r??S.autoForwardDefaultPause,se=Ne.useMemo(()=>rc(o,e,t),[o,e,t]),Ge=Ne.useMemo(()=>sc(i,r,K),[i,r,K]),ke=hs(g),[xt,ze]=xo(()=>n?[]:wo(se));fn(()=>{if(m)return m.preference.onPreferenceChange(()=>{y(M=>M+1)}).cancel},[m]),fn(()=>{ke.current=g},[g]),fn(()=>{let M=!1,ye=[],pe=Math.max(.01,R),ce=G=>new Promise(ee=>{let k=setTimeout(ee,Math.max(0,G));ye.push(k)}),V=()=>{M||ke.current?.()};return n?se.length===0?(ze([]),()=>{M=!0}):((async()=>{do{let G=ko(se);for(ze([]);!M;){let{done:ee,value:k}=G.next();if(ee)break;if(Ie.isPause(k)){let Be=Ie.from(k);await ce((Be.config.duration??B)/pe)}else gs(ze,k),k===`
|
|
42
|
+
`?await ce(fs(C,R)):await ce(fs(k.cps??C,R))}if(M)return;V(),Ge.enabled&&await ce(Ge.delay)}while(!M&&Ge.enabled)})(),()=>{M=!0,ye.forEach(G=>clearTimeout(G))}):(ze(wo(se)),V(),()=>{M=!0})},[se,n,Ge,C,R,B]);let ge=e?.config,U=f??"bold",ae={fontWeight:ge?.bold?U:h,fontSize:ge?.fontSize??d,color:Ii(ge?.color??l),fontFamily:ge?.fontFamily??b,fontStyle:ge?.italic?"italic":void 0},_=M=>({fontWeight:M.config.bold||ge?.bold?U:h,fontSize:M.config.fontSize??ge?.fontSize??d,color:Ii(M.config.color??ge?.color??l),fontFamily:M.config.fontFamily??ge?.fontFamily??b,fontStyle:M.config.italic??ge?.italic?"italic":void 0}),Q=(M,ye)=>M===`
|
|
43
|
+
`?Ne.createElement("br",{key:ye}):Ne.createElement("span",{key:ye,style:_(M),className:Li("inline-block break-all",M.config.className)},M.config.ruby?Ne.createElement("ruby",{className:"align-bottom inline-block"},Ne.createElement("rt",{className:"block text-center"},M.config.ruby),M.text):M.text);return Ne.createElement("div",{...T,className:Li("whitespace-pre-wrap",p),style:{...ae,...u}},xt.map(Q))}function ys(o){return Ne.createElement(Po,{...o,key:o.dialog?.config.action.id})}function cc({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Di({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Ne.createElement(Po,{...r,dialog:s,key:s.config.action.id})}function lc(o){let e=ct();return Ne.createElement(Po,{...o,dialog:e,key:e.config.action.id})}function Ot(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Ne.createElement(cc,{...o}):Ne.createElement(lc,{...o})}var uc=Ot;import Ni,{useEffect as pc,useLayoutEffect as dc,useMemo as Ss,useRef as mc,useState as fc}from"react";import Ri from"react";var Eo=Ri.createContext(null);function Do(){let o=Ri.useContext(Eo);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var Lo=Ri.createContext(null);function vs(){let o=Ri.useContext(Lo);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Mi({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let c=mc(null),{register:l,unregister:p,getIndex:u}=vs(),[d,h]=fc(-1),{choose:f,evaluated:b,gameState:g}=Do(),T=d===-1?null:b[d],m=Ss(()=>Se.getCtx({gameState:g}),[g]),{hidden:y,disabled:S}=Ss(()=>{if(!T)return{hidden:!1,disabled:!1};let R=T.config.hidden?.evaluate(m)?.value??!1,B=!R&&(T.config.disabled?.evaluate(m)?.value??!1);return{hidden:R,disabled:B}},[T,m]);dc(()=>{if(!c.current)return;let R=c;l(R);let B=u(R);return h(B),c.current.dataset.index=B.toString(),()=>p(R)},[l,p,u]),pc(()=>{if(!t)return;let R=B=>{B.key.toLowerCase()===t.toLowerCase()&&!B.ctrlKey&&!B.metaKey&&(B.preventDefault(),B.stopPropagation(),L())};return window.addEventListener("keydown",R,!0),()=>{window.removeEventListener("keydown",R,!0)}},[t]);function L(){if(d===-1||!b[d]||y||S)return;let R=b[d];f({...R,evaluated:q.getText(R.words||[])})}let C=T&&!y;return Ni.createElement(Ni.Fragment,null,Ni.createElement("button",{className:o,style:{...e,display:C?e?.display??void 0:"none"},onClick:L,ref:c,disabled:S},C&&Ni.createElement(ys,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Ce({useTypeEffect:!1,action:{sentence:T.prompt,words:T.words,character:null},gameState:g,evaluatedWords:T.words})})))}import Gi from"react";import{AnimatePresence as hc}from"motion/react";function Hi({children:o,...e}){let t=hc;return Gi.createElement(Gi.Fragment,null,Gi.createElement("div",{...e},Gi.createElement(t,null,o)))}import Ts from"react";function It({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Ts.useContext(Xt),c=e??o?.character??a?.config.action.character??null,l=n??c?.config.color,p=i??t??c?.state.name;return Ts.createElement("div",{...s,style:{color:l?on(l):void 0,...r}},p)}import gc from"clsx";import yc from"react";function bs(){let o=ct(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return Tc(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?I.getSrcURL(s):null,c=s&&I.isTagSrc(s)?[...s.state.currentSrc]:null,l=Xr({character:n,sentence:i,portrait:s,currentSrc:a,tags:c,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),p=Sc(l.source);return{visible:!!p,src:p,character:l.character,portrait:l.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function vc({className:o,style:e,alt:t,...n}){let i=bs();return!i.visible||!i.src?null:yc.createElement("img",{...n,"data-element-type":"dialog-avatar",className:gc("dialog-avatar",o),src:i.src,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function Sc(o){return o?x.srcToURL(o):null}function Tc(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var Io=vc;import{useEffect as bc}from"react";function Cc(){let o=ct(),[e]=ie(o.deps),t=q.getText(o.config.evaluatedWords);return bc(()=>o.events.on(Ce.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 Ui,useEffect as Ro,useMemo as Ac,useRef as xc,useState as Cs}from"react";function wc(){let o=ct(),[e]=ie(o.deps),[t,n]=Cs(!0),[i,r]=Cs(!0),s=xc(null),a=o.config.gameState,c=o.config.action.sentence,l=c?.config.voiceId??null;Ro(()=>o.events.on(Ce.Events.onFlush,()=>{e()}).cancel,[o]);let p=Ac(()=>{if(!c)return null;try{return st.getVoice(a,c)}catch{return null}},[a,c,l,c?.config.voice]);Ro(()=>{s.current=null,r(!0)},[c]),Ro(()=>{let b=!1,g=null,T=null,m=null;if(!p){n(!0);return}n(!1);let y=()=>{b||n(!0)};g=a.audioManager.getToken(p),g&&(g.isPlaying()||n(!0),T=()=>y(),m=()=>y(),g.once("ended",T),g.once("stop",m));let S=a.events.on(P.EventTypes["event:state.player.lineEnd"],()=>{y()});return()=>{b=!0,S.cancel(),g&&T&&g.off("ended",T),g&&m&&g.off("stop",m)}},[a,p]);let u=Ui(async b=>{let g=b??p;if(!g)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let T=g instanceof URL?me.voice(g.toString()):typeof g=="string"?me.voice(g):g,m=await a.getLiveGame().playSound(T);s.current=m;let y=()=>{r(!0)};return m.once("ended",y),m.once("stop",y),m},[a,p]),d=Ui(()=>p,[p]),h=Ui(()=>l,[l]),f=Ui(()=>p?.getSrc()??null,[p]);return{done:t&&i,voice:p,playVoice:u,getVoice:d,getVoiceId:h,getVoiceSrc:f}}import No,{createContext as Uc,useContext as Fc,useEffect as ws,useRef as Oc}from"react";import{useState as kc}from"react";function Fi(o){let[e]=kc(o);return e}import{AnimatePresence as Pc}from"motion/react";var Oi=Pc;import Fn,{createContext as Rc,useContext as Nc,useEffect as Mc,useRef as Gc}from"react";import{useEffect as Gn,useLayoutEffect as Ec}from"react";function Dc(){let o=yt(),[e]=ie();return Gn(()=>o.onChange(e).cancel,[]),o.getPathname()}function Lc(){let{router:o,path:e}=Un(),[t]=ie();return Gn(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function Ic(){let o=yt(),[e]=ie();return Gn(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function Ki(o,e){let t=yt();Ec(()=>t.onUpdate(()=>o(t)).cancel,e),Gn(()=>{o(t)},[])}function Hn(){let o=yt(),[e]=ie();return Gn(()=>o.onChange(e).cancel,[]),e}var As=Rc(null);function On({children:o,path:e,consumedBy:t}){let i={router:yt(),path:e,consumedBy:t};return Fn.createElement(As,{value:i},o)}function Un(){let o=Nc(As);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.
|
|
44
|
+
This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function Hc({children:o,name:e,propagate:t}){let n=D(),[i]=ie(),{path:r,router:s,consumedBy:a}=Un(),c=s.joinPath(r,e),l=Fi(()=>s.createToken(c+"@layout")),p=s.getCurrentPath(),u=Gc(!1),d=f=>{u.current=f,i()},h=s.matchPath(p,c);if(Hn(),Ki(f=>{let b=f.matchPath(f.getCurrentPath(),c);if(u.current&&!b){if(!o){d(!1);return}f.registerUnmountingPath(l)}b&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(l),b&&!u.current&&!f.isTransitioning()&&d(!0)},[h,o]),Mc(()=>{if(!h)return;let f=s.mount(c);return()=>{f.cancel()}},[c,s,h]),a)throw new E("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Fn.createElement(On,{path:c},Fn.createElement(Oi,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),d(!1)}},h&&u.current&&o))}function xs({children:o}){return Hn(),Fn.createElement(On,{path:Ft.rootPath},Fn.createElement(xi,{"data-layout-path":Ft.rootPath,key:Ft.rootPath},o))}var Mo=Uc(null);function Kc(){return Fc(Mo)}function Vc({children:o,name:e}){let[t]=ie(),{path:n,router:i,consumedBy:r}=Un(),s=Kc(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,p=Fi(()=>i.createToken(l+"@page")),u=i.getCurrentPath(),d=!a,h=Oc(!1),f=m=>{h.current=m,t()},b=d&&i.exactMatch(u,n)||i.exactMatch(u,l);if(r&&r!==c)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");Hn(),Ki(m=>{let y=d&&m.exactMatch(m.getCurrentPath(),n)||m.exactMatch(m.getCurrentPath(),l);if(h.current&&!y){if(!o){f(!1);return}m.registerUnmountingPath(p)}y&&m.isPathsUnmounting()&&m.unregisterUnmountingPath(p),y&&!h.current&&!m.isTransitioning()&&f(!0)},[b,o]),ws(()=>{if(!b)return;let m=d?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{m.cancel()}},[l,b]),ws(()=>()=>{i.unregisterUnmountingPath(p),f(!1)},[]);let g=No.createElement(On,{path:n,consumedBy:c},No.createElement(Oi,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(p),f(!1)}},b&&h.current&&o));return(m=>s?No.createElement(Mo,{value:{name:null}},m):m)(g)}import Go,{useCallback as Wc,useEffect as Ho,useImperativeHandle as zc,useMemo as ks,useRef as Uo,useState as Bc}from"react";var $c=50,jc={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Ps={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function qc(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Es(o,e){return e==null?o:Math.max(o,e)}function Qc(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 Ds=Go.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:c,dataAttributes:l,onUpdate:p,children:u},d){let h=Uo(null),[f,b]=Bc({...Ps,width:"0px",height:"0px"}),g=Uo(p),T=Uo(null);Ho(()=>{g.current=p},[p]);let m=Wc(()=>{let L=h.current;if(!L)return;let C=L.clientWidth,R=L.clientHeight;if(C<=0||R<=0||e<=0)return;let B=Qc(C,R,e),K=Es(B.width,n),se=Es(B.height,i),Ge=T.current;(!Ge||Ge.width!==K||Ge.height!==se)&&(T.current={width:K,height:se},b({...Ps,width:`${K}px`,height:`${se}px`}));let ke=t>0?K/t:1;g.current?.({width:K,height:se,scale:ke,containerWidth:C,containerHeight:R})},[e,t,n,i]),y=ks(()=>Dr(m,typeof r=="number"?r:$c),[m,r]);Ho(()=>{m()},[m]),Ho(()=>{let L=new ResizeObserver(()=>{y()});h.current&&L.observe(h.current);let C=()=>{y()};return window.addEventListener("resize",C),()=>{L.disconnect(),window.removeEventListener("resize",C)}},[y]),zc(d,()=>({requestUpdate:m}),[m]);let S=ks(()=>qc(l),[l]);return Go.createElement("div",{id:c,ref:h,style:jc,...S},Go.createElement("div",{className:s,style:{...f,...a}},u))}),Ls=Ds;function Xc(){return D().getLiveGame()}import Ko from"react";import Yc,{createContext as Jc,useContext as Zc,useEffect as _c,useState as Is}from"react";var el={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Rs=Jc({state:el,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function St(){return Zc(Rs)}function Fo(){let{dialogs:o}=St();return o}function tl(){let{isActive:o}=St();return o}function nl(){let{isVisible:o}=St();return o}function Oo({children:o}){let t=D().getLiveGame().getGameState(),[n,i]=Is(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=Is(null);_c(()=>{let c=f=>({...f,dialogs:[...f.dialogs]}),l=t.events.on(P.EventTypes["event:state.nvl.enter"],(f,b)=>{i(c(t.getNvlState())),s(b?.showTransition||null)}),p=t.events.on(P.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState()))}),u=t.events.on(P.EventTypes["event:state.nvl.dialogAppend"],()=>{i(c(t.getNvlState()))}),d=t.events.on(P.EventTypes["event:state.nvl.visibilityChange"],(f,b)=>{i(c(t.getNvlState())),s(b||null)}),h=t.events.on(P.EventTypes["event:state.nvl.change"],f=>{i(c(f))});return()=>{l.cancel(),p.cancel(),u.cancel(),d.cancel(),h.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return Yc.createElement(Rs.Provider,{value:a},o)}import{AnimatePresence as il,motion as ol}from"motion/react";import rl from"clsx";function Vo({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=St(),{ratio:r}=he(),s=D(),a=i?.duration?i.duration/1e3:.3;return Ko.createElement(il,null,n&&Ko.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},Ko.createElement(ol.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:rl("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 Jt from"react";function Wo({renderDialogItem:o,dialogs:e}){return Jt.createElement(Vo,{className:"bg-black/80 text-white p-16 inset-8"},Jt.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?Jt.createElement(It,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Jt.createElement(Ot,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Jt.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}):Jt.createElement(Jt.Fragment,null,r,s))})))}import tt,{useMemo as sl}from"react";import Ns from"clsx";function al({children:o,className:e,style:t,renderDialogItem:n}){let i=Fo(),{state:r}=St();return tt.createElement("div",{"data-element-type":"nvl-dialog-list",className:Ns("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>tt.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},tt.createElement(cl,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?tt.createElement(It,{className:"nvl-character-name font-bold mr-2"}):null,texts:tt.createElement(Ot,{className:"nvl-dialog-text"})}):o?tt.Children.map(o,c=>tt.isValidElement(c)?tt.cloneElement(c,{entry:s,index:a}):c):tt.createElement(Ms,{entry:s,index:a})))))}function Ms({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??tt.createElement(Ot,{className:"nvl-dialog-text"});return tt.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:Ns("nvl-dialog-item",t),style:n},r&&tt.createElement(It,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function cl({entry:o,children:e}){let n=D().getLiveGame().getGameState(),i=sl(()=>o.sentence.evaluate(Se.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=Di({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return tt.createElement(Xt,{value:c},e)}function Hs({state:o}){let e=D(),t=yt(),n=zo(null),i=zo(null),r=zo(!1),[s]=at(Z.Preferences.skipDelay),[a]=at(Z.Preferences.skipInterval),[c]=Yt("skipAction");return ul(()=>{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 p=()=>{i.current&&(clearTimeout(i.current),i.current=null),n.current&&(clearInterval(n.current),n.current=null),r.current=!1},u=h=>{if(e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(Z.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let f=()=>{n.current=setInterval(()=>{o.events.emit(P.EventTypes["event:state.player.skip"],!1)},a)};p(),o.events.emit(P.EventTypes["event:state.player.skip"],!1),r.current=!0,s===0?f():i.current=setTimeout(f,s)}},d=h=>{e.keyMap.match("skipAction",h.key)&&p()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",u).cancel,f=e.getLiveGame().onWindowEvent("keyup",d).cancel;return()=>{p(),h(),f()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",u).cancel,f=e.getLiveGame().onPlayerEvent("keyup",d).cancel;return()=>{p(),h(),f()}}},[t,s,a,c]),Gs.createElement(Gs.Fragment,null)}import Us,{useEffect as pl}from"react";function dl(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Fs=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],ml=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]'];function fl(o,e){return!o||e&&Fs.some(t=>!!o.closest(t))?!1:[...ml,...Fs].some(t=>!!o.closest(t))}function Os(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 Ks({state:o}){let e=D();return pl(()=>{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)||!Os(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!Os(i,s))||dl(r)||fl(r,o.isNvlMode())||(o.events.emit(P.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]),Us.createElement(Us.Fragment,null)}import{useEffect as Kn}from"react";function Bo({gameState:o}){let e=o.audioManager,[t]=at("voiceVolume"),[n]=at("bgmVolume"),[i]=at("soundVolume"),[r,s]=at("globalVolume");return Kn(()=>{s(e.getGlobalVolume())},[]),Kn(()=>{e.setGroupVolume("voice",t)},[t]),Kn(()=>{e.setGroupVolume("bgm",n)},[n]),Kn(()=>{e.setGroupVolume("sound",i)},[i]),Kn(()=>{e.setGlobalVolume(r)},[r]),null}import{useEffect as Wi,useRef as yl}from"react";import $o,{createContext as hl,useContext as gl,useState as Vs}from"react";var Zt=class Zt{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(Zt.EventTypes["event:preloaded.add"],e),this.events.emit(Zt.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(Zt.EventTypes["event:preloaded.remove"],e),this.events.emit(Zt.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Ue.getSrc(e)}};Zt.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 Me=Zt;var Vi=class o{constructor(e){this.game=e;this.src=new Map;this.preloadTasks=new Map;this.game.addSideEffect(()=>{this.abortAll(),this.src.clear()})}static getImage(e,t,n){return Ir(e,{...n,signal:t})}static decodeImage(e){if(typeof window>"u"||typeof window.Image>"u")return Promise.resolve();let t=new window.Image;return t.src=e,typeof t.decode!="function"?Promise.resolve():t.decode().catch(()=>{})}has(e){return this.src.has(e)}add(e,t){return this.src.set(e,t),this}remove(e){return this.src.delete(e),this}get(e){return this.src.get(e)}clear(){return this.src.clear(),this}size(){return this.src.size}isPreloading(e){return this.preloadTasks.has(e)}preload(e,t){if(this.src.has(t)||this.preloadTasks.has(t)){let u={abort:()=>{},onFinished:()=>u,onErrored:()=>u};return u}let n=t,i={};this.game.hooks.rawTrigger("preloadImage",()=>[n,(u,d)=>{n=u,i={...i,...d}}]);let r=new AbortController,s=r.signal,a=[],l={promise:o.getImage(n,s,i).then(async u=>{this.preloadTasks.delete(t),u&&(this.add(t,u),await o.decodeImage(u))}).catch(u=>{this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${u}`),a.forEach(d=>d(u))}),controller:r};this.preloadTasks.set(t,l);let p={abort:()=>{r.abort(),this.preloadTasks.delete(t)},onFinished:u=>(l.promise.then(u),p),onErrored:u=>(a.push(u),p)};return p}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.src.values())}filter(e){for(let t of this.src.keys())e.includes(t)||this.src.delete(t);return this}};var jo=hl(null);function Ws({children:o}){let e=D(),[t]=Vs(()=>new Me),[n]=Vs(()=>new Vi(e));return $o.createElement($o.Fragment,null,$o.createElement(jo,{value:{preloaded:t,cacheManager:n}},o))}function hn(){if(!jo)throw new Error("usePreloaded must be used within a PreloadedProvider");return gl(jo)}function zs({state:o}){let{preloaded:e,cacheManager:t}=hn(),n=D(),i=yl(new Set),[r]=ie(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),c=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,l=n.getLiveGame().story;function p(){o.logger.debug(s,"Preload unmounted"),e.events.emit(Me.EventTypes["event:preloaded.unmount"])}return Wi(()=>o.events.on(P.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Wi(()=>{if(typeof fetch>"u")return e.events.emit(Me.EventTypes["event:preloaded.complete"]),e.events.emit(Me.EventTypes["event:preloaded.ready"]),o.logger.warn(s,"Fetch is not supported in this environment, skipping preload"),p;if(!n.config.preloadAllImages)return e.events.emit(Me.EventTypes["event:preloaded.complete"]),e.events.emit(Me.EventTypes["event:preloaded.ready"]),o.logger.debug(s,"Preload all images is disabled, skipping preload"),p;if(n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(s,"Cache cleared")),!l||!a)return l?o.logger.debug(s,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(s,"Story not found, skipping preload"),p;let u=performance.now(),d=Ue.catSrc([...a.srcManager?.src||[],...a.srcManager?.getFutureSrc()||[]]),h=new bn(n.config.preloadConcurrency,n.config.preloadDelay),f=[],b=o.logger.group(s,!0),g=[];o.logger.debug(s,"preloading:",d,a);for(let T of d.image){let m=Ue.getSrc(T);if(m){if(f.push(m),t.has(m)||t.isPreloading(m)||g.includes(m)){o.logger.debug(s,`Image already loaded (${d.image.indexOf(T)+1}/${d.image.length})`,m),g.push(m);continue}g.push(m),h.addTask(()=>new Promise(y=>{t.preload(o,m).onFinished(()=>{o.logger.debug(s,`Image loaded (${d.image.indexOf(T)+1}/${d.image.length})`,m),y()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${d.image.indexOf(T)+1}/${d.image.length})`,m),y()})}))}}return b.end(),h.start().then(()=>{o.logger.info(s,"Image preload",`loaded ${t.size()} images in ${performance.now()-u}ms`),e.events.emit(Me.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(Me.EventTypes["event:preloaded.ready"]),t.filter(f)}),n.config.waitForPreload||e.events.emit(Me.EventTypes["event:preloaded.ready"]),e.events.emit(Me.EventTypes["event:preloaded.mount"]),p},[a,l]),Wi(()=>{i.current.clear()},[a]),Wi(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!l){o.logger.weakWarn(s,"Story not found, skipping preload");return}let u=performance.now(),d=n.getLiveGame().getAllPredictableActions(l,c,n.config.maxPreloadActions).map(m=>Ue.getPreloadableSrc(l,m)).filter(function(m){return m!==null});d.filter(function(m){return m?.activeType==="scene"}).forEach(m=>{i.current.has(m)||i.current.add(m)});let f=Ue.catSrc([...i.current,...d]),b=new bn(n.config.preloadConcurrency,n.config.preloadDelay),g=[],T=o.logger.group(s);o.logger.debug(s,"preloading:",f);for(let m of f.image){let y=Ue.getSrc(m);if(y){if(g.push(y),t.has(y)||t.isPreloading(y)){o.logger.debug(s,`Image already loaded (${f.image.indexOf(m)+1}/${f.image.length})`,y);continue}b.addTask(()=>new Promise(S=>{t.preload(o,y).onFinished(()=>{o.logger.debug(s,`Image loaded (${f.image.indexOf(m)+1}/${f.image.length})`,y),S()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${f.image.indexOf(m)+1}/${f.image.length})`,y),S()})}))}}T.end(),b.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-u}ms`),t.filter(g)})},[c,l]),null}import vl from"clsx";import Tt,{useCallback as qo,useMemo as Sl,useRef as Tl}from"react";function Qo({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=D(),a=Tl([]),c=qo(f=>(a.current.push(f),a.current.indexOf(f)),[]),l=qo(f=>{let b=a.current.indexOf(f);b!==-1&&a.current.splice(b,1)},[]),p=qo(f=>a.current.indexOf(f),[]),u=s.config.menu,d=Sl(()=>e.map(f=>({...f,words:f.prompt.evaluate(Se.getCtx({gameState:n}))})),[]);function h(f){t(f)}return Tt.createElement(Tt.Fragment,null,Tt.createElement(Eo,{value:{evaluated:d,choose:h,gameState:n}},Tt.createElement(Lo,{value:{register:c,unregister:l,getIndex:p}},Tt.createElement(vt,{className:"absolute"},r&&o&&Tt.createElement(Mn,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),Tt.createElement(Qt.Div,{color:"green",border:"dashed",className:vl("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},Tt.createElement(u,{items:d.map((f,b)=>b)})))))}function Bs({items:o}){return Tt.createElement(wi,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>Tt.createElement(Mi,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Xi from"react";import zi from"react";import Xo,{useEffect as Yo,useLayoutEffect as Jo,useRef as Zo,useState as _o}from"react";function gn({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c}){let[l,p]=_o(null),[u,d]=_o(null),h=Xo.useRef(null),[f]=_o(()=>new Jn("displayable.refGroup")),b=Zo(f.next()),g=Zo(ze()),m=D().getLiveGame().getGameState(),y=typeof a=="function"?a(l):a,[S]=ie([u,l,g]);Yo(()=>m.events.depends([m.events.on(P.EventTypes["event:state.player.skip"],xt)]).cancel,[u,l,g]),Jo(()=>{if(R(),!l)return;if(g.current.some(([Q])=>!Q.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:U,task:ae}=l;return U.onUpdate(Q=>{g.current.forEach(([M],ye)=>{let pe=ae.resolve[ye],ce=typeof pe=="function"?pe:pe.resolver;if(!ce)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${ye}])`);let V=ce(...Q),w=F(y[ye]||y[y.length-1]||{},V);K(M,c?c(w):w)})}).cancel},[l]),Yo(()=>{if(!h.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),Jo(()=>{let U=e.toStyle(m,i);Object.assign(h.current.style,U),m.logger.debug("Displayable","Initial style applied",h.current,U)},[]);let L=Zo(()=>{});L.current=()=>{u||l||!h.current||(Object.assign(h.current.style,e.toStyle(m,i)),R())},Jo(()=>{L.current()});let{ratio:C}=he();Yo(()=>C.onUpdate(()=>{L.current(),requestAnimationFrame(()=>L.current())}),[C]);function R(){let U=typeof a=="function"?a(l):a;if(!g.current||!g.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");g.current.some(([ae])=>!ae.current)||g.current.forEach(([ae],_)=>{K(ae,U[_]||U[U.length-1]||{})})}function B(U){m.logger.debug("Displayable","Transform applied",e.toStyle(m,i),h.current),S(),r?.(U)}function K(U,ae){if(!U.current)throw new E("Displayable: Trying to assign properties to unmounted element");let _=U.current,Q={},M={};Object.keys(ae).forEach(pe=>{let ce=pe;ce==="style"&&ae.style?Object.assign(Q,ae.style):ae[ce]!==void 0&&ce!=="key"&&(M[ce]=ae[ce])}),Object.keys(Q).length>0&&Object.assign(_.style,Q);let ye=c?c(M):M;for(let[pe,ce]of Object.entries(ye))_.getAttribute(pe)!==ce&&_.setAttribute(pe,ce)}function se(U,ae){u&&(u.abort(),d(null));let _=U.animate(e,{gameState:m,ref:h,overwrites:i}),Q=new we(_);return m.timelines.attachTimeline(Q),_.onSkipControllerRegister(M=>{M.onAbort(()=>{Q.abort(),d(null)})}),d(_),_.then(()=>{d(null),B(U),ae()}),Q}function Ge(U,ae){l&&l.controller.complete();let _=U.createTask(m),Q=U.requestAnimations(_.animations),M=new v().registerSkipController(new H(Q.cancel)),ye=new we(M);M.skipController.onAbort(()=>{Q.cancel()}),Q.onCanceled(()=>{ye.abort(),p(null),m.logger.debug("Displayable","Transition cancelled",U)}),m.timelines.attachTimeline(ye),p({task:_,controller:Q,transition:U,resolve:ae});let pe;if(g.current=_.resolve.map(V=>{let w=Xo.createRef(),G=typeof V=="function"?void 0:V.key;if(!G)return[w,f.next()];if(G==="target")return pe=f.next(),[w,pe];if(G==="current")return[w,b.current];throw new E("Displayable: Invalid key type")}),!pe)throw new E("Displayable: No target key found");b.current=pe;let ce=g.current.map(([V])=>{let w=V.current;return w?.waitForLoad?w.waitForLoad():Promise.resolve()});return Promise.all(ce).then(()=>{Q.start(),Q.onComplete(()=>{ge(),p(null),s?.(U),ae(),M.resolve()})}),ye}function ke(U){return m.logger.debug("initDisplayable",o),se(J.immediate(e.get()),U)}function xt(){t&&u&&(u.abort(),d(null),m.logger.debug("transform skipped")),n&&l&&(l.controller.complete(),m.logger.debug("transition skipped"))}function ze(){return[[Xo.createRef(),b.current]]}function ge(){g.current.forEach(([U])=>{U.current=null}),g.current=ze()}return{transformRef:h,transitionRefs:g.current,transitionTask:l,initDisplayable:ke,applyTransform:se,applyTransition:Ge,updateStyleSync:R,deps:[u,l,g]}}import{useEffect as bl}from"react";function Kt(o,e,t=[]){let i=D().getLiveGame().getGameState();return bl(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function er({state:o,text:e}){let{ratio:t}=he(),[n]=ie(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyTransition:c,updateStyleSync:l,deps:p}=gn({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:u=>({width:"fit-content",transform:J.propToCSSTransform(o,u,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return Kt(e,{initDisplayable:s,applyTransform:a,applyTransition:c,flush:n,updateStyleSync:l},[...p]),zi.createElement(Qt.Div,{"data-element-type":"text"},zi.createElement(Qt.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([u,d])=>zi.createElement("span",{key:d,ref:u,className:e.config.className},zi.createElement("span",null,e.state.text)))))}import bt,{forwardRef as Al,useImperativeHandle as xl,useRef as qi,useState as js}from"react";import Bi,{useEffect as tr,useRef as $i,forwardRef as Cl}from"react";var $s=Cl(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=$i(null),{ratio:a}=he(),[c,l]=Bi.useState(()=>a.state.width),[p,u]=Bi.useState(()=>a.state.height),d=D(),h=$i(!1),f=$i(null),b=$i(null);Bi.useImperativeHandle(r,()=>s.current,[]),tr(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>h.current,configurable:!0},waitForLoad:{value:()=>{let m=()=>{let y=s.current;return!y||typeof y.decode!="function"?Promise.resolve():y.decode().catch(()=>{})};return h.current?m():(f.current||(f.current=new Promise(y=>{b.current=y})),f.current.then(m))},configurable:!0}})},[]),tr(()=>(g(),a.onUpdate(g)),[o]),tr(()=>{let m=new MutationObserver(y=>{y.forEach(S=>{S.type==="attributes"&&S.attributeName==="src"&&s.current&&g()})});return s.current&&m.observe(s.current,{attributes:!0}),()=>{m.disconnect()}},[o]);function g(){if(s.current&&s.current.naturalWidth)if(s.current.naturalWidth*s.current.naturalHeight===1){let m=a.state.width,y=a.state.height,S=`${m} / ${y}`;l(m),u(y),s.current.style.aspectRatio=S,o&&o(m,y)}else{let m=t?d.config.width/s.current.naturalWidth:1,y=s.current.naturalWidth*a.state.scale*m,S=s.current.naturalHeight*a.state.scale*m;l(y),u(S),s.current.style.aspectRatio="auto",o&&o(y,S)}}function T(){g(),h.current=!0,b.current&&(b.current(),b.current=null,f.current=null),e&&e()}return Bi.createElement("img",{ref:s,onLoad:T,width:c,height:p,alt:"",src:n,style:i})});$s.displayName="AspectScaleImage";var ji=$s;import qs from"clsx";import{motion as wl}from"motion/react";var kl={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},Qs=Al(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=qi(null),a=qi([]),c=o.findIndex(l=>l!==null);return xl(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(l=>!l?.isLoaded||l.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(l=>l?.waitForLoad?l.waitForLoad():Promise.resolve())).then(()=>{})}),[]),bt.createElement("div",{ref:s},o.map((l,p)=>l===null?null:bt.createElement(ji,{key:"layer-"+p,ref:u=>{a.current[p]=u},src:t(l),style:kl,autoFit:e,onSizeChanged:p===c?n:void 0,onLoad:p===c?i:void 0})))});Qs.displayName="LayerStack";function Pl(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 El(o){return I.isStaticSrc(o)?o.state.currentSrc:I.getSrcURL(o)??void 0}var Dl={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function Qi({image:o,state:e}){let[t]=js(()=>new X),[n,i]=js([]),{cacheManager:r}=hn(),s=qi([]),a=qi(null),c=I.isLayeredSrc(o)?I.getSrcURLs(o):null;function l(S){return!x.isDataURI(S)&&!r.has(S)&&!r.isPreloading(S)&&!s.current.includes(S)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${S}".
|
|
45
45
|
This may be caused by complicated image action behavior that cannot be predicted.
|
|
46
|
-
To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(S)),r.get(S)||S}let{transformRef:p,transitionRefs:u,transitionTask:d,initDisplayable:h,applyTransition:f,applyTransform:b,updateStyleSync:g,deps:T}=gn({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:S=>{if(c)return(S?S.task.resolve:[null]).map(R=>R&&typeof R=="function"?{style:
|
|
47
|
-
at Video.tsx: useEffect`),l=()=>{a||!s||(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 u=t.current;return u.currentTime=0,new Promise(d=>{o.schedule(({retry:h})=>{if(u.readyState<3){let T=()=>{u.removeEventListener("loadeddata",T),h()};u.addEventListener("loadeddata",T);return}let f=()=>{g(),d()},b=()=>{g(),d()},g=()=>{u.removeEventListener("ended",f),u.removeEventListener("stopped",b)};u.addEventListener("ended",f),u.addEventListener("stopped",b),p.push(g),u.play().catch(T=>{o.logger.error("Failed to play video: "+T),g(),d()})},10)})},pause:()=>{if(!t.current)throw c();t.current.pause()},resume:()=>{if(!t.current)throw c();return t.current.play()},stop:()=>{if(!t.current)throw c();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:u=>{if(!t.current)throw c();t.current.currentTime=u}}))},p=[];return s.addEventListener("canplay",l),()=>{a=!1,s.removeEventListener("canplay",l),p.forEach(u=>u()),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 Gl.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 Ul from"clsx";import Fl,{useCallback as Ol,useEffect as Ji,useRef as Kl}from"react";function ar({children:o,className:e,gameState:t}){let{ratio:n}=he(),i=D(),[r]=ie(),s=Kl(null),a=i.config.minWidth,c=i.config.minHeight,l=Ol(p=>{if(n.isLocked()){t.logger.weakWarn("AspectRatio","ratio is locked, skipping update");return}n.update(p.width,p.height,p.scale),n.updateMin(a,c),r()},[r,t.logger,c,a,n]);return Ji(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),Ji(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),Ji(()=>{let p=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(p)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),Ji(()=>t.events.on(E.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),Fl.createElement(Ls,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:Ul(e),onUpdate:l},o)}import Zs,{useEffect as Vl,useRef as Wl,useState as _s}from"react";function cr({src:o,width:e,height:t}){let[n,i]=_s({x:0,y:0}),[r,s]=_s(!1),a=Wl(null),{ratio:c}=he();return Vl(()=>{let l=p=>{if(a.current){let u=a.current.getBoundingClientRect(),d=p.clientX-u.left,h=p.clientY-u.top;i({x:d,y:h}),r||s(!0)}};return window.addEventListener("mousemove",l),()=>{window.removeEventListener("mousemove",l)}},[r]),Zs.createElement(vt,{ref:a,className:"overflow-hidden absolute"},Zs.createElement("img",{src:o,style:{position:"absolute",left:n.x,top:n.y,width:e,height:t,pointerEvents:"none",zIndex:1001,display:r?"block":"none",cursor:"none",transform:`scale(${c.state.scale})`},alt:""}))}import ea from"react";import Rt from"react";function lr({error:o,errorInfo:e}){return D().config.app.debug?Rt.createElement("div",{className:"text-left"},Rt.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),Rt.createElement("p",{className:"text-red-700"},"Message: ",o.message),Rt.createElement("pre",null,"Error Stack: ",o?.stack),Rt.createElement("pre",null,"Component Stack: ",e?.componentStack),Rt.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):Rt.createElement("div",{className:"bg-white w-full h-full"},Rt.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),Rt.createElement("p",null,"Please contact the game developer for further assistance."))}var Zi=class extends ea.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?ea.createElement(lr,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import ia from"clsx";import W,{useEffect as Ct,useReducer as oa,useState as yn}from"react";import{flushSync as ra}from"react-dom";import{useRef as zl}from"react";import{useEffect as Bl}from"react";function ta({gameState:o}){let e=zl(null);return Bl(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(E.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Wn,{useEffect as $l}from"react";function ur({gameState:o}){let[e]=ie(),{ratio:t}=he(),n=o.notificationMgr;$l(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Wn.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"},Wn.createElement(i,{notifications:n.toArray()}))}function na({notifications:o}){return Wn.createElement(Hi,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Wn.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Wn.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function sa({story:o=Dn.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:c,onError:l,children:p,active:u=!0}){let[d,h]=oa(w=>w+1,0),[f,b]=oa(w=>w+1,0),[g,T]=yn(0),m=D(),[y]=yn(()=>new E(m,{update:h,forceUpdate:()=>{y.logger.weakWarn("Player","force update"),ra(()=>{h()})},forceRemount:()=>{y.logger.weakWarn("Player","force remount"),ra(()=>{T(w=>w+1),h()})},next:pe})),S=W.createRef(),L=W.createRef(),[C,R]=yn(!1),B=W.useRef(!1),K=W.useRef(null),ae=W.useRef(null),{preloaded:Ge}=hn(),[ke,xt]=yn(!1),ze=W.useRef(!1),[ge,U]=yn(!1),oe=W.useRef(!1),_=W.useRef(null),Q=W.useRef(!1),[M]=yn(new Map);function ye(w){return{game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable(),scene:w}}function pe(){let w=()=>{M.forEach(k=>k.cancel())};if(y.rollLock.isLocked())return;w();let G=!1,ee=0;for(;!G;){if(ee++>m.config.maxStackModelLoop)throw new P("Max stack model loop reached");let k=m.getLiveGame().next();if(!k){if(m.getLiveGame().stackModel&&!m.getLiveGame().stackModel.isEmpty())continue;break}if(v.isAwaitable(k)){if(K.current===k)break;K.current=k,k.onSettled(()=>{k.isFailed()||(K.current===k&&(K.current=null),pe())}),k.onFailed(Be=>{K.current===k&&(K.current=null),y.logger.error("Player",Be)}),G=!0;break}if(k instanceof nn){if(ae.current===k)break;ae.current=k,k.nextUnlock().then(()=>{ae.current===k&&(ae.current=null),pe()}),G=!0;break}if(Oe.isCalledActionResult(k)&&k.wait&&Oe.isStackModelsAwaiting(k.wait.type,k.wait.stackModels)){if(K.current===k)break;if(K.current=k,k.wait){let Be=Oe.executeStackModelGroup(k.wait.type,k.wait.stackModels);Be.then(()=>{K.current===k&&(K.current=null),pe()}),Be.onFailed(wt=>{K.current===k&&(K.current=null),y.logger.error("Player",wt)})}G=!0;break}y.handle(k)}y.stage.update()}Ct(()=>{y.audioManager.initialize()},[]),Ct(()=>(m.getLiveGame().setGameState(y),o&&!m.getLiveGame().isPlaying()&&m.getLiveGame().loadStory(o),y.playerCurrent=S.current,y.mainContentNode=L.current,()=>{m.getLiveGame().setGameState(void 0),y.playerCurrent=null}),[m,o]),Ct(()=>je(()=>{R(!0);let w=y.getLastScene(),G=[];w?G.push(w.events.once("event:scene.mount",()=>{y.stage.next()}).cancel):y.stage.next();let ee=y.events.on(E.EventTypes["event:state.end"],()=>{c&&c({game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()})});return y.stage.update(),()=>{w&&G.forEach(k=>k()),ee.cancel()}}),[]),Ct(()=>je(()=>{C&&i&&!B.current&&(B.current=!0,y.stage.forceUpdate(),m.hooks.trigger("init",[]),i({game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()}))}),[C]),Ct(()=>je(()=>{if(ke&&s&&!ze.current){ze.current=!0;let w=_.current||y.getLastScene()||y.getPreloadingScene(),G=ye(w);s(G)}}),[ke]),Ct(()=>je(()=>{if(ge&&!oe.current){oe.current=!0;let w=_.current||y.getLastScene()||y.getPreloadingScene(),G=ye(w);m.markPreloadComplete(G)&&r&&r(G)}}),[ge]),Ct(()=>y.events.on(E.EventTypes["event:state.scene.mount"],w=>{_.current||(_.current=w,b())}).cancel,[]),Ct(()=>{if(!ge||!u||Q.current||m.isFirstSceneReady())return;let w=_.current||y.getLastScene();if(!w)return;let G=null,ee=null,k=!1;Q.current=!0;let Be=()=>{k=!0,Q.current=!1;let wt=ye(w);m.markFirstSceneReady(wt)&&a&&a(wt)};return typeof requestAnimationFrame=="function"?G=requestAnimationFrame(()=>{ee=setTimeout(Be,0)}):ee=setTimeout(Be,0),()=>{k||(Q.current=!1,G!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(G),ee!==null&&clearTimeout(ee))}},[u,f,d,ge]),Ct(()=>Ge.events.depends([Ge.events.on(Me.EventTypes["event:preloaded.ready"],()=>{xt(!0),y.stage.update(),o&&m.getLiveGame().isPlaying()&&pe()}),Ge.events.on(Me.EventTypes["event:preloaded.complete"],()=>{U(!0)})]).cancel,[]),Ct(()=>{y.flushDep=d},[d]);let ce=e||m.config.width,V=t||m.config.height;return W.createElement(Zi,{onError:l},W.createElement("div",{style:{width:typeof ce=="number"?`${ce}px`:ce,height:typeof V=="number"?`${V}px`:V},className:ia(n,"__narraleaf_content-player"),ref:S,tabIndex:0},W.createElement(ar,{className:ia("flex-grow overflow-auto"),gameState:y},W.createElement(Bo,{gameState:y}),W.createElement(ta,{gameState:y}),W.createElement(vt,{className:"absolute",ref:L,style:{cursor:y.game.config.cursor?"none":"auto",overflow:y.game.config.showOverflow?"visible":"hidden"}},m.config.cursor&&W.createElement(cr,{src:m.config.cursor,width:m.config.cursorWidth,height:m.config.cursorHeight}),W.createElement(jl,{show:ke&&u,key:g},W.createElement(Oo,null,W.createElement(Hs,{state:y}),W.createElement(Ks,{state:y}),y.getSceneElements().map(w=>W.createElement(or,{key:"scene-"+w.scene.getId(),state:y,elements:w})),y.getVideos().map((w,G)=>W.createElement("div",{className:"w-full h-full absolute",key:"video-"+G,"data-element-type":"video"},W.createElement(sr,{gameState:y,video:w}))),W.createElement(ql,{NvlComponent:m.config.nvlDialog}))),W.createElement(zs,{state:y}),W.createElement(xs,null,p),W.createElement(ur,{gameState:y})))))}function jl({children:o,show:e}){return W.createElement(W.Fragment,null,e?o:null)}function ql({NvlComponent:o}){let{dialogs:e,state:t}=St(),i=D().getLiveGame().getGameState(),r=W.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(Se.getCtx({gameState:i})),l=t.activeDialogId===s.id,p=l&&t.phase==="typing";return{entry:s,index:a,isActive:l,gameState:i,words:c,useTypeEffect:p}}),[e,i,t.activeDialogId,t.phase]);return W.createElement(o,{dialogs:r})}import"client-only";import vn from"react";function aa({children:o,game:e}){return vn.createElement(vn.Fragment,null,vn.createElement(rs,null,vn.createElement(es,{game:e},vn.createElement(Ws,null,vn.createElement(os,null,o)))))}var Ql=(r=>(r.image="narraleaf:image",r.text="narraleaf:text",r.layer="narraleaf:layer",r.scene="narraleaf:scene",r.video="narraleaf:video",r))(Ql||{});import Xl from"clsx";import At,{useEffect as ca,useRef as Yl}from"react";import{motion as Jl,useIsPresent as Zl}from"motion/react";var _l={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function eu({children:o,initial:e,transition:t,...n}){let i=D(),r=ct(),{ratio:s}=he(),[a]=at(Z.Preferences.showDialog),c=Yl(null),[l]=Yt("nextAction"),p=Zl();function u(){r.requestComplete()}return ca(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
|
|
48
|
-
at Say.tsx: onElementClick`);return}let d=f=>{i.keyMap.match("nextAction",f.key)&&r.requestComplete()};window.addEventListener("keyup",d);let h=r.events.on(Ce.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keyup",d),h.cancel()}},[r,l]),ca(()=>{let d=i.preference.onPreferenceChange(Z.Preferences.autoForward,h=>{h&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{d.cancel()}},[r]),At.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},At.createElement("div",{className:Xl("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:u,style:{...ii(i.config.useAspectScale,{maxWidth:i.config.dialogWidth,maxHeight:i.config.dialogHeight,transform:`scale(${s.state.scale})`,transformOrigin:"bottom left",width:i.config.width,height:i.config.height})},ref:c},At.createElement(Jl.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&p?{duration:0}:t},o)))}function la({children:o,...e}){let t=ct();return!t.config.action.sentence||!t.config.action.words?null:At.createElement(eu,{...e},o)}var ll=la;function ua(){return At.createElement(la,null,At.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},At.createElement(Io,null),At.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},At.createElement(It,null),At.createElement(Ot,{..._l}))))}var zn={say:ua,menu:Bs,notification:na,nvlDialog:Wo};var _i=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 Bn=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 pa=(e=>(e.game="game",e))(pa||{}),Ke=class Ke{constructor(e){this.hooks=new _n;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new Rn(Ke.DefaultPreference);this.keyMap=new Bn({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new X;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=F(Ke.DefaultConfig,e),this.plugins=new _i(this),this.router=new Ft(this)}configure(e){let[t,n]=Ur(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=F(this.config,t),this.getLiveGame().getGameState()?.events.emit(E.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}onPreloadComplete(e){return this.lifecycleEvents.on(Ke.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(Ke.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(Ke.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(Ke.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(Ke.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(Ke.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new ht(this)}};Ke.defaultSettings={volume:1},Ke.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:500,skipInterval:100},Ke.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},Ke.DefaultConfig={app:{debug:!1,logger:{log:!1,info:!1,warn:!0,error:!0,debug:!1,trace:!1,verbose:!1},inspector:!1,guard:{invalidExposedStateUnmounting:!0,unexpectedTimelineStatusChange:!0}},contentContainerId:"__narraleaf_content",aspectRatio:16/9,minWidth:800,minHeight:450,width:1920,height:1080,useWindowListener:!0,ratioUpdateInterval:50,preloadDelay:100,preloadConcurrency:5,waitForPreload:!0,preloadAllImages:!0,forceClearCache:!1,maxPreloadActions:10,cursor:null,cursorHeight:30,cursorWidth:30,showOverflow:!1,maxRouterHistory:10,screenshotQuality:1,useAspectScale:!0,autoForwardDelay:3*1e3,autoForwardDefaultPause:1e3,allowSkipImageTransform:!0,allowSkipImageTransition:!0,allowSkipBackgroundTransform:!0,allowSkipBackgroundTransition:!1,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:zn.notification,menu:zn.menu,dialog:zn.say,nvlDialog:zn.nvlDialog,onError:e=>{console.error(e)},stage:null,maxStackModelLoop:1e3,maxActionHistory:100},Ke.GameSettingsNamespace=pa,Ke.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var Z=Ke;var eo=class eo extends j{static executeActionsAsync(e,t){let n=e.game.getLiveGame().requestAsyncStackModel([{type:t.type,node:t.contentNode}]);return e.game.getLiveGame().executeAsyncStackModel(n)}checkActionChain(e){if(e.some(t=>!!t.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return e}executeAction(e,t){let n=this.contentNode,[i]=n.getContent();if(this.type===Ae.do)return[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:i[0].contentNode}];if(this.type===Ae.doAsync){let r=eo.executeActionsAsync(e,i[0]);return e.timelines.attachTimeline(r),super.executeAction(e,t)}else if(this.type===Ae.any){if(i.length===0)return{type:this.type,node:this.contentNode.getChild()};let r=this.checkActionChain(i).map(s=>e.game.getLiveGame().createStackModel([{type:s.type,node:s.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:r}}}else if(this.type===Ae.all){if(i.length===0)return{type:this.type,node:this.contentNode.getChild()};let r=this.checkActionChain(i).map(s=>e.game.getLiveGame().createStackModel([{type:s.type,node:s.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:r}}}else if(this.type===Ae.allAsync){if(i.length===0)return{type:this.type,node:this.contentNode.getChild()};let r=this.checkActionChain(i).map(s=>e.game.getLiveGame().requestAsyncStackModel([{type:s.type,node:s.contentNode}]));return e.timelines.attachTimeline(v.all(...r.map(s=>e.game.getLiveGame().executeAsyncStackModel(s)))),super.executeAction(e,t)}else if(this.type===Ae.repeat){let[r,s]=this.contentNode.getContent();if(s<=0||r.length===0)return super.executeAction(e,t);let a=Oe.createCountLoop(e.game.getLiveGame(),s,this.checkActionChain(r));return e.logger.debug("ControlAction","repeat",r,s),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[a]}}}else if(this.type===Ae.while){let[r,s]=this.contentNode.getContent();if(r.length===0)return super.executeAction(e,t);if(!s.evaluate({gameState:e}).value)return super.executeAction(e,t);let a=Oe.createConditionLoop(e.game.getLiveGame(),s,this.getId(),this.checkActionChain(r));return e.logger.debug("ControlAction","while",r),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[a]}}}else if(this.type===Ae.break){if(!t.stackModel.isLoop())throw new Error("Control.breakLoop() can only be used inside a loop (repeat/while)");return t.stackModel.breakLoop(),{type:this.type,node:null}}else if(this.type===Ae.sleep){let[,r]=this.contentNode.getContent(),s;typeof r=="number"?s=v.delay(r):v.isAwaitable(r)?s=r:s=v.fromPromise(r);let a=new v,c=new we(s);return e.timelines.attachTimeline(c),s.then(()=>{a.resolve({type:this.type,node:this.contentNode.getChild()})}),a.onSkipControllerRegister(l=>{l.onAbort(()=>{c.abort()})}),a}else if(this.type===Ae.waitForClick){if(e.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let r=new v,s=new v,a=new we(s);e.timelines.attachTimeline(a);let c=e.game.preference,l=c.getPreference(Z.Preferences.autoForward),p=c.getPreference(Z.Preferences.gameSpeed),u=l?e.game.config.autoForwardDelay/p:null,d=!1,h=null,f=null,b=null,g=()=>{f?.cancel(),b?.cancel(),h&&(clearTimeout(h),h=null)},T=()=>{d||(d=!0,g(),s.resolve())};return f=e.events.on(E.EventTypes["event:state.player.stageClick"],T),b=e.events.on(E.EventTypes["event:state.player.skip"],T),u!==null&&(h=setTimeout(T,u)),s.then(()=>{r.resolve({type:this.type,node:this.contentNode.getChild()})}),r.onSkipControllerRegister(m=>{m.onAbort(()=>{d||(d=!0,g(),a.abort())})}),r}throw new Error("Unknown control action type: "+this.type)}getFutureActions(e,t){if(this.callee.config.allowFutureScene===!1&&t.allowFutureScene===!1)return[...super.getFutureActions(e,t)];if(this.type===Ae.break||this.type===Ae.waitForClick)return super.getFutureActions(e,t);let n=this.contentNode.getContent()[0],i=super.getFutureActions(e,t);return[...n??[],...i]}stringify(e,t,n){if(this.type===Ae.break)return super.stringifyWithContent("Control","break");if(this.type===Ae.waitForClick)return super.stringifyWithContent("Control","waitForClick");let i=this.contentNode,[r]=i.getContent();return super.stringifyWithContent("Control",r.map(s=>s.stringify(e,t,n)).join(";"))}};eo.ActionTypes=Ae;var fe=eo;var Le=class o extends re{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()}do(t){return this.push(fe.ActionTypes.do,t)}doAsync(t){return this.push(fe.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(fe.ActionTypes.any,t)}all(t){return this.pushUnchained(fe.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(fe.ActionTypes.allAsync,t)}repeat(t,n){return this.push(fe.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=O.from(t);return this.pushWithLambda(fe.ActionTypes.while,n,i)}breakLoop(){let t=new fe(this.chain(),fe.ActionTypes.break,new A().setContent([]));return this.chain(t)}sleep(t){return this.push(fe.ActionTypes.sleep,[],t)}waitForClick(){let t=new fe(this.chain(),fe.ActionTypes.waitForClick,new A().setContent([]));return this.chain(t)}push(t,n,...i){let r=this.narrativeToActions(n),s=new fe(this.chain(),t,new A().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new fe(this.chain(),t,new A().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new fe(this.chain(),t,new A().setContent([this.construct(r),i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Pt.say(n).getActions():Ee.toActions([n]))}};var z=class z extends mt{static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return x.isStaticImageData(t)?x.srcToURL(t):x.isColor(t)?t:x.isImageSrc(t)?x.srcToURL(t):z.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&&!x.isImageSrc(e)&&!x.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)&&(x.isImageSrc(t)||x.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:z.isLayeredSrc(e)?null:z.isTagSrc(e)&&e.config.src.resolve?z.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):z.isStaticSrc(e)?x.isStaticImageData(e.state.currentSrc)?x.srcToURL(e.state.currentSrc):x.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=>z.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(z.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new z({src:e})}constructor(e={}){super();let t=z.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 Le,n=>{if(x.isImageSrc(e)||x.isColor(e)){if(x.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 A().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Le,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 de("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:z.StateSerializer.serialize(this.state),transformState:be.TransformStateSerializer.serialize(this.transformState.get())}}fromData(e){return this.state=z.StateSerializer.deserialize(e.state),this.transformState=be.deserialize(e.transformState),this}_applyTransition(e,t){return new De(this.chain(),Pe.applyTransition,new A().setContent([e,t]))}_init(e,t){return new De(this.chain(),Pe.init,new A().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new se(this.chain(),se.ActionTypes.initWearable,new A().setContent([e]))}_flush(){return new se(this.chain(),se.ActionTypes.flush,new A)}reset(){return this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig),this}resolveTags(e,t){if(!z.isTagSrc(this))throw new Error(`Tag not defined
|
|
46
|
+
To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(S)),r.get(S)||S}let{transformRef:p,transitionRefs:u,transitionTask:d,initDisplayable:h,applyTransition:f,applyTransform:b,updateStyleSync:g,deps:T}=gn({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:S=>{if(c)return(S?S.task.resolve:[null]).map(R=>R&&typeof R=="function"?{style:Dl}:{style:Pl(o.state.darkness)});let L=S?S.transition._getCurrentSrc():El(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:x.isColor(L)?x.colorToString(L):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:x.isImageSrc(L)?x.srcToURL(L):I.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:S=>S.src?{...S,src:l(S.src)}:S});Kt(o,{createWearable:S=>{i(L=>[...L,S])},disposeWearable:S=>{i(L=>L.filter(C=>C.getId()!==S.getId()))},initDisplayable:h,applyTransform:b,applyTransition:f,events:t,updateStyleSync:g},[...T]);function m(S,L){a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${S}px`,height:`${L}px`}))}function y(){t.emit("event:image.onLoad")}return bt.createElement(wl.div,{ref:p,className:"absolute w-max h-max","data-element-type":"image"},bt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},c?u.map(([S,L],C)=>{let R=d?d.task.resolve[C]:null;if(R&&typeof R=="function")return bt.createElement(ji,{key:L,ref:S,autoFit:o.config.autoFit});let B=R?R.key==="target"?d.transition._getTargetLayers():d.transition._getPrevLayers():c;return bt.createElement(Qs,{key:L,ref:S,src:B||c,autoFit:o.config.autoFit,resolveSrc:l,onSizeChanged:C===0?m:void 0,onLoad:C===0?y:void 0})}):u.map(([S,L],C)=>bt.createElement(ji,{key:L,ref:S,autoFit:o.config.autoFit,onSizeChanged:C===0?m:void 0,onLoad:C===0?y:void 0})),bt.createElement("div",{className:qs("w-full h-full top-0 left-0 absolute")},n.map(S=>bt.createElement("div",{className:qs("w-full h-full relative"),key:"wearable-"+S.getId()},bt.createElement(Qi,{image:S,state:e}))))))}function nr({state:o,displayable:e}){return Xi.createElement(Xi.Fragment,null,e.map(t=>{if(t instanceof $t)return Xi.createElement(er,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof I)return Xi.createElement(Qi,{state:o,image:t,key:"image-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import Yi,{useEffect as Ll}from"react";import{motion as Il}from"motion/react";function Xs({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c,deps:l}=gn({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return Kt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c},[...l]),Ll(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),Yi.createElement(Yi.Fragment,null,Yi.createElement(Il.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([p,u])=>Yi.createElement("div",{className:"relative w-full h-full",ref:p,key:u},t))))}import Rl from"clsx";import{AnimatePresence as Nl}from"motion/react";import{useEffect as ir,useReducer as Ml,useRef as Vn}from"react";import _t from"react";var Gl=120;function or({state:o,className:e,elements:t}){let{scene:n,layers:i,texts:r,menus:s}=t,a=Vn(!1),c=Vn({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),l=Vn([]),p=Vn(null),u=Vn(null),[,d]=Ml(g=>g+1,0),h=()=>{u.current&&(clearTimeout(u.current),u.current=null)},f=()=>{let g=p.current;if(!g)return;let T=c.current;g.forEach(({slot:m,presenceKey:y})=>{T.slotKeys.get(m)===y&&T.slotKeys.delete(m),T.exitingKeys.add(y)}),p.current=null,u.current=null,l.current=[],d()};ir(()=>n.events.depends([n.events.on(et.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),ir(()=>(n.events.emit(et.EventTypes["event:scene.mount"]),o.events.emit(P.EventTypes["event:state.scene.mount"],n),o.logger.debug("Scene","Scene mounted",n.getId()),()=>{n.events.emit(et.EventTypes["event:scene.unmount"]),o.events.emit(P.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),ir(()=>()=>{h()},[]),Kt(n,{setBackgroundMusic(g,T){return new Promise(m=>{(async function(){n.state.backgroundMusic&&o.audioManager.isManaged(n.state.backgroundMusic)&&await o.audioManager.stop(n.state.backgroundMusic,T),g?(await o.audioManager.play(g,{end:g.state.volume,duration:T}),n.state.backgroundMusic=g):n.state.backgroundMusic=null,m()})()})}});let b=(()=>{let g=c.current,T=r.length>0?r.map(({action:S,onClick:L},C)=>({action:S,slot:C,useTypeEffect:!a.current,onFinished:R=>{R!==void 0&&(a.current=R),L(),o.events.emit(P.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):s.flatMap((S,L)=>{if(!S.action.prompt||!S.action.words)return[];let C=g.menuPromptIds.get(S);return C||(C=`menu-prompt-${n.getId()}-${g.nextKey++}`,g.menuPromptIds.set(S,C)),[{action:{sentence:S.action.prompt,words:S.action.words,character:null,id:C},slot:L,useTypeEffect:!1}]});if(T.length===0)return!p.current&&l.current.length>0&&(p.current=l.current.map(S=>({...S,active:!1}))),p.current&&!u.current&&(u.current=setTimeout(f,Gl)),p.current??[];h(),p.current=null;let m=new Set(T.map(({slot:S})=>S));for(let[S,L]of Array.from(g.slotKeys))m.has(S)||(g.exitingKeys.add(L),g.slotKeys.delete(S));let y=T.map(({slot:S,...L})=>{let C=g.slotKeys.get(S);return(!C||g.exitingKeys.has(C))&&(C=`say-${n.getId()}-${g.nextKey++}`,g.slotKeys.set(S,C)),{...L,presenceKey:C,slot:S,active:!0}});return l.current=y,y})();return _t.createElement("div",{className:Rl(e,"w-full h-full absolute")},[...i.entries()].sort(([g],[T])=>g.state.zIndex-T.state.zIndex).map(([g,T])=>_t.createElement(Xs,{state:o,layer:g,key:g.getId()},_t.createElement(nr,{state:o,displayable:T}))),_t.createElement(Nl,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{c.current.exitingKeys.clear()}},b.map(({action:g,onFinished:T,presenceKey:m,active:y,useTypeEffect:S})=>_t.createElement(Mn,{gameState:o,key:m,action:g,active:y,onFinished:T,useTypeEffect:S}))),s.map(({action:g,onClick:T},m)=>_t.createElement("div",{key:"menu-"+m,"data-element-type":"menu"},_t.createElement(Qo,{state:o,prompt:g.prompt,choices:g.choices,renderPrompt:!g.prompt,afterChoose:y=>{a.current=!1,T(y),o.stage.next()},words:g.words}))))}import Hl from"react";import{useEffect as rr,useRef as Ul}from"react";import{useCallback as Ys}from"react";function Js(o){let e=Ys(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=Ys(()=>{if(!o.current)return;let n=o.current;n.style.opacity="0",n.style.pointerEvents="none",n.style.visibility="hidden"},[o]);return{show:e,hide:t}}function sr({gameState:o,video:e}){let t=Ul(null),{show:n,hide:i}=Js(t);rr(()=>o.events.depends([o.events.on(P.EventTypes["event:state.player.skip"],()=>{o.game.config.allowSkipVideo&&(r(),o.logger.log("NarraLeaf-React: Video","Skipped"))})]).cancel,[]),rr(()=>{i(),e.state.display&&n()},[]),rr(()=>{if(!t.current)return;let s=t.current,a=!1,c=()=>new E(`Failed to add event listener, ref is not available
|
|
47
|
+
at Video.tsx: useEffect`),l=()=>{a||!s||(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 u=t.current;return u.currentTime=0,new Promise(d=>{o.schedule(({retry:h})=>{if(u.readyState<3){let T=()=>{u.removeEventListener("loadeddata",T),h()};u.addEventListener("loadeddata",T);return}let f=()=>{g(),d()},b=()=>{g(),d()},g=()=>{u.removeEventListener("ended",f),u.removeEventListener("stopped",b)};u.addEventListener("ended",f),u.addEventListener("stopped",b),p.push(g),u.play().catch(T=>{o.logger.error("Failed to play video: "+T),g(),d()})},10)})},pause:()=>{if(!t.current)throw c();t.current.pause()},resume:()=>{if(!t.current)throw c();return t.current.play()},stop:()=>{if(!t.current)throw c();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:u=>{if(!t.current)throw c();t.current.currentTime=u}}))},p=[];return s.addEventListener("canplay",l),()=>{a=!1,s.removeEventListener("canplay",l),p.forEach(u=>u()),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 Hl.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 Fl from"clsx";import Ol,{useCallback as Kl,useEffect as Ji,useRef as Vl}from"react";function ar({children:o,className:e,gameState:t}){let{ratio:n}=he(),i=D(),[r]=ie(),s=Vl(null),a=i.config.minWidth,c=i.config.minHeight,l=Kl(p=>{if(n.isLocked()){t.logger.weakWarn("AspectRatio","ratio is locked, skipping update");return}n.update(p.width,p.height,p.scale),n.updateMin(a,c),r()},[r,t.logger,c,a,n]);return Ji(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),Ji(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),Ji(()=>{let p=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(p)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),Ji(()=>t.events.on(P.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),Ol.createElement(Ls,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:Fl(e),onUpdate:l},o)}import Zs,{useEffect as Wl,useRef as zl,useState as _s}from"react";function cr({src:o,width:e,height:t}){let[n,i]=_s({x:0,y:0}),[r,s]=_s(!1),a=zl(null),{ratio:c}=he();return Wl(()=>{let l=p=>{if(a.current){let u=a.current.getBoundingClientRect(),d=p.clientX-u.left,h=p.clientY-u.top;i({x:d,y:h}),r||s(!0)}};return window.addEventListener("mousemove",l),()=>{window.removeEventListener("mousemove",l)}},[r]),Zs.createElement(vt,{ref:a,className:"overflow-hidden absolute"},Zs.createElement("img",{src:o,style:{position:"absolute",left:n.x,top:n.y,width:e,height:t,pointerEvents:"none",zIndex:1001,display:r?"block":"none",cursor:"none",transform:`scale(${c.state.scale})`},alt:""}))}import ea from"react";import Rt from"react";function lr({error:o,errorInfo:e}){return D().config.app.debug?Rt.createElement("div",{className:"text-left"},Rt.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),Rt.createElement("p",{className:"text-red-700"},"Message: ",o.message),Rt.createElement("pre",null,"Error Stack: ",o?.stack),Rt.createElement("pre",null,"Component Stack: ",e?.componentStack),Rt.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):Rt.createElement("div",{className:"bg-white w-full h-full"},Rt.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),Rt.createElement("p",null,"Please contact the game developer for further assistance."))}var Zi=class extends ea.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?ea.createElement(lr,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import ia from"clsx";import W,{useEffect as Ct,useReducer as oa,useState as yn}from"react";import{flushSync as ra}from"react-dom";import{useRef as Bl}from"react";import{useEffect as $l}from"react";function ta({gameState:o}){let e=Bl(null);return $l(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(P.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Wn,{useEffect as jl}from"react";function ur({gameState:o}){let[e]=ie(),{ratio:t}=he(),n=o.notificationMgr;jl(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Wn.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"},Wn.createElement(i,{notifications:n.toArray()}))}function na({notifications:o}){return Wn.createElement(Hi,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Wn.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Wn.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function sa({story:o=Dn.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:c,onError:l,children:p,active:u=!0}){let[d,h]=oa(w=>w+1,0),[f,b]=oa(w=>w+1,0),[g,T]=yn(0),m=D(),[y]=yn(()=>new P(m,{update:h,forceUpdate:()=>{y.logger.weakWarn("Player","force update"),ra(()=>{h()})},forceRemount:()=>{y.logger.weakWarn("Player","force remount"),ra(()=>{T(w=>w+1),h()})},next:pe})),S=W.createRef(),L=W.createRef(),[C,R]=yn(!1),B=W.useRef(!1),K=W.useRef(null),se=W.useRef(null),{preloaded:Ge}=hn(),[ke,xt]=yn(!1),ze=W.useRef(!1),[ge,U]=yn(!1),ae=W.useRef(!1),_=W.useRef(null),Q=W.useRef(!1),[M]=yn(new Map);function ye(w){return{game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable(),scene:w}}function pe(){let w=()=>{M.forEach(k=>k.cancel())};if(y.rollLock.isLocked())return;w();let G=!1,ee=0;for(;!G;){if(ee++>m.config.maxStackModelLoop)throw new E("Max stack model loop reached");let k=m.getLiveGame().next();if(!k){if(m.getLiveGame().stackModel&&!m.getLiveGame().stackModel.isEmpty())continue;break}if(v.isAwaitable(k)){if(K.current===k)break;K.current=k,k.onSettled(()=>{k.isFailed()||(K.current===k&&(K.current=null),pe())}),k.onFailed(Be=>{K.current===k&&(K.current=null),y.logger.error("Player",Be)}),G=!0;break}if(k instanceof nn){if(se.current===k)break;se.current=k,k.nextUnlock().then(()=>{se.current===k&&(se.current=null),pe()}),G=!0;break}if(Oe.isCalledActionResult(k)&&k.wait&&Oe.isStackModelsAwaiting(k.wait.type,k.wait.stackModels)){if(K.current===k)break;if(K.current=k,k.wait){let Be=Oe.executeStackModelGroup(k.wait.type,k.wait.stackModels);Be.then(()=>{K.current===k&&(K.current=null),pe()}),Be.onFailed(wt=>{K.current===k&&(K.current=null),y.logger.error("Player",wt)})}G=!0;break}y.handle(k)}y.stage.update()}Ct(()=>{y.audioManager.initialize()},[]),Ct(()=>(m.getLiveGame().setGameState(y),o&&!m.getLiveGame().isPlaying()&&m.getLiveGame().loadStory(o),y.playerCurrent=S.current,y.mainContentNode=L.current,()=>{m.getLiveGame().setGameState(void 0),y.playerCurrent=null}),[m,o]),Ct(()=>je(()=>{R(!0);let w=y.getLastScene(),G=[];w?G.push(w.events.once("event:scene.mount",()=>{y.stage.next()}).cancel):y.stage.next();let ee=y.events.on(P.EventTypes["event:state.end"],()=>{c&&c({game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()})});return y.stage.update(),()=>{w&&G.forEach(k=>k()),ee.cancel()}}),[]),Ct(()=>je(()=>{C&&i&&!B.current&&(B.current=!0,y.stage.forceUpdate(),m.hooks.trigger("init",[]),i({game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()}))}),[C]),Ct(()=>je(()=>{if(ke&&s&&!ze.current){ze.current=!0;let w=_.current||y.getLastScene()||y.getPreloadingScene(),G=ye(w);s(G)}}),[ke]),Ct(()=>je(()=>{if(ge&&!ae.current){ae.current=!0;let w=_.current||y.getLastScene()||y.getPreloadingScene(),G=ye(w);m.markPreloadComplete(G)&&r&&r(G)}}),[ge]),Ct(()=>y.events.on(P.EventTypes["event:state.scene.mount"],w=>{_.current||(_.current=w,b())}).cancel,[]),Ct(()=>{if(!ge||!u||Q.current||m.isFirstSceneReady())return;let w=_.current||y.getLastScene();if(!w)return;let G=null,ee=null,k=!1;Q.current=!0;let Be=()=>{k=!0,Q.current=!1;let wt=ye(w);m.markFirstSceneReady(wt)&&a&&a(wt)};return typeof requestAnimationFrame=="function"?G=requestAnimationFrame(()=>{ee=setTimeout(Be,0)}):ee=setTimeout(Be,0),()=>{k||(Q.current=!1,G!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(G),ee!==null&&clearTimeout(ee))}},[u,f,d,ge]),Ct(()=>Ge.events.depends([Ge.events.on(Me.EventTypes["event:preloaded.ready"],()=>{xt(!0),y.stage.update(),o&&m.getLiveGame().isPlaying()&&pe()}),Ge.events.on(Me.EventTypes["event:preloaded.complete"],()=>{U(!0)})]).cancel,[]),Ct(()=>{y.flushDep=d},[d]);let ce=e||m.config.width,V=t||m.config.height;return W.createElement(Zi,{onError:l},W.createElement("div",{style:{width:typeof ce=="number"?`${ce}px`:ce,height:typeof V=="number"?`${V}px`:V},className:ia(n,"__narraleaf_content-player"),ref:S,tabIndex:0},W.createElement(ar,{className:ia("flex-grow overflow-auto"),gameState:y},W.createElement(Bo,{gameState:y}),W.createElement(ta,{gameState:y}),W.createElement(vt,{className:"absolute",ref:L,style:{cursor:y.game.config.cursor?"none":"auto",overflow:y.game.config.showOverflow?"visible":"hidden"}},m.config.cursor&&W.createElement(cr,{src:m.config.cursor,width:m.config.cursorWidth,height:m.config.cursorHeight}),W.createElement(ql,{show:ke&&u,key:g},W.createElement(Oo,null,W.createElement(Hs,{state:y}),W.createElement(Ks,{state:y}),y.getSceneElements().map(w=>W.createElement(or,{key:"scene-"+w.scene.getId(),state:y,elements:w})),y.getVideos().map((w,G)=>W.createElement("div",{className:"w-full h-full absolute",key:"video-"+G,"data-element-type":"video"},W.createElement(sr,{gameState:y,video:w}))),W.createElement(Ql,{NvlComponent:m.config.nvlDialog}))),W.createElement(zs,{state:y}),W.createElement(xs,null,p),W.createElement(ur,{gameState:y})))))}function ql({children:o,show:e}){return W.createElement(W.Fragment,null,e?o:null)}function Ql({NvlComponent:o}){let{dialogs:e,state:t}=St(),i=D().getLiveGame().getGameState(),r=W.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(Se.getCtx({gameState:i})),l=t.activeDialogId===s.id,p=l&&t.phase==="typing";return{entry:s,index:a,isActive:l,gameState:i,words:c,useTypeEffect:p}}),[e,i,t.activeDialogId,t.phase]);return W.createElement(o,{dialogs:r})}import"client-only";import vn from"react";function aa({children:o,game:e}){return vn.createElement(vn.Fragment,null,vn.createElement(rs,null,vn.createElement(es,{game:e},vn.createElement(Ws,null,vn.createElement(os,null,o)))))}var Xl=(r=>(r.image="narraleaf:image",r.text="narraleaf:text",r.layer="narraleaf:layer",r.scene="narraleaf:scene",r.video="narraleaf:video",r))(Xl||{});import Yl from"clsx";import At,{useEffect as ca,useRef as Jl}from"react";import{motion as Zl,useIsPresent as _l}from"motion/react";var eu={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function tu({children:o,initial:e,transition:t,...n}){let i=D(),r=ct(),{ratio:s}=he(),[a]=at(Z.Preferences.showDialog),c=Jl(null),[l]=Yt("nextAction"),p=_l();function u(){r.requestComplete()}return ca(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
|
|
48
|
+
at Say.tsx: onElementClick`);return}let d=f=>{i.keyMap.match("nextAction",f.key)&&r.requestComplete()};window.addEventListener("keyup",d);let h=r.events.on(Ce.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keyup",d),h.cancel()}},[r,l]),ca(()=>{let d=i.preference.onPreferenceChange(Z.Preferences.autoForward,h=>{h&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{d.cancel()}},[r]),At.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},At.createElement("div",{className:Yl("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:u,style:{...ii(i.config.useAspectScale,{maxWidth:i.config.dialogWidth,maxHeight:i.config.dialogHeight,transform:`scale(${s.state.scale})`,transformOrigin:"bottom left",width:i.config.width,height:i.config.height})},ref:c},At.createElement(Zl.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&p?{duration:0}:t},o)))}function la({children:o,...e}){let t=ct();return!t.config.action.sentence||!t.config.action.words?null:At.createElement(tu,{...e},o)}var ll=la;function ua(){return At.createElement(la,null,At.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},At.createElement(Io,null),At.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},At.createElement(It,null),At.createElement(Ot,{...eu}))))}var zn={say:ua,menu:Bs,notification:na,nvlDialog:Wo};var _i=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 Bn=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 pa=(e=>(e.game="game",e))(pa||{}),Ke=class Ke{constructor(e){this.hooks=new _n;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new Rn(Ke.DefaultPreference);this.keyMap=new Bn({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new X;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=F(Ke.DefaultConfig,e),this.plugins=new _i(this),this.router=new Ft(this)}configure(e){let[t,n]=Ur(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=F(this.config,t),this.getLiveGame().getGameState()?.events.emit(P.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}onPreloadComplete(e){return this.lifecycleEvents.on(Ke.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(Ke.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(Ke.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(Ke.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(Ke.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(Ke.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new ht(this)}};Ke.defaultSettings={volume:1},Ke.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:500,skipInterval:100},Ke.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},Ke.DefaultConfig={app:{debug:!1,logger:{log:!1,info:!1,warn:!0,error:!0,debug:!1,trace:!1,verbose:!1},inspector:!1,guard:{invalidExposedStateUnmounting:!0,unexpectedTimelineStatusChange:!0}},contentContainerId:"__narraleaf_content",aspectRatio:16/9,minWidth:800,minHeight:450,width:1920,height:1080,useWindowListener:!0,ratioUpdateInterval:50,preloadDelay:100,preloadConcurrency:5,waitForPreload:!0,preloadAllImages:!0,forceClearCache:!1,maxPreloadActions:10,cursor:null,cursorHeight:30,cursorWidth:30,showOverflow:!1,maxRouterHistory:10,screenshotQuality:1,useAspectScale:!0,autoForwardDelay:3*1e3,autoForwardDefaultPause:1e3,allowSkipImageTransform:!0,allowSkipImageTransition:!0,allowSkipBackgroundTransform:!0,allowSkipBackgroundTransition:!1,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:zn.notification,menu:zn.menu,dialog:zn.say,nvlDialog:zn.nvlDialog,onError:e=>{console.error(e)},stage:null,maxStackModelLoop:1e3,maxActionHistory:100},Ke.GameSettingsNamespace=pa,Ke.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var Z=Ke;var eo=class eo extends j{static executeActionsAsync(e,t){let n=e.game.getLiveGame().requestAsyncStackModel([{type:t.type,node:t.contentNode}]);return e.game.getLiveGame().executeAsyncStackModel(n)}checkActionChain(e){if(e.some(t=>!!t.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return e}executeAction(e,t){let n=this.contentNode,[i]=n.getContent();if(this.type===Ae.do)return[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:i[0].contentNode}];if(this.type===Ae.doAsync){let r=eo.executeActionsAsync(e,i[0]);return e.timelines.attachTimeline(r),super.executeAction(e,t)}else if(this.type===Ae.any){if(i.length===0)return{type:this.type,node:this.contentNode.getChild()};let r=this.checkActionChain(i).map(s=>e.game.getLiveGame().createStackModel([{type:s.type,node:s.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:r}}}else if(this.type===Ae.all){if(i.length===0)return{type:this.type,node:this.contentNode.getChild()};let r=this.checkActionChain(i).map(s=>e.game.getLiveGame().createStackModel([{type:s.type,node:s.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:r}}}else if(this.type===Ae.allAsync){if(i.length===0)return{type:this.type,node:this.contentNode.getChild()};let r=this.checkActionChain(i).map(s=>e.game.getLiveGame().requestAsyncStackModel([{type:s.type,node:s.contentNode}]));return e.timelines.attachTimeline(v.all(...r.map(s=>e.game.getLiveGame().executeAsyncStackModel(s)))),super.executeAction(e,t)}else if(this.type===Ae.repeat){let[r,s]=this.contentNode.getContent();if(s<=0||r.length===0)return super.executeAction(e,t);let a=Oe.createCountLoop(e.game.getLiveGame(),s,this.checkActionChain(r));return e.logger.debug("ControlAction","repeat",r,s),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[a]}}}else if(this.type===Ae.while){let[r,s]=this.contentNode.getContent();if(r.length===0)return super.executeAction(e,t);if(!s.evaluate({gameState:e}).value)return super.executeAction(e,t);let a=Oe.createConditionLoop(e.game.getLiveGame(),s,this.getId(),this.checkActionChain(r));return e.logger.debug("ControlAction","while",r),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[a]}}}else if(this.type===Ae.break){if(!t.stackModel.isLoop())throw new Error("Control.breakLoop() can only be used inside a loop (repeat/while)");return t.stackModel.breakLoop(),{type:this.type,node:null}}else if(this.type===Ae.sleep){let[,r]=this.contentNode.getContent(),s;typeof r=="number"?s=v.delay(r):v.isAwaitable(r)?s=r:s=v.fromPromise(r);let a=new v,c=new we(s);return e.timelines.attachTimeline(c),s.then(()=>{a.resolve({type:this.type,node:this.contentNode.getChild()})}),a.onSkipControllerRegister(l=>{l.onAbort(()=>{c.abort()})}),a}else if(this.type===Ae.waitForClick){if(e.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let r=new v,s=new v,a=new we(s);e.timelines.attachTimeline(a);let c=e.game.preference,l=c.getPreference(Z.Preferences.autoForward),p=c.getPreference(Z.Preferences.gameSpeed),u=l?e.game.config.autoForwardDelay/p:null,d=!1,h=null,f=null,b=null,g=()=>{f?.cancel(),b?.cancel(),h&&(clearTimeout(h),h=null)},T=()=>{d||(d=!0,g(),s.resolve())};return f=e.events.on(P.EventTypes["event:state.player.stageClick"],T),b=e.events.on(P.EventTypes["event:state.player.skip"],T),u!==null&&(h=setTimeout(T,u)),s.then(()=>{r.resolve({type:this.type,node:this.contentNode.getChild()})}),r.onSkipControllerRegister(m=>{m.onAbort(()=>{d||(d=!0,g(),a.abort())})}),r}throw new Error("Unknown control action type: "+this.type)}getFutureActions(e,t){if(this.callee.config.allowFutureScene===!1&&t.allowFutureScene===!1)return[...super.getFutureActions(e,t)];if(this.type===Ae.break||this.type===Ae.waitForClick)return super.getFutureActions(e,t);let n=this.contentNode.getContent()[0],i=super.getFutureActions(e,t);return[...n??[],...i]}stringify(e,t,n){if(this.type===Ae.break)return super.stringifyWithContent("Control","break");if(this.type===Ae.waitForClick)return super.stringifyWithContent("Control","waitForClick");let i=this.contentNode,[r]=i.getContent();return super.stringifyWithContent("Control",r.map(s=>s.stringify(e,t,n)).join(";"))}};eo.ActionTypes=Ae;var fe=eo;var Le=class o extends oe{constructor(t={}){super();this.config=t}static do(t){return new o().do(t)}static doAsync(t){return new o().doAsync(t)}static any(t){return new o().any(t)}static all(t){return new o().all(t)}static allAsync(t){return new o().allAsync(t)}static repeat(t,n){return new o().repeat(t,n)}static whileLoop(t,n){return new o().whileLoop(t,n)}static breakLoop(){return new o().breakLoop()}static sleep(t){return new o().sleep(t)}static waitForClick(){return new o().waitForClick()}do(t){return this.push(fe.ActionTypes.do,t)}doAsync(t){return this.push(fe.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(fe.ActionTypes.any,t)}all(t){return this.pushUnchained(fe.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(fe.ActionTypes.allAsync,t)}repeat(t,n){return this.push(fe.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=O.from(t);return this.pushWithLambda(fe.ActionTypes.while,n,i)}breakLoop(){let t=new fe(this.chain(),fe.ActionTypes.break,new A().setContent([]));return this.chain(t)}sleep(t){return this.push(fe.ActionTypes.sleep,[],t)}waitForClick(){let t=new fe(this.chain(),fe.ActionTypes.waitForClick,new A().setContent([]));return this.chain(t)}push(t,n,...i){let r=this.narrativeToActions(n),s=new fe(this.chain(),t,new A().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new fe(this.chain(),t,new A().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new fe(this.chain(),t,new A().setContent([this.construct(r),i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?Pt.say(n).getActions():Ee.toActions([n]))}};var z=class z extends mt{static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return x.isStaticImageData(t)?x.srcToURL(t):x.isColor(t)?t:x.isImageSrc(t)?x.srcToURL(t):z.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&&!x.isImageSrc(e)&&!x.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)&&(x.isImageSrc(t)||x.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:z.isLayeredSrc(e)?null:z.isTagSrc(e)&&e.config.src.resolve?z.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):z.isStaticSrc(e)?x.isStaticImageData(e.state.currentSrc)?x.srcToURL(e.state.currentSrc):x.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=>z.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(z.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new z({src:e})}constructor(e={}){super();let t=z.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 Le,n=>{if(x.isImageSrc(e)||x.isColor(e)){if(x.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 re(n,re.ActionTypes.setAppearance,new A().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Le,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 de("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:z.StateSerializer.serialize(this.state),transformState:be.TransformStateSerializer.serialize(this.transformState.get())}}fromData(e){return this.state=z.StateSerializer.deserialize(e.state),this.transformState=be.deserialize(e.transformState),this}_applyTransition(e,t){return new De(this.chain(),Pe.applyTransition,new A().setContent([e,t]))}_init(e,t){return new De(this.chain(),Pe.init,new A().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new re(this.chain(),re.ActionTypes.initWearable,new A().setContent([e]))}_flush(){return new re(this.chain(),re.ActionTypes.flush,new A)}reset(){return this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig),this}resolveTags(e,t){if(!z.isTagSrc(this))throw new Error(`Tag not defined
|
|
49
49
|
Tag must be defined in the image config`);let n=this.constructTagMap(this.config.src.groups),i=new Map,r=[];this.config.src.groups.forEach(a=>{i.set(a,null)});let s=a=>{a.forEach(c=>{let l=n.get(c);l&&i.set(l,c)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let c=i.get(a);if(!c)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(c)}),r}_mixedSrcError(){throw new de(`Trying to mix src and tags
|
|
50
50
|
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
|
|
51
51
|
Wearable must be an Image with isWearable set to true
|
|
52
52
|
It seems like you are trying to add a non-wearable image to wearables
|
|
53
53
|
Image below violates the rule:
|
|
54
|
-
`+e)}_invalidTagGroupDefinitionError(){throw new Error("Invalid tag group definition. Tags in groups must be unique and not conflicting with each other.")}_setSrc(e,t,n){return n&&e.chain(this._applyTransition(n.copy(),i=>i._setPrevSrc(
|
|
54
|
+
`+e)}_invalidTagGroupDefinitionError(){throw new Error("Invalid tag group definition. Tags in groups must be unique and not conflicting with each other.")}_setSrc(e,t,n){return n&&e.chain(this._applyTransition(n.copy(),i=>i._setPrevSrc(re.resolveCurrentSrc(this))._setTargetSrc(t))),new re(e,re.ActionTypes.setSrc,new A().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){let e=this.config.src;return e?.slots?z.getAllLayerSrc(this).forEach(t=>this.srcManager.registerRawSrc(t)):e?.resolve?this.srcManager.registerRawSrc(z.getSrcFromTags(e.defaults,e.resolve)):x.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(x.srcToURL(this.state.currentSrc)),this}static normalizeSrcDefinition(e){return z.isLayeredDefinition(e)?{groups:e.layers.filter(z.isLayerVariants).map(t=>Object.keys(t)),defaults:[...e.defaults],resolve:null,slots:e.layers}:z.isTagDefinition(e)?{groups:e.groups,defaults:[...e.defaults],resolve:e.resolve,slots:null}:null}createImageConfig(e){let t=e.get();return z.DefaultImageConfig.create({...t,src:z.normalizeSrcDefinition(t.src)})}getInitialState(){return z.DefaultImageState.create().assign({currentSrc:z.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(be.DefaultTransformState.keys());return new be(be.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(z.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();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
|
|
55
55
|
Tag "${r}" is conflicting with another tag
|
|
56
56
|
Error found in config.tag.defaults`);if(!n.has(r))throw new Error(`Tag not found
|
|
57
57
|
Tag "${r}" is not defined in tagDefinitions
|
|
58
58
|
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 de(`Layer has no default
|
|
59
|
-
The layer 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 A().setContent([t,n,i]))}};z.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",z.StateSerializer=new $e,z.DefaultUserConfig=new Y({name:"(anonymous)",autoInit:!0,src:z.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...be.DefaultTransformState.getDefaultConfig()},{position:e=>I.tryParsePosition(e)}),z.DefaultImageConfig=new Y({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),z.DefaultImageState=new Y({currentSrc:z.DefaultImagePlaceholder,darkness:0});var N=z;var ue=class extends ft{_setPrevLayers(e){return this._prevLayers=e,this}_setTargetLayers(e){return this._targetLayers=e,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(e){return this._prevSrc=e,this}_setTargetSrc(e){return this._targetSrc=e,this}_setCurrentSrc(e){return this._currentSrc=e,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(e){let t=super.requestAnimations(e);return t.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),t}asPrev(e){return super.asPrev((...t)=>F(e(...t),this._srcToProps(this._prevSrc)))}asTarget(e){return super.asTarget((...t)=>F(e(...t),this._srcToProps(this._targetSrc)))}_srcToProps(e){if(this._isLayered())return{};if(x.isColor(e))return{src:N.DefaultImagePlaceholder,style:{backgroundColor:x.isRGBAColor(e)?x.RGBAColorToHex(e):e}};if(x.isImageSrc(e))return{src:x.srcToURL(e)};throw new de("Image transition src cannot be identified, using: "+e)}};var to=class o extends ue{constructor(t,n,i,r){super();this.prevDarkness=t;this.targetDarkness=n;this.duration=i;this.easing=r}createTask(){return{animations:[{type:0,start:this.prevDarkness,end:this.targetDarkness,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(t=>({style:{filter:`brightness(${1-t})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o(this.prevDarkness,this.targetDarkness,this.duration,this.easing)}};var $n=class $n extends j{static resolveTagSrc(e,t){if(!N.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return N.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(N.isLayeredSrc(e))throw e._mixedSrcError();if(N.isStaticSrc(e))return x.isImageSrc(e.state.currentSrc)?x.srcToURL(e.state.currentSrc):e.state.currentSrc;if(N.isTagSrc(e)&&e.config.src.resolve)return N.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===Je.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new v(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===Je.setSrc){let n=this.contentNode.getContent()[0];if(x.isColor(n)&&!this.callee.config.isBackground)throw new de("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(),super.executeAction(e,t)}else{if(this.type===Je.flush)return super.executeAction(e,t);if(this.type===Je.setAppearance){let[n,i]=this.contentNode.getContent();if(!N.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],c=()=>{this.callee.state.currentSrc=a};if(N.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let u=new v(b=>b).registerSkipController(new H(()=>super.executeAction(e,t)));i._setPrevLayers(N.getSrcURLs(this.callee))._setTargetLayers(N.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,u.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(u).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},c,[]),u}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),e.stage.update(),super.executeAction(e,t)}let l=this.callee.config.src.resolve;if(!l)throw this.callee._invalidSrcHandlerError();let p=N.getSrcFromTags(s,l);if(e.logger.debug("Image - Set Appearance",s,p),i){let u=new v(b=>b).registerSkipController(new H(()=>super.executeAction(e,t)));i._setPrevSrc($n.resolveCurrentSrc(this.callee))._setTargetSrc(p);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,u.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(u).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},c,[]),u}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),super.executeAction(e,t)}else if(this.type===Je.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},c=e.getExposedStateForce(this.callee);if(i){let l=new v(h=>h),p=new to(s,n,i,r);if(N.isLayeredSrc(this.callee)){let h=N.getSrcURLs(this.callee);p._setPrevLayers(h)._setTargetLayers(h)}else{let h=$n.resolveCurrentSrc(this.callee);p._setPrevSrc(h)._setTargetSrc(h)}let u=c.applyTransition(p,()=>{this.callee.state.darkness=n,l.resolve(super.executeAction(e,t))}),d=e.timelines.attachTimeline(l).attachChild(u);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:d},()=>{l.isSettled()||l.abort(),u.abort(),a()}),l}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),c.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};$n.ActionTypes=Je;var se=$n;var Nt=class Nt extends j{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await Nt.initBackgroundMusic(e,r),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t){e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new de("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);t.addElement(r),n.local.getNamespace(t.getStorable()).load(e.local),e.state&&n.fromData(e.state),e.background&&n.background.fromData(e.background)}applyTransition(e,t,n){let i=new v().registerSkipController(new H(()=>(e.logger.info("Background Transition","Skipped"),super.executeAction(e,n))));return e.getExposedStateForce(this.callee.background).applyTransition(t,()=>{i.resolve(super.executeAction(e,n))}),e.timelines.attachTimeline(i),i}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new v(l=>l),c=null;return a.registerSkipController(new H(()=>(c&&(clearTimeout(c),c=null),s))),c=e.setTimeout(()=>{c=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===$.action)return super.executeAction(e,t);if(this.is(Nt,"scene:init")){let n=new v(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{this.exit(e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return Nt.handleSceneInit(this.callee,r,e,v.forward(n,r))}else if(this.type===$.exit){let n=Nt.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new v(s=>s);e.timelines.attachTimeline(r),Nt.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),Nt.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===$.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize();e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let[c]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(a,c)},[r]);let s=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:s}),null}else if(this.type===$.setBackgroundMusic){let[n,i]=this.contentNode.getContent(),r=this.callee,s=e.getExposedStateForce(r),a=r.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{s.setBackgroundMusic(c,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===$.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===$.transitionToScene){let[n,i,r]=this.contentNode.getContent();return n._setPrevSrc(se.resolveCurrentSrc(this.callee.background)),i?n._setTargetSrc(se.resolveCurrentSrc(i.background)):r&&n._setTargetSrc(r),this.applyTransition(e,n,t)}else if(this.type===$.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===$.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=v.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===$.nvlHide){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!1,n,t),s=v.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===$.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===$.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===$.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 de(`Scene with name ${e} not found
|
|
59
|
+
The layer 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 re(e,re.ActionTypes.setDarkness,new A().setContent([t,n,i]))}};z.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",z.StateSerializer=new $e,z.DefaultUserConfig=new Y({name:"(anonymous)",autoInit:!0,src:z.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...be.DefaultTransformState.getDefaultConfig()},{position:e=>N.tryParsePosition(e)}),z.DefaultImageConfig=new Y({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),z.DefaultImageState=new Y({currentSrc:z.DefaultImagePlaceholder,darkness:0});var I=z;var ue=class extends ft{_setPrevLayers(e){return this._prevLayers=e,this}_setTargetLayers(e){return this._targetLayers=e,this}_getPrevLayers(){return this._prevLayers}_getTargetLayers(){return this._targetLayers}_isLayered(){return!!this._prevLayers||!!this._targetLayers}_setPrevSrc(e){return this._prevSrc=e,this}_setTargetSrc(e){return this._targetSrc=e,this}_setCurrentSrc(e){return this._currentSrc=e,this}_getPrevSrc(){return this._prevSrc}_getTargetSrc(){return this._targetSrc}_getCurrentSrc(){return this._currentSrc}requestAnimations(e){let t=super.requestAnimations(e);return t.onComplete(()=>{this._setCurrentSrc(this._getTargetSrc())}),t}asPrev(e){return super.asPrev((...t)=>F(e(...t),this._srcToProps(this._prevSrc)))}asTarget(e){return super.asTarget((...t)=>F(e(...t),this._srcToProps(this._targetSrc)))}_srcToProps(e){if(this._isLayered())return{};if(x.isColor(e))return{src:I.DefaultImagePlaceholder,style:{backgroundColor:x.isRGBAColor(e)?x.RGBAColorToHex(e):e}};if(x.isImageSrc(e))return{src:x.srcToURL(e)};throw new de("Image transition src cannot be identified, using: "+e)}};var to=class o extends ue{constructor(t,n,i,r){super();this.prevDarkness=t;this.targetDarkness=n;this.duration=i;this.easing=r}createTask(){return{animations:[{type:0,start:this.prevDarkness,end:this.targetDarkness,duration:this.duration,ease:this.easing}],resolve:[this.asTarget(t=>({style:{filter:`brightness(${1-t})`}})),this.asPrev(()=>({style:{opacity:0},height:0,width:0}))]}}copy(){return new o(this.prevDarkness,this.targetDarkness,this.duration,this.easing)}};var $n=class $n extends j{static resolveTagSrc(e,t){if(!I.isTagSrc(e)||!e.config.src.resolve)throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return I.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(I.isLayeredSrc(e))throw e._mixedSrcError();if(I.isStaticSrc(e))return x.isImageSrc(e.state.currentSrc)?x.srcToURL(e.state.currentSrc):e.state.currentSrc;if(I.isTagSrc(e)&&e.config.src.resolve)return I.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===Je.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new v(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===Je.setSrc){let n=this.contentNode.getContent()[0];if(x.isColor(n)&&!this.callee.config.isBackground)throw new de("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===Je.flush)return super.executeAction(e,t);if(this.type===Je.setAppearance){let[n,i]=this.contentNode.getContent();if(!I.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],c=()=>{this.callee.state.currentSrc=a};if(I.isLayeredSrc(this.callee)){if(e.logger.debug("Image - Set Appearance (layered)",s),i){let u=new v(b=>b).registerSkipController(new H(()=>super.executeAction(e,t)));i._setPrevLayers(I.getSrcURLs(this.callee))._setTargetLayers(I.getSrcURLs(this.callee,s));let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,u.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(u).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},c,[]),u}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),e.stage.update(),super.executeAction(e,t)}let l=this.callee.config.src.resolve;if(!l)throw this.callee._invalidSrcHandlerError();let p=I.getSrcFromTags(s,l);if(e.logger.debug("Image - Set Appearance",s,p),i){let u=new v(b=>b).registerSkipController(new H(()=>super.executeAction(e,t)));i._setPrevSrc($n.resolveCurrentSrc(this.callee))._setTargetSrc(p);let h=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,u.resolve(super.executeAction(e,t))}),f=e.timelines.attachTimeline(u).attachChild(h);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:f},c,[]),u}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},c),e.stage.update(),e.getExposedState(this.callee)?.updateStyleSync(),super.executeAction(e,t)}else if(this.type===Je.setDarkness){let[n,i,r]=this.contentNode.getContent(),s=this.callee.state.darkness,a=()=>{this.callee.state.darkness=s},c=e.getExposedStateForce(this.callee);if(i){let l=new v(h=>h),p=new to(s,n,i,r);if(I.isLayeredSrc(this.callee)){let h=I.getSrcURLs(this.callee);p._setPrevLayers(h)._setTargetLayers(h)}else{let h=$n.resolveCurrentSrc(this.callee);p._setPrevSrc(h)._setTargetSrc(h)}let u=c.applyTransition(p,()=>{this.callee.state.darkness=n,l.resolve(super.executeAction(e,t))}),d=e.timelines.attachTimeline(l).attachChild(u);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:d},()=>{l.isSettled()||l.abort(),u.abort(),a()}),l}return this.callee.state.darkness=n,e.actionHistory.push({action:this,stackModel:t.stackModel},a),c.updateStyleSync(),super.executeAction(e,t)}}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("ImageAction")}};$n.ActionTypes=Je;var re=$n;var Nt=class Nt extends j{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await Nt.initBackgroundMusic(e,r),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t){e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new de("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);t.addElement(r),n.local.getNamespace(t.getStorable()).load(e.local),e.state&&n.fromData(e.state),e.background&&n.background.fromData(e.background)}applyTransition(e,t,n){let i=new v().registerSkipController(new H(()=>(e.logger.info("Background Transition","Skipped"),super.executeAction(e,n))));return e.getExposedStateForce(this.callee.background).applyTransition(t,()=>{i.resolve(super.executeAction(e,n))}),e.timelines.attachTimeline(i),i}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new v(l=>l),c=null;return a.registerSkipController(new H(()=>(c&&(clearTimeout(c),c=null),s))),c=e.setTimeout(()=>{c=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===$.action)return super.executeAction(e,t);if(this.is(Nt,"scene:init")){let n=new v(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{this.exit(e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return Nt.handleSceneInit(this.callee,r,e,v.forward(n,r))}else if(this.type===$.exit){let n=Nt.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new v(s=>s);e.timelines.attachTimeline(r),Nt.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),Nt.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===$.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize();e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let[c]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(a,c)},[r]);let s=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:s}),null}else if(this.type===$.setBackgroundMusic){let[n,i]=this.contentNode.getContent(),r=this.callee,s=e.getExposedStateForce(r),a=r.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{s.setBackgroundMusic(c,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===$.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===$.transitionToScene){let[n,i,r]=this.contentNode.getContent();return n._setPrevSrc(re.resolveCurrentSrc(this.callee.background)),i?n._setTargetSrc(re.resolveCurrentSrc(i.background)):r&&n._setTargetSrc(r),this.applyTransition(e,n,t)}else if(this.type===$.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===$.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=v.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===$.nvlHide){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!1,n,t),s=v.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===$.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===$.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===$.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 de(`Scene with name ${e} not found
|
|
60
60
|
Make sure you have registered the scene using story.register
|
|
61
61
|
Action: (id: ${this.getId()}) ${this.type}
|
|
62
|
-
At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===$.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")}};Nt.ActionTypes=$;var te=Nt;var pr=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)}},ut=class ut{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)||ut.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return ut.isHexString(e)||ut.isNamedColor(e)||ut.isRGBAColor(e)}static isNamedColor(e){return Nr(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(ut.isHexString(e))return e;if(ut.isNamedColor(e))return e;if(ut.isRGBAColor(e))return ut.RGBAColorToHex(e);throw new Error("Unknown color type")}static isHexString(e){return typeof e!="string"?!1:/^#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})$/i.test(e)}static toBackgroundSrc(e){return typeof e=="string"?e:e.src}static isDataURI(e){return e.startsWith("data:")}static offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,c=this.calc(i,s),l=this.calc(r,a),p=n.invertX?{right:c}:{left:c},u=n.invertY?{bottom:l}:{top:l};return{left:"auto",right:"auto",top:"auto",bottom:"auto",...p,...u}}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)}};ut.RGBColor=pr;var x=ut,dr=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},xe=class o extends dr{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},Si=class{constructor(e){this.scene=e}run(e){let t=new Map,n=new Map,i=[],r=new Set,s=this.scene.getAllChildren(e,this.scene.getSceneRoot());if(!s.length)return null;for(i.push(s[0]);i.length;){let a=i.shift();this.checkAction(e,a,{imageStates:t,scenes:n},r);let c=a.contentNode.getChild();c&&c.action&&i.push(c.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof
|
|
62
|
+
At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===$.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")}};Nt.ActionTypes=$;var te=Nt;var pr=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)}},ut=class ut{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)||ut.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return ut.isHexString(e)||ut.isNamedColor(e)||ut.isRGBAColor(e)}static isNamedColor(e){return Nr(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(ut.isHexString(e))return e;if(ut.isNamedColor(e))return e;if(ut.isRGBAColor(e))return ut.RGBAColorToHex(e);throw new Error("Unknown color type")}static isHexString(e){return typeof e!="string"?!1:/^#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})$/i.test(e)}static toBackgroundSrc(e){return typeof e=="string"?e:e.src}static isDataURI(e){return e.startsWith("data:")}static offset(e,t,n={invertX:!1,invertY:!1}){let[i,r]=e,[s,a]=t,c=this.calc(i,s),l=this.calc(r,a),p=n.invertX?{right:c}:{left:c},u=n.invertY?{bottom:l}:{top:l};return{left:"auto",right:"auto",top:"auto",bottom:"auto",...p,...u}}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)}};ut.RGBColor=pr;var x=ut,dr=class o extends Error{static isUseError(e){return e instanceof o}constructor(e,t,n="UseError"){super(e),this.props=t,this.name=n}},xe=class o extends dr{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},Si=class{constructor(e){this.scene=e}run(e){let t=new Map,n=new Map,i=[],r=new Set,s=this.scene.getAllChildren(e,this.scene.getSceneRoot());if(!s.length)return null;for(i.push(s[0]);i.length;){let a=i.shift();this.checkAction(e,a,{imageStates:t,scenes:n},r);let c=a.contentNode.getChild();c&&c.action&&i.push(c.action)}return t}checkAction(e,t,{imageStates:n,scenes:i},r){if(t instanceof re)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof te){let s=t.callee;if(i.has(s.config.name)){if(i.get(s.config.name)!==s){let a=`Scene with name: ${s.config.name} is duplicated
|
|
63
63
|
Scene: ${s.config.name}
|
|
64
64
|
|
|
65
65
|
At: ${t.__stack}`;throw new xe(a)}}else i.set(s.config.name,s);if(t.type===$.jumpTo){let a=t.contentNode.getContent()[0],c=e.getScene(a,!0);if(r.has(c))return;r.add(c)}}}checkImage(e,t){if(t.type===Je.setSrc){let i=t.contentNode.getContent()[0];x.isImageURL(i)&&x.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},de=class o extends Error{static toMessage(e,t){let n=[];return n.push(...Array.isArray(e)?e:[e]),t&&n.push(...Array.isArray(t)?t.map(o.getActionTrace):[o.getActionTrace(t)]),n.join("")}static getActionTrace(e){return`
|
|
66
66
|
Using action (id: ${e.getId()})
|
|
67
|
-
at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},
|
|
67
|
+
at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},E=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},Fe=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function nu(o,e){return q.color(o,e)}function iu(o){return q.bold(o)}function ou(o){return q.italic(o)}var mr=class o extends ue{constructor(t,n){super();this.duration=t;this.easing=n}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:{opacity:1-t}})),this.asTarget(t=>({style:{opacity:t}}))]}}copy(){return new o(this.duration,this.easing)}};var fr=class o extends ue{constructor(t,n=[0,0],i){super();this.duration=t;this.startPos=n;this.easing=i}createTask(t){let{invertX:n,invertY:i}=t.getStory().getInversionConfig();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing},{type:0,start:this.startPos[0],end:0,duration:this.duration,ease:this.easing},{type:0,start:this.startPos[1],end:0,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({})),this.asTarget((r,s,a)=>({style:{opacity:r,translate:`${n?-s:s}px ${i?-a:a}px`}}))]}}copy(){return new o(this.duration,this.startPos,this.easing)}};var hr=class o extends ue{constructor(t,n,i){super();this.duration=t;this.easing=n;this.clipPathResolver=i}static circle(t){let{duration:n,easing:i,center:r="50% 50%",from:s=0,to:a=150}=t;return new o(n,i,c=>o.circleClipPath(o.lerp(s,a,c),r))}static wipe(t){let{duration:n,easing:i,direction:r="left",reverse:s=!1}=t,a=s?0:100,c=s?100:0;return new o(n,i,l=>o.wipeClipPath(r,o.lerp(a,c,l)))}createTask(){return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(()=>({style:{opacity:1,clipPath:"none"}})),this.asTarget(t=>({style:{opacity:1,clipPath:this.clipPathResolver(t)}}))]}}copy(){return new o(this.duration,this.easing,this.clipPathResolver)}static lerp(t,n,i){return t+(n-t)*i}static circleClipPath(t,n){return`circle(${o.formatNumber(t)}% at ${n})`}static wipeClipPath(t,n){let i=o.formatNumber(n);switch(t){case"right":return`inset(0 0 0 ${i}%)`;case"top":return`inset(0 0 ${i}% 0)`;case"bottom":return`inset(${i}% 0 0 0)`;case"left":default:return`inset(0 ${i}% 0 0)`}}static formatNumber(t){return Number.isInteger(t)?String(t):t.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}};function We(o){return o<0?0:o>1?1:o}function Vt(o){return{maskImage:o,WebkitMaskImage:o,maskSize:"100% 100%",WebkitMaskSize:"100% 100%",maskRepeat:"no-repeat",WebkitMaskRepeat:"no-repeat"}}function gr(o){return{position:"absolute",top:"50%",left:"50%",width:"100%",height:"100%",transform:"translate(-50%, -50%)",backgroundColor:o}}function ru(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 su(o){return o==="vertical"?"to right":"to bottom"}function no(o,e,t){let n=Math.max(0,e),i=-n+We(t)*(100+n);return`linear-gradient(${ru(o)}, #000 ${i}%, transparent ${i+n}%)`}function io(o,e,t){let n=100/Math.max(1,e),i=We(t)*n;return`repeating-linear-gradient(${su(o)}, #000 0, #000 ${i}%, transparent ${i}%, transparent ${n}%)`}function da(o,e,t){let n=Math.max(0,e),i=(1-We(t))*150;return`radial-gradient(circle at ${o}, transparent ${i-n}%, #000 ${i}%)`}function ma(o,e,t){let n=Math.max(0,e),i=We(t)*150;return`radial-gradient(circle at ${o}, #000 ${i-n}%, transparent ${i}%)`}var yr=class o extends ue{constructor(e){super(),this.duration=e.duration,this.direction=e.direction??"left",this.feather=e.feather??12,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:Vt(no(this.direction,this.feather,e))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,feather:this.feather,easing:this.easing})}};var vr=class o extends ue{constructor(e){super(),this.duration=e.duration,this.orientation=e.orientation??"horizontal",this.slats=e.slats??8,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:Vt(io(this.orientation,this.slats,e))}))]}}copy(){return new o({duration:this.duration,orientation:this.orientation,slats:this.slats,easing:this.easing})}};var Sr=class o extends ue{constructor(e){super(),this.duration=e.duration,this.center=e.center??"50% 50%",this.feather=e.feather??12,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:Vt(ma(this.center,this.feather,e))}))]}}copy(){return new o({duration:this.duration,center:this.center,feather:this.feather,easing:this.easing})}};var Tr=class o extends ue{constructor(e){super(),this.duration=e.duration,this.blur=e.blur??16,this.easing=e.easing}createTask(){let e=Math.max(0,this.blur);return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:{opacity:1-We(t),filter:`blur(${e*We(t)}px)`}})),this.asTarget(t=>({style:{opacity:We(t),filter:`blur(${e*(1-We(t))}px)`}}))]}}copy(){return new o({duration:this.duration,blur:this.blur,easing:this.easing})}};var br=class o extends ue{constructor(e){super(),this.duration=e.duration,this.direction=e.direction??"left",this.easing=e.easing}axisUnit(){switch(this.direction){case"right":return{axis:"x",unit:"vw",sign:1};case"top":return{axis:"y",unit:"vh",sign:-1};case"bottom":return{axis:"y",unit:"vh",sign:1};case"left":default:return{axis:"x",unit:"vw",sign:-1}}}translate(e){let{axis:t,unit:n}=this.axisUnit(),i=`${e}${n}`;return{translate:t==="x"?`${i} 0px`:`0px ${i}`}}createTask(){let{sign:e}=this.axisUnit();return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(t=>({style:this.translate(e*100*We(t))})),this.asTarget(t=>({style:this.translate(-e*100*(1-We(t)))}))]}}copy(){return new o({duration:this.duration,direction:this.direction,easing:this.easing})}};var Cr=class o extends ue{constructor(t,n,i,r,s){super();this.duration=t;this.color=n;this.hold=i;this.coverMask=r;this.easing=s}static fade(t){return new o(t.duration,t.color??"#000000",t.hold??.3,null,t.easing)}static wipe(t){let n=t.direction??"left",i=t.feather??12;return new o(t.duration,t.color??"#000000",t.hold??.3,r=>no(n,i,r),t.easing)}static blinds(t){let n=t.orientation??"horizontal",i=t.slats??8;return new o(t.duration,t.color??"#000000",t.hold??.3,r=>io(n,i,r),t.easing)}static iris(t){let n=t.center??"50% 50%",i=t.feather??12;return new o(t.duration,t.color??"#000000",t.hold??.3,r=>da(n,i,r),t.easing)}coverStyle(t){return this.coverMask?{...gr(this.color),opacity:1,...Vt(this.coverMask(t))}:{...gr(this.color),opacity:We(t)}}createTask(){let n=(1-We(this.hold))/2,i=1-n,r=.5,s=a=>a<=n?n<=0?1:a/n:a>=i?i>=1?1:(1-a)/(1-i):1;return{animations:[{type:0,start:0,end:1,duration:this.duration,ease:this.easing}],resolve:[this.asPrev(a=>({style:{opacity:a<r?1:0}})),this.asTarget(a=>({style:{opacity:a<r?0:1}})),a=>({src:I.DefaultImagePlaceholder,style:this.coverStyle(s(a))})]}}copy(){return new o(this.duration,this.color,this.hold,this.coverMask,this.easing)}};var Ar=class extends Ln{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 O(()=>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 oo=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=Ee.isChained(e)?e.getActions():e;return Le.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}static registerDisplayable(e,t,n=null,i=null){e.findElementByDisplayable(t)||(e.createDisplayable(t,n,i),e.flush())}static setElementId(e,t){e.setId(t)}static getDisplayableTransformProps(e){return{...e.transformState.get()}}static setDisplayableTransformProps(e,t,n,i={}){let r=t.transformState;i.merge===!1?r.forceOverwrite(n):r.assign(Symbol("DevTools.setDisplayableTransformProps"),n),e.getExposedState(t)?.updateStyleSync?.(),e.flush()}static getCurrentDialog(e){if(e.isNvlMode()){let n=e.getNvlState();if(!n.activeDialogId||n.phase==="idle")return null;let i=e.getNvlDialog(n.activeDialogId);return i?{actionId:i.actionId||null,ended:n.phase==="awaitAdvance",mode:"nvl"}:null}let t=e.getAdvDialogState();return t?{actionId:t.actionId,ended:t.ended,mode:"adv"}:null}static onDialogStateChange(e,t){let n=[e.events.on(P.EventTypes["event:state.dialog.change"],t),e.events.on(P.EventTypes["event:state.nvl.change"],t)];return{cancel:()=>{for(let i of n)i.cancel()}}}};oo.DynamicPersistent=ln;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */
|
|
68
68
|
@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-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}}}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.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}.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{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}.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}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.__narraleaf_content-player *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.__narraleaf_content-player img{pointer-events:none;-webkit-user-drag:none;-webkit-user-select:none}.__narraleaf_content-player .pointer-disabled{pointer-events:none}.__narraleaf_content-player .pointer-disabled>:not(.pointer-disabled){pointer-events:auto}.__narraleaf_content-player img:before,.__narraleaf_content-player img:after{content:none!important;border:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.bg-cover{background-size:cover}.bg-center{background-position:50%}.pointer-events-auto-rest *{pointer-events:auto}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-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}
|
|
69
|
-
`,document.head.appendChild(o)}export{zt as Align,Io as Avatar,vr as Blinds,Tr as BlurDissolve,pi as Character,nt as CommonPosition,An as CommonPositionType,mo as Condition,Le as Control,_e as Coord2D,Wo as DefaultNvlContainer,Ms as DefaultNvlDialogItem,oo as DevTools,ll as Dialog,mr as Dissolve,
|
|
69
|
+
`,document.head.appendChild(o)}export{zt as Align,Io as Avatar,vr as Blinds,Tr as BlurDissolve,pi as Character,nt as CommonPosition,An as CommonPositionType,mo as Condition,Le as Control,_e as Coord2D,Wo as DefaultNvlContainer,Ms as DefaultNvlDialogItem,oo as DevTools,ll as Dialog,mr as Dissolve,Xl as ExposedStateType,fr as FadeIn,Ds as FixedAspectRatioContainer,Ar as Gallery,Z as Game,wi as GameMenu,aa as GameProviders,P as GameState,I as Image,ue as ImageTransition,vt as Isolated,Mi as Item,mn as KeyBindingType,Bn as KeyMap,O as Lambda,pn as Layer,Hc as Layout,On as LayoutRouterProvider,ht as LiveGame,hr as MaskTransition,fo as Menu,En as NVLToken,dt as Namespace,It as Nametag,Pt as Narrator,Hi as Notifications,Vo as NvlContainer,al as NvlDialogList,Oo as NvlProvider,Vc as Page,Mo as PageInjectContext,Ie as Pause,cn as Persistent,sa as Player,Rn as Preference,br as Push,is as RootPath,et as Scene,Se as Script,le as Sentence,Ln as Service,Sr as SoftIris,yr as SoftWipe,me as Sound,Mt as SoundType,za as Stage,xn as Storable,Dn as Story,$t as Text,wn as TextTransition,uc as Texts,ac as TextsPreview,Cr as ThroughColor,J as Transform,ft as Transition,yo as Video,q as Word,iu as b,nu as c,ou as i,bs as useAvatar,Cc as useDialog,D as useGame,tl as useIsNvlMode,nl as useIsNvlVisible,Yt as useKeyBinding,Xc as useLiveGame,St as useNvl,Fo as useNvlDialogs,Lc as useParams,Dc as usePathname,at as usePreference,Ic as useQueryParams,yt as useRouter,Do as useUIMenuContext,wc as useVoiceState};
|