narraleaf-react 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/game/nlcore/game.d.ts +60 -0
- package/dist/game/nlcore/gameTypes.d.ts +1 -36
- package/dist/game/player/elements/Player.d.ts +1 -1
- package/dist/game/player/elements/menu/UIMenu/Item.d.ts +3 -2
- package/dist/game/player/elements/say/Nametag.d.ts +6 -3
- package/dist/game/player/elements/say/Sentence.d.ts +9 -15
- package/dist/game/player/elements/type.d.ts +21 -2
- package/dist/game/player/gameState.d.ts +2 -0
- package/dist/game/player/lib/Preloaded.d.ts +1 -0
- package/dist/game/player/libElements.d.ts +3 -1
- package/dist/main.js +41 -41
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
var
|
|
1
|
+
var ke={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",init:"displayable:init"},Jt={say:"character:say",action:"character:action",setName:"character:setName"},z={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 Xe={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},ar={action:"condition:action"},cr={action:"script:action"},lr={action:"menu:action"},At={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"},qn={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},yn={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},Kt={action:"layer:action",setZIndex:"layer:setZIndex"},Zt={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 ur=(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))(ur||{}),_i=(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});_i.DataTypes=ur;function H(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,c)=>_i(a)===3&&_i(c)===3?a.constructor!==Object||c.constructor!==Object?c||a:H(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]=H({},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 H(i,s,...a)}return i}var Ge=class Ge{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=eo()}static isAwaitable(e){return e instanceof Ge}static fromPromise(e){let t=new Ge;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new Ge;return t.resolve(e),t}static delay(e){let t=new Ge;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new Ge;return e(t),t}static wait(e){let t=new Ge;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new Ge;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 G(()=>{e.forEach(n=>n.skipController?.abort())})),t)}static forward(e,t,n){let i=new Ge().registerSkipController(n||new G(()=>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 Ge;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 G(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new Ge;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 G(()=>{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>=Ge.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>=Ge.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()}}};Ge.nothing=e=>e,Ge.maxListeners=8;var v=Ge;function pr(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 en(o){return typeof o=="string"?o:`#${(o.r||0).toString(16).padStart(2,"0")}${(o.g||0).toString(16).padStart(2,"0")}${(o.b||0).toString(16).padStart(2,"0")}${o.a===void 0?"":o.a.toString(16).padStart(2,"0")}`}var Q=class{constructor(){this.events={};this.maxListeners=10}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),this.events[e].length>this.maxListeners&&console.warn(`NarraLeaf-React: Event ${e} has more than ${this.maxListeners} listeners (total: ${this.events[e].length}), this may cause performance issues.`),this.emit("event:EventDispatcher.register",e,t),{type:e,listener:t,cancel:()=>{this.off(e,t)}}}depends(e){return{cancel:()=>{e.forEach(t=>t.cancel())}}}off(e,t){this.events[e]&&(this.events[e]=this.events[e].filter(n=>n!==t))}emit(e,...t){if(!this.events[e])return 0;let n=this.events[e].length;return this.events[e].forEach(i=>{i(...t)}),n}once(e,t){let n=(...i)=>{t(...i),this.off(e,n)};return this.on(e,n)}async any(e,...t){if(this.events[e]||(this.events[e]=[]),this.events[e].length>0){await Promise.all(this.events[e].map(n=>n(...t)));return}return new Promise(n=>{let i="event:EventDispatcher.register",r=this.on(i,(s,a)=>{if(s===e){this.off(i,r);let 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 eo(o=1){let e=new Error().stack;return e?e.split(`
|
|
2
2
|
`).slice(o+1).join(`
|
|
3
|
-
`).trim():""}function _n(o){return new Promise(e=>setTimeout(e,o))}var Zn=class Zn{constructor(e){this.abortHandler=e;this.events=new J;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(Zn.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};Zn.EventTypes={"event:skipController.abort":"event:skipController.abort"};var G=Zn;var vn=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}},_t=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new vn;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 ei(o,e,t={}){return o?e:t}function ur(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var qn=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 pr(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 dr(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 Sn=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 _n(this.delay),await e()};await e()}};function We(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function mr(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var He=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 fr(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 hr(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function _i(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function eo(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"&&!eo(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Qn=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 yr(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Xn=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},Yn=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 Jn=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 vr(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 Sr(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 Tn=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=Zi(),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]:[]}};Tn.ActionTypes={action:"action"};var O=class extends Tn{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 y(i=>i);return(async()=>await e(n.resolve.bind(n),n))(),n}is(e,t){return this instanceof e&&this.type===t}stringify(e,t,n){return this.stringifyWithName("Action")}stringifyWithName(e){return`${e}#${this._id}(${this.type})`}stringifyWithContent(e,t){return`${e}#${this._id}(${this.type}){${t}}`}};var to=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},b=class o extends to{static create(e){return new o().setContent(e)}static forEachParent(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getParent()}static forEachChild(e,t){let n=new Set,i=e;for(;i&&!n.has(i);)n.add(i),t(i),i=i.getChild()}constructor(e,t,n){super("ContentNode"),this.child=n||null,this.parent=t||null,this.action=e||null}setParent(e){if(e===this)throw new Error("Cannot set parent to itself");return this.parent&&this.parent.setChild(null),this.parent=e,this}setChild(e){if(e===this)throw new Error("Cannot set child to itself");return this.child&&(this.child.parent=null),this.child=e,e&&e.parent!==this&&(e.remove(),e.parent=this),this}getChild(){return this.child||null}getParent(){return this.parent||null}addChild(e){return this.setChild(e),this}removeChild(e){return e&&this.child===e?(this.child=null,e.setParent(null)):e||(this.child=null),this}remove(){return this.parent&&this.parent.removeChild(this),this.child&&this.child.setParent(null),this}hasChild(){return!!this.child}};var ti={center:"center",left:"left",right:"right"};import{animate as Js}from"motion/react";var bn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(bn||{}),Tr={left:"33.33%",center:"50%",right:"66.66%"},je=class je{static isUnknown(e){return e===je.Unknown}static D2PositionToCSS(e,t=!1,n=!1){let i=this.calc(e.y,e.yoffset),r=this.calc(e.x,e.xoffset),s=n?{bottom:i}:{top:i},a=t?{right:r}:{left:r};return this.wrap({...s,...a})}static calc(e,t){return!e||je.isUnknown(e)?"auto":t===void 0||je.isUnknown(t)?`calc(${e} + 0px)`:`calc(${typeof e=="number"?`${e}px`:e} + ${t}px)`}static toCoord2D(e){if(qe.isCommonPositionType(e))return Ue.fromCommonPosition(e);if(Ue.isCoord2DPosition(e))return e;if(Ft.isAlignPosition(e))return Ue.fromAlignPosition(e);if(typeof e=="object"&&["x","y","xoffset","yoffset"].some(t=>t in e)){let t=e;return new Ue(t)}else throw new Error("Invalid position type")}static orUnknown(e){return je.isUnknown(e)||e===void 0?je.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return Ue.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:je.isUnknown(t.x)?0:t.x,y:je.isUnknown(t.y)?0:t.y,xoffset:je.isUnknown(t.xoffset)?0:t.xoffset,yoffset:je.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(bn).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"&&("xalign"in e||"yalign"in e||"xoffset"in e||"yoffset"in e)}static isRawPosition(e){return this.isRawCommonPositionType(e)||this.isRawCoord2DPosition(e)||this.isRawAlignPosition(e)}static isPosition(e){return e instanceof qe||e instanceof Ue||e instanceof Ft}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return Ue.fromCommonPosition(new qe(e));if(this.isRawCoord2DPosition(e))return new Ue(e);if(this.isRawAlignPosition(e))return Ue.fromAlignPosition(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}}};je.Unknown=Symbol("Unknown");var D=je,ni=class ni{static isCommonPositionType(e){return e instanceof ni}constructor(e){this.position=e}toCSS(){return{x:Tr[this.position],y:"50%",xoffset:0,yoffset:0}}};ni.Positions=bn;var qe=ni,Ue=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:Tr[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||D.isUnknown(n)?D.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:D.isUnknown(t.x)?e.x:t.x,y:D.isUnknown(t.y)?e.y:t.y,xoffset:D.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:D.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=D.orUnknown(e.x),this.y=D.orUnknown(e.y),this.xoffset=D.orUnknown(e.xoffset),this.yoffset=D.orUnknown(e.yoffset)):(this.x=D.orUnknown(e),this.y=D.orUnknown(t),this.xoffset=D.Unknown,this.yoffset=D.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}}},Ft=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=D.orUnknown(e.xalign),this.yalign=D.orUnknown(e.yalign),this.xoffset=D.orUnknown(e.xoffset),this.yoffset=D.orUnknown(e.yoffset)):(this.xalign=D.orUnknown(e),this.yalign=D.orUnknown(t),this.xoffset=D.Unknown,this.yoffset=D.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:D.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:D.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var j=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new no(this.mergeWithDefaultConfig(e))}copy(){return new o(H({},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)?H({},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}},no=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(H({},this.config))}join(e){let t=mr(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 Zs={[ti.left]:"25.33%",[ti.center]:"50%",[ti.right]:"75.66%"},Je=class Je{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new Je(Je.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?D.toCoord2D(D.tryParsePosition(e||t)):D.mergePosition(D.tryParsePosition(e),D.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=Je.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 _i(q.constructStyle(e,this.state,t))}toStyle(e,t){return _i(q.constructStyle(e,this.state,t))}serialize(){return Je.TransformStateSerializer.serialize(this.state)}clone(){return new Je(Je.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=Je.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}};Je.DefaultTransformState=new j({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new qe("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}),Je.TransformStateSerializer=new He({position:e=>D.serializePosition(D.tryParsePosition(e))},{position:e=>D.toCoord2D(e)});var me=Je,de=class de{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},de.defaultConfig,t||{});else{let[n,i]=[e,t||de.defaultOptions];this.sequences.push({props:n,options:i||de.defaultOptions}),this.config=Object.assign({},de.defaultConfig)}}static isPosition(e){return qe.isCommonPositionType(e)||Ue.isCoord2DPosition(e)||Ft.isAlignPosition(e)}static immediate(e){return new de(e,{duration:0,ease:"linear"})}static left(e,t){return new de({position:qe.Positions.Left},{duration:e,ease:t})}static right(e,t){return new de({position:qe.Positions.Right},{duration:e,ease:t})}static center(e,t){return new de({position:qe.Positions.Center},{duration:e,ease:t})}static create(e){return new de([],e)}static positionToCSS(e,t,n){return e?D.isRawPosition(e)?D.D2PositionToCSS(D.rawPositionToCoord2D(e),n,t):D.D2PositionToCSS(e.toCSS(),n,t):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?D.toCoord2D(D.tryParsePosition(e||t)):D.mergePosition(D.tryParsePosition(e),D.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...H(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,m){return typeof d>"u"?typeof m<"u"?h(m):"":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||{};return{...de.positionToCSS(t.position,i,r),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?Ye(t.fontColor):void 0,transform:de.propToCSSTransform(e,t),...de.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=Js(s,a),u=()=>{e.overwrite(l,r.get()).unlock(l),p.complete(),c=!0},d=new y().registerSkipController(new G(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,(m=>{t.logger.error("Failed to animate transform. "+(m?.toString?.()||""))})),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{...de.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 de(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 ce("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 ce("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};de.defaultConfig={sync:!0},de.defaultOptions={duration:0,ease:"linear"},de.CommonImagePositionMap=Zs;var q=de;var ii=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 br=Symbol("_Chained"),Ar;Ar=br;var io=class io{constructor(e){this[Ar]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[br]}static toActions(e){return e.flat(2).map(t=>io.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()}},Ae=io,en=class extends ii{chain(e){let t=Ae.isChained(this)?this:this.proxy(this,new Ae(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 te=class extends en{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var rt=class extends O{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)}}`:""}`)}};rt.ActionTypes=rr;var st=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=H({},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=H({},this.defaultContent),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content=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)}},
|
|
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].load(n):this.namespaces[t]=new
|
|
6
|
-
To prevent unintended behavior, the sound marked as bgm cannot be played using \`play()\`.`);return this.pushAction(Fe.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(Fe.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(Fe.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(Fe.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(Fe.ActionTypes.setRate,[e])}pause(e){return this.pushAction(Fe.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(Fe.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}getSrc(){return this.config.src}toData(){return{state:le.StateSerializer.serialize(this.state)}}fromData(e){return this.state=le.StateSerializer.deserialize(e.state),this}copy(){return new le(this.userConfig.get())}reset(){return this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return le.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new Fe(this.chain(),e,new b().setContent(t)))}};le.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",le.DefaultUserConfig=new j({src:le.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,type:"sound"}),le.DefaultConfig=new j({src:le.noSound,loop:!1,streaming:!1,seek:0,type:"sound"}),le.DefaultState=new j({volume:1,rate:1,paused:!1,muted:!1}),le.StateSerializer=new He;var re=le;var Lu={};var tn=class extends en{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 Kt=class Kt{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===Kt.SrcTypes.image?t.add(s):r===Kt.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 U?U.getSrcURL(e):e.type==="image"?U.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(Y,V.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(A.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof ne){let n=t;if(t.is(ne,Oe.setSrc)){let i=t.contentNode.getContent()[0];if(A.isImageSrc(i))return{type:"image",src:A.srcToURL(i),activeType:"scene"}}else{if(t.type===Oe.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===Oe.setAppearance){let i=t.contentNode.getContent()[0];if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(U.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:U.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 re){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof U||A.isStaticImageData(e)){if(e instanceof U){if(!A.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(U.getSrcURL(e)))return this}else if(this.isSrcRegistered(A.srcToURL(e.src)))return this;this.src.push({type:"image",src:A.isStaticImageData(e)?A.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 re?t:new re({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 re?e.getSrc():e;return this.src.some(n=>n.type===Kt.SrcTypes.audio?t===n.src.getSrc():n.type===Kt.SrcTypes.image?t===U.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)}};Kt.SrcTypes={image:"image",video:"video",audio:"audio"};var De=Kt;var Pt=class extends O{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===jn.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===jn.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")}};Pt.ActionTypes=jn;var Ce=class extends O{executeAction(e,t){if(this.type===be.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===be.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===be.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 y().registerSkipController(new G(()=>(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 y().registerSkipController(new G(()=>(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 y().registerSkipController(new G(()=>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")}};Ce.ActionTypes=be;var at=class o extends te{constructor(){super(...arguments);this.srcManager=new De}pos(t,n,i){return this.transform(new q({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new q({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new q({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new q({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new q({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 q({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new q({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new q(t,n))}mask(t,n={}){let i=A.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 xe,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 xe,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 xe,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 Ce(n,be.applyTransform,new b().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 q(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 q?t.copy():new q({opacity:1},t),r=new Ce(n,be.applyTransform,new b().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof q?t.copy():new q({opacity:0},t),r=new Ce(n,be.applyTransform,new b().setContent([i]));return n.chain(r)}};var Et=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(Et||{});import{animate as _s}from"motion/react";var ct=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(m=>m(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 _s(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};ct.AnimationType=Et;var Cn=class extends ct{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new x(`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
|
|
3
|
+
`).trim():""}function ei(o){return new Promise(e=>setTimeout(e,o))}var _n=class _n{constructor(e){this.abortHandler=e;this.events=new Q;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(_n.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};_n.EventTypes={"event:skipController.abort":"event:skipController.abort"};var G=_n;var vn=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}},_t=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new vn;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 ti(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 Qn=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 mr(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 fr(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 Sn=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 ei(this.delay),await e()};await e()}};function Be(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function hr(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var ze=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 gr(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 yr(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function to(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function no(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"&&!no(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var Xn=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function vr(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 Sr(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Yn=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},Jn=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 Zn=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 Tr(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 br(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 Tn=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=eo(),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]:[]}};Tn.ActionTypes={action:"action"};var B=class extends Tn{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 io=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},b=class o extends io{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 ni={center:"center",left:"left",right:"right"};import{animate as ia}from"motion/react";var bn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(bn||{}),Cr={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){let i=this.calc(e.y,e.yoffset),r=this.calc(e.x,e.xoffset),s=n?{bottom:i}:{top:i},a=t?{right:r}:{left:r};return this.wrap({...s,...a})}static calc(e,t){return!e||Ze.isUnknown(e)?"auto":t===void 0||Ze.isUnknown(t)?`calc(${e} + 0px)`:`calc(${typeof e=="number"?`${e}px`:e} + ${t}px)`}static toCoord2D(e){if(_e.isCommonPositionType(e))return $e.fromCommonPosition(e);if($e.isCoord2DPosition(e))return e;if(Vt.isAlignPosition(e))return $e.fromAlignPosition(e);if(typeof e=="object"&&["x","y","xoffset","yoffset"].some(t=>t in e)){let t=e;return new $e(t)}else 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(bn).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"&&("xalign"in e||"yalign"in e||"xoffset"in e||"yoffset"in e)}static isRawPosition(e){return this.isRawCommonPositionType(e)||this.isRawCoord2DPosition(e)||this.isRawAlignPosition(e)}static isPosition(e){return e instanceof _e||e instanceof $e||e instanceof Vt}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return $e.fromCommonPosition(new _e(e));if(this.isRawCoord2DPosition(e))return new $e(e);if(this.isRawAlignPosition(e))return $e.fromAlignPosition(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 D=Ze,ii=class ii{static isCommonPositionType(e){return e instanceof ii}constructor(e){this.position=e}toCSS(){return{x:Cr[this.position],y:"50%",xoffset:0,yoffset:0}}};ii.Positions=bn;var _e=ii,$e=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:Cr[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||D.isUnknown(n)?D.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:D.isUnknown(t.x)?e.x:t.x,y:D.isUnknown(t.y)?e.y:t.y,xoffset:D.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:D.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=D.orUnknown(e.x),this.y=D.orUnknown(e.y),this.xoffset=D.orUnknown(e.xoffset),this.yoffset=D.orUnknown(e.yoffset)):(this.x=D.orUnknown(e),this.y=D.orUnknown(t),this.xoffset=D.Unknown,this.yoffset=D.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}}},Vt=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=D.orUnknown(e.xalign),this.yalign=D.orUnknown(e.yalign),this.xoffset=D.orUnknown(e.xoffset),this.yoffset=D.orUnknown(e.yoffset)):(this.xalign=D.orUnknown(e),this.yalign=D.orUnknown(t),this.xoffset=D.Unknown,this.yoffset=D.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:D.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:D.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var X=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new oo(this.mergeWithDefaultConfig(e))}copy(){return new o(H({},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)?H({},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}},oo=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(H({},this.config))}join(e){let t=hr(this.config,Object.keys(e));return new o(Object.assign(t,e instanceof o?e.get():e))}extract(e){let t={},n={};for(let i of e)t[i]=this.config[i];for(let i in this.config)e.includes(i)||(n[i]=this.config[i]);return[new o(t),new o(n)]}assign(e){return new o(Object.assign({},this.config,e))}};var oa={[ni.left]:"25.33%",[ni.center]:"50%",[ni.right]:"75.66%"},nt=class nt{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new nt(nt.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?D.toCoord2D(D.tryParsePosition(e||t)):D.mergePosition(D.tryParsePosition(e),D.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=nt.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 to(Y.constructStyle(e,this.state,t))}toStyle(e,t){return to(Y.constructStyle(e,this.state,t))}serialize(){return nt.TransformStateSerializer.serialize(this.state)}clone(){return new nt(nt.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=nt.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}};nt.DefaultTransformState=new X({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new _e("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}),nt.TransformStateSerializer=new ze({position:e=>D.serializePosition(D.tryParsePosition(e))},{position:e=>D.toCoord2D(e)});var Te=nt,Se=class Se{constructor(e,t){this.sequences=[];this.stagedChanges=[];if(Array.isArray(e))this.sequences.push(...e),this.config=Object.assign({},Se.defaultConfig,t||{});else{let[n,i]=[e,t||Se.defaultOptions];this.sequences.push({props:n,options:i||Se.defaultOptions}),this.config=Object.assign({},Se.defaultConfig)}}static isPosition(e){return _e.isCommonPositionType(e)||$e.isCoord2DPosition(e)||Vt.isAlignPosition(e)}static immediate(e){return new Se(e,{duration:0,ease:"linear"})}static left(e,t){return new Se({position:_e.Positions.Left},{duration:e,ease:t})}static right(e,t){return new Se({position:_e.Positions.Right},{duration:e,ease:t})}static center(e,t){return new Se({position:_e.Positions.Center},{duration:e,ease:t})}static create(e){return new Se([],e)}static positionToCSS(e,t,n){return e?D.isRawPosition(e)?D.D2PositionToCSS(D.rawPositionToCoord2D(e),n,t):D.D2PositionToCSS(e.toCSS(),n,t):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?D.toCoord2D(D.tryParsePosition(e||t)):D.mergePosition(D.tryParsePosition(e),D.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...H(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,g,f){return typeof d>"u"?typeof f<"u"?g(f):"":g(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||{};return{...Se.positionToCSS(t.position,i,r),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?en(t.fontColor):void 0,transform:Se.propToCSSTransform(e,t),...Se.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=ia(s,a),u=()=>{e.overwrite(l,r.get()).unlock(l),p.complete(),c=!0},d=new v().registerSkipController(new G(u)),g=()=>{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(g,(f=>{t.logger.error("Failed to animate transform. "+(f?.toString?.()||""))})),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{...Se.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 Se(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 me("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 me("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};Se.defaultConfig={sync:!0},Se.defaultOptions={duration:0,ease:"linear"},Se.CommonImagePositionMap=oa;var Y=Se;var oi=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 Ar=Symbol("_Chained"),xr;xr=Ar;var ro=class ro{constructor(e){this[xr]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[Ar]}static toActions(e){return e.flat(2).map(t=>ro.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()}},Pe=ro,tn=class extends oi{chain(e){let t=Pe.isChained(this)?this:this.proxy(this,new Pe(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 tn{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var lt=class extends B{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)}}`:""}`)}};lt.ActionTypes=ar;var ut=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=H({},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=H({},this.defaultContent),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content=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)}},Cn=class{constructor(){this.namespaces={}}static createNamespace(e,t,n){return new ut(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 w(`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].load(n):this.namespaces[t]=new ut(t,n)})}clear(){return this.namespaces={},this}};var je=class extends B{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===At.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===At.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===At.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===At.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===At.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===At.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===At.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")}};je.ActionTypes=At;var It=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(It||{}),fe=class fe extends re{static toSound(e){return e==null?null:typeof e=="string"?new fe({src:e}):e}static isSound(e){return e instanceof fe}static voice(e){let t=typeof e=="string"?{src:e}:e;return new fe({...t,type:"voice"})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new fe({...t,type:"bgm"})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new fe({...t,type:"sound"})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=fe.DefaultUserConfig.create(t),[i]=n.extract(fe.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){if(this.config.type==="bgm")throw new xe(`Sound (src: ${this.config.src}) is marked as bgm, but it is being played as a normal sound.
|
|
6
|
+
To prevent unintended behavior, the sound marked as bgm cannot be played using \`play()\`.`);return this.pushAction(je.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(je.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(je.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(je.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(je.ActionTypes.setRate,[e])}pause(e){return this.pushAction(je.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(je.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}getSrc(){return this.config.src}toData(){return{state:fe.StateSerializer.serialize(this.state)}}fromData(e){return this.state=fe.StateSerializer.deserialize(e.state),this}copy(){return new fe(this.userConfig.get())}reset(){return this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return fe.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new je(this.chain(),e,new b().setContent(t)))}};fe.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",fe.DefaultUserConfig=new X({src:fe.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,type:"sound"}),fe.DefaultConfig=new X({src:fe.noSound,loop:!1,streaming:!1,seek:0,type:"sound"}),fe.DefaultState=new X({volume:1,rate:1,paused:!1,muted:!1}),fe.StateSerializer=new ze;var ue=fe;var Hu={};var nn=class extends tn{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 Ot=class Ot{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===Ot.SrcTypes.image?t.add(s):r===Ot.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 U?U.getSrcURL(e):e.type==="image"?U.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(_,z.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(C.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,Xe.setSrc)){let i=t.contentNode.getContent()[0];if(C.isImageSrc(i))return{type:"image",src:C.srcToURL(i),activeType:"scene"}}else{if(t.type===Xe.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===Xe.setAppearance){let i=t.contentNode.getContent()[0];if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(U.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:U.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 ue){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof U||C.isStaticImageData(e)){if(e instanceof U){if(!C.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(U.getSrcURL(e)))return this}else if(this.isSrcRegistered(C.srcToURL(e.src)))return this;this.src.push({type:"image",src:C.isStaticImageData(e)?C.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 ue?t:new ue({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 ue?e.getSrc():e;return this.src.some(n=>n.type===Ot.SrcTypes.audio?t===n.src.getSrc():n.type===Ot.SrcTypes.image?t===U.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)}};Ot.SrcTypes={image:"image",video:"video",audio:"audio"};var He=Ot;var Rt=class extends B{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===qn.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===qn.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")}};Rt.ActionTypes=qn;var Ee=class extends B{executeAction(e,t){if(this.type===ke.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===ke.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===ke.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 G(()=>(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 G(()=>(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 G(()=>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")}};Ee.ActionTypes=ke;var pt=class o extends re{constructor(){super(...arguments);this.srcManager=new He}pos(t,n,i){return this.transform(new Y({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new Y({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new Y({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new Y({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new Y({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 Y({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new Y({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new Y(t,n))}mask(t,n={}){let i=C.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 De,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 De,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 De,g=>g.transform(d).clearClip({duration:0})):this.transform(d)}filter(t,n){return this.effect({filter:t},n)}clearFilter(t){return this.effect({filter:"none"},t)}backdrop(t,n){return this.effect({backdropFilter:t},n)}blend(t,n){return this.effect({mixBlendMode:t},n)}transform(t){let n=this.chain(),i=new Ee(n,ke.applyTransform,new b().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 Y(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 Y?t.copy():new Y({opacity:1},t),r=new Ee(n,ke.applyTransform,new b().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof Y?t.copy():new Y({opacity:0},t),r=new Ee(n,ke.applyTransform,new b().setContent([i]));return n.chain(r)}};var Nt=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(Nt||{});import{animate as ra}from"motion/react";var dt=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(g=>g(t)),i++,i===e.length&&s.forEach(g=>g())},onUpdate:g=>{t[d]=g,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 ra(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};dt.AnimationType=Nt;var An=class extends dt{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new w(`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 ri=class o extends An{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 qe=class qe extends pt{constructor(e,t={}){super();let n=typeof e=="string"?{...t,text:e}:e,i=qe.DefaultUserConfig.create(n),r=qe.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 Rt(t,Rt.ActionTypes.setText,new b().setContent([e]));return t.chain(n)}setFontColor(e,t=0,n){return this.transform(new Y({fontColor:e},{duration:t,ease:n}))}setFontSize(e,t=0,n){return this.combineActions(new De,i=>{if(t){let s=new ri(e,t,n);i.chain(this._applyTransition(i,s))}let r=new Rt(i,Rt.ActionTypes.setFontSize,new b().setContent([e]));return i.chain(r)})}useLayer(e){return this.userConfig.get().layer=e,Object.assign(this.config,{layer:e}),this}toData(){return{state:qe.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=qe.StateSerializer.deserialize(e.state),this.transformState=Te.deserialize(e.transformState),this}_init(e){return new Ee(this.chain(),ke.init,new b().setContent([e||null,this.config.layer||null]))}reset(){this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig)}getInitialTransformState(e){let[t]=e.extract(qe.DefaultTextTransformState.keys());return new Te(qe.DefaultTextTransformState.create(t.get()).get())}_applyTransition(e,t){return new Ee(e,ke.applyTransition,new b().setContent([t,n=>n._setElement(this)]))}getInitialState(){return qe.DefaultTextState.create({fontSize:this.userConfig.get().fontSize,text:this.userConfig.get().text}).get()}};qe.DefaultUserConfig=new X({alignX:"center",alignY:"center",className:"",fontSize:16,fontColor:"#000000",text:""}),qe.DefaultTextConfig=new X({alignX:"center",alignY:"center",className:"",layer:void 0}),qe.DefaultTextState=new X({fontSize:16,display:!1,text:""}),qe.DefaultTextTransformState=new X({fontColor:"#000000",...Te.DefaultTransformState.getDefaultConfig()}),qe.StateSerializer=new ze;var Wt=qe;var xn=class xn extends B{executeAction(e,t){let n=this;if(n.is(xn,"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(xn,"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")}};xn.ActionTypes=yn;var si=xn;var Le=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 Ie=class Ie{static isWord(e){return e instanceof Ie}static color(e,t){return Ie.isWord(e)?e.copy().assign({color:t}):new Ie(e,{color:t})}static bold(e){return Ie.isWord(e)?e.copy().assign({bold:!0}):new Ie(e,{bold:!0})}static italic(e){return Ie.isWord(e)?e.copy().assign({italic:!0}):new Ie(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=H(Ie.defaultConfig,t)}evaluate(e){if(Le.isPause(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Ie.isWord(n)?n.inherit(this.config).evaluate(e):new Ie(n,this.config)).flat():Ie.isWord(t)?t.inherit(this.config).evaluate(e):[new Ie(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=H(this.config,e),this}copy(){return new Ie(this.text,this.config)}isPause(){return Le.isPause(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Ie.defaultConfig={},Ie.defaultColor="#000";var $=Ie;var Qe=class Qe{static isSentence(e){return e instanceof Qe}static toSentence(e){return Qe.isSentence(e)?e:new Qe(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 $.isWord(e)?e:new $(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[$.isWord(e)?e:new $(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(Qe.isSingleWord):Qe.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||$.isWord(e)||Le.isPause(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=Qe.format(e),this.config=H(Qe.defaultConfig,{...t,voice:typeof t.voice=="string"?ue.voice(t.voice):ue.toSound(t.voice)}),this.state=pr(Qe.defaultState)}toData(){return null}fromData(e){return this.state=H(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(...Qe.formatStaticWord(i))}return t}copy(){return new Qe([...this.text],this.config)}};Qe.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},Qe.defaultState={};var ae=Qe;var Mt=class extends B{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")}};Mt.ActionTypes=cr;var he=class o extends re{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 Mt(t,Mt.ActionTypes.action,new b().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new Mt(this.chain(),Mt.ActionTypes.action,new b().setContent(e))]}};var ai=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()}),Be(()=>{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 w("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 w("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?Be(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new G(()=>(i&&i.abort(),t))),i=e(t),i?Be(()=>s()):Be(()=>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()?Be(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 w(`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=
|
|
10
|
-
You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:F.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new
|
|
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(
|
|
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
|
|
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())}},ci=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 on=class on extends B{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:ue.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===Jt.say){let n=null,i="",r=null,s=new v(h=>h).registerSkipController(new G(()=>{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,g=on.getVoice(e,c);if(g){let h=e.audioManager.play(g);a.attachChild(h)}let f=g?e.events.on(P.EventTypes["event:state.player.lineEnd"],()=>{let h=on.endVoiceWithPreference(e,g);h&&e.timelines.attachTimeline(h),f?.cancel()}):null;if(l){let h=this.getId(),m=(e.getActiveNvlDialogForAction(h)||e.getLatestNvlDialogForAction(h))?.id||e.allocateNvlDialogId(h),y=c.evaluate(he.getCtx({gameState:e}));i=$.getText(y),p.events.emit(mt.EventTypes["event:character.prompt"],{character:c.config.character,sentence:c,text:i});let E=!1,O=()=>{E||(E=!0,e.events.emit(P.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(T),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:A}=e.ensureNvlDialog({id:m,actionId:h,character:this.callee,sentence:c,text:i});r=m;let N=e.consumeNvlTypingSuppression(),j=A&&!N?"typing":"awaitAdvance";e.activateNvlDialog(m,j,!A);let W=e.waitForNvlAdvance(m,()=>{e.settleNvlDialog(m),O()});n=()=>{W.cancel()}}else{let h=e.idManager.generateId(),S=e.createDialog(h,c,()=>{e.gameHistory.resolvePending(T),s.resolve({type:this.type,node:this.contentNode.getChild()})});i=S.text,n=S.cancel}p.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:T}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(f?.cancel(),g&&e.audioManager.isPlaying(g)){let h=on.endVoiceWithPreference(e,g);h&&a.attachChild(h)}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:T,action:this,element:{type:"say",text:i,voice:g?g.getSrc():null,character:this.callee.state.name},isPending:!0}),s}else if(this.type===Jt.setName){let n=this.callee.state.name;return this.callee.state.name=this.contentNode.getContent()[0],e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{this.callee.state.name=i},[n]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("CharacterAction")}};on.ActionTypes=Jt;var it=on;var wn=class wn extends re{constructor(e,t={}){super(),this.config=H(wn.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=>ae.isSingleWord(c))){let c=e,l=ae.format([t,...n]),p=new ae(mr(c,l),{character:this}),u=new it(this.chain(),it.ActionTypes.say,new b().setContent(p));return this.chain(u)}let i=t||{},r=e,s=Array.isArray(r)?new ae(r,{...i,character:this}):(ae.isSentence(r)?r:new ae(r,{...i,character:this})).copy();s.setCharacter(this);let a=new it(this.chain(),it.ActionTypes.say,new b().setContent(s));return this.chain(a)}setName(e){let t=new it(this.chain(),it.ActionTypes.setName,new b().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&&ae.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):ae.isSentence(e)?this.say(e):this.say(e,t)}};wn.defaultCharacterColor="#000",wn.defaultConfig={portraits:[]};var li=wn,xt=new li(null);var F=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()})`}},so=class o extends re{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
|
+
You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:F.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(lt,[this,lt.ActionTypes.action,new b().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 Pe.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=F.from(t),this.conditions.If.action=this.construct(n);let i=this.chain(),r=new lt(i,lt.ActionTypes.action,new b().setContent(this.conditions));return i.chain(r)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?xt.say(n).getActions():Pe.toActions([n]))}};var ui=class ui extends re{constructor(e,t){super(),this.namespace=this.prefix(e),this.defaultContent=t}init(e){e.hasNamespace(this.namespace)||e.addNamespace(new ut(this.namespace,this.defaultContent))}getNamespace(e){return e.getNamespace(this.namespace)}set(e,t){return this.chain(this.createAction(yn.set,[e,t]))}assign(e){return this.chain(this.createAction(yn.assign,[e]))}equals(e,t){return new F(n=>{let i=n.storable.getNamespace(this.namespace),r=F.isLambda(t)||F.isLambdaHandler(t)?F.from(t).evaluate(n).value:t;return i.equals(e,r)})}notEquals(e,t){return new F(n=>{let i=n.storable.getNamespace(this.namespace),r=F.isLambda(t)||F.isLambdaHandler(t)?F.from(t).evaluate(n).value:t;return!i.equals(e,r)})}isTrue(e){return new F(({storable:t})=>t.getNamespace(this.namespace).equals(e,!0))}isFalse(e){return new F(({storable:t})=>t.getNamespace(this.namespace).equals(e,!1))}isNotNull(e){return new F(({storable:t})=>{let n=t.getNamespace(this.namespace).get(e);return n!=null})}toWord(e){return new $(({storable:t})=>[String(t.getNamespace(this.namespace).get(e))])}get(e){return this.toWord(e)}conditional(e,t,n){return new $(i=>F.from(e).evaluate(i).value?t:n)}evaluate(e,t){return new F(({storable:n})=>t(n.getNamespace(this.namespace).get(e)))}getNamespaceName(){return this.namespace}prefix(e,t=ui.NamespacePrefix){return t+":"+String(e)}createAction(e,t){return new si(this.chain(),e,b.create(t))}};ui.NamespacePrefix="persistent";var rn=ui,pi=class pi extends rn{constructor(e){super(e,{}),this.namespace=this.prefix(e,pi.LocalNamespacePrefix)}init(e){e.removeNamespace(this.namespace).addNamespace(new ut(this.namespace,this.defaultContent))}};pi.LocalNamespacePrefix="local";var sn=pi;var an=class extends B{executeAction(e,t){if(this.type===Kt.action)return super.executeAction(e,t);if(this.type===Kt.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")}};an.ActionTypes=Kt;var et=class et extends pt{constructor(e,t={}){super();let n=et.DefaultUserConfig.create(t),i=et.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 an(this.chain(),Kt.setZIndex,new b().setContent([e])))}toData(){return{state:et.StateSerializer.serialize(this.state),transformState:this.transformState.serialize()}}fromData(e){return this.state=et.StateSerializer.deserialize(e.state),this.transformState=Te.deserialize(e.transformState),this}copy(){return new et(this.config.name,this.userConfig.get())}setName(e){return this.config.name=e,this}_init(e){return[new an(this.chain(),Kt.action,new b),new Ee(this.chain(),ke.init,new b().setContent([e,null,!1]))]}getInitialState(){return et.DefaultState.create({zIndex:this.config.zIndex}).get()}getInitialTransformState(){let[e]=this.userConfig.extract(Te.DefaultTransformState.keys());return new Te(Te.DefaultTransformState.create(e.get()).get())}};et.DefaultUserConfig=new X({zIndex:0,...Te.DefaultTransformState.getDefaultConfig(),opacity:1}),et.DefaultConfig=new X({name:"(anonymous)",zIndex:0}),et.StateSerializer=new ze,et.DefaultState=new X({zIndex:0});var cn=et;var kn=class extends re{constructor(e){super(),this.scene=e}show(e){let t=new _(this.scene.chain(),z.nvlShow,new b().setContent([e]));return this.chain(t)}hide(e){let t=new _(this.scene.chain(),z.nvlHide,new b().setContent([e]));return this.chain(t)}end(){let e=new _(this.scene.chain(),z.nvlEnd,new b().setContent([]));return this.chain(e)}};var Oe=class Oe extends nn{constructor(t,n){super();this.srcManager=new He;this.events=new Q;this.actions=[];this._futureActions_=[];let i=Oe.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=Oe.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=Oe.DefaultUserConfig.create(n),a=Oe.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 sn(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 Oe}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t){return new ze({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(De.do([this.background.char(t,n)]))}jumpTo(t,n={}){return this.combineActions(new De({allowFutureScene:!1}),i=>{let s=H({},n instanceof dt?{transition:n}:n);return i.chain(new _(i,"scene:preUnmount",new b().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 _(this.chain(),z.setBackgroundMusic,new b().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new kn(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},p=new _(this.chain(),z.nvlEnd,new b().setContent([l])),u=[...c,p];super.constructNodes(u);let d=new _(this.chain(),z.nvlBlock,new b().setContent([u,l]));return this.chain(d)}action(t){return this.actions=t,this}preloadImage(t){if(!C.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:Oe.getStateSerializer(this).serialize(this.state)}}fromData(t){return this.state=Oe.getStateSerializer(this).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new _(this.chain(),"scene:action",new b);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(f=>Pe.isChained(f)?f.fromChained(f):f).flat(2),s=[],a=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(f=>{Pe.isChained(f)||(f instanceof U?s.push(f):f instanceof Wt&&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 T of f.config.wearables){if(p.get(T)&&p.get(T)!==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
|
-
Parent Conflict (src: `+p.get(
|
|
15
|
-
Current Parent (src: `+
|
|
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 U({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 Y(this.chain(),"scene:jumpTo",new b().setContent([t])))}_exit(){return new Y(this.chain(),"scene:exit",new b().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 Y(this.chain(),"scene:init",new b().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)]}};Me.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"},Me.DefaultUserConfig=new j({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Me.DefaultSceneConfig=new j({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new an("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new an("[[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=>{re.isSound(r)&&Me.validateVoice(r)}),i(t))return t;throw new Se(`Invalid voices config: ${t}`)}});var ze=Me;import*as Ir from"howler";var pi=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 ea={volume:1,limit:1/0},ta=class wr{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={...ea,...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 wr(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}}},kr=!1;function na(o){kr=o}function Lt(o,e){kr||(e!==void 0?console.warn(o,e):console.warn(o))}var ia=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){Lt("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){Lt("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){Lt("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()}},xr=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}},oa=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 ia(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){Lt("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){Lt("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 xr(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new xr(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}},ra=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}},sa=10*1024*1024,aa=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 ra(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}}},ca={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},Pr=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...ca,...o},na(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new aa(this.audioContext),this.masterChannel=new ta("__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=>{Lt("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 oa(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<sa?"full":"stream"}catch(t){return Lt("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=>{Lt("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var di=class{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.channelVolumes=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1;Object.values(kt).forEach(t=>{this.channelVolumes.set(t,1)})}initialize(){if(this.isReady||this.isInitializing)return;let e=new Pr;this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),Object.values(kt).forEach(t=>{let n=this.channelVolumes.get(t)??1,i=e.getChannel(t)??e.createChannel(t,{volume:n});i.setVolume(n),this.channels.set(t,i)}),this.isReady=!0,this.isInitializing=!1,this.setupGroupVolume()}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}play(e,t={end:1,duration:0}){let n=new y;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 x(`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 y;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 y;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 y;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 y;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 y;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,y.resolve(void 0)):y.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 x(`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(
|
|
14
|
+
Parent Conflict (src: `+p.get(T)?.state.currentSrc+`)
|
|
15
|
+
Current Parent (src: `+f.state.currentSrc+")");p.set(T,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),g=new b(this.sceneRoot,void 0,d||void 0).setContent(this);return d?.setParent(g),this.sceneRoot?.setContentNode(g),this._futureActions_=u,this}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?xt.say(n).getActions():Pe.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 _){let l=c.callee;if(C.isImageSrc(l.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:C.srcToURL(l.state.backgroundImage.state.currentSrc)}),c.type===z.jumpTo){let p=c,u=Oe.getScene(t,p.contentNode.getContent()[0]);if(!u)throw c._sceneNotFoundError(c.getSceneName(p.contentNode.getContent()[0]));let d=He.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 se){let l=He.getPreloadableSrc(t,c);l&&this.srcManager.register(l)}else if(c instanceof je)this.srcManager.register(c.callee);else if(c instanceof pe){let p=c.getFutureActions(t,{allowFutureScene:!0});s.push(...p)}else c instanceof Ee&&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"?ue.voice(r):(Oe.validateVoice(r),r)}let i=n[t];return typeof i=="string"?ue.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 U({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 _(this.chain(),"scene:jumpTo",new b().setContent([t])))}_exit(){return new _(this.chain(),"scene:exit",new b().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 _(this.chain(),"scene:init",new b().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)]}};Oe.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"},Oe.DefaultUserConfig=new X({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),Oe.DefaultSceneConfig=new X({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new cn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new cn("[[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=>{ue.isSound(r)&&Oe.validateVoice(r)}),i(t))return t;throw new xe(`Invalid voices config: ${t}`)}});var Ye=Oe;import*as Nr from"howler";var di=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 sa={volume:1,limit:1/0},aa=class Pr{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={...sa,...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 Pr(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}}},Er=!1;function ca(o){Er=o}function Gt(o,e){Er||(e!==void 0?console.warn(o,e):console.warn(o))}var la=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){Gt("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){Gt("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){Gt("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()}},kr=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}},ua=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 la(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){Gt("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){Gt("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 kr(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new kr(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}},pa=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}},da=10*1024*1024,ma=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 pa(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}}},fa={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},Dr=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...fa,...o},ca(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new ma(this.audioContext),this.masterChannel=new aa("__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=>{Gt("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 ua(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,g=()=>{d||(d=!0,p.releaseRef?.())};u.once("ended",g),u.once("stop",g)}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<da?"full":"stream"}catch(t){return Gt("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=>{Gt("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var mi=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(It).forEach(t=>{this.channelVolumes.set(t,1)})}initialize(){if(this.isReady||this.isInitializing)return;let e=new Dr;this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),Object.values(It).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 w(`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 w(`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(It).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 ha from"html-to-image";var fi=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new Q}addNotification(e){this.notifications.push(e),this.flush()}removeNotification(e){this.notifications=this.notifications.filter(t=>t!==e),this.flush()}clearNotifications(){this.notifications=[],this.flush()}consume(e){let t=new v,n=new we(t);return t.registerSkipController(new G(()=>{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 hi=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=vr(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 gi=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 zt=class extends B{executeAction(e,t){let n=new v().registerSkipController(new G(()=>{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(",")}]}`)}};zt.ActionTypes=lr;var Bt=class Bt extends re{constructor(t,n={}){super();this.choices=[];this.prompt=ae.isSentence(t)?t:t===null?null:new ae(t),this.config=H(Bt.defaultConfig,n)}static prompt(t,n={}){return new Bt(t!==void 0?t:null,n)}static choose(t,n){return new Bt(null,{}).choose(t,n)}choose(t,n){let i=this.chain();return ae.isSentence(t)&&n?i.choices.push({prompt:ae.toSentence(t),action:this.narrativeToActions(n),config:{}}):($.isWord(t)||Array.isArray(t)||typeof t=="string")&&n?i.choices.push({prompt:ae.toSentence(t),action:this.narrativeToActions(n),config:{}}):typeof t=="object"&&"prompt"in t&&"action"in t?i.choices.push({prompt:ae.toSentence(t.prompt),action:this.narrativeToActions(t.action),config:{disabled:t.config?.disabled?F.from(t.config.disabled):void 0,hidden:t.config?.hidden?F.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=F.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=F.from(t),this.chain()}enableWhen(t,n,i){return this.choose({prompt:n,action:i,config:{disabled:F.not(F.from(t))}})}showWhen(t,n,i){return this.choose({prompt:n,action:i,config:{hidden:F.not(F.from(t))}})}fromChained(t){return[new zt(this.chain(),zt.ActionTypes.action,new b().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"?xt.say(n).getActions():Pe.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??{}}))}};Bt.defaultConfig={},Bt.targetAction=zt;var ao=Bt;var wt=class wt extends nn{constructor(t,n=wt.defaultConfig){super();this.entryScene=null;this.scenes=new Map;this.persistent=[];this.services=new Map;this.name=t,this.config=H(wt.defaultConfig,n)}static empty(){return new wt("empty").entry(new Ye("empty"))}entry(t){return this.entryScene=t,this}registerPersistent(t){return this.persistent.push(t),this}createPersistent(t,n){let i=new rn(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 br(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 me(`Service ${i} serialize method should not return a promise`);if(!no(r))throw new me(`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(
|
|
25
|
-
Use video.show() to add the video to the game`);let i=this.callee,r=new y,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 G(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")}};ut.ActionTypes=Zt;var vi=ut;var cn=class cn extends te{constructor(e){super();let t=cn.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new ce("Video must have a src")}show(){return this.chain(this.createAction(Zt.show,[]))}hide(){return this.chain(this.createAction(Zt.hide,[]))}play(){return this.chain(this.createAction(Zt.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 cn.DefaultVideoState.create().get()}createAction(e,t){return new vi(this.chain(),e,b.create(t))}};cn.DefaultVideoConfig=new j({src:"",muted:!1}),cn.DefaultVideoState=new j({display:!1});var co=cn;function Dr(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Lr(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return Er(o);let i=lo(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=lo(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=lo(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function lo(o,e){if(o===!1||typeof o>"u")return{resolved:!1,source:null};if(typeof o=="function"){let t=o(e);return{resolved:typeof t<"u",source:t??null}}return{resolved:!0,source:o}}function Er(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}var ae=class ae{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 vn;this.htmlToImage=la;this.pageRouter=null;this.stageClickBuffer=null;this.nvlAdvanceWaiters=new Map;this.stage=t,this.game=e,this.events=new J,this.logger=new pi(e,"NarraLeaf-React"),this.audioManager=new di(this),this.guard=new si(e.config.app.guard).observe(this),this.timelines=new ai(this.guard),this.notificationMgr=new mi(this,[]),this.idManager=new Xn,this.actionHistory=new fi(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new hi(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=ze.isScene(e)?e:e.entryScene;if(!t)throw new x("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(ae.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}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(Dr);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(ue.getCtx({gameState:this}));this.game.getLiveGame().events.emit(lt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:W.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:W.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(ue.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(lt.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?W.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(ae.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],!0,e?.showTransition),this.emitNvlStateChange(),this}exitNvlMode(e){let t=e?.hideTransition||this.nvlState.options?.hideTransition;return this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(ae.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(ae.EventTypes["event:state.nvl.dialogAppend"],e),this.emitNvlStateChange(),this}removeNvlDialog(e){let t=this.nvlState.dialogs.findIndex(r=>r.id===e);if(t===-1)return this;let n=[...this.nvlState.dialogs],[i]=n.splice(t,1);return this.nvlState.dialogs=n,this.events.emit(ae.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>Y.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(ae.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(ae.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(ae.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{Y.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(ae.EventTypes["event:state.nvl.dialogAppend"],t),this.emitNvlStateChange(),{created:!1,entry:t}):(this.appendNvlDialog(e),{created:!0,entry:e})}activateNvlDialog(e,t="typing",n=!0){return n&&this.nvlState.activeDialogId===e&&this.nvlState.phase!=="idle"||(this.nvlState.activeDialogId=e,this.nvlState.phase=t,this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}waitForNvlAdvance(e,t){return this.nvlAdvanceWaiters.set(e,t),{cancel:()=>{this.nvlAdvanceWaiters.get(e)===t&&this.nvlAdvanceWaiters.delete(e)}}}requestNvlAdvance(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?"ignore":this.nvlState.phase==="typing"?"typing":this.nvlState.phase==="awaitAdvance"?(this.resolveNvlAdvance(e),"advance"):"ignore"}requestNvlSkip(e){return this.requestNvlAdvance(e)}completeNvlTyping(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?!1:(this.nvlState.phase="awaitAdvance",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.events.emit(ae.EventTypes["event:state.nvl.dialogComplete"],e),this.emitNvlStateChange(),!0)}settleNvlDialog(e){return this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}suppressNextNvlTyping(){return this._suppressNextNvlTyping=!0,this}consumeNvlTypingSuppression(){return this._suppressNextNvlTyping?(this._suppressNextNvlTyping=!1,!0):!1}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 x(`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 Ir.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 x("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]=Te.proxy(y.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof at&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(q.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new Le("State already mounted");if(!e)throw new Le("Invalid state key");return this.exposedState.set(e,t),this.events.emit(ae.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new x("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(ae.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 x("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=>{
|
|
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
|
|
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(Ye.isScene(t))return t;let r=this.scenes.get(t)||null;if(!r&&n)throw Reflect.construct(i||me,[`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>wt.MAX_DEPTH)throw new Error(`Max depth reached while constructing scene roots (max depth: ${wt.MAX_DEPTH})`);let s=i.shift();if(Ye.isScene(s.callee)){if(n.has(s.callee))continue;s.callee.isSceneRootConstructed()||s.callee.constructSceneRoot(this),n.add(s.callee)}let a=s.getFutureActions(this,{allowFutureScene:!0});i.push(...a)}return this}initPersistent(t){return this.persistent.forEach(n=>{n.init(t)}),this}getInversionConfig(){let{origin:t}=this.config;return{invertY:t==="bottom left"||t==="bottom right",invertX:t==="bottom right"||t==="top right"}}runStaticCheck(t){return new yi(t).run(this)}};wt.defaultConfig={origin:"bottom left"},wt.MAX_DEPTH=32767;var Pn=wt;var vi=class extends B{executeAction(e,t){let[n,i]=this.contentNode.getContent(),r=this.callee.triggerAction(he.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 co=class extends re{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(yr(r)){let s=[],a=new v().registerSkipController(new G(()=>{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 vi(t,"service:action",new b().setContent([n,i]))}},lo=class extends co{},En=class extends lo{};var ft=class ft extends B{executeAction(e,t){let n=this,i=this.callee,r={action:n,stackModel:t.stackModel};if(n.is(ft,"video:play"))return this.changeStateAsync(e,s=>s.play(),t);if(n.is(ft,"video:pause"))return this.changeState(e,s=>s.pause(),t);if(n.is(ft,"video:stop"))return this.changeState(e,s=>s.stop(),t);if(n.is(ft,"video:seek"))return this.changeState(e,s=>s.seek(n.contentNode.getContent()[0]),t);if(n.is(ft,"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(ft,"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(ft,"video:resume"))return this.changeState(e,s=>s.resume(),t);throw this.unknownTypeError()}changeStateBase(e,t,n){if(!e.isVideoAdded(this.callee))throw new w(`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 G(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")}};ft.ActionTypes=Zt;var Si=ft;var ln=class ln extends re{constructor(e){super();let t=ln.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new me("Video must have a src")}show(){return this.chain(this.createAction(Zt.show,[]))}hide(){return this.chain(this.createAction(Zt.hide,[]))}play(){return this.chain(this.createAction(Zt.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 ln.DefaultVideoState.create().get()}createAction(e,t){return new Si(this.chain(),e,b.create(t))}};ln.DefaultVideoConfig=new X({src:"",muted:!1}),ln.DefaultVideoState=new X({display:!1});var uo=ln;function Ir(o){return"image"in o?{image:o.image,avatar:o.avatar}:{image:o}}function Rr(o){let{sentenceAvatar:e,portraitAvatar:t,characterAvatar:n}=o;if(!o.character||!o.character.state.name||e===!1)return Lr(o);let i=po(e,o);if(i.resolved)return{source:i.source,character:o.character,portrait:o.portrait};let r=po(t,o);if(r.resolved)return{source:r.source,character:o.character,portrait:o.portrait};let s=po(n,o);return s.resolved?{source:s.source,character:o.character,portrait:o.portrait}:{source:null,character:o.character,portrait:o.portrait}}function po(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 Lr(o){return{source:null,character:o.character||null,portrait:o.portrait||null}}var de=class de{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 vn;this.htmlToImage=ha;this.pageRouter=null;this.stageClickBuffer=null;this.nvlAdvanceWaiters=new Map;this.stage=t,this.game=e,this.events=new Q,this.logger=new di(e,"NarraLeaf-React"),this.audioManager=new mi(this),this.guard=new ai(e.config.app.guard).observe(this),this.timelines=new ci(this.guard),this.notificationMgr=new fi(this,[]),this.idManager=new Yn,this.actionHistory=new hi(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new gi(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=Ye.isScene(e)?e:e.entryScene;if(!t)throw new w("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(de.EventTypes["event:state:flushPreloadedScenes"]),this}getPreloadingScene(){return this.preloadingScene}addElement(e){return this.state.elements.push(e),this.logger.debug("GameState","Adding element",e.scene.getId()),this}addScene(e){return this.sceneExists(e)?this:(this.state.elements.unshift({scene:e,texts:[],menus:[],layers:new Map(e.config.layers.map(t=>[t,[]]))}),this.logger.debug("GameState","Adding scene",e.getId()),this)}flush(){return this.stage.update(),this}popScene(){let e=this.state.elements.pop();return e?(this.removeElements(e.scene),this.logger.debug("GameState","Popping scene",e.scene.getId()),this):this}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(Ir);if(!t.length)return null;let n=this.getLastScene(),i=n?this.findElementByScene(n):null;if(!i)return null;let r=new Map(t.map(a=>[a.image,a])),s=Array.from(i.layers.values());for(let a=s.length-1;a>=0;a--){let 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(he.getCtx({gameState:this}));this.game.getLiveGame().events.emit(mt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:$.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:$.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(he.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(mt.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?$.getText(r):null}}enterNvlMode(e){let t=this.idManager.generateId();return this.nvlState={active:!0,visible:!0,sessionId:t,dialogs:[],options:e||null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.events.emit(de.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!0,e?.showTransition),this.emitNvlStateChange(),this}exitNvlMode(e){let t=e?.hideTransition||this.nvlState.options?.hideTransition;return this.nvlState={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},this.nvlAdvanceWaiters.clear(),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(de.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],e),this.emitNvlStateChange(),this}removeNvlDialog(e){let t=this.nvlState.dialogs.findIndex(r=>r.id===e);if(t===-1)return this;let n=[...this.nvlState.dialogs],[i]=n.splice(t,1);return this.nvlState.dialogs=n,this.events.emit(de.EventTypes["event:state.nvl.dialogAppend"],i),this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState()),this.emitNvlStateChange(),this}getNvlDialogs(){return this.nvlState.dialogs}isNvlMode(){return this.nvlState.active}getNvlState(){return this.nvlState}createNvlSnapshot(){return{active:this.nvlState.active,visible:this.nvlState.visible,sessionId:this.nvlState.sessionId,dialogs:this.nvlState.dialogs.map(e=>({...e})),options:this.nvlState.options?{...this.nvlState.options}:null,activeDialogId:this.nvlState.activeDialogId,phase:this.nvlState.phase,pendingAdvance:this.nvlState.pendingAdvance,isTyping:this.nvlState.isTyping}}createPresentationSnapshot(){return{scenes:this.state.elements.map(({scene:e})=>_.createSceneSnapshot(e,this)),nvlState:this.createNvlSnapshot()}}restoreNvlSnapshot(e){let t=e.activeDialogId&&e.dialogs.some(n=>n.id===e.activeDialogId)?e.activeDialogId:null;return this.nvlState={active:e.active,visible:e.visible,sessionId:e.sessionId,dialogs:e.dialogs.map(n=>({...n})),options:e.options?{...e.options}:null,activeDialogId:t,phase:t?"awaitAdvance":"idle",pendingAdvance:!1,isTyping:!1},this.syncNvlDerivedState(),this.nvlState.active?(this.events.emit(de.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(de.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{_.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(de.EventTypes["event:state.nvl.dialogAppend"],t),this.emitNvlStateChange(),{created:!1,entry:t}):(this.appendNvlDialog(e),{created:!0,entry:e})}activateNvlDialog(e,t="typing",n=!0){return n&&this.nvlState.activeDialogId===e&&this.nvlState.phase!=="idle"||(this.nvlState.activeDialogId=e,this.nvlState.phase=t,this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}waitForNvlAdvance(e,t){return this.nvlAdvanceWaiters.set(e,t),{cancel:()=>{this.nvlAdvanceWaiters.get(e)===t&&this.nvlAdvanceWaiters.delete(e)}}}requestNvlAdvance(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?"ignore":this.nvlState.phase==="typing"?"typing":this.nvlState.phase==="awaitAdvance"?(this.resolveNvlAdvance(e),"advance"):"ignore"}requestNvlSkip(e){return this.requestNvlAdvance(e)}completeNvlTyping(e){return!this.nvlState.active||this.nvlState.activeDialogId!==e?!1:(this.nvlState.phase="awaitAdvance",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.events.emit(de.EventTypes["event:state.nvl.dialogComplete"],e),this.emitNvlStateChange(),!0)}settleNvlDialog(e){return this.nvlState.activeDialogId===e&&(this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange()),this}suppressNextNvlTyping(){return this._suppressNextNvlTyping=!0,this}consumeNvlTypingSuppression(){return this._suppressNextNvlTyping?(this._suppressNextNvlTyping=!1,!0):!1}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 w(`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 Nr.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 w("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 pt&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(Y.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new Ue("State already mounted");if(!e)throw new Ue("Invalid state key");return this.exposedState.set(e,t),this.events.emit(de.EventTypes["event.state.onExpose"],e,t),{unMount:()=>{this.unMountState(e)}}}unMountState(e){return this.exposedState.has(e)||this.guard.warn("invalidExposedStateUnmounting","State not found when unmounting"),this.exposedState.delete(e),this}initVideo(e){return this.state.videos.push(e),this}isStateMounted(e){return this.exposedState.has(e)}getExposedState(e){return this.exposedState.get(e)||null}getExposedStateForce(e){let t=this.getExposedState(e);if(!t)throw new w("State not found, key: "+e);return t}getExposedStateAsync(e,t){let n=this.getExposedState(e);if(n)return{cancel:this.schedule(()=>{t(n)},0)};{let i=this.events.on(de.EventTypes["event.state.onExpose"],(r,s)=>{r===e&&(t(s),i.cancel())});return i}}dispose(){this.forceReset()}toData(){return{scenes:this.state.elements.map(e=>({sceneId:e.scene.getId(),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 w("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=>{_.initBackgroundMusic(l,u)})}),this.audioManager.fromData(r,t),this.state.videos=s.map(([a,c])=>{let l=t.get(a);if(!l)throw new w("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 ae(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(de.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.nvlState.visible&&this.events.emit(de.EventTypes["event:state.nvl.visibilityChange"],!0,this.nvlState.options?.showTransition),this.emitNvlStateChange()}}getLastSceneIfNot(e){let t=e||this.getLastScene();if(!t||!this.sceneExists(t))throw new w('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(de.EventTypes["event:state.nvl.change"],this.getNvlState()),this.stage.update()}resolveNvlAdvance(e){let t=this.nvlAdvanceWaiters.get(e);return t?(this.nvlAdvanceWaiters.delete(e),this.nvlState.activeDialogId=null,this.nvlState.phase="idle",this.nvlState.pendingAdvance=!1,this.syncNvlDerivedState(),this.emitNvlStateChange(),t(),!0):!1}isDisplayableVisible(e){return(e.transformState.get().opacity??0)>0}createWaitableAction(e,t){return{action:e,onClick:(i=>{t&&t(i)})}}sceneNotFound(){return new w("Scene not found, target scene may not be activated. This is an internal error, please report this to the developer.")}layerNotFound(){return new w("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 w("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 w("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)})]}))}};
|
|
30
|
+
This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};de.EventTypes={"event:state.end":"event:state.end","event:state.player.skip":"event:state.player.skip","event:state.player.lineEnd":"event:state.player.lineEnd","event:state.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=de;var Mr=32767,ga=1e3,Fe=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 Zn().addPushValidator(n=>{let i=this.stack.peek();if(n===i)throw new Ue("StackModel: Unexpected self-push in stack.");if(o.isCalledActionResult(i)){if(i.wait&&o.isStackModelsAwaiting(i.wait.type,i.wait.stackModels))throw new Ue("StackModel: Unexpected waiting action in stack. (is calledActionResult: true, wait: true)")}else if(v.isAwaitable(i)&&!i.isSettled())throw new Ue("StackModel: Unexpected unsettled Awaitable in stack.");if(!o.isCalledActionResult(n)&&!v.isAwaitable(n))throw new Ue("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%Mr===0){let t=Date.now()-this.loopStartTime;if(e-this.loopDebugCheckpoint>=Mr&&t<ga){let i=new w(`[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`);m.reset(),m.fromData(h)}),this.currentSavedGame=e,t.loadData(r,u),this.stackModel.deserialize(c,p),l.forEach(d=>{let h=Ie.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(k.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===Jt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(r,i),s===this.stackModel&&this.stackModel.push(Ie.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=y.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 re({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(k.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(bt.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(bt.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(Ie.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 Ie(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 Ie(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 y.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new Le("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Ie(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Le("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),[rt].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(Y,V.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(se,ve.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 Le("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Le("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:yr(),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 x("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 x("Player Element Not Mounted")}};bt.DefaultNamespaces={game:{}},bt.GameSpacesKey={game:"game"},bt.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose"};var lt=bt;var Dn=class Dn{constructor(e){this.settings=e;this.events=new J;this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(Dn.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(Dn.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))}};Dn.EventTypes={"event:game.preference.change":"event:game.preference.change"};var Ln=Dn;import"client-only";import gs,{useEffect as Bc,useRef as Mo}from"react";import"client-only";import Nr,{useContext as Mr,useState as pa}from"react";var uo=Nr.createContext(null);function Gr({children:o,game:e}){"use client";let t=new Q({}),[n]=pa(e||t);return Nr.createElement(uo,{value:n},o)}function w(){let o=Mr(uo);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function Hr(){return Mr(uo)}import da,{createContext as ma,useContext as Ur}from"react";var Fr="/",Si=class Si{constructor(e,t=Si.rootPath){this.events=new J;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,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 x(`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 x(`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(),We(()=>{t()}))})}else We(()=>{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)}};Si.rootPath=Fr;var It=Si,po=ma(null);function Kr({children:o}){let e=w();return da.createElement(po,{value:{router:e.router}},o)}function pt(){if(!Ur(po))throw new Error("useRouter must be used within a RouterProvider");return Ur(po).router}import Or from"react";import Ta from"clsx";import fa,{createContext as ha,useContext as ga,useLayoutEffect as ya,useReducer as va,useState as Sa}from"react";var At=class At{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new J().setMaxListeners(1/0);this.lockers=[];this.updater=null}update(e,t,n){this.state.width=e,this.state.height=t,this.state.scale=n,this.events.emit(At.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(At.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(At.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(At.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(At.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(At.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};At.EventTypes={"event:aspectRatio.update":"event:aspectRatio.update","event:aspectRatio.pause":"event:aspectRatio.pause","event:aspectRatio.resume":"event:aspectRatio.resume","event:aspectRatio.requestUpdate":"event:aspectRatio.requestUpdate"};var mo=At,fo=ha(null);function Vr({children:o}){"use client";let[e]=Sa(()=>new mo);return fa.createElement(fo,{value:{ratio:e}},o)}function pe(){let o=ga(fo),[,e]=va(n=>n+1,0);if(!fo||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return ya(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function dt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=pe(),s=r.getStyle();return Or.createElement("div",{className:Ta("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},Or.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import ba,{useEffect as Aa}from"react";function _e(o){let e=w(),[t,n]=ba.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return Aa(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import ho from"react";import Ti from"react";import Wr from"clsx";function bi({children:o,className:e,style:t,...n}){let{ratio:i}=pe(),r=w();return Ti.createElement(dt,{className:Wr("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},Ti.createElement("div",{className:"absolute inset-0 w-full h-full"},Ti.createElement("div",{className:"inset-0 w-full h-full"},Ti.createElement("div",{className:Wr("pointer-events-auto-rest",e),style:t},o))))}function Ca({children:o,className:e,style:t}){return ho.createElement(ho.Fragment,null,ho.createElement(bi,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import zr from"clsx";import Br from"react";function Ai({className:o,children:e,...t}){let{ratio:n}=pe();return Br.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:zr("w-full h-full")},Br.createElement("div",{className:zr("z-20",o),...t},e))}import Xe,{useState as $r}from"react";import{motion as xa}from"motion/react";function Ci({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=w(),[l,p]=$r(!1);if(!c.config.app.inspector)return Xe.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 Xe.createElement(r,{...u,ref:s},n&&l&&Xe.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function wa({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=w(),[a,c]=$r(!1);if(!s.config.app.inspector)return Xe.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 Xe.createElement("div",null,Xe.createElement(i,{...l}),t&&a&&Xe.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function ka(o){return Xe.createElement(Ci,{...o,as:"div"})}function Pa(o){return Xe.createElement(Ci,{...o,as:"span"})}function Ea(o){return Xe.createElement(wa,{...o,as:"img"})}function Da(o){return Xe.createElement(Ci,{...o,as:"button"})}function La(o){return Xe.createElement(Ci,{...o,as:xa.div,ref:o.ref,layout:o.layout})}var Ia={Div:ka,Span:Pa,Button:Da,Img:Ea,mDiv:La},zt=Ia;import Pi from"clsx";import Pe,{useEffect as un,useRef as Yr,useState as go}from"react";import{useEffect as Ra,useState as Na}from"react";function Z(o){let[e,t]=Na(0);Ra(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import jr from"react";var Bt=jr.createContext(null);function et(){let o=jr.useContext(Bt);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import xi,{useCallback as Ma,useLayoutEffect as In,useMemo as qr,useRef as Qr}from"react";import{useIsPresent as Ga}from"motion/react";var tt=class tt{constructor(e){this.events=new J;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.config=e,this._state="pending",this.autoForwardScheduler=new qn,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(tt.Events.complete):this.safeEmit(tt.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(tt.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(tt.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",e.getPreference(Q.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(tt.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(tt.Events.onFlush),this}onFlush(e){return this.events.on(tt.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(Q.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(tt.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(Q.Preferences.gameSpeed))}};tt.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var fe=tt;function Rn({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=Ga(),s=i&&r,a=Qr(!1),c=Qr(o),l=c.current!==o,p=qr(()=>o.sentence?.evaluate(ue.getCtx({gameState:n})),[o.sentence,n]),u=qr(()=>new fe({useTypeEffect:t,action:o,evaluatedWords:p||[],gameState:n,suppressInitialAnimation:l}),[o,n,t,p]),d=n.game.config.dialog,h=Ma(m=>{!s||a.current||(a.current=!0,e?.(m))},[s,e]);return In(()=>{a.current=!1},[u]),In(()=>{c.current=o},[o]),In(()=>(u.setActive(s),()=>{u.setActive(!1)}),[u,s]),In(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",u),u.events.on(fe.Events.complete,m=>{n.logger.log("NarraLeaf-React: Say","Complete",u.isIdle()),s&&(u.isIdle()||m?h(!1):u.setIdle(!0))}).cancel),[u,h,n,s]),In(()=>n.events.on(k.EventTypes["event:state.player.skip"],m=>{s&&(m?(u.setIdle(!0),u.forceSkip()):u.isIdle()?h(!0):u.forceSkip())}).cancel,[u,h,n,s]),xi.createElement(xi.Fragment,null,xi.createElement(Bt,{value:u},xi.createElement(d,null)))}import{useEffect as wi,useState as Fa}from"react";import{useEffect as Ha,useState as Ua}from"react";function $t(o){let e=w(),[t,n]=Ua(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return Ha(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var ln=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(ln||{});function ki({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=w(),[s]=$t("nextAction"),[a]=Fa(()=>new fe({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e}));return wi(()=>{if(!n)return;let c=()=>{e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()},l=()=>{e.requestNvlSkip(o.id)==="typing"&&a.forceSkip()},p=e.events.on(k.EventTypes["event:state.player.stageClick"],c),u=e.events.on(k.EventTypes["event:state.player.skip"],l);return()=>{p.cancel(),u.cancel()}},[a,o.id,e,n]),wi(()=>{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]),wi(()=>{let c=a.events.on(fe.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),wi(()=>{let c=a.events.on(fe.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function*vo(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(we.isPause(n.text)){yield we.from(n.text);continue}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 w("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 G(()=>{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;e=s,await s}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 Ue("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&&F.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 kt=class kt{constructor(e){this.events=new Q;this.story=null;this.gameLock=new _t;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 Cn,this.initNamespaces()}initNamespaces(){return this._storable.clear().addNamespace(new ut(kt.GameSpacesKey.game,kt.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._storable.clear().load(i),s.forEach(({id:d,data:g})=>{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(g)}),this.currentSavedGame=e,t.loadData(r,u),this.stackModel.deserialize(c,p),l.forEach(d=>{let g=Fe.createStackModel(this,d,p);this.asyncStackModels.add(g),t.timelines.attachTimeline(this.executeAsyncStackModel(g))}),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===Jt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(r,i),s===this.stackModel&&this.stackModel.push(Fe.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 ue({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(kt.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(kt.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(Fe.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 Fe(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 Fe(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 Ue("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new Fe(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new Ue("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),[lt].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(_,z.jumpTo)){let[c]=i.action.contentNode.getContent(),l=e.getScene(c);if(!l)throw i.action._sceneNotFoundError(i.action.getSceneName(c));if(a.has(l)){i=null;continue}a.add(l),i=l.getSceneRoot()?.contentNode||null;continue}else if(i.action&&i.action.is(pe,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 Ue("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new Ue("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:Sr(),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 w("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 w("Player Element Not Mounted")}};kt.DefaultNamespaces={game:{}},kt.GameSpacesKey={game:"game"},kt.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose"};var mt=kt;var Dn=class Dn{constructor(e){this.settings=e;this.events=new Q;this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(Dn.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(Dn.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))}};Dn.EventTypes={"event:game.preference.change":"event:game.preference.change"};var Ln=Dn;import"client-only";import Ss,{useEffect as Yc,useRef as Ho}from"react";import"client-only";import Gr,{useContext as Hr,useState as ya}from"react";var mo=Gr.createContext(null);function Ur({children:o,game:e}){"use client";let t=new J({}),[n]=ya(e||t);return Gr.createElement(mo,{value:n},o)}function k(){let o=Hr(mo);if(!o)throw new Error("useGame must be used within a GameProvider");return o}function Fr(){return Hr(mo)}import va,{createContext as Sa,useContext as Kr}from"react";var Vr="/",Ti=class Ti{constructor(e,t=Ti.rootPath){this.events=new Q;this.currentPath="";this.currentQuery={};this.history=[];this.historyIndex=-1;this.mountedPaths=new Set;this.defaultHandlerPaths=new Set;this.unmountingPaths=new Set;this.updateSyncHooks=new Set;this.transitioning=!1;this.game=e;let{path:n,query:i}=this.parseUrl(t);this.currentPath=n,this.currentQuery=i,this.history.push(t),this.historyIndex=0}getCurrentPath(){return this.currentPath}getPathname(){return this.currentPath}getCurrentQuery(){return{...this.currentQuery}}getQueryParams(){return this.getCurrentQuery()}getCurrentUrl(){return this.buildUrl(this.currentPath,this.currentQuery)}parseUrl(e){let[t,n]=e.split("?"),i={};if(n){let r=n.split("&");for(let s of r){let[a,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 w(`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 w(`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(),Be(()=>{t()}))})}else Be(()=>{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)}};Ti.rootPath=Vr;var Ht=Ti,fo=Sa(null);function Or({children:o}){let e=k();return va.createElement(fo,{value:{router:e.router}},o)}function ht(){if(!Kr(fo))throw new Error("useRouter must be used within a RouterProvider");return Kr(fo).router}import zr from"react";import ka from"clsx";import Ta,{createContext as ba,useContext as Ca,useLayoutEffect as Aa,useReducer as xa,useState as wa}from"react";var Pt=class Pt{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new Q().setMaxListeners(1/0);this.lockers=[];this.updater=null}update(e,t,n){this.state.width=e,this.state.height=t,this.state.scale=n,this.events.emit(Pt.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(Pt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(Pt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(Pt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(Pt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(Pt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};Pt.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 ho=Pt,go=ba(null);function Wr({children:o}){"use client";let[e]=wa(()=>new ho);return Ta.createElement(go,{value:{ratio:e}},o)}function ge(){let o=Ca(go),[,e]=xa(n=>n+1,0);if(!go||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return Aa(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function gt({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=ge(),s=r.getStyle();return zr.createElement("div",{className:ka("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},zr.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import Pa,{useEffect as Ea}from"react";function ot(o){let e=k(),[t,n]=Pa.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return Ea(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import yo from"react";import bi from"react";import Br from"clsx";function Ci({children:o,className:e,style:t,...n}){let{ratio:i}=ge(),r=k();return bi.createElement(gt,{className:Br("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},bi.createElement("div",{className:"absolute inset-0 w-full h-full"},bi.createElement("div",{className:"inset-0 w-full h-full"},bi.createElement("div",{className:Br("pointer-events-auto-rest",e),style:t},o))))}function Da({children:o,className:e,style:t}){return yo.createElement(yo.Fragment,null,yo.createElement(Ci,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import $r from"clsx";import jr from"react";function Ai({className:o,children:e,...t}){let{ratio:n}=ge();return jr.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:$r("w-full h-full")},jr.createElement("div",{className:$r("z-20",o),...t},e))}import tt,{useState as qr}from"react";import{motion as La}from"motion/react";function xi({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=k(),[l,p]=qr(!1);if(!c.config.app.inspector)return tt.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 tt.createElement(r,{...u,ref:s},n&&l&&tt.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function Ia({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=k(),[a,c]=qr(!1);if(!s.config.app.inspector)return tt.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 tt.createElement("div",null,tt.createElement(i,{...l}),t&&a&&tt.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function Ra(o){return tt.createElement(xi,{...o,as:"div"})}function Na(o){return tt.createElement(xi,{...o,as:"span"})}function Ma(o){return tt.createElement(Ia,{...o,as:"img"})}function Ga(o){return tt.createElement(xi,{...o,as:"button"})}function Ha(o){return tt.createElement(xi,{...o,as:La.div,ref:o.ref,layout:o.layout})}var Ua={Div:Ra,Span:Na,Button:Ga,Img:Ma,mDiv:Ha},$t=Ua;import Ei from"clsx";import Re,{useEffect as pn,useRef as Zr,useState as vo}from"react";import{useEffect as Fa,useState as Ka}from"react";function te(o){let[e,t]=Ka(0);Fa(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import Qr from"react";var jt=Qr.createContext(null);function rt(){let o=Qr.useContext(jt);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import wi,{useCallback as Va,useLayoutEffect as In,useMemo as Xr,useRef as Yr}from"react";import{useIsPresent as Oa}from"motion/react";var st=class st{constructor(e){this.events=new Q;this._forceSkipped=!1;this._idle=!1;this._active=!0;this.config=e,this._state="pending",this.autoForwardScheduler=new Qn,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(st.Events.complete):this.safeEmit(st.Events.requestComplete))}forceSkip(){this._active&&(this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(st.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(st.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",e.getPreference(J.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(st.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(st.Events.onFlush),this}onFlush(e){return this.events.on(st.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(J.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(st.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(J.Preferences.gameSpeed))}};st.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var be=st;function Rn({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n,active:i=!0}){let r=Oa(),s=i&&r,a=Yr(!1),c=Yr(o),l=c.current!==o,p=Xr(()=>o.sentence?.evaluate(he.getCtx({gameState:n})),[o.sentence,n]),u=Xr(()=>new be({useTypeEffect:t,action:o,evaluatedWords:p||[],gameState:n,suppressInitialAnimation:l}),[o,n,t,p]),d=n.game.config.dialog,g=Va(f=>{!s||a.current||(a.current=!0,e?.(f))},[s,e]);return In(()=>{a.current=!1},[u]),In(()=>{c.current=o},[o]),In(()=>(u.setActive(s),()=>{u.setActive(!1)}),[u,s]),In(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",u),u.events.on(be.Events.complete,f=>{n.logger.log("NarraLeaf-React: Say","Complete",u.isIdle()),s&&(u.isIdle()||f?g(!1):u.setIdle(!0))}).cancel),[u,g,n,s]),In(()=>n.events.on(P.EventTypes["event:state.player.skip"],f=>{s&&(f?(u.setIdle(!0),u.forceSkip()):u.isIdle()?g(!0):u.forceSkip())}).cancel,[u,g,n,s]),wi.createElement(wi.Fragment,null,wi.createElement(jt,{value:u},wi.createElement(d,null)))}import{useEffect as ki,useState as Ba}from"react";import{useEffect as Wa,useState as za}from"react";function qt(o){let e=k(),[t,n]=za(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return Wa(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var un=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(un||{});function Pi({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=k(),[s]=qt("nextAction"),[a]=Ba(()=>new be({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e}));return ki(()=>{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]),ki(()=>{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]),ki(()=>{let c=a.events.on(be.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),ki(()=>{let c=a.events.on(be.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function*To(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Le.isPause(n.text)){yield Le.from(n.text);continue}for(let i=0;i<n.text.length;i++){let r=n.text[i];r===`
|
|
35
35
|
`?yield`
|
|
36
|
-
`:yield{text:r,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function
|
|
36
|
+
`:yield{text:r,config:n.config,tag:t,tag2:i,cps:n.config.cps}}}}function So(o){let e=To(o),t=[];for(let n of e)Le.isPause(n)||t.push(n);return t}function _r(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
|
|
39
|
-
`?
|
|
40
|
-
`&&
|
|
41
|
-
`?
|
|
42
|
-
`?await
|
|
43
|
-
`?
|
|
44
|
-
This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function gc({children:o,name:e,propagate:t}){let n=w(),[i]=Z(),{path:r,router:s,consumedBy:a}=Hn(),c=s.joinPath(r,e),l=Mi(()=>s.createToken(c+"@layout")),p=s.getCurrentPath(),u=hc(!1),d=m=>{u.current=m,i()},h=s.matchPath(p,c);if(Gn(),Hi(m=>{let v=m.matchPath(m.getCurrentPath(),c);if(u.current&&!v){if(!o){d(!1);return}m.registerUnmountingPath(l)}v&&m.isPathsUnmounting()&&m.unregisterUnmountingPath(l),v&&!u.current&&!m.isTransitioning()&&d(!0)},[h,o]),fc(()=>{if(!h)return;let m=s.mount(c);return()=>{m.cancel()}},[c,s,h]),a)throw new x("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Un.createElement(Fn,{path:c},Un.createElement(Gi,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),d(!1)}},h&&u.current&&o))}function rs({children:o}){return Gn(),Un.createElement(Fn,{path:It.rootPath},Un.createElement(bi,{"data-layout-path":It.rootPath,key:It.rootPath},o))}var wo=yc(null);function Tc(){return vc(wo)}function bc({children:o,name:e}){let[t]=Z(),{path:n,router:i,consumedBy:r}=Hn(),s=Tc(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,p=Mi(()=>i.createToken(l+"@page")),u=i.getCurrentPath(),d=!a,h=Sc(!1),m=f=>{h.current=f,t()},v=d&&i.exactMatch(u,n)||i.exactMatch(u,l);if(r&&r!==c)throw new x("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");Gn(),Hi(f=>{let T=d&&f.exactMatch(f.getCurrentPath(),n)||f.exactMatch(f.getCurrentPath(),l);if(h.current&&!T){if(!o){m(!1);return}f.registerUnmountingPath(p)}T&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(p),T&&!h.current&&!f.isTransitioning()&&m(!0)},[v,o]),ss(()=>{if(!v)return;let f=d?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{f.cancel()}},[l,v]),ss(()=>()=>{i.unregisterUnmountingPath(p),m(!1)},[]);let g=xo.createElement(Fn,{path:n,consumedBy:c},xo.createElement(Gi,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(p),m(!1)}},v&&h.current&&o));return(f=>s?xo.createElement(wo,{value:{name:null}},f):f)(g)}import ko,{useCallback as Ac,useEffect as Po,useImperativeHandle as Cc,useMemo as as,useRef as Eo,useState as xc}from"react";var wc=50,kc={position:"relative",width:"100%",height:"100%",overflow:"hidden"},cs={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function Pc(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function ls(o,e){return e==null?o:Math.max(o,e)}function Ec(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 us=ko.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=Eo(null),[m,v]=xc({...cs,width:"0px",height:"0px"}),g=Eo(p),S=Eo(null);Po(()=>{g.current=p},[p]);let f=Ac(()=>{let I=h.current;if(!I)return;let N=I.clientWidth,X=I.clientHeight;if(N<=0||X<=0||e<=0)return;let he=Ec(N,X,e),ge=ls(he.width,n),ye=ls(he.height,i),Re=S.current;(!Re||Re.width!==ge||Re.height!==ye)&&(S.current={width:ge,height:ye},v({...cs,width:`${ge}px`,height:`${ye}px`}));let Ne=t>0?ge/t:1;g.current?.({width:ge,height:ye,scale:Ne,containerWidth:N,containerHeight:X})},[e,t,n,i]),T=as(()=>ur(f,typeof r=="number"?r:wc),[f,r]);Po(()=>{f()},[f]),Po(()=>{let I=new ResizeObserver(()=>{T()});h.current&&I.observe(h.current);let N=()=>{T()};return window.addEventListener("resize",N),()=>{I.disconnect(),window.removeEventListener("resize",N)}},[T]),Cc(d,()=>({requestUpdate:f}),[f]);let C=as(()=>Pc(l),[l]);return ko.createElement("div",{id:c,ref:h,style:kc,...C},ko.createElement("div",{className:s,style:{...m,...a}},u))}),ps=us;function Dc(){return w().getLiveGame()}import Io from"react";import Lc,{createContext as Ic,useContext as Rc,useEffect as Nc,useState as ds}from"react";var Mc={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},ms=Ic({state:Mc,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function mt(){return Rc(ms)}function Do(){let{dialogs:o}=mt();return o}function Gc(){let{isActive:o}=mt();return o}function Hc(){let{isVisible:o}=mt();return o}function Lo({children:o}){let t=w().getLiveGame().getGameState(),[n,i]=ds(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=ds(null);Nc(()=>{let c=m=>({...m,dialogs:[...m.dialogs]}),l=t.events.on(k.EventTypes["event:state.nvl.enter"],(m,v)=>{i(c(t.getNvlState())),s(v?.showTransition||null)}),p=t.events.on(k.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState())),s(null)}),u=t.events.on(k.EventTypes["event:state.nvl.dialogAppend"],()=>{i(c(t.getNvlState()))}),d=t.events.on(k.EventTypes["event:state.nvl.visibilityChange"],(m,v)=>{i(c(t.getNvlState())),s(v||null)}),h=t.events.on(k.EventTypes["event:state.nvl.change"],m=>{i(c(m))});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 Lc.createElement(ms.Provider,{value:a},o)}import{AnimatePresence as Uc,motion as Fc}from"motion/react";import Kc from"clsx";function Ro({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=mt(),{ratio:r}=pe(),s=w(),a=i?.duration?i.duration/1e3:.3;return Io.createElement(Uc,null,n&&Io.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},Io.createElement(Fc.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:Kc("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 No({renderDialogItem:o,dialogs:e}){return jt.createElement(Ro,{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(Nt,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=jt.createElement(Rt,{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 Be,{useMemo as Vc}from"react";import fs from"clsx";function Oc({children:o,className:e,style:t,renderDialogItem:n}){let i=Do(),{state:r}=mt();return Be.createElement("div",{"data-element-type":"nvl-dialog-list",className:fs("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>Be.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},Be.createElement(Wc,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?Be.createElement(Nt,{className:"nvl-character-name font-bold mr-2"}):null,texts:Be.createElement(Rt,{className:"nvl-dialog-text"})}):o?Be.Children.map(o,c=>Be.isValidElement(c)?Be.cloneElement(c,{entry:s,index:a}):c):Be.createElement(hs,{entry:s,index:a})))))}function hs({entry:o,index:e,className:t,style:n,texts:i}){let r=w(),s=o.character?.state.name||null,a=Ye(o.character?.config.color||r.config.defaultTextColor),c=i??Be.createElement(Rt,{className:"nvl-dialog-text"});return Be.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:fs("nvl-dialog-item",t),style:n},s&&Be.createElement("span",{className:"nvl-character-name font-bold mr-2",style:{color:a}},s,":"),c)}function Wc({entry:o,children:e}){let n=w().getLiveGame().getGameState(),i=Vc(()=>o.sentence.evaluate(ue.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=ki({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return Be.createElement(Bt,{value:c},e)}function ys({state:o}){let e=w(),t=pt(),n=Mo(null),i=Mo(null),r=Mo(!1),[s]=_e(Q.Preferences.skipDelay),[a]=_e(Q.Preferences.skipInterval),[c]=$t("skipAction");return Bc(()=>{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(Q.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let m=()=>{n.current=setInterval(()=>{o.events.emit(k.EventTypes["event:state.player.skip"],!1)},a)};p(),o.events.emit(k.EventTypes["event:state.player.skip"],!1),r.current=!0,s===0?m():i.current=setTimeout(m,s)}},d=h=>{e.keyMap.match("skipAction",h.key)&&p()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",u).cancel,m=e.getLiveGame().onWindowEvent("keyup",d).cancel;return()=>{p(),h(),m()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",u).cancel,m=e.getLiveGame().onPlayerEvent("keyup",d).cancel;return()=>{p(),h(),m()}}},[t,s,a,c]),gs.createElement(gs.Fragment,null)}import vs,{useEffect as $c}from"react";function jc(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Ss=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],qc=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]'];function Qc(o,e){return!o||e&&Ss.some(t=>!!o.closest(t))?!1:[...qc,...Ss].some(t=>!!o.closest(t))}function Ts(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 bs({state:o}){let e=w();return $c(()=>{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)||!Ts(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!Ts(i,s))||jc(r)||Qc(r,o.isNvlMode())||(o.events.emit(k.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]),vs.createElement(vs.Fragment,null)}import{useEffect as Kn}from"react";function Go({gameState:o}){let e=o.audioManager,[t]=_e("voiceVolume"),[n]=_e("bgmVolume"),[i]=_e("soundVolume"),[r,s]=_e("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 Fi,useRef as Jc}from"react";import Ho,{createContext as Xc,useContext as Yc,useState as As}from"react";var qt=class qt{constructor(){this.preloaded=[];this.events=new J}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(qt.EventTypes["event:preloaded.add"],e),this.events.emit(qt.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(qt.EventTypes["event:preloaded.remove"],e),this.events.emit(qt.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return De.getSrc(e)}};qt.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.unmount":"event:preloaded.unmount"};var $e=qt;var Ui=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 dr(e,{...n,signal:t})}has(e){return this.src.has(e)}add(e,t){return this.src.set(e,t),this}remove(e){return this.src.delete(e),this}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(u=>{this.preloadTasks.delete(t),u&&this.add(t,u)}).catch(u=>{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 Uo=Xc(null);function Cs({children:o}){let e=w(),[t]=As(()=>new $e),[n]=As(()=>new Ui(e));return Ho.createElement(Ho.Fragment,null,Ho.createElement(Uo,{value:{preloaded:t,cacheManager:n}},o))}function pn(){if(!Uo)throw new Error("usePreloaded must be used within a PreloadedProvider");return Yc(Uo)}function xs({state:o}){let{preloaded:e,cacheManager:t}=pn(),n=w(),i=Jc(new Set),[r]=Z(),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($e.EventTypes["event:preloaded.unmount"])}return Fi(()=>o.events.on(k.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Fi(()=>{if(typeof fetch>"u")return e.events.emit($e.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($e.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=De.catSrc([...a.srcManager?.src||[],...a.srcManager?.getFutureSrc()||[]]),h=new Sn(n.config.preloadConcurrency,n.config.preloadDelay),m=[],v=o.logger.group(s,!0),g=[];o.logger.debug(s,"preloading:",d,a);for(let S of d.image){let f=De.getSrc(S);if(f){if(m.push(f),t.has(f)||t.isPreloading(f)||g.includes(f)){o.logger.debug(s,`Image already loaded (${d.image.indexOf(S)+1}/${d.image.length})`,f),g.push(f);continue}g.push(f),h.addTask(()=>new Promise(T=>{t.preload(o,f).onFinished(()=>{o.logger.debug(s,`Image loaded (${d.image.indexOf(S)+1}/${d.image.length})`,f),T()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${d.image.indexOf(S)+1}/${d.image.length})`,f),T()})}))}}return v.end(),h.start().then(()=>{o.logger.info(s,"Image preload",`loaded ${t.size()} images in ${performance.now()-u}ms`),n.config.waitForPreload&&e.events.emit($e.EventTypes["event:preloaded.ready"]),t.filter(m)}),n.config.waitForPreload||e.events.emit($e.EventTypes["event:preloaded.ready"]),e.events.emit($e.EventTypes["event:preloaded.mount"]),p},[a,l]),Fi(()=>{i.current.clear()},[a]),Fi(()=>{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(f=>De.getPreloadableSrc(l,f)).filter(function(f){return f!==null});d.filter(function(f){return f?.activeType==="scene"}).forEach(f=>{i.current.has(f)||i.current.add(f)});let m=De.catSrc([...i.current,...d]),v=new Sn(n.config.preloadConcurrency,n.config.preloadDelay),g=[],S=o.logger.group(s);o.logger.debug(s,"preloading:",m);for(let f of m.image){let T=De.getSrc(f);if(T){if(g.push(T),t.has(T)||t.isPreloading(T)){o.logger.debug(s,`Image already loaded (${m.image.indexOf(f)+1}/${m.image.length})`,T);continue}v.addTask(()=>new Promise(C=>{t.preload(o,T).onFinished(()=>{o.logger.debug(s,`Image loaded (${m.image.indexOf(f)+1}/${m.image.length})`,T),C()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${m.image.indexOf(f)+1}/${m.image.length})`,T),C()})}))}}S.end(),v.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 Zc from"clsx";import ft,{useCallback as Fo,useMemo as _c,useRef as el}from"react";function Ko({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=w(),a=el([]),c=Fo(m=>(a.current.push(m),a.current.indexOf(m)),[]),l=Fo(m=>{let v=a.current.indexOf(m);v!==-1&&a.current.splice(v,1)},[]),p=Fo(m=>a.current.indexOf(m),[]),u=s.config.menu,d=_c(()=>e.map(m=>({...m,words:m.prompt.evaluate(ue.getCtx({gameState:n}))})),[]);function h(m){t(m)}return ft.createElement(ft.Fragment,null,ft.createElement(To,{value:{evaluated:d,choose:h,gameState:n}},ft.createElement(bo,{value:{register:c,unregister:l,getIndex:p}},ft.createElement(dt,{className:"absolute"},r&&o&&ft.createElement(Rn,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),ft.createElement(zt.Div,{color:"green",border:"dashed",className:Zc("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},ft.createElement(u,{items:d.map((m,v)=>v)})))))}function ws({items:o}){return ft.createElement(Ai,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>ft.createElement(Li,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import zi from"react";import Ki from"react";import Vo,{useEffect as ks,useLayoutEffect as Ps,useRef as Es,useState as Oo}from"react";function dn({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c}){let[l,p]=Oo(null),[u,d]=Oo(null),h=Vo.useRef(null),[m]=Oo(()=>new Qn("displayable.refGroup")),v=Es(m.next()),g=Es(Ne()),f=w().getLiveGame().getGameState(),T=typeof a=="function"?a(l):a,[C]=Z([u,l,g]);ks(()=>f.events.depends([f.events.on(k.EventTypes["event:state.player.skip"],Re)]).cancel,[u,l,g]),Ps(()=>{if(I(),!l)return;if(g.current.some(([$])=>!$.current))throw new x("Displayable: Trying to access transition groups before they are mounted");let{controller:R,task:L}=l;return R.onUpdate($=>{g.current.forEach(([P],M)=>{let K=L.resolve[M],ee=typeof K=="function"?K:K.resolver;if(!ee)throw new x(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${M}])`);let oe=ee(...$),E=H(T[M]||T[T.length-1]||{},oe);X(P,c?c(E):E)})}).cancel},[l]),ks(()=>{if(!h.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),Ps(()=>{let R=e.toStyle(f,i);Object.assign(h.current.style,R),f.logger.debug("Displayable","Initial style applied",h.current,R)},[]);function I(){let R=typeof a=="function"?a(l):a;if(!g.current||!g.current.length)throw new x("Displayable: Transition group refs are not initialized correctly");if(g.current.some(([L])=>!L.current))throw new x("Displayable: Trying to access transition groups before they are mounted");g.current.forEach(([L],z)=>{if(!L.current)throw new x("Displayable: Trying to assign properties to unmounted element");X(L,R[z]||R[R.length-1]||{})})}function N(R){f.logger.debug("Displayable","Transform applied",e.toStyle(f,i),h.current),C(),r?.(R)}function X(R,L){if(!R.current)throw new x("Displayable: Trying to assign properties to unmounted element");let z=R.current,$={},P={};Object.keys(L).forEach(K=>{let ee=K;ee==="style"&&L.style?Object.assign($,L.style):L[ee]!==void 0&&ee!=="key"&&(P[ee]=L[ee])}),Object.keys($).length>0&&Object.assign(z.style,$);let M=c?c(P):P;for(let[K,ee]of Object.entries(M))z.getAttribute(K)!==ee&&z.setAttribute(K,ee)}function he(R,L){u&&(u.abort(),d(null));let z=R.animate(e,{gameState:f,ref:h,overwrites:i}),$=new Te(z);return f.timelines.attachTimeline($),z.onSkipControllerRegister(P=>{P.onAbort(()=>{$.abort(),d(null)})}),d(z),z.then(()=>{d(null),N(R),L()}),$}function ge(R,L){l&&l.controller.complete();let z=R.createTask(f),$=R.requestAnimations(z.animations),P=new y().registerSkipController(new G($.cancel)),M=new Te(P);P.skipController.onAbort(()=>{$.cancel()}),$.onCanceled(()=>{M.abort(),p(null),f.logger.debug("Displayable","Transition cancelled",R)}),f.timelines.attachTimeline(M),p({task:z,controller:$,transition:R,resolve:L});let K;if(g.current=z.resolve.map(oe=>{let E=Vo.createRef(),Ge=typeof oe=="function"?void 0:oe.key;if(!Ge)return[E,m.next()];if(Ge==="target")return K=m.next(),[E,K];if(Ge==="current")return[E,v.current];throw new x("Displayable: Invalid key type")}),!K)throw new x("Displayable: No target key found");v.current=K;let ee=g.current.map(([oe])=>{let E=oe.current;return E?.waitForLoad?E.waitForLoad():Promise.resolve()});return Promise.all(ee).then(()=>{$.start(),$.onComplete(()=>{ot(),p(null),s?.(R),L(),P.resolve()})}),M}function ye(R){return f.logger.debug("initDisplayable",o),he(q.immediate(e.get()),R)}function Re(){t&&u&&(u.abort(),d(null),f.logger.debug("transform skipped")),n&&l&&(l.controller.complete(),f.logger.debug("transition skipped"))}function Ne(){return[[Vo.createRef(),v.current]]}function ot(){g.current.forEach(([R])=>{R.current=null}),g.current=Ne()}return{transformRef:h,transitionRefs:g.current,isTransforming:!!u,transitionTask:l,initDisplayable:ye,applyTransform:he,applyTransition:ge,updateStyleSync:I,deps:[u,l,g]}}import{useEffect as tl}from"react";function Mt(o,e,t=[]){let i=w().getLiveGame().getGameState();return tl(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function Wo({state:o,text:e}){let{ratio:t}=pe(),[n]=Z(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyTransition:c,updateStyleSync:l,deps:p,isTransforming:u}=dn({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:d=>({width:"fit-content",transform:q.propToCSSTransform(o,d,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return Mt(e,{initDisplayable:s,applyTransform:a,applyTransition:c,flush:n,updateStyleSync:l},[...p]),Ki.createElement(zt.Div,{"data-element-type":"text"},Ki.createElement(zt.mDiv,{tag:"text.container",color:"green",border:"dashed",layout:u,ref:i,className:"absolute"},r.map(([d,h])=>Ki.createElement("span",{key:h,ref:d,className:e.config.className},Ki.createElement("span",null,e.state.text)))))}import mn,{useRef as Is,useState as Rs}from"react";import Vi,{useEffect as zo,useRef as Oi,forwardRef as nl}from"react";var Ds=nl(({onSizeChanged:o,onLoad:e,autoFit:t=!1},n)=>{let i=Oi(null),{ratio:r}=pe(),[s,a]=Vi.useState(()=>r.state.width),[c,l]=Vi.useState(()=>r.state.height),p=w(),u=Oi(!1),d=Oi(null),h=Oi(null);Vi.useImperativeHandle(n,()=>i.current,[]),zo(()=>{i.current&&Object.defineProperties(i.current,{isLoaded:{value:()=>u.current,configurable:!0},waitForLoad:{value:()=>u.current?Promise.resolve():(d.current||(d.current=new Promise(g=>{h.current=g})),d.current),configurable:!0}})},[]),zo(()=>(m(),r.onUpdate(m)),[o]),zo(()=>{let g=new MutationObserver(S=>{S.forEach(f=>{f.type==="attributes"&&f.attributeName==="src"&&i.current&&m()})});return i.current&&g.observe(i.current,{attributes:!0}),()=>{g.disconnect()}},[o]);function m(){if(i.current&&i.current.naturalWidth)if(i.current.naturalWidth*i.current.naturalHeight===1){let g=r.state.width,S=r.state.height,f=`${g} / ${S}`;a(g),l(S),i.current.style.aspectRatio=f,o&&o(g,S)}else{let g=t?p.config.width/i.current.naturalWidth:1,S=i.current.naturalWidth*r.state.scale*g,f=i.current.naturalHeight*r.state.scale*g;a(S),l(f),i.current.style.aspectRatio="auto",o&&o(S,f)}}function v(){m(),u.current=!0,h.current&&(h.current(),h.current=null,d.current=null),e&&e()}return Vi.createElement("img",{ref:i,onLoad:v,width:s,height:c,alt:""})});Ds.displayName="AspectScaleImage";var Ls=Ds;import Ns from"clsx";import{motion as il}from"motion/react";function Wi({image:o,state:e}){let[t]=Rs(()=>new J),[n,i]=Rs([]),{cacheManager:r}=pn(),s=Is([]),a=Is(null),{transformRef:c,transitionRefs:l,isTransforming:p,initDisplayable:u,applyTransition:d,applyTransform:h,updateStyleSync:m,deps:v}=dn({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:f=>{let T=f?f.transition._getCurrentSrc():o.state.currentSrc;return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:A.isColor(T)?A.colorToString(T):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:A.isImageSrc(T)?A.srcToURL(T):U.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:f=>f.src?(!A.isDataURI(f.src)&&!r.has(f.src)&&!r.isPreloading(f.src)&&!s.current.includes(f.src)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${f.src}".
|
|
38
|
+
`&&n.tag===e.tag?[...t.slice(0,-1),{...e,text:n.text+e.text,config:e.config}]:[...t,e]})}function $a(o,e,t){return t||(o!==void 0?ae.formatStaticWord(o):e?e.text.flatMap(n=>typeof n.text=="function"?[]:new $(n.text,n.config)):[])}function ja(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 Jr(o,e){let t=Math.max(.01,o),n=Math.max(.01,e);return 1e3/(t*n)}function Di(o){return o===void 0?void 0:en(o)}function bo({defaultColor:o,className:e,style:t,dialog:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,...c}){let l=k(),p=l.getLiveGame().getGameState(),u=Zr(null),[d,g]=vo(()=>n&&!n.config.useTypeEffect?So(n.config.evaluatedWords):[]),[f,T]=te();if(!n)throw new Error("Dialog state is required");pn(()=>{if(!(!n.config.action.sentence||u.current))return p.logger.info("Initializing the sentence",n,u.current),p.schedule(({onCleanup:A})=>{if(!n.config.useTypeEffect){n.dispatchComplete();return}g([]),u.current=h(),f(),u.current.onComplete(()=>{n.dispatchComplete()}),A(()=>{u.current?.timeline?.abort()})},0)},[]),pn(()=>n.events.depends([n.events.on(be.Events.requestComplete,()=>{u.current?.interact()}),n.events.on(be.Events.forceSkip,()=>{n.isEnded()||u.current?.forceSkip()})]).cancel,[n,T]),pn(()=>l.preference.events.depends([l.preference.onPreferenceChange(J.Preferences.gameSpeed,()=>{u.current?.update()}),l.preference.onPreferenceChange(J.Preferences.autoForward,()=>{u.current?.update()}),l.preference.onPreferenceChange(J.Preferences.cps,()=>{u.current?.update()})]).cancel,[]);function h(){let A=new v,N=new we(A).setGuard(p.guard),j=new Set,W=new Set,ce=new Set,Me=To(n.config.evaluatedWords),Ce=null,bt=[],R=[],M=()=>{bt.forEach(q=>q()),bt.length=0},ie=()=>{if(R.length!==0)return{done:!1,value:R.shift()};let{done:q,value:L}=Me.next();return{done:q,value:L}},ee=q=>{let L=K=>{q(K),W.delete(L)};return W.add(L),{cancel:()=>{W.delete(L)}}},le=q=>{_r(g,q)},ye=(q=!1)=>{let L=!1;for(;!L;){let{done:K,value:Z}=ie();if(K){L=!0;break}if(Le.isPause(Z)){if(q)continue;L=!0,R.push(Z);break}else Z===`
|
|
39
|
+
`?g(x=>[...x,Z]):typeof Z=="object"&&"text"in Z&&!j.has(Z)&&(j.add(Z),le(Z))}Ce&&!Ce.isSettled()?Ce.abort():(ce.forEach(K=>K()),A.resolve())};return p.schedule(async q=>{let L=!1,K=!1;for(;!L;){let{done:Z,value:x}=ie();if(Z){L=K=!0;break}let We=new v;if(p.timelines.attachTimeline(We),We.registerSkipController(new G(()=>{M(),L=!0,q.retry()})),We.onSettled(()=>{M()}),Ce=We,Le.isPause(x)){let Ct=Le.from(x),Bn=l.preference.getPreference(J.Preferences.gameSpeed);if(Ct.config.duration){let $n=Ct.config.duration/Bn;await ei($n)}else{let $n=l.preference.getPreference(J.Preferences.autoForward),jn=v.race([v.create(ea=>{let ta=ee(na=>{na(),ea.resolve()});bt.push(()=>ta.cancel())}),...$n?[v.delay(l.config.autoForwardDefaultPause/Bn)]:[]]);p.timelines.attachTimeline(jn),await v.wait(jn)}}else{if(x!==`
|
|
40
|
+
`&&j.has(x))continue;j.add(x),le(x);let{gameSpeed:Ct,cps:Bn}=l.preference.getPreferences(),jn=1e3/((typeof x=="object"&&"cps"in x&&x.cps!==void 0?x.cps:Bn)*Ct);await ei(jn)}}K&&(ce.forEach(Z=>Z()),A.resolve())},0),{getToken:()=>A,interact:()=>{let q=!1;W.forEach(L=>L(()=>q=!0)),!q&&ye()},update:()=>{Ce&&Ce.abort()},forceSkip:()=>{ye(!0)},timeline:N,onComplete:q=>(ce.add(q),{cancel:()=>{ce.delete(q)}})}}let S=n.config.action.sentence;if(!S)return null;let m=s??"bold",y={fontWeight:S.config.bold?m:r,fontSize:S.config.fontSize??i,color:Di(S.config.color??o),fontFamily:S.config.fontFamily??a,fontStyle:S.config.italic?"italic":void 0},E=A=>({fontWeight:A.config.bold||S.config.bold?m:r,fontSize:A.config.fontSize??S.config.fontSize??i,color:Di(A.config.color??S.config.color??o),fontFamily:A.config.fontFamily??S.config.fontFamily??a,fontStyle:A.config.italic??S.config.italic?"italic":void 0}),O=(A,N)=>A===`
|
|
41
|
+
`?Re.createElement("br",{key:N}):Re.createElement($t.Span,{tag:`say.word.${N}`,key:N,style:{...E(A),...ti(l.config.app.debug,{outline:"1px dashed red"})},className:Ei("inline-block break-all",A.config.className)},A.config.ruby?Re.createElement("ruby",{className:"align-bottom inline-block"},Re.createElement("rt",{className:"block text-center"},A.config.ruby),A.text):A.text);return Re.createElement("div",{...c,className:Ei("whitespace-pre-wrap",e),style:{...y,...t}},d.map(O))}function qa({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:g,fontWeightBold:f,fontFamily:T,onCompleted:h,...S}){let m=Fr(),[,y]=vo(0),E=m?.config??J.DefaultConfig,O=m?.preference.getPreferences()??J.DefaultPreference,A=s??O.cps,N=a??O.gameSpeed,j=c??E.autoForwardDefaultPause,W=r??E.autoForwardDefaultPause,ce=Re.useMemo(()=>$a(o,e,t),[o,e,t]),Me=Re.useMemo(()=>ja(i,r,W),[i,r,W]),Ce=Zr(h),[bt,R]=vo(()=>n?[]:So(ce));pn(()=>{if(m)return m.preference.onPreferenceChange(()=>{y(I=>I+1)}).cancel},[m]),pn(()=>{Ce.current=h},[h]),pn(()=>{let I=!1,oe=[],Ve=Math.max(.01,N),ve=K=>new Promise(Z=>{let x=setTimeout(Z,Math.max(0,K));oe.push(x)}),q=()=>{I||Ce.current?.()};return n?ce.length===0?(R([]),()=>{I=!0}):((async()=>{do{let K=To(ce);for(R([]);!I;){let{done:Z,value:x}=K.next();if(Z)break;if(Le.isPause(x)){let We=Le.from(x);await ve((We.config.duration??j)/Ve)}else _r(R,x),x===`
|
|
42
|
+
`?await ve(Jr(A,N)):await ve(Jr(x.cps??A,N))}if(I)return;q(),Me.enabled&&await ve(Me.delay)}while(!I&&Me.enabled)})(),()=>{I=!0,oe.forEach(K=>clearTimeout(K))}):(R(So(ce)),q(),()=>{I=!0})},[ce,n,Me,A,N,j]);let M=e?.config,ie=f??"bold",ee={fontWeight:M?.bold?ie:g,fontSize:M?.fontSize??d,color:Di(M?.color??l),fontFamily:M?.fontFamily??T,fontStyle:M?.italic?"italic":void 0},le=I=>({fontWeight:I.config.bold||M?.bold?ie:g,fontSize:I.config.fontSize??M?.fontSize??d,color:Di(I.config.color??M?.color??l),fontFamily:I.config.fontFamily??M?.fontFamily??T,fontStyle:I.config.italic??M?.italic?"italic":void 0}),ye=(I,oe)=>I===`
|
|
43
|
+
`?Re.createElement("br",{key:oe}):Re.createElement("span",{key:oe,style:le(I),className:Ei("inline-block break-all",I.config.className)},I.config.ruby?Re.createElement("ruby",{className:"align-bottom inline-block"},Re.createElement("rt",{className:"block text-center"},I.config.ruby),I.text):I.text);return Re.createElement("div",{...S,className:Ei("whitespace-pre-wrap",p),style:{...ee,...u}},bt.map(ye))}function es(o){return Re.createElement(bo,{...o,key:o.dialog?.config.action.id})}function Qa({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=Pi({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Re.createElement(bo,{...r,dialog:s,key:s.config.action.id})}function Xa(o){let e=rt();return Re.createElement(bo,{...o,dialog:e,key:e.config.action.id})}function Ut(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Re.createElement(Qa,{...o}):Re.createElement(Xa,{...o})}var Ya=Ut;import Ii,{useEffect as Ja,useLayoutEffect as Za,useMemo as is,useRef as _a,useState as ec}from"react";import Li from"react";var Co=Li.createContext(null);function ts(){let o=Li.useContext(Co);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var Ao=Li.createContext(null);function ns(){let o=Li.useContext(Ao);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Ri({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let c=_a(null),{register:l,unregister:p,getIndex:u}=ns(),[d,g]=ec(-1),{choose:f,evaluated:T,gameState:h}=ts(),S=d===-1?null:T[d],m=is(()=>he.getCtx({gameState:h}),[h]),{hidden:y,disabled:E}=is(()=>{if(!S)return{hidden:!1,disabled:!1};let N=S.config.hidden?.evaluate(m)?.value??!1,j=!N&&(S.config.disabled?.evaluate(m)?.value??!1);return{hidden:N,disabled:j}},[S,m]);Za(()=>{if(!c.current)return;let N=c;l(N);let j=u(N);return g(j),c.current.dataset.index=j.toString(),()=>p(N)},[l,p,u]),Ja(()=>{if(!t)return;let N=j=>{j.key.toLowerCase()===t.toLowerCase()&&!j.ctrlKey&&!j.metaKey&&(j.preventDefault(),j.stopPropagation(),O())};return window.addEventListener("keydown",N,!0),()=>{window.removeEventListener("keydown",N,!0)}},[t]);function O(){if(d===-1||!T[d]||y||E)return;let N=T[d];f({...N,evaluated:$.getText(N.words||[])})}let A=S&&!y;return Ii.createElement(Ii.Fragment,null,Ii.createElement("button",{className:o,style:{...e,display:A?e?.display??void 0:"none"},onClick:O,ref:c,disabled:E},A&&Ii.createElement(es,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new be({useTypeEffect:!1,action:{sentence:S.prompt,words:S.words,character:null},gameState:h,evaluatedWords:S.words})})))}import Ni from"react";import{AnimatePresence as tc}from"motion/react";function Mi({children:o,...e}){let t=tc;return Ni.createElement(Ni.Fragment,null,Ni.createElement("div",{...e},Ni.createElement(t,null,o)))}import os from"react";function Et({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=os.useContext(jt),c=e??o?.character??a?.config.action.character??null,l=n??c?.config.color,p=i??t??c?.state.name;return os.createElement("div",{...s,style:{color:l?en(l):void 0,...r}},p)}import nc from"clsx";import ic from"react";function rs(){let o=rt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return sc(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?U.getSrcURL(s):null,c=s&&U.isTagSrc(s)?[...s.state.currentSrc]:null,l=Rr({character:n,sentence:i,portrait:s,currentSrc:a,tags:c,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),p=rc(l.source);return{visible:!!p,src:p,character:l.character,portrait:l.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function oc({className:o,style:e,alt:t,...n}){let i=rs();return!i.visible||!i.src?null:ic.createElement("img",{...n,"data-element-type":"dialog-avatar",className:nc("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 rc(o){return o?C.srcToURL(o):null}function sc(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var xo=oc;import{useEffect as ac}from"react";function cc(){let o=rt(),[e]=te(o.deps),t=$.getText(o.config.evaluatedWords);return ac(()=>o.events.on(be.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 Gi,useEffect as wo,useMemo as lc,useRef as uc,useState as ss}from"react";function pc(){let o=rt(),[e]=te(o.deps),[t,n]=ss(!0),[i,r]=ss(!0),s=uc(null),a=o.config.gameState,c=o.config.action.sentence,l=c?.config.voiceId??null;wo(()=>o.events.on(be.Events.onFlush,()=>{e()}).cancel,[o]);let p=lc(()=>{if(!c)return null;try{return it.getVoice(a,c)}catch{return null}},[a,c,l,c?.config.voice]);wo(()=>{s.current=null,r(!0)},[c]),wo(()=>{let T=!1,h=null,S=null,m=null;if(!p){n(!0);return}n(!1);let y=()=>{T||n(!0)};h=a.audioManager.getToken(p),h&&(h.isPlaying()||n(!0),S=()=>y(),m=()=>y(),h.once("ended",S),h.once("stop",m));let E=a.events.on(P.EventTypes["event:state.player.lineEnd"],()=>{y()});return()=>{T=!0,E.cancel(),h&&S&&h.off("ended",S),h&&m&&h.off("stop",m)}},[a,p]);let u=Gi(async T=>{let h=T??p;if(!h)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let S=h instanceof URL?ue.voice(h.toString()):typeof h=="string"?ue.voice(h):h,m=await a.getLiveGame().playSound(S);s.current=m;let y=()=>{r(!0)};return m.once("ended",y),m.once("stop",y),m},[a,p]),d=Gi(()=>p,[p]),g=Gi(()=>l,[l]),f=Gi(()=>p?.getSrc()??null,[p]);return{done:t&&i,voice:p,playVoice:u,getVoice:d,getVoiceId:g,getVoiceSrc:f}}import ko,{createContext as Ac,useContext as xc,useEffect as ls,useRef as wc}from"react";import{useState as dc}from"react";function Hi(o){let[e]=dc(o);return e}import{AnimatePresence as mc}from"motion/react";var Ui=mc;import Hn,{createContext as vc,useContext as Sc,useEffect as Tc,useRef as bc}from"react";import{useEffect as Nn,useLayoutEffect as fc}from"react";function hc(){let o=ht(),[e]=te();return Nn(()=>o.onChange(e).cancel,[]),o.getPathname()}function gc(){let{router:o,path:e}=Gn(),[t]=te();return Nn(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function yc(){let o=ht(),[e]=te();return Nn(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function Fi(o,e){let t=ht();fc(()=>t.onUpdate(()=>o(t)).cancel,e),Nn(()=>{o(t)},[])}function Mn(){let o=ht(),[e]=te();return Nn(()=>o.onChange(e).cancel,[]),e}var as=vc(null);function Un({children:o,path:e,consumedBy:t}){let i={router:ht(),path:e,consumedBy:t};return Hn.createElement(as,{value:i},o)}function Gn(){let o=Sc(as);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new w(`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 Cc({children:o,name:e,propagate:t}){let n=k(),[i]=te(),{path:r,router:s,consumedBy:a}=Gn(),c=s.joinPath(r,e),l=Hi(()=>s.createToken(c+"@layout")),p=s.getCurrentPath(),u=bc(!1),d=f=>{u.current=f,i()},g=s.matchPath(p,c);if(Mn(),Fi(f=>{let T=f.matchPath(f.getCurrentPath(),c);if(u.current&&!T){if(!o){d(!1);return}f.registerUnmountingPath(l)}T&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(l),T&&!u.current&&!f.isTransitioning()&&d(!0)},[g,o]),Tc(()=>{if(!g)return;let f=s.mount(c);return()=>{f.cancel()}},[c,s,g]),a)throw new w("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Hn.createElement(Un,{path:c},Hn.createElement(Ui,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),d(!1)}},g&&u.current&&o))}function cs({children:o}){return Mn(),Hn.createElement(Un,{path:Ht.rootPath},Hn.createElement(Ci,{"data-layout-path":Ht.rootPath,key:Ht.rootPath},o))}var Po=Ac(null);function kc(){return xc(Po)}function Pc({children:o,name:e}){let[t]=te(),{path:n,router:i,consumedBy:r}=Gn(),s=kc(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,p=Hi(()=>i.createToken(l+"@page")),u=i.getCurrentPath(),d=!a,g=wc(!1),f=m=>{g.current=m,t()},T=d&&i.exactMatch(u,n)||i.exactMatch(u,l);if(r&&r!==c)throw new w("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");Mn(),Fi(m=>{let y=d&&m.exactMatch(m.getCurrentPath(),n)||m.exactMatch(m.getCurrentPath(),l);if(g.current&&!y){if(!o){f(!1);return}m.registerUnmountingPath(p)}y&&m.isPathsUnmounting()&&m.unregisterUnmountingPath(p),y&&!g.current&&!m.isTransitioning()&&f(!0)},[T,o]),ls(()=>{if(!T)return;let m=d?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{m.cancel()}},[l,T]),ls(()=>()=>{i.unregisterUnmountingPath(p),f(!1)},[]);let h=ko.createElement(Un,{path:n,consumedBy:c},ko.createElement(Ui,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(p),f(!1)}},T&&g.current&&o));return(m=>s?ko.createElement(Po,{value:{name:null}},m):m)(h)}import Eo,{useCallback as Ec,useEffect as Do,useImperativeHandle as Dc,useMemo as us,useRef as Lo,useState as Lc}from"react";var Ic=50,Rc={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 Nc(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function ds(o,e){return e==null?o:Math.max(o,e)}function Mc(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 ms=Eo.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 g=Lo(null),[f,T]=Lc({...ps,width:"0px",height:"0px"}),h=Lo(p),S=Lo(null);Do(()=>{h.current=p},[p]);let m=Ec(()=>{let O=g.current;if(!O)return;let A=O.clientWidth,N=O.clientHeight;if(A<=0||N<=0||e<=0)return;let j=Mc(A,N,e),W=ds(j.width,n),ce=ds(j.height,i),Me=S.current;(!Me||Me.width!==W||Me.height!==ce)&&(S.current={width:W,height:ce},T({...ps,width:`${W}px`,height:`${ce}px`}));let Ce=t>0?W/t:1;h.current?.({width:W,height:ce,scale:Ce,containerWidth:A,containerHeight:N})},[e,t,n,i]),y=us(()=>dr(m,typeof r=="number"?r:Ic),[m,r]);Do(()=>{m()},[m]),Do(()=>{let O=new ResizeObserver(()=>{y()});g.current&&O.observe(g.current);let A=()=>{y()};return window.addEventListener("resize",A),()=>{O.disconnect(),window.removeEventListener("resize",A)}},[y]),Dc(d,()=>({requestUpdate:m}),[m]);let E=us(()=>Nc(l),[l]);return Eo.createElement("div",{id:c,ref:g,style:Rc,...E},Eo.createElement("div",{className:s,style:{...f,...a}},u))}),fs=ms;function Gc(){return k().getLiveGame()}import No from"react";import Hc,{createContext as Uc,useContext as Fc,useEffect as Kc,useState as hs}from"react";var Vc={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},gs=Uc({state:Vc,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function yt(){return Fc(gs)}function Io(){let{dialogs:o}=yt();return o}function Oc(){let{isActive:o}=yt();return o}function Wc(){let{isVisible:o}=yt();return o}function Ro({children:o}){let t=k().getLiveGame().getGameState(),[n,i]=hs(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=hs(null);Kc(()=>{let c=f=>({...f,dialogs:[...f.dialogs]}),l=t.events.on(P.EventTypes["event:state.nvl.enter"],(f,T)=>{i(c(t.getNvlState())),s(T?.showTransition||null)}),p=t.events.on(P.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState())),s(null)}),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,T)=>{i(c(t.getNvlState())),s(T||null)}),g=t.events.on(P.EventTypes["event:state.nvl.change"],f=>{i(c(f))});return()=>{l.cancel(),p.cancel(),u.cancel(),d.cancel(),g.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return Hc.createElement(gs.Provider,{value:a},o)}import{AnimatePresence as zc,motion as Bc}from"motion/react";import $c from"clsx";function Mo({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=yt(),{ratio:r}=ge(),s=k(),a=i?.duration?i.duration/1e3:.3;return No.createElement(zc,null,n&&No.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},No.createElement(Bc.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:$c("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 Qt from"react";function Go({renderDialogItem:o,dialogs:e}){return Qt.createElement(Mo,{className:"bg-black/80 text-white p-16 inset-8"},Qt.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?Qt.createElement(Et,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Qt.createElement(Ut,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Qt.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}):Qt.createElement(Qt.Fragment,null,r,s))})))}import Je,{useMemo as jc}from"react";import ys from"clsx";function qc({children:o,className:e,style:t,renderDialogItem:n}){let i=Io(),{state:r}=yt();return Je.createElement("div",{"data-element-type":"nvl-dialog-list",className:ys("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>Je.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},Je.createElement(Qc,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?Je.createElement(Et,{className:"nvl-character-name font-bold mr-2"}):null,texts:Je.createElement(Ut,{className:"nvl-dialog-text"})}):o?Je.Children.map(o,c=>Je.isValidElement(c)?Je.cloneElement(c,{entry:s,index:a}):c):Je.createElement(vs,{entry:s,index:a})))))}function vs({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??Je.createElement(Ut,{className:"nvl-dialog-text"});return Je.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:ys("nvl-dialog-item",t),style:n},r&&Je.createElement(Et,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function Qc({entry:o,children:e}){let n=k().getLiveGame().getGameState(),i=jc(()=>o.sentence.evaluate(he.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=Pi({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return Je.createElement(jt,{value:c},e)}function Ts({state:o}){let e=k(),t=ht(),n=Ho(null),i=Ho(null),r=Ho(!1),[s]=ot(J.Preferences.skipDelay),[a]=ot(J.Preferences.skipInterval),[c]=qt("skipAction");return Yc(()=>{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=g=>{if(e.keyMap.match("skipAction",g.key)&&e.preference.getPreference(J.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=g=>{e.keyMap.match("skipAction",g.key)&&p()};if(e.config.useWindowListener){let g=e.getLiveGame().onWindowEvent("keydown",u).cancel,f=e.getLiveGame().onWindowEvent("keyup",d).cancel;return()=>{p(),g(),f()}}else{let g=e.getLiveGame().onPlayerEvent("keydown",u).cancel,f=e.getLiveGame().onPlayerEvent("keyup",d).cancel;return()=>{p(),g(),f()}}},[t,s,a,c]),Ss.createElement(Ss.Fragment,null)}import bs,{useEffect as Jc}from"react";function Zc(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Cs=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],_c=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]'];function el(o,e){return!o||e&&Cs.some(t=>!!o.closest(t))?!1:[..._c,...Cs].some(t=>!!o.closest(t))}function As(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 xs({state:o}){let e=k();return Jc(()=>{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)||!As(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!As(i,s))||Zc(r)||el(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]),bs.createElement(bs.Fragment,null)}import{useEffect as Fn}from"react";function Uo({gameState:o}){let e=o.audioManager,[t]=ot("voiceVolume"),[n]=ot("bgmVolume"),[i]=ot("soundVolume"),[r,s]=ot("globalVolume");return Fn(()=>{s(e.getGlobalVolume())},[]),Fn(()=>{e.setGroupVolume("voice",t)},[t]),Fn(()=>{e.setGroupVolume("bgm",n)},[n]),Fn(()=>{e.setGroupVolume("sound",i)},[i]),Fn(()=>{e.setGlobalVolume(r)},[r]),null}import{useEffect as Vi,useRef as il}from"react";import Fo,{createContext as tl,useContext as nl,useState as ws}from"react";var Xt=class Xt{constructor(){this.preloaded=[];this.events=new Q}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(Xt.EventTypes["event:preloaded.add"],e),this.events.emit(Xt.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(Xt.EventTypes["event:preloaded.remove"],e),this.events.emit(Xt.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return He.getSrc(e)}};Xt.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 Ne=Xt;var Ki=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 fr(e,{...n,signal:t})}has(e){return this.src.has(e)}add(e,t){return this.src.set(e,t),this}remove(e){return this.src.delete(e),this}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(u=>{this.preloadTasks.delete(t),u&&this.add(t,u)}).catch(u=>{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 Ko=tl(null);function ks({children:o}){let e=k(),[t]=ws(()=>new Ne),[n]=ws(()=>new Ki(e));return Fo.createElement(Fo.Fragment,null,Fo.createElement(Ko,{value:{preloaded:t,cacheManager:n}},o))}function dn(){if(!Ko)throw new Error("usePreloaded must be used within a PreloadedProvider");return nl(Ko)}function Ps({state:o}){let{preloaded:e,cacheManager:t}=dn(),n=k(),i=il(new Set),[r]=te(),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(Ne.EventTypes["event:preloaded.unmount"])}return Vi(()=>o.events.on(P.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Vi(()=>{if(typeof fetch>"u")return e.events.emit(Ne.EventTypes["event:preloaded.complete"]),e.events.emit(Ne.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(Ne.EventTypes["event:preloaded.complete"]),e.events.emit(Ne.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=He.catSrc([...a.srcManager?.src||[],...a.srcManager?.getFutureSrc()||[]]),g=new Sn(n.config.preloadConcurrency,n.config.preloadDelay),f=[],T=o.logger.group(s,!0),h=[];o.logger.debug(s,"preloading:",d,a);for(let S of d.image){let m=He.getSrc(S);if(m){if(f.push(m),t.has(m)||t.isPreloading(m)||h.includes(m)){o.logger.debug(s,`Image already loaded (${d.image.indexOf(S)+1}/${d.image.length})`,m),h.push(m);continue}h.push(m),g.addTask(()=>new Promise(y=>{t.preload(o,m).onFinished(()=>{o.logger.debug(s,`Image loaded (${d.image.indexOf(S)+1}/${d.image.length})`,m),y()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${d.image.indexOf(S)+1}/${d.image.length})`,m),y()})}))}}return T.end(),g.start().then(()=>{o.logger.info(s,"Image preload",`loaded ${t.size()} images in ${performance.now()-u}ms`),e.events.emit(Ne.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit(Ne.EventTypes["event:preloaded.ready"]),t.filter(f)}),n.config.waitForPreload||e.events.emit(Ne.EventTypes["event:preloaded.ready"]),e.events.emit(Ne.EventTypes["event:preloaded.mount"]),p},[a,l]),Vi(()=>{i.current.clear()},[a]),Vi(()=>{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=>He.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=He.catSrc([...i.current,...d]),T=new Sn(n.config.preloadConcurrency,n.config.preloadDelay),h=[],S=o.logger.group(s);o.logger.debug(s,"preloading:",f);for(let m of f.image){let y=He.getSrc(m);if(y){if(h.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}T.addTask(()=>new Promise(E=>{t.preload(o,y).onFinished(()=>{o.logger.debug(s,`Image loaded (${f.image.indexOf(m)+1}/${f.image.length})`,y),E()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${f.image.indexOf(m)+1}/${f.image.length})`,y),E()})}))}}S.end(),T.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-u}ms`),t.filter(h)})},[c,l]),null}import ol from"clsx";import vt,{useCallback as Vo,useMemo as rl,useRef as sl}from"react";function Oo({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=k(),a=sl([]),c=Vo(f=>(a.current.push(f),a.current.indexOf(f)),[]),l=Vo(f=>{let T=a.current.indexOf(f);T!==-1&&a.current.splice(T,1)},[]),p=Vo(f=>a.current.indexOf(f),[]),u=s.config.menu,d=rl(()=>e.map(f=>({...f,words:f.prompt.evaluate(he.getCtx({gameState:n}))})),[]);function g(f){t(f)}return vt.createElement(vt.Fragment,null,vt.createElement(Co,{value:{evaluated:d,choose:g,gameState:n}},vt.createElement(Ao,{value:{register:c,unregister:l,getIndex:p}},vt.createElement(gt,{className:"absolute"},r&&o&&vt.createElement(Rn,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),vt.createElement($t.Div,{color:"green",border:"dashed",className:ol("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},vt.createElement(u,{items:d.map((f,T)=>T)})))))}function Es({items:o}){return vt.createElement(Ai,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>vt.createElement(Ri,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import $i from"react";import Oi from"react";import Wo,{useEffect as Ds,useLayoutEffect as Ls,useRef as Is,useState as zo}from"react";function mn({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c}){let[l,p]=zo(null),[u,d]=zo(null),g=Wo.useRef(null),[f]=zo(()=>new Xn("displayable.refGroup")),T=Is(f.next()),h=Is(Ce()),m=k().getLiveGame().getGameState(),y=typeof a=="function"?a(l):a,[E]=te([u,l,h]);Ds(()=>m.events.depends([m.events.on(P.EventTypes["event:state.player.skip"],Me)]).cancel,[u,l,h]),Ls(()=>{if(O(),!l)return;if(h.current.some(([ee])=>!ee.current))throw new w("Displayable: Trying to access transition groups before they are mounted");let{controller:R,task:M}=l;return R.onUpdate(ee=>{h.current.forEach(([le],ye)=>{let I=M.resolve[ye],oe=typeof I=="function"?I:I.resolver;if(!oe)throw new w(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${ye}])`);let Ve=oe(...ee),ve=H(y[ye]||y[y.length-1]||{},Ve);N(le,c?c(ve):ve)})}).cancel},[l]),Ds(()=>{if(!g.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),Ls(()=>{let R=e.toStyle(m,i);Object.assign(g.current.style,R),m.logger.debug("Displayable","Initial style applied",g.current,R)},[]);function O(){let R=typeof a=="function"?a(l):a;if(!h.current||!h.current.length)throw new w("Displayable: Transition group refs are not initialized correctly");if(h.current.some(([M])=>!M.current))throw new w("Displayable: Trying to access transition groups before they are mounted");h.current.forEach(([M],ie)=>{if(!M.current)throw new w("Displayable: Trying to assign properties to unmounted element");N(M,R[ie]||R[R.length-1]||{})})}function A(R){m.logger.debug("Displayable","Transform applied",e.toStyle(m,i),g.current),E(),r?.(R)}function N(R,M){if(!R.current)throw new w("Displayable: Trying to assign properties to unmounted element");let ie=R.current,ee={},le={};Object.keys(M).forEach(I=>{let oe=I;oe==="style"&&M.style?Object.assign(ee,M.style):M[oe]!==void 0&&oe!=="key"&&(le[oe]=M[oe])}),Object.keys(ee).length>0&&Object.assign(ie.style,ee);let ye=c?c(le):le;for(let[I,oe]of Object.entries(ye))ie.getAttribute(I)!==oe&&ie.setAttribute(I,oe)}function j(R,M){u&&(u.abort(),d(null));let ie=R.animate(e,{gameState:m,ref:g,overwrites:i}),ee=new we(ie);return m.timelines.attachTimeline(ee),ie.onSkipControllerRegister(le=>{le.onAbort(()=>{ee.abort(),d(null)})}),d(ie),ie.then(()=>{d(null),A(R),M()}),ee}function W(R,M){l&&l.controller.complete();let ie=R.createTask(m),ee=R.requestAnimations(ie.animations),le=new v().registerSkipController(new G(ee.cancel)),ye=new we(le);le.skipController.onAbort(()=>{ee.cancel()}),ee.onCanceled(()=>{ye.abort(),p(null),m.logger.debug("Displayable","Transition cancelled",R)}),m.timelines.attachTimeline(ye),p({task:ie,controller:ee,transition:R,resolve:M});let I;if(h.current=ie.resolve.map(Ve=>{let ve=Wo.createRef(),q=typeof Ve=="function"?void 0:Ve.key;if(!q)return[ve,f.next()];if(q==="target")return I=f.next(),[ve,I];if(q==="current")return[ve,T.current];throw new w("Displayable: Invalid key type")}),!I)throw new w("Displayable: No target key found");T.current=I;let oe=h.current.map(([Ve])=>{let ve=Ve.current;return ve?.waitForLoad?ve.waitForLoad():Promise.resolve()});return Promise.all(oe).then(()=>{ee.start(),ee.onComplete(()=>{bt(),p(null),s?.(R),M(),le.resolve()})}),ye}function ce(R){return m.logger.debug("initDisplayable",o),j(Y.immediate(e.get()),R)}function Me(){t&&u&&(u.abort(),d(null),m.logger.debug("transform skipped")),n&&l&&(l.controller.complete(),m.logger.debug("transition skipped"))}function Ce(){return[[Wo.createRef(),T.current]]}function bt(){h.current.forEach(([R])=>{R.current=null}),h.current=Ce()}return{transformRef:g,transitionRefs:h.current,isTransforming:!!u,transitionTask:l,initDisplayable:ce,applyTransform:j,applyTransition:W,updateStyleSync:O,deps:[u,l,h]}}import{useEffect as al}from"react";function Ft(o,e,t=[]){let i=k().getLiveGame().getGameState();return al(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function Bo({state:o,text:e}){let{ratio:t}=ge(),[n]=te(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyTransition:c,updateStyleSync:l,deps:p,isTransforming:u}=mn({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:d=>({width:"fit-content",transform:Y.propToCSSTransform(o,d,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return Ft(e,{initDisplayable:s,applyTransform:a,applyTransition:c,flush:n,updateStyleSync:l},[...p]),Oi.createElement($t.Div,{"data-element-type":"text"},Oi.createElement($t.mDiv,{tag:"text.container",color:"green",border:"dashed",layout:u,ref:i,className:"absolute"},r.map(([d,g])=>Oi.createElement("span",{key:g,ref:d,className:e.config.className},Oi.createElement("span",null,e.state.text)))))}import fn,{useRef as Ms,useState as Gs}from"react";import Wi,{useEffect as $o,useRef as zi,forwardRef as cl}from"react";var Rs=cl(({onSizeChanged:o,onLoad:e,autoFit:t=!1},n)=>{let i=zi(null),{ratio:r}=ge(),[s,a]=Wi.useState(()=>r.state.width),[c,l]=Wi.useState(()=>r.state.height),p=k(),u=zi(!1),d=zi(null),g=zi(null);Wi.useImperativeHandle(n,()=>i.current,[]),$o(()=>{i.current&&Object.defineProperties(i.current,{isLoaded:{value:()=>u.current,configurable:!0},waitForLoad:{value:()=>u.current?Promise.resolve():(d.current||(d.current=new Promise(h=>{g.current=h})),d.current),configurable:!0}})},[]),$o(()=>(f(),r.onUpdate(f)),[o]),$o(()=>{let h=new MutationObserver(S=>{S.forEach(m=>{m.type==="attributes"&&m.attributeName==="src"&&i.current&&f()})});return i.current&&h.observe(i.current,{attributes:!0}),()=>{h.disconnect()}},[o]);function f(){if(i.current&&i.current.naturalWidth)if(i.current.naturalWidth*i.current.naturalHeight===1){let h=r.state.width,S=r.state.height,m=`${h} / ${S}`;a(h),l(S),i.current.style.aspectRatio=m,o&&o(h,S)}else{let h=t?p.config.width/i.current.naturalWidth:1,S=i.current.naturalWidth*r.state.scale*h,m=i.current.naturalHeight*r.state.scale*h;a(S),l(m),i.current.style.aspectRatio="auto",o&&o(S,m)}}function T(){f(),u.current=!0,g.current&&(g.current(),g.current=null,d.current=null),e&&e()}return Wi.createElement("img",{ref:i,onLoad:T,width:s,height:c,alt:""})});Rs.displayName="AspectScaleImage";var Ns=Rs;import Hs from"clsx";import{motion as ll}from"motion/react";function Bi({image:o,state:e}){let[t]=Gs(()=>new Q),[n,i]=Gs([]),{cacheManager:r}=dn(),s=Ms([]),a=Ms(null),{transformRef:c,transitionRefs:l,isTransforming:p,initDisplayable:u,applyTransition:d,applyTransform:g,updateStyleSync:f,deps:T}=mn({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:m=>{let y=m?m.transition._getCurrentSrc():o.state.currentSrc;return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:C.isColor(y)?C.colorToString(y):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:C.isImageSrc(y)?C.srcToURL(y):U.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:m=>m.src?(!C.isDataURI(m.src)&&!r.has(m.src)&&!r.isPreloading(m.src)&&!s.current.includes(m.src)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${m.src}".
|
|
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(
|
|
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 S=()=>{u.removeEventListener("loadeddata",S),h()};u.addEventListener("loadeddata",S);return}let m=()=>{g(),d()},v=()=>{g(),d()},g=()=>{u.removeEventListener("ended",m),u.removeEventListener("stopped",v)};u.addEventListener("ended",m),u.addEventListener("stopped",v),p.push(g),u.play().catch(S=>{o.logger.error("Failed to play video: "+S),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 ul.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 dl from"clsx";import ml,{useCallback as fl,useEffect as $i,useRef as hl}from"react";function Xo({children:o,className:e,gameState:t}){let{ratio:n}=pe(),i=w(),[r]=Z(),s=hl(null),a=i.config.minWidth,c=i.config.minHeight,l=fl(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 $i(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),$i(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),$i(()=>{let p=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(p)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),$i(()=>t.events.on(k.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),ml.createElement(ps,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:dl(e),onUpdate:l},o)}import Us,{useEffect as gl,useRef as yl,useState as Fs}from"react";function Yo({src:o,width:e,height:t}){let[n,i]=Fs({x:0,y:0}),[r,s]=Fs(!1),a=yl(null),{ratio:c}=pe();return gl(()=>{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]),Us.createElement(dt,{ref:a,className:"overflow-hidden absolute"},Us.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 Ks from"react";import Ct from"react";function Jo({error:o,errorInfo:e}){return w().config.app.debug?Ct.createElement("div",{className:"text-left"},Ct.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),Ct.createElement("p",{className:"text-red-700"},"Message: ",o.message),Ct.createElement("pre",null,"Error Stack: ",o?.stack),Ct.createElement("pre",null,"Component Stack: ",e?.componentStack),Ct.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):Ct.createElement("div",{className:"bg-white w-full h-full"},Ct.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),Ct.createElement("p",null,"Please contact the game developer for further assistance."))}var ji=class extends Ks.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?Ks.createElement(Jo,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import Ws from"clsx";import B,{useEffect as Xt,useReducer as bl,useState as Wn}from"react";import{flushSync as zs}from"react-dom";import{useRef as vl}from"react";import{useEffect as Sl}from"react";function Vs({gameState:o}){let e=vl(null);return Sl(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(k.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import On,{useEffect as Tl}from"react";function Zo({gameState:o}){let[e]=Z(),{ratio:t}=pe(),n=o.notificationMgr;Tl(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return On.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"},On.createElement(i,{notifications:n.toArray()}))}function Os({notifications:o}){return On.createElement(Ri,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>On.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},On.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Bs({story:o=Pn.empty(),width:e,height:t,className:n,onReady:i,onPreloadedReady:r,onEnd:s,onError:a,children:c,active:l=!0}){let[p,u]=bl(L=>L+1,0),[d,h]=Wn(0),m=w(),[v]=Wn(()=>new k(m,{update:u,forceUpdate:()=>{v.logger.weakWarn("Player","force update"),zs(()=>{u()})},forceRemount:()=>{v.logger.weakWarn("Player","force remount"),zs(()=>{h(L=>L+1),u()})},next:Ne})),g=B.createRef(),S=B.createRef(),[f,T]=Wn(!1),C=B.useRef(!1),I=B.useRef(null),N=B.useRef(null),{preloaded:X}=pn(),[he,ge]=Wn(!1),ye=B.useRef(!1),[Re]=Wn(new Map);function Ne(){let L=()=>{Re.forEach(P=>P.cancel())};if(v.rollLock.isLocked())return;L();let z=!1,$=0;for(;!z;){if($++>m.config.maxStackModelLoop)throw new x("Max stack model loop reached");let P=m.getLiveGame().next();if(!P){if(m.getLiveGame().stackModel&&!m.getLiveGame().stackModel.isEmpty())continue;break}if(y.isAwaitable(P)){if(I.current===P)break;I.current=P,P.onSettled(()=>{P.isFailed()||(I.current===P&&(I.current=null),Ne())}),P.onFailed(M=>{I.current===P&&(I.current=null),v.logger.error("Player",M)}),z=!0;break}if(P instanceof _t){if(N.current===P)break;N.current=P,P.nextUnlock().then(()=>{N.current===P&&(N.current=null),Ne()}),z=!0;break}if(Ie.isCalledActionResult(P)&&P.wait&&Ie.isStackModelsAwaiting(P.wait.type,P.wait.stackModels)){if(I.current===P)break;if(I.current=P,P.wait){let M=Ie.executeStackModelGroup(P.wait.type,P.wait.stackModels);M.then(()=>{I.current===P&&(I.current=null),Ne()}),M.onFailed(K=>{I.current===P&&(I.current=null),v.logger.error("Player",K)})}z=!0;break}v.handle(P)}v.stage.update()}Xt(()=>{v.audioManager.initialize()},[]),Xt(()=>(m.getLiveGame().setGameState(v),o&&!m.getLiveGame().isPlaying()&&m.getLiveGame().loadStory(o),v.playerCurrent=g.current,v.mainContentNode=S.current,()=>{m.getLiveGame().setGameState(void 0),v.playerCurrent=null}),[m,o]),Xt(()=>We(()=>{T(!0);let L=v.getLastScene(),z=[];L?z.push(L.events.once("event:scene.mount",()=>{v.stage.next()}).cancel):v.stage.next();let $=v.events.on(k.EventTypes["event:state.end"],()=>{s&&s({game:m,gameState:v,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()})});return v.stage.update(),()=>{L&&z.forEach(P=>P()),$.cancel()}}),[]),Xt(()=>We(()=>{f&&i&&!C.current&&(C.current=!0,v.stage.forceUpdate(),m.hooks.trigger("init",[]),i({game:m,gameState:v,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()}))}),[f]),Xt(()=>We(()=>{he&&r&&!ye.current&&(ye.current=!0,r({game:m,gameState:v,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()}))}),[he]),Xt(()=>X.events.depends([X.events.on($e.EventTypes["event:preloaded.ready"],()=>{ge(!0),v.stage.update(),o&&m.getLiveGame().isPlaying()&&Ne()})]).cancel,[]),Xt(()=>{v.flushDep=p},[p]);let ot=e||m.config.width,R=t||m.config.height;return B.createElement(ji,{onError:a},B.createElement("div",{style:{width:typeof ot=="number"?`${ot}px`:ot,height:typeof R=="number"?`${R}px`:R},className:Ws(n,"__narraleaf_content-player"),ref:g,tabIndex:0},B.createElement(Xo,{className:Ws("flex-grow overflow-auto"),gameState:v},B.createElement(Go,{gameState:v}),B.createElement(Vs,{gameState:v}),B.createElement(dt,{className:"absolute",ref:S,style:{cursor:v.game.config.cursor?"none":"auto",overflow:v.game.config.showOverflow?"visible":"hidden"}},m.config.cursor&&B.createElement(Yo,{src:m.config.cursor,width:m.config.cursorWidth,height:m.config.cursorHeight}),B.createElement(Al,{show:he&&l,key:d},B.createElement(Lo,null,B.createElement(ys,{state:v}),B.createElement(bs,{state:v}),v.getSceneElements().map(L=>B.createElement(jo,{key:"scene-"+L.scene.getId(),state:v,elements:L})),v.getVideos().map((L,z)=>B.createElement("div",{className:"w-full h-full absolute",key:"video-"+z,"data-element-type":"video"},B.createElement(Qo,{gameState:v,video:L}))),B.createElement(Cl,{NvlComponent:m.config.nvlDialog}))),B.createElement(xs,{state:v}),B.createElement(rs,null,c),B.createElement(Zo,{gameState:v})))))}function Al({children:o,show:e}){return B.createElement(B.Fragment,null,e?o:null)}function Cl({NvlComponent:o}){let{dialogs:e,state:t}=mt(),i=w().getLiveGame().getGameState(),r=B.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(ue.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 B.createElement(o,{dialogs:r})}import"client-only";import fn from"react";function $s({children:o,game:e}){return fn.createElement(fn.Fragment,null,fn.createElement(Vr,null,fn.createElement(Gr,{game:e},fn.createElement(Cs,null,fn.createElement(Kr,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 wl from"clsx";import ht,{useEffect as js,useRef as kl}from"react";import{motion as Pl,useIsPresent as El}from"motion/react";function Dl({children:o,initial:e,transition:t,...n}){let i=w(),r=et(),{ratio:s}=pe(),[a]=_e(Q.Preferences.showDialog),c=kl(null),[l]=$t("nextAction"),p=El();function u(){r.requestComplete()}return js(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
|
|
48
|
-
at Say.tsx: onElementClick`);return}let d=m=>{i.keyMap.match("nextAction",m.key)&&r.requestComplete()};window.addEventListener("keyup",d);let h=r.events.on(fe.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keyup",d),h.cancel()}},[r,l]),js(()=>{let d=i.preference.onPreferenceChange(Q.Preferences.autoForward,h=>{h&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{d.cancel()}},[r]),ht.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},ht.createElement("div",{className:wl("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:u,style:{...ei(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},ht.createElement(Pl.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&p?{duration:0}:t},o)))}function qs({children:o,...e}){let t=et();return!t.config.action.sentence||!t.config.action.words?null:ht.createElement(Dl,{...e},o)}var zc=qs;function Qs(){return ht.createElement(qs,null,ht.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},ht.createElement(Ao,null),ht.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},ht.createElement(Nt,null),ht.createElement(Rt,null))))}var zn={say:Qs,menu:ws,notification:Os,nvlDialog:No};var qi=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 J}setKeyBinding(e,t){this.keyMap[e]=t,this.events.emit("event:keyMap.change",e,t)}getKeyBinding(e){return this.keyMap[e]??null}addKeyBinding(e,t){if(t===null)return;let n=this.getKeyBinding(e)??[],i=r=>Array.isArray(r)?r:[r];Array.isArray(n)?this.setKeyBinding(e,[...n,...i(t)]):this.setKeyBinding(e,[n,...i(t)])}getKeyBindings(){return this.keyMap}onKeyBindingChange(e,t){return this.events.on("event:keyMap.change",(n,i)=>{n===e&&t(i)})}importKeyBindings(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setKeyBinding(t,e[t])}exportKeyBindings(){return this.keyMap}match(e,t){let n=this.getKeyBinding(e);return n===null?!1:Array.isArray(n)?n.includes(t)||n.some(i=>i.toLowerCase()===t.toLowerCase()):n===t||n.toLowerCase()===t.toLowerCase()}};var Xs=(e=>(e.game="game",e))(Xs||{}),xt=class xt{constructor(e){this.hooks=new Yn;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new Ln(xt.DefaultPreference);this.keyMap=new Bn({skipAction:["Control"],nextAction:[" "]});this.config=H(xt.DefaultConfig,e),this.plugins=new qi(this),this.router=new It(this)}configure(e){let[t,n]=vr(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=H(this.config,t),this.getLiveGame().getGameState()?.events.emit(k.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}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 lt(this)}};xt.defaultSettings={volume:1},xt.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},xt.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"},xt.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,defaultTextColor:"#000",defaultNametagColor:"#000",notification:zn.notification,menu:zn.menu,dialog:zn.say,nvlDialog:zn.nvlDialog,onError:e=>{console.error(e)},fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif",stage:null,defaultMenuChoiceColor:"#000",maxStackModelLoop:1e3,maxActionHistory:100},xt.GameSettingsNamespace=Xs;var Q=xt;var Qi=class Qi extends O{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===ve.do)return[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:i[0].contentNode}];if(this.type===ve.doAsync){let r=Qi.executeActionsAsync(e,i[0]);return e.timelines.attachTimeline(r),super.executeAction(e,t)}else if(this.type===ve.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===ve.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===ve.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(y.all(...r.map(s=>e.game.getLiveGame().executeAsyncStackModel(s)))),super.executeAction(e,t)}else if(this.type===ve.repeat){let[r,s]=this.contentNode.getContent();if(s<=0||r.length===0)return super.executeAction(e,t);let a=Ie.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===ve.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=Ie.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===ve.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===ve.sleep){let[,r]=this.contentNode.getContent(),s;typeof r=="number"?s=y.delay(r):y.isAwaitable(r)?s=r:s=y.fromPromise(r);let a=new y,c=new Te(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===ve.waitForClick){if(e.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let r=new y,s=new y,a=new Te(s);e.timelines.attachTimeline(a);let c=e.game.preference,l=c.getPreference(Q.Preferences.autoForward),p=c.getPreference(Q.Preferences.gameSpeed),u=l?e.game.config.autoForwardDelay/p:null,d=!1,h=null,m=null,v=null,g=()=>{m?.cancel(),v?.cancel(),h&&(clearTimeout(h),h=null)},S=()=>{d||(d=!0,g(),s.resolve())};return m=e.events.on(k.EventTypes["event:state.player.stageClick"],S),v=e.events.on(k.EventTypes["event:state.player.skip"],S),u!==null&&(h=setTimeout(S,u)),s.then(()=>{r.resolve({type:this.type,node:this.contentNode.getChild()})}),r.onSkipControllerRegister(f=>{f.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===ve.break||this.type===ve.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===ve.break)return super.stringifyWithContent("Control","break");if(this.type===ve.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(";"))}};Qi.ActionTypes=ve;var se=Qi;var xe=class o extends te{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(se.ActionTypes.do,t)}doAsync(t){return this.push(se.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(se.ActionTypes.any,t)}all(t){return this.pushUnchained(se.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(se.ActionTypes.allAsync,t)}repeat(t,n){return this.push(se.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=F.from(t);return this.pushWithLambda(se.ActionTypes.while,n,i)}breakLoop(){let t=new se(this.chain(),se.ActionTypes.break,new b().setContent([]));return this.chain(t)}sleep(t){return this.push(se.ActionTypes.sleep,[],t)}waitForClick(){let t=new se(this.chain(),se.ActionTypes.waitForClick,new b().setContent([]));return this.chain(t)}push(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new b().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new b().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new se(this.chain(),t,new b().setContent([this.construct(r),i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?St.say(n).getActions():Ae.toActions([n]))}};var _=class _ extends at{static getInitialSrc(e){if(this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return A.isStaticImageData(t)?A.srcToURL(t):A.isColor(t)?t:A.isImageSrc(t)?A.srcToURL(t):_.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isTagDefinition(e){return typeof e=="object"&&e!==null&&!A.isImageSrc(e)&&!A.isColor(e)&&"defaults"in e}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(A.isImageSrc(t)||A.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:_.isTagSrc(e)?_.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):_.isStaticSrc(e)?A.isStaticImageData(e.state.currentSrc)?A.srcToURL(e.state.currentSrc):A.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static fromSrc(e){return new _({src:e})}constructor(e={}){super();let t=_.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new xe,n=>{if(A.isImageSrc(e)||A.isColor(e)){if(A.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 ne(n,ne.ActionTypes.setAppearance,new b().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new xe,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 ce("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:_.StateSerializer.serialize(this.state),transformState:me.TransformStateSerializer.serialize(this.transformState.get())}}fromData(e){return this.state=_.StateSerializer.deserialize(e.state),this.transformState=me.deserialize(e.transformState),this}_applyTransition(e,t){return new Ce(this.chain(),be.applyTransition,new b().setContent([e,t]))}_init(e,t){return new Ce(this.chain(),be.init,new b().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new ne(this.chain(),ne.ActionTypes.initWearable,new b().setContent([e]))}_flush(){return new ne(this.chain(),ne.ActionTypes.flush,new b)}reset(){return this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig),this}resolveTags(e,t){if(!_.isTagSrc(this))throw new Error(`Tag not defined
|
|
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
|
|
46
|
+
To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(m.src)),{...m,src:r.get(m.src)||m.src}):m});Ft(o,{createWearable:m=>{i(y=>[...y,m])},disposeWearable:m=>{i(y=>y.filter(E=>E.getId()!==m.getId()))},initDisplayable:u,applyTransform:g,applyTransition:d,events:t,updateStyleSync:f},[...T]);function h(m,y){a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${m}px`,height:`${y}px`}))}function S(){t.emit("event:image.onLoad")}return fn.createElement(ll.div,{layout:p,ref:c,className:"absolute w-max h-max","data-element-type":"image"},fn.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},l.map(([m,y],E)=>fn.createElement(Ns,{key:y,ref:m,autoFit:o.config.autoFit,onSizeChanged:E===0?h:void 0,onLoad:E===0?S:void 0})),fn.createElement("div",{className:Hs("w-full h-full top-0 left-0 absolute")},n.map(m=>fn.createElement("div",{className:Hs("w-full h-full relative"),key:"wearable-"+m.getId()},fn.createElement(Bi,{image:m,state:e}))))))}function jo({state:o,displayable:e}){return $i.createElement($i.Fragment,null,e.map(t=>{if(t instanceof Wt)return $i.createElement(Bo,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof U)return $i.createElement(Bi,{state:o,image:t,key:"image-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import ji,{useEffect as ul}from"react";import{motion as pl}from"motion/react";function Us({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c,deps:l}=mn({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return Ft(e,{initDisplayable:r,applyTransition:s,applyTransform:a,updateStyleSync:c},[...l]),ul(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),ji.createElement(ji.Fragment,null,ji.createElement(pl.div,{layout:!0,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])=>ji.createElement("div",{className:"relative w-full h-full",ref:p,key:u},t))))}import dl from"clsx";import{AnimatePresence as ml}from"motion/react";import{useEffect as qo,useReducer as fl,useRef as Kn}from"react";import Yt from"react";var hl=120;function Qo({state:o,className:e,elements:t}){let{scene:n,layers:i,texts:r,menus:s}=t,a=Kn(!1),c=Kn({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),l=Kn([]),p=Kn(null),u=Kn(null),[,d]=fl(h=>h+1,0),g=()=>{u.current&&(clearTimeout(u.current),u.current=null)},f=()=>{let h=p.current;if(!h)return;let S=c.current;h.forEach(({slot:m,presenceKey:y})=>{S.slotKeys.get(m)===y&&S.slotKeys.delete(m),S.exitingKeys.add(y)}),p.current=null,u.current=null,l.current=[],d()};qo(()=>n.events.depends([n.events.on(Ye.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),qo(()=>(n.events.emit(Ye.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(Ye.EventTypes["event:scene.unmount"]),o.events.emit(P.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),qo(()=>()=>{g()},[]),Ft(n,{setBackgroundMusic(h,S){return new Promise(m=>{(async function(){n.state.backgroundMusic&&o.audioManager.isManaged(n.state.backgroundMusic)&&await o.audioManager.stop(n.state.backgroundMusic,S),h?(await o.audioManager.play(h,{end:h.state.volume,duration:S}),n.state.backgroundMusic=h):n.state.backgroundMusic=null,m()})()})}});let T=(()=>{let h=c.current,S=r.length>0?r.map(({action:E,onClick:O},A)=>({action:E,slot:A,useTypeEffect:!a.current,onFinished:N=>{N!==void 0&&(a.current=N),O(),o.events.emit(P.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):s.flatMap((E,O)=>{if(!E.action.prompt||!E.action.words)return[];let A=h.menuPromptIds.get(E);return A||(A=`menu-prompt-${n.getId()}-${h.nextKey++}`,h.menuPromptIds.set(E,A)),[{action:{sentence:E.action.prompt,words:E.action.words,character:null,id:A},slot:O,useTypeEffect:!1}]});if(S.length===0)return!p.current&&l.current.length>0&&(p.current=l.current.map(E=>({...E,active:!1}))),p.current&&!u.current&&(u.current=setTimeout(f,hl)),p.current??[];g(),p.current=null;let m=new Set(S.map(({slot:E})=>E));for(let[E,O]of Array.from(h.slotKeys))m.has(E)||(h.exitingKeys.add(O),h.slotKeys.delete(E));let y=S.map(({slot:E,...O})=>{let A=h.slotKeys.get(E);return(!A||h.exitingKeys.has(A))&&(A=`say-${n.getId()}-${h.nextKey++}`,h.slotKeys.set(E,A)),{...O,presenceKey:A,slot:E,active:!0}});return l.current=y,y})();return Yt.createElement("div",{className:dl(e,"w-full h-full absolute")},[...i.entries()].sort(([h],[S])=>h.state.zIndex-S.state.zIndex).map(([h,S])=>Yt.createElement(Us,{state:o,layer:h,key:h.getId()},Yt.createElement(jo,{state:o,displayable:S}))),Yt.createElement(ml,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{c.current.exitingKeys.clear()}},T.map(({action:h,onFinished:S,presenceKey:m,active:y,useTypeEffect:E})=>Yt.createElement(Rn,{gameState:o,key:m,action:h,active:y,onFinished:S,useTypeEffect:E}))),s.map(({action:h,onClick:S},m)=>Yt.createElement("div",{key:"menu-"+m,"data-element-type":"menu"},Yt.createElement(Oo,{state:o,prompt:h.prompt,choices:h.choices,renderPrompt:!h.prompt,afterChoose:y=>{a.current=!1,S(y),o.stage.next()},words:h.words}))))}import gl from"react";import{useEffect as Xo,useRef as yl}from"react";import{useCallback as Fs}from"react";function Ks(o){let e=Fs(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=Fs(()=>{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 Yo({gameState:o,video:e}){let t=yl(null),{show:n,hide:i}=Ks(t);Xo(()=>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,[]),Xo(()=>{i(),e.state.display&&n()},[]),Xo(()=>{if(!t.current)return;let s=t.current,a=!1,c=()=>new w(`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:g})=>{if(u.readyState<3){let S=()=>{u.removeEventListener("loadeddata",S),g()};u.addEventListener("loadeddata",S);return}let f=()=>{h(),d()},T=()=>{h(),d()},h=()=>{u.removeEventListener("ended",f),u.removeEventListener("stopped",T)};u.addEventListener("ended",f),u.addEventListener("stopped",T),p.push(h),u.play().catch(S=>{o.logger.error("Failed to play video: "+S),h(),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 vl from"clsx";import Sl,{useCallback as Tl,useEffect as qi,useRef as bl}from"react";function Jo({children:o,className:e,gameState:t}){let{ratio:n}=ge(),i=k(),[r]=te(),s=bl(null),a=i.config.minWidth,c=i.config.minHeight,l=Tl(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 qi(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),qi(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),qi(()=>{let p=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(p)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),qi(()=>t.events.on(P.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),Sl.createElement(fs,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:vl(e),onUpdate:l},o)}import Vs,{useEffect as Cl,useRef as Al,useState as Os}from"react";function Zo({src:o,width:e,height:t}){let[n,i]=Os({x:0,y:0}),[r,s]=Os(!1),a=Al(null),{ratio:c}=ge();return Cl(()=>{let l=p=>{if(a.current){let u=a.current.getBoundingClientRect(),d=p.clientX-u.left,g=p.clientY-u.top;i({x:d,y:g}),r||s(!0)}};return window.addEventListener("mousemove",l),()=>{window.removeEventListener("mousemove",l)}},[r]),Vs.createElement(gt,{ref:a,className:"overflow-hidden absolute"},Vs.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 Ws from"react";import Dt from"react";function _o({error:o,errorInfo:e}){return k().config.app.debug?Dt.createElement("div",{className:"text-left"},Dt.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),Dt.createElement("p",{className:"text-red-700"},"Message: ",o.message),Dt.createElement("pre",null,"Error Stack: ",o?.stack),Dt.createElement("pre",null,"Component Stack: ",e?.componentStack),Dt.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):Dt.createElement("div",{className:"bg-white w-full h-full"},Dt.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),Dt.createElement("p",null,"Please contact the game developer for further assistance."))}var Qi=class extends Ws.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?Ws.createElement(_o,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import $s from"clsx";import V,{useEffect as St,useReducer as js,useState as hn}from"react";import{flushSync as qs}from"react-dom";import{useRef as xl}from"react";import{useEffect as wl}from"react";function zs({gameState:o}){let e=xl(null);return wl(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(P.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import Vn,{useEffect as kl}from"react";function er({gameState:o}){let[e]=te(),{ratio:t}=ge(),n=o.notificationMgr;kl(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return Vn.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"},Vn.createElement(i,{notifications:n.toArray()}))}function Bs({notifications:o}){return Vn.createElement(Mi,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>Vn.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},Vn.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function Qs({story:o=Pn.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,g]=js(L=>L+1,0),[f,T]=js(L=>L+1,0),[h,S]=hn(0),m=k(),[y]=hn(()=>new P(m,{update:g,forceUpdate:()=>{y.logger.weakWarn("Player","force update"),qs(()=>{g()})},forceRemount:()=>{y.logger.weakWarn("Player","force remount"),qs(()=>{S(L=>L+1),g()})},next:Ve})),E=V.createRef(),O=V.createRef(),[A,N]=hn(!1),j=V.useRef(!1),W=V.useRef(null),ce=V.useRef(null),{preloaded:Me}=dn(),[Ce,bt]=hn(!1),R=V.useRef(!1),[M,ie]=hn(!1),ee=V.useRef(!1),le=V.useRef(null),ye=V.useRef(!1),[I]=hn(new Map);function oe(L){return{game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable(),scene:L}}function Ve(){let L=()=>{I.forEach(x=>x.cancel())};if(y.rollLock.isLocked())return;L();let K=!1,Z=0;for(;!K;){if(Z++>m.config.maxStackModelLoop)throw new w("Max stack model loop reached");let x=m.getLiveGame().next();if(!x){if(m.getLiveGame().stackModel&&!m.getLiveGame().stackModel.isEmpty())continue;break}if(v.isAwaitable(x)){if(W.current===x)break;W.current=x,x.onSettled(()=>{x.isFailed()||(W.current===x&&(W.current=null),Ve())}),x.onFailed(We=>{W.current===x&&(W.current=null),y.logger.error("Player",We)}),K=!0;break}if(x instanceof _t){if(ce.current===x)break;ce.current=x,x.nextUnlock().then(()=>{ce.current===x&&(ce.current=null),Ve()}),K=!0;break}if(Fe.isCalledActionResult(x)&&x.wait&&Fe.isStackModelsAwaiting(x.wait.type,x.wait.stackModels)){if(W.current===x)break;if(W.current=x,x.wait){let We=Fe.executeStackModelGroup(x.wait.type,x.wait.stackModels);We.then(()=>{W.current===x&&(W.current=null),Ve()}),We.onFailed(Ct=>{W.current===x&&(W.current=null),y.logger.error("Player",Ct)})}K=!0;break}y.handle(x)}y.stage.update()}St(()=>{y.audioManager.initialize()},[]),St(()=>(m.getLiveGame().setGameState(y),o&&!m.getLiveGame().isPlaying()&&m.getLiveGame().loadStory(o),y.playerCurrent=E.current,y.mainContentNode=O.current,()=>{m.getLiveGame().setGameState(void 0),y.playerCurrent=null}),[m,o]),St(()=>Be(()=>{N(!0);let L=y.getLastScene(),K=[];L?K.push(L.events.once("event:scene.mount",()=>{y.stage.next()}).cancel):y.stage.next();let Z=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(),()=>{L&&K.forEach(x=>x()),Z.cancel()}}),[]),St(()=>Be(()=>{A&&i&&!j.current&&(j.current=!0,y.stage.forceUpdate(),m.hooks.trigger("init",[]),i({game:m,gameState:y,liveGame:m.getLiveGame(),storable:m.getLiveGame().getStorable()}))}),[A]),St(()=>Be(()=>{if(Ce&&s&&!R.current){R.current=!0;let L=le.current||y.getLastScene()||y.getPreloadingScene(),K=oe(L);s(K)}}),[Ce]),St(()=>Be(()=>{if(M&&!ee.current){ee.current=!0;let L=le.current||y.getLastScene()||y.getPreloadingScene(),K=oe(L);m.markPreloadComplete(K)&&r&&r(K)}}),[M]),St(()=>y.events.on(P.EventTypes["event:state.scene.mount"],L=>{le.current||(le.current=L,T())}).cancel,[]),St(()=>{if(!M||!u||ye.current||m.isFirstSceneReady())return;let L=le.current||y.getLastScene();if(!L)return;let K=null,Z=null,x=!1;ye.current=!0;let We=()=>{x=!0,ye.current=!1;let Ct=oe(L);m.markFirstSceneReady(Ct)&&a&&a(Ct)};return typeof requestAnimationFrame=="function"?K=requestAnimationFrame(()=>{Z=setTimeout(We,0)}):Z=setTimeout(We,0),()=>{x||(ye.current=!1,K!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(K),Z!==null&&clearTimeout(Z))}},[u,f,d,M]),St(()=>Me.events.depends([Me.events.on(Ne.EventTypes["event:preloaded.ready"],()=>{bt(!0),y.stage.update(),o&&m.getLiveGame().isPlaying()&&Ve()}),Me.events.on(Ne.EventTypes["event:preloaded.complete"],()=>{ie(!0)})]).cancel,[]),St(()=>{y.flushDep=d},[d]);let ve=e||m.config.width,q=t||m.config.height;return V.createElement(Qi,{onError:l},V.createElement("div",{style:{width:typeof ve=="number"?`${ve}px`:ve,height:typeof q=="number"?`${q}px`:q},className:$s(n,"__narraleaf_content-player"),ref:E,tabIndex:0},V.createElement(Jo,{className:$s("flex-grow overflow-auto"),gameState:y},V.createElement(Uo,{gameState:y}),V.createElement(zs,{gameState:y}),V.createElement(gt,{className:"absolute",ref:O,style:{cursor:y.game.config.cursor?"none":"auto",overflow:y.game.config.showOverflow?"visible":"hidden"}},m.config.cursor&&V.createElement(Zo,{src:m.config.cursor,width:m.config.cursorWidth,height:m.config.cursorHeight}),V.createElement(Pl,{show:Ce&&u,key:h},V.createElement(Ro,null,V.createElement(Ts,{state:y}),V.createElement(xs,{state:y}),y.getSceneElements().map(L=>V.createElement(Qo,{key:"scene-"+L.scene.getId(),state:y,elements:L})),y.getVideos().map((L,K)=>V.createElement("div",{className:"w-full h-full absolute",key:"video-"+K,"data-element-type":"video"},V.createElement(Yo,{gameState:y,video:L}))),V.createElement(El,{NvlComponent:m.config.nvlDialog}))),V.createElement(Ps,{state:y}),V.createElement(cs,null,p),V.createElement(er,{gameState:y})))))}function Pl({children:o,show:e}){return V.createElement(V.Fragment,null,e?o:null)}function El({NvlComponent:o}){let{dialogs:e,state:t}=yt(),i=k().getLiveGame().getGameState(),r=V.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(he.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 V.createElement(o,{dialogs:r})}import"client-only";import gn from"react";function Xs({children:o,game:e}){return gn.createElement(gn.Fragment,null,gn.createElement(Wr,null,gn.createElement(Ur,{game:e},gn.createElement(ks,null,gn.createElement(Or,null,o)))))}var Dl=(r=>(r.image="narraleaf:image",r.text="narraleaf:text",r.layer="narraleaf:layer",r.scene="narraleaf:scene",r.video="narraleaf:video",r))(Dl||{});import Ll from"clsx";import Tt,{useEffect as Ys,useRef as Il}from"react";import{motion as Rl,useIsPresent as Nl}from"motion/react";var Ml={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function Gl({children:o,initial:e,transition:t,...n}){let i=k(),r=rt(),{ratio:s}=ge(),[a]=ot(J.Preferences.showDialog),c=Il(null),[l]=qt("nextAction"),p=Nl();function u(){r.requestComplete()}return Ys(()=>{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 g=r.events.on(be.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keyup",d),g.cancel()}},[r,l]),Ys(()=>{let d=i.preference.onPreferenceChange(J.Preferences.autoForward,g=>{g&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{d.cancel()}},[r]),Tt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},Tt.createElement("div",{className:Ll("absolute bottom-0 w-full h-full",!a&&"invisible pointer-events-auto"),onClick:u,style:{...ti(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},Tt.createElement(Rl.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&p?{duration:0}:t},o)))}function Js({children:o,...e}){let t=rt();return!t.config.action.sentence||!t.config.action.words?null:Tt.createElement(Gl,{...e},o)}var Xc=Js;function Zs(){return Tt.createElement(Js,null,Tt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},Tt.createElement(xo,null),Tt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},Tt.createElement(Et,null),Tt.createElement(Ut,{...Ml}))))}var On={say:Zs,menu:Es,notification:Bs,nvlDialog:Go};var Xi=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 Wn=class{constructor(e={}){this.keyMap=e;this.events=new Q}setKeyBinding(e,t){this.keyMap[e]=t,this.events.emit("event:keyMap.change",e,t)}getKeyBinding(e){return this.keyMap[e]??null}addKeyBinding(e,t){if(t===null)return;let n=this.getKeyBinding(e)??[],i=r=>Array.isArray(r)?r:[r];Array.isArray(n)?this.setKeyBinding(e,[...n,...i(t)]):this.setKeyBinding(e,[n,...i(t)])}getKeyBindings(){return this.keyMap}onKeyBindingChange(e,t){return this.events.on("event:keyMap.change",(n,i)=>{n===e&&t(i)})}importKeyBindings(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setKeyBinding(t,e[t])}exportKeyBindings(){return this.keyMap}match(e,t){let n=this.getKeyBinding(e);return n===null?!1:Array.isArray(n)?n.includes(t)||n.some(i=>i.toLowerCase()===t.toLowerCase()):n===t||n.toLowerCase()===t.toLowerCase()}};var _s=(e=>(e.game="game",e))(_s||{}),Ke=class Ke{constructor(e){this.hooks=new Jn;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new Ln(Ke.DefaultPreference);this.keyMap=new Wn({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new Q;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=H(Ke.DefaultConfig,e),this.plugins=new Xi(this),this.router=new Ht(this)}configure(e){let[t,n]=Tr(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=H(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 mt(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:On.notification,menu:On.menu,dialog:On.say,nvlDialog:On.nvlDialog,onError:e=>{console.error(e)},stage:null,maxStackModelLoop:1e3,maxActionHistory:100},Ke.GameSettingsNamespace=_s,Ke.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var J=Ke;var Yi=class Yi extends B{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=Yi.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=Fe.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=Fe.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(J.Preferences.autoForward),p=c.getPreference(J.Preferences.gameSpeed),u=l?e.game.config.autoForwardDelay/p:null,d=!1,g=null,f=null,T=null,h=()=>{f?.cancel(),T?.cancel(),g&&(clearTimeout(g),g=null)},S=()=>{d||(d=!0,h(),s.resolve())};return f=e.events.on(P.EventTypes["event:state.player.stageClick"],S),T=e.events.on(P.EventTypes["event:state.player.skip"],S),u!==null&&(g=setTimeout(S,u)),s.then(()=>{r.resolve({type:this.type,node:this.contentNode.getChild()})}),r.onSkipControllerRegister(m=>{m.onAbort(()=>{d||(d=!0,h(),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(";"))}};Yi.ActionTypes=Ae;var pe=Yi;var De=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(pe.ActionTypes.do,t)}doAsync(t){return this.push(pe.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(pe.ActionTypes.any,t)}all(t){return this.pushUnchained(pe.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(pe.ActionTypes.allAsync,t)}repeat(t,n){return this.push(pe.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=F.from(t);return this.pushWithLambda(pe.ActionTypes.while,n,i)}breakLoop(){let t=new pe(this.chain(),pe.ActionTypes.break,new b().setContent([]));return this.chain(t)}sleep(t){return this.push(pe.ActionTypes.sleep,[],t)}waitForClick(){let t=new pe(this.chain(),pe.ActionTypes.waitForClick,new b().setContent([]));return this.chain(t)}push(t,n,...i){let r=this.narrativeToActions(n),s=new pe(this.chain(),t,new b().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new pe(this.chain(),t,new b().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new pe(this.chain(),t,new b().setContent([this.construct(r),i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?xt.say(n).getActions():Pe.toActions([n]))}};var ne=class ne extends pt{static getInitialSrc(e){if(this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return C.isStaticImageData(t)?C.srcToURL(t):C.isColor(t)?t:C.isImageSrc(t)?C.srcToURL(t):ne.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isTagDefinition(e){return typeof e=="object"&&e!==null&&!C.isImageSrc(e)&&!C.isColor(e)&&"defaults"in e}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(C.isImageSrc(t)||C.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:ne.isTagSrc(e)?ne.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):ne.isStaticSrc(e)?C.isStaticImageData(e.state.currentSrc)?C.srcToURL(e.state.currentSrc):C.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static fromSrc(e){return new ne({src:e})}constructor(e={}){super();let t=ne.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 De,n=>{if(C.isImageSrc(e)||C.isColor(e)){if(C.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 b().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new De,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 me("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:ne.StateSerializer.serialize(this.state),transformState:Te.TransformStateSerializer.serialize(this.transformState.get())}}fromData(e){return this.state=ne.StateSerializer.deserialize(e.state),this.transformState=Te.deserialize(e.transformState),this}_applyTransition(e,t){return new Ee(this.chain(),ke.applyTransition,new b().setContent([e,t]))}_init(e,t){return new Ee(this.chain(),ke.init,new b().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new se(this.chain(),se.ActionTypes.initWearable,new b().setContent([e]))}_flush(){return new se(this.chain(),se.ActionTypes.flush,new b)}reset(){return this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig),this}resolveTags(e,t){if(!ne.isTagSrc(this))throw new Error(`Tag not defined
|
|
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 me(`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(se.resolveCurrentSrc(this))._setTargetSrc(t))),new se(e,se.ActionTypes.setSrc,new b().setContent([t]))}_setIsBackground(e){return Object.assign(this.config,{isBackground:e}),this}registerSrc(){return ne.isTagSrc(this)?this.srcManager.registerRawSrc(ne.getSrcFromTags(this.config.src.defaults,this.config.src.resolve)):C.isImageSrc(this.state.currentSrc)&&this.srcManager.registerRawSrc(C.srcToURL(this.state.currentSrc)),this}createImageConfig(e){let t=e.get();return ne.DefaultImageConfig.create({...t,src:ne.isTagDefinition(t.src)?t.src:null})}getInitialState(){return ne.DefaultImageState.create().assign({currentSrc:ne.getInitialSrc(this.userConfig.get())}).get()}getInitialTransformState(e){let[t]=e.extract(Te.DefaultTransformState.keys());return new Te(Te.DefaultTransformState.create(t.get()).get())}checkConfig(){for(let e of this.config.wearables)if(!e.config.isWearable)throw this._invalidWearableError(JSON.stringify(e.config));if(ne.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
|
-
Error found in config.tag.defaults`);n.get(r)?.forEach(s=>i.add(s))}}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 ne(e,ne.ActionTypes.setDarkness,new b().setContent([t,n,i]))}};_.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",_.StateSerializer=new He,_.DefaultUserConfig=new j({name:"(anonymous)",autoInit:!0,src:_.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...me.DefaultTransformState.getDefaultConfig()},{position:e=>D.tryParsePosition(e)}),_.DefaultImageConfig=new j({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),_.DefaultImageState=new j({currentSrc:_.DefaultImagePlaceholder,darkness:0});var U=_;var nt=class extends ct{_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)=>H(e(...t),this._srcToProps(this._prevSrc)))}asTarget(e){return super.asTarget((...t)=>H(e(...t),this._srcToProps(this._targetSrc)))}_srcToProps(e){if(A.isColor(e))return{src:U.DefaultImagePlaceholder,style:{backgroundColor:A.isRGBAColor(e)?A.RGBAColorToHex(e):e}};if(A.isImageSrc(e))return{src:A.srcToURL(e)};throw new ce("Image transition src cannot be identified, using: "+e)}};var Xi=class o extends nt{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 O{static resolveTagSrc(e,t){if(!U.isTagSrc(e))throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return U.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(U.isStaticSrc(e))return A.isImageSrc(e.state.currentSrc)?A.srcToURL(e.state.currentSrc):e.state.currentSrc;if(U.isTagSrc(e))return U.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===Oe.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new y(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===Oe.setSrc){let n=this.contentNode.getContent()[0];if(A.isColor(n)&&!this.callee.config.isBackground)throw new ce("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===Oe.flush)return super.executeAction(e,t);if(this.type===Oe.setAppearance){let[n,i]=this.contentNode.getContent();if(!U.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],c=U.getSrcFromTags(s,this.callee.config.src.resolve),l=()=>{this.callee.state.currentSrc=a};if(e.logger.debug("Image - Set Appearance",s,c),i){let p=new y(m=>m).registerSkipController(new G(()=>super.executeAction(e,t)));i._setPrevSrc($n.resolveCurrentSrc(this.callee))._setTargetSrc(c);let d=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),h=e.timelines.attachTimeline(p).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:h},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),super.executeAction(e,t)}else if(this.type===Oe.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&&r){let l=$n.resolveCurrentSrc(this.callee),p=new y(m=>m),u=new Xi(s,n,i,r)._setPrevSrc(l)._setTargetSrc(l),d=c.applyTransition(u,()=>{this.callee.state.darkness=n,p.resolve(super.executeAction(e,t))}),h=e.timelines.attachTimeline(p).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:h},()=>{p.isSettled()||p.abort(),d.abort(),a()}),p}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=Oe;var ne=$n;var wt=class wt extends O{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 wt.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 ce("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 y().registerSkipController(new G(()=>(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 y(l=>l),c=null;return a.registerSkipController(new G(()=>(c&&(clearTimeout(c),c=null),s))),c=e.setTimeout(()=>{c=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===V.action)return super.executeAction(e,t);if(this.is(wt,"scene:init")){let n=new y(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 wt.handleSceneInit(this.callee,r,e,y.forward(n,r))}else if(this.type===V.exit){let n=wt.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new y(s=>s);e.timelines.attachTimeline(r),wt.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),wt.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===V.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===V.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===V.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===V.transitionToScene){let[n,i,r]=this.contentNode.getContent();return n._setPrevSrc(ne.resolveCurrentSrc(this.callee.background)),i?n._setTargetSrc(ne.resolveCurrentSrc(i.background)):r&&n._setTargetSrc(r),this.applyTransition(e,n,t)}else if(this.type===V.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===V.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=y.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===V.nvlHide){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!1,n,t),s=y.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===V.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===V.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===V.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 ce(`Scene with name ${e} not found
|
|
58
|
+
Error found in config.tag.defaults`);n.get(r)?.forEach(s=>i.add(s))}}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 b().setContent([t,n,i]))}};ne.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",ne.StateSerializer=new ze,ne.DefaultUserConfig=new X({name:"(anonymous)",autoInit:!0,src:ne.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...Te.DefaultTransformState.getDefaultConfig()},{position:e=>D.tryParsePosition(e)}),ne.DefaultImageConfig=new X({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),ne.DefaultImageState=new X({currentSrc:ne.DefaultImagePlaceholder,darkness:0});var U=ne;var at=class extends dt{_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)=>H(e(...t),this._srcToProps(this._prevSrc)))}asTarget(e){return super.asTarget((...t)=>H(e(...t),this._srcToProps(this._targetSrc)))}_srcToProps(e){if(C.isColor(e))return{src:U.DefaultImagePlaceholder,style:{backgroundColor:C.isRGBAColor(e)?C.RGBAColorToHex(e):e}};if(C.isImageSrc(e))return{src:C.srcToURL(e)};throw new me("Image transition src cannot be identified, using: "+e)}};var Ji=class o extends at{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 zn=class zn extends B{static resolveTagSrc(e,t){if(!U.isTagSrc(e))throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return U.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(U.isStaticSrc(e))return C.isImageSrc(e.state.currentSrc)?C.srcToURL(e.state.currentSrc):e.state.currentSrc;if(U.isTagSrc(e))return U.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===Xe.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===Xe.setSrc){let n=this.contentNode.getContent()[0];if(C.isColor(n)&&!this.callee.config.isBackground)throw new me("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===Xe.flush)return super.executeAction(e,t);if(this.type===Xe.setAppearance){let[n,i]=this.contentNode.getContent();if(!U.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],c=U.getSrcFromTags(s,this.callee.config.src.resolve),l=()=>{this.callee.state.currentSrc=a};if(e.logger.debug("Image - Set Appearance",s,c),i){let p=new v(f=>f).registerSkipController(new G(()=>super.executeAction(e,t)));i._setPrevSrc(zn.resolveCurrentSrc(this.callee))._setTargetSrc(c);let d=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,p.resolve(super.executeAction(e,t))}),g=e.timelines.attachTimeline(p).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:g},l,[]),p}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),super.executeAction(e,t)}else if(this.type===Xe.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&&r){let l=zn.resolveCurrentSrc(this.callee),p=new v(f=>f),u=new Ji(s,n,i,r)._setPrevSrc(l)._setTargetSrc(l),d=c.applyTransition(u,()=>{this.callee.state.darkness=n,p.resolve(super.executeAction(e,t))}),g=e.timelines.attachTimeline(p).attachChild(d);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:g},()=>{p.isSettled()||p.abort(),d.abort(),a()}),p}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")}};zn.ActionTypes=Xe;var se=zn;var Lt=class Lt extends B{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 Lt.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 me("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 G(()=>(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 G(()=>(c&&(clearTimeout(c),c=null),s))),c=e.setTimeout(()=>{c=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===z.action)return super.executeAction(e,t);if(this.is(Lt,"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 Lt.handleSceneInit(this.callee,r,e,v.forward(n,r))}else if(this.type===z.exit){let n=Lt.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new v(s=>s);e.timelines.attachTimeline(r),Lt.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),Lt.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===z.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize();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===z.setBackgroundMusic){let[n,i]=this.contentNode.getContent(),r=this.callee,s=e.getExposedStateForce(r),a=r.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{s.setBackgroundMusic(c,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===z.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===z.transitionToScene){let[n,i,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===z.nvlBlock){let[n,i]=this.contentNode.getContent(),r=e.createNvlSnapshot();return e.enterNvlMode(i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{e.restoreNvlSnapshot(s)},[r]),n.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]}else if(this.type===z.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=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===z.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===z.nvlEnd){let[n]=this.contentNode.getContent(),i=e.createNvlSnapshot();return e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{e.restoreNvlSnapshot(r)},[i]),e.exitNvlMode(n||null),{type:this.type,node:null}}}throw new Error("Unknown scene action type: "+this.type)}getFutureActions(e,t={}){if(this.type===z.jumpTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=e.getScene(i,!0).getSceneRoot()?.contentNode;return s?.action?[s.action]:[]}if(this.type===z.nvlBlock){let[i]=this.contentNode.getContent(),r=super.getFutureActions(e,t);return[...i??[],...r]}let n=this.contentNode.getChild()?.action;return n?[n]:[]}_sceneNotFoundError(e){return new me(`Scene with name ${e} not found
|
|
59
59
|
Make sure you have registered the scene using story.register
|
|
60
60
|
Action: (id: ${this.getId()}) ${this.type}
|
|
61
|
-
At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===
|
|
61
|
+
At: ${this.__stack}`)}getSceneName(e){return typeof e=="string"?e:e.config.name}stringify(e,t,n){if(this.type===z.jumpTo){if(t.has(this))return super.stringifyWithContent("Scene","[[recursive]]");t.add(this);let[i]=this.contentNode.getContent();return super.stringifyWithContent("Scene",`jumpTo {${i.stringify(e,t,n)}}`)}return super.stringifyWithName("SceneAction")}};Lt.ActionTypes=z;var _=Lt;var tr=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)}},ct=class ct{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)||ct.isStaticImageData(e)}static isImageURL(e){return typeof e=="string"&&!this.isColor(e)}static isColor(e){return ct.isHexString(e)||ct.isNamedColor(e)||ct.isRGBAColor(e)}static isNamedColor(e){return gr(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(ct.isHexString(e))return e;if(ct.isNamedColor(e))return e;if(ct.isRGBAColor(e))return ct.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)}};ct.RGBColor=tr;var C=ct,nr=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 nr{static isWarning(e){return e instanceof o}constructor(e,t){super(e,{info:t},"StaticScriptWarning")}},yi=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 se)n.has(t.callee)||n.set(t.callee,{isDisposed:!1,usedExternalSrc:!1}),this.checkImage(n.get(t.callee),t);else if(t instanceof _){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
|
|
62
62
|
Scene: ${s.config.name}
|
|
63
63
|
|
|
64
|
-
At: ${t.__stack}`;throw new
|
|
64
|
+
At: ${t.__stack}`;throw new xe(a)}}else i.set(s.config.name,s);if(t.type===z.jumpTo){let a=t.contentNode.getContent()[0],c=e.getScene(a,!0);if(r.has(c))return;r.add(c)}}}checkImage(e,t){if(t.type===Xe.setSrc){let i=t.contentNode.getContent()[0];C.isImageURL(i)&&C.isExternalSrc(i)&&(e.usedExternalSrc=!0)}}},me=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`
|
|
65
65
|
Using action (id: ${e.getId()})
|
|
66
|
-
at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},
|
|
67
|
-
@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-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}
|
|
68
|
-
`,document.head.appendChild(o)}export{
|
|
66
|
+
at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},w=class extends Error{constructor(e){super(e),this.name="RuntimeGameError"}},Ue=class extends Error{constructor(e){super(e),this.name="RuntimeInternalError"}};function Hl(o,e){return $.color(o,e)}function Ul(o){return $.bold(o)}function Fl(o){return $.italic(o)}var ir=class o extends at{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 or=class o extends at{constructor(t,n=[0,0],i){super();this.duration=t;this.startPos=n;this.easing=i}createTask(t){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((n,i,r)=>({style:{opacity:n,...C.offset(["50%","50%"],[i,r],t.getStory().getInversionConfig()),transform:"translate(-50%, 50%)"}}))]}}copy(){return new o(this.duration,this.startPos,this.easing)}};var rr=class o extends at{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(/\.$/,"")}};var sr=class extends En{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 F(()=>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 Zi=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=Pe.isChained(e)?e.getActions():e;return De.do(t)}static getNamespaceName(e){return e.getNamespaceName()}static getCurrentScene(e){return e.getCurrentScene()}};Zi.DynamicPersistent=sn;if(typeof document<"u"){let o=document.createElement("style");o.textContent=`/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */
|
|
67
|
+
@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}
|
|
68
|
+
`,document.head.appendChild(o)}export{Vt as Align,xo as Avatar,li as Character,_e as CommonPosition,bn as CommonPositionType,so as Condition,De as Control,$e as Coord2D,Go as DefaultNvlContainer,vs as DefaultNvlDialogItem,Zi as DevTools,Xc as Dialog,ir as Dissolve,Dl as ExposedStateType,or as FadeIn,ms as FixedAspectRatioContainer,sr as Gallery,J as Game,Ai as GameMenu,Xs as GameProviders,P as GameState,U as Image,at as ImageTransition,gt as Isolated,Ri as Item,un as KeyBindingType,Wn as KeyMap,F as Lambda,cn as Layer,Cc as Layout,Un as LayoutRouterProvider,mt as LiveGame,rr as MaskTransition,ao as Menu,kn as NVLToken,ut as Namespace,Et as Nametag,xt as Narrator,Mi as Notifications,Mo as NvlContainer,qc as NvlDialogList,Ro as NvlProvider,Pc as Page,Po as PageInjectContext,Le as Pause,rn as Persistent,Qs as Player,Ln as Preference,Vr as RootPath,Ye as Scene,he as Script,ae as Sentence,En as Service,ue as Sound,It as SoundType,Da as Stage,Cn as Storable,Pn as Story,Wt as Text,An as TextTransition,Ya as Texts,qa as TextsPreview,Y as Transform,dt as Transition,uo as Video,$ as Word,Ul as b,Hl as c,Fl as i,rs as useAvatar,cc as useDialog,k as useGame,Oc as useIsNvlMode,Wc as useIsNvlVisible,qt as useKeyBinding,Gc as useLiveGame,yt as useNvl,Io as useNvlDialogs,gc as useParams,hc as usePathname,ot as usePreference,yc as useQueryParams,ht as useRouter,pc as useVoiceState};
|