narraleaf-react 0.9.0 → 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/LICENSE +373 -373
- package/README.md +165 -147
- package/dist/built-in.d.ts +3 -0
- package/dist/built-in.js +1 -0
- package/dist/game/nlcore/action/action.d.ts +9 -5
- package/dist/game/nlcore/action/actionTypes.d.ts +10 -10
- package/dist/game/nlcore/action/actions/menuAction.d.ts +1 -4
- package/dist/game/nlcore/action/logicAction.d.ts +29 -29
- package/dist/game/nlcore/common/elements.d.ts +4 -2
- package/dist/game/nlcore/common/transition.d.ts +2 -1
- package/dist/game/nlcore/elements/built-in/DevTools.d.ts +2 -0
- package/dist/game/nlcore/elements/built-in/built-in.d.ts +2 -0
- package/dist/game/nlcore/elements/built-in/screenEffects.d.ts +31 -0
- package/dist/game/nlcore/elements/character/avatar.d.ts +35 -0
- package/dist/game/nlcore/elements/character/sentence.d.ts +14 -0
- package/dist/game/nlcore/elements/character.d.ts +30 -0
- package/dist/game/nlcore/elements/displayable/displayable.d.ts +84 -0
- package/dist/game/nlcore/elements/displayable/image.d.ts +2 -2
- package/dist/game/nlcore/elements/displayable/text.d.ts +2 -2
- package/dist/game/nlcore/elements/layer.d.ts +1 -2
- package/dist/game/nlcore/elements/scene.d.ts +2 -1
- package/dist/game/nlcore/elements/transform/transform.d.ts +26 -3
- package/dist/game/nlcore/elements/transform/type.d.ts +30 -2
- package/dist/game/nlcore/elements/transition/transitions/image/maskTransition.d.ts +38 -0
- package/dist/game/nlcore/game.d.ts +60 -0
- package/dist/game/nlcore/gameTypes.d.ts +1 -36
- package/dist/game/player/Tasks.d.ts +4 -1
- 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/menu/type.d.ts +1 -0
- package/dist/game/player/elements/say/Avatar.d.ts +13 -0
- package/dist/game/player/elements/say/Nametag.d.ts +6 -3
- package/dist/game/player/elements/say/Sentence.d.ts +76 -13
- package/dist/game/player/elements/say/UIDialog.d.ts +6 -2
- package/dist/game/player/elements/say/type.d.ts +4 -2
- package/dist/game/player/elements/say/useDialog.d.ts +3 -0
- package/dist/game/player/elements/type.d.ts +27 -2
- package/dist/game/player/gameState.d.ts +5 -0
- package/dist/game/player/lib/AudioManager.d.ts +1 -0
- package/dist/game/player/lib/ErrorFallback.d.ts +5 -1
- package/dist/game/player/lib/Preloaded.d.ts +1 -0
- package/dist/game/player/libElements.d.ts +7 -2
- package/dist/game/player/provider/game-state.d.ts +1 -0
- package/dist/main.js +42 -40
- package/dist/util/data.d.ts +15 -2
- package/package.json +114 -107
package/dist/main.js
CHANGED
|
@@ -1,66 +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 Qn(o){return new Promise(e=>setTimeout(e,o))}var qn=class qn{constructor(e){this.abortHandler=e;this.events=new W;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(qn.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};qn.EventTypes={"event:skipController.abort":"event:skipController.abort"};var M=qn;var un=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}},jt=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new un;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 Xn(o,e,t={}){return o?e:t}function Jo(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var Wn=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 Zo(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 _o(o,e){return new Promise((t,n)=>{fetch(o,e).then(i=>i.blob()).then(i=>{let r=new FileReader;r.onload=()=>{t(r.result)},r.readAsDataURL(i)}).catch(n)})}var pn=class{constructor(e,t){this.concurrency=e;this.delay=t;this.tasks=[]}addTask(e){this.tasks.push(e)}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 Qn(this.delay),await e()};await e()}};function ze(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function er(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var Le=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 tr(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 nr(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function qi(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function Qi(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"&&!Qi(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var zn=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function ir(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 or(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Bn=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},$n=class{constructor(){this.hooks={}}hook(e,t){return this.hooks[e]=this.hooks[e]||[],this.hooks[e].push(t),{cancel:()=>this.unhook(e,t)}}unhook(e,t){this.hooks[e]=this.hooks[e]?.filter(n=>n!==t)||[]}trigger(e,t){let n=this.hooks[e];if(!n)return()=>{};let i=n.map(r=>r(...t));return()=>{i.forEach(r=>r&&r())}}rawTrigger(e,t){let n=this.hooks[e];if(!n)return()=>{};let i=n.map(r=>r(...t()));return()=>{i.forEach(r=>r&&r())}}};var 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 rr(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,u=r*c+s*a>>>0,m=s*c+(u>>>0)>>>0;e=l,t=m}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var dn=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=ji(),this._id=""}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}getId(){return this._id}setId(e){this._id=e}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]:[]}};dn.ActionTypes={action:"action"};var U=class extends dn{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 g(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 Xi=class{constructor(e){this.type=e,this.content=void 0}setContent(e){return this.content=e,this}getContent(){return this.content}},v=class o extends Xi{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 Yn={center:"center",left:"left",right:"right"};import{animate as Ms}from"motion/react";var mn=(n=>(n.Left="left",n.Center="center",n.Right="right",n))(mn||{}),ar={left:"33.33%",center:"50%",right:"66.66%"},Be=class Be{static isUnknown(e){return e===Be.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||Be.isUnknown(e)?"auto":t===void 0||Be.isUnknown(t)?`calc(${e} + 0px)`:`calc(${typeof e=="number"?`${e}px`:e} + ${t}px)`}static toCoord2D(e){if($e.isCommonPositionType(e))return Ie.fromCommonPosition(e);if(Ie.isCoord2DPosition(e))return e;if(Rt.isAlignPosition(e))return Ie.fromAlignPosition(e);if(typeof e=="object"&&["x","y","xoffset","yoffset"].some(t=>t in e)){let t=e;return new Ie(t)}else throw new Error("Invalid position type")}static orUnknown(e){return Be.isUnknown(e)||e===void 0?Be.Unknown:e}static mergePosition(e,t){let n=this.toCoord2D(e),i=this.toCoord2D(t);return Ie.merge(n,i)}static serializePosition(e){let t=this.toCoord2D(e);return{x:Be.isUnknown(t.x)?0:t.x,y:Be.isUnknown(t.y)?0:t.y,xoffset:Be.isUnknown(t.xoffset)?0:t.xoffset,yoffset:Be.isUnknown(t.yoffset)?0:t.yoffset}}static isRawCommonPositionType(e){return Object.values(mn).includes(e)}static isRawCoord2DPosition(e){return typeof e=="object"&&("x"in e||"y"in e||"xoffset"in e||"yoffset"in e)}static isRawAlignPosition(e){return typeof e=="object"&&("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 Ie||e instanceof Rt}static rawPositionToCoord2D(e){if(this.isRawCommonPositionType(e))return Ie.fromCommonPosition(new $e(e));if(this.isRawCoord2DPosition(e))return new Ie(e);if(this.isRawAlignPosition(e))return Ie.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}}};Be.Unknown=Symbol("Unknown");var k=Be,Jn=class Jn{static isCommonPositionType(e){return e instanceof Jn}constructor(e){this.position=e}toCSS(){return{x:ar[this.position],y:"50%",xoffset:0,yoffset:0}}};Jn.Positions=mn;var $e=Jn,Ie=class o{static isCoord2DPosition(e){return e instanceof o}static fromCommonPosition(e){return new o({x:ar[e.position],y:"50%"})}static fromAlignPosition(e){let t=n=>!n||k.isUnknown(n)?k.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:k.isUnknown(t.x)?e.x:t.x,y:k.isUnknown(t.y)?e.y:t.y,xoffset:k.isUnknown(t.xoffset)?e.xoffset:t.xoffset,yoffset:k.isUnknown(t.yoffset)?e.yoffset:t.yoffset})}constructor(e,t){typeof e=="object"?(this.x=k.orUnknown(e.x),this.y=k.orUnknown(e.y),this.xoffset=k.orUnknown(e.xoffset),this.yoffset=k.orUnknown(e.yoffset)):(this.x=k.orUnknown(e),this.y=k.orUnknown(t),this.xoffset=k.Unknown,this.yoffset=k.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}}},Rt=class o{static isAlignPosition(e){return e instanceof o}constructor(e,t){typeof e=="object"?(this.xalign=k.orUnknown(e.xalign),this.yalign=k.orUnknown(e.yalign),this.xoffset=k.orUnknown(e.xoffset),this.yoffset=k.orUnknown(e.yoffset)):(this.xalign=k.orUnknown(e),this.yalign=k.orUnknown(t),this.xoffset=k.Unknown,this.yoffset=k.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:k.isUnknown(this.xalign)?this.xalign:`${this.xalign*100}%`,y:k.isUnknown(this.yalign)?this.yalign:`${this.yalign*100}%`,xoffset:this.xoffset,yoffset:this.yoffset}}};var K=class o{constructor(e,t){this.defaultConfig=e;this.handlers=t||{}}create(e={}){return new Yi(this.mergeWithDefaultConfig(e))}copy(){return new o(I({},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)?I({},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}},Yi=class o{constructor(e){this.config=e}get(){return this.config}copy(){return new o(I({},this.config))}join(e){let t=er(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 Gs={[Yn.left]:"25.33%",[Yn.center]:"50%",[Yn.right]:"75.66%"},Xe=class Xe{constructor(e={}){this.state={};this.locked=null;this.frozen=!1;this.state=e}static deserialize(e){return new Xe(Xe.TransformStateSerializer.deserialize(e))}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?k.toCoord2D(k.tryParsePosition(e||t)):k.mergePosition(k.tryParsePosition(e),k.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=Xe.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 qi(z.constructStyle(e,this.state,t))}toStyle(e,t){return qi(z.constructStyle(e,this.state,t))}serialize(){return Xe.TransformStateSerializer.serialize(this.state)}clone(){return new Xe(Xe.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=Xe.mergeState(this.state,t),this}forceOverwrite(e){return this.state=e,this}};Xe.DefaultTransformState=new K({scaleX:1,scaleY:1,zoom:1,rotation:0,position:new $e("center"),opacity:0,alt:""}),Xe.TransformStateSerializer=new Le({position:e=>k.serializePosition(k.tryParsePosition(e))},{position:e=>k.toCoord2D(e)});var me=Xe,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 $e.isCommonPositionType(e)||Ie.isCoord2DPosition(e)||Rt.isAlignPosition(e)}static immediate(e){return new de(e,{duration:0,ease:"linear"})}static left(e,t){return new de({position:$e.Positions.Left},{duration:e,ease:t})}static right(e,t){return new de({position:$e.Positions.Right},{duration:e,ease:t})}static center(e,t){return new de({position:$e.Positions.Center},{duration:e,ease:t})}static create(e){return new de([],e)}static positionToCSS(e,t,n){return e?k.isRawPosition(e)?k.D2PositionToCSS(k.rawPositionToCoord2D(e),n,t):k.D2PositionToCSS(e.toCSS(),n,t):{}}static mergePosition(e,t){if(!e&&!t)throw new Error("No position found.");return!e||!t?k.toCoord2D(k.tryParsePosition(e||t)):k.mergePosition(k.tryParsePosition(e),k.tryParsePosition(t))}static mergeState(e,t){let n=this.mergePosition(e.position,t.position);return{...I(e,t),position:n}}static propToCSSTransform(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{translate:s=[]}=n||{},a=t.zoom??1,c=function(p,h,d){return typeof p>"u"?typeof d<"u"?h(d):"":h(p)},l=s[0]||(r?"":"-")+"50%",u=s[1]||(i?"":"-")+"50%";return[`translate(${l}, ${u})`,c(t.rotation,p=>`rotate(${p}deg)`,0),c(t.scaleX,p=>`scaleX(${p*a})`,1),c(t.scaleY,p=>`scaleY(${p*a})`,1)].filter(Boolean).join(" ")}static constructStyle(e,t,n){let{invertY:i,invertX:r}=e.getStory().getInversionConfig(),{overwrite:s}=n||{};return{...de.positionToCSS(t.position,i,r),opacity:t.opacity,color:"fontColor"in t&&t.fontColor?mt(t.fontColor):void 0,transform:de.propToCSSTransform(e,t),...s?s(t):{}}}animate(e,{gameState:t,ref:n,overwrites:i}){if(!n.current)throw new Error("No ref found when animating.");this.commit();let{finalState:r,sequences:s,options:a}=this.constructAnimation({gameState:t,transformState:e,overwrites:i,current:n.current});s.length||t.logger.warn("Transform","No sequences to animate.");let c=!1,l=e.lock(),u=Ms(s,a),m=()=>{e.overwrite(l,r.get()).unlock(l),u.complete(),c=!0},p=new g().registerSkipController(new M(m)),h=()=>{c||e.overwrite(l,r.get()).unlock(l),c=!0,t.logger.debug("Transform","Transform Completed",e.toStyle(t,i)),p.resolve()};return u.then(h,d=>{t.logger.error("Failed to animate transform. "+(d?.toString?.()||""))}),u.play(),t.logger.debug("Transform","Ready to animate transform.",{finalState:r,sequences:s,options:a},this),p}repeat(e){let t=this.copy();return t.config.repeat||(t.config.repeat=1),t.config.repeat*=e,t}getOptions(e){if(!e)return{...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 u=r.assign(s,c).toFramesDefinition(e,n);return[i,u,this.getOptions(l)]});return{finalState:r.unlock(s).freeze(),sequences:a,options:this.getSequenceOptions()}}getSequenceOptions(){let{repeat:e,repeatDelay:t}=this.config;return{repeat:e,repeatDelay:this.toSeconds(t,void 0)}}copy(){return new 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})}constructCommit(e,t){let n={props:{},options:t};for(let i of e)n.props[i.key]=i.props;return n}pushChange(e){return this.stagedChanges.push(e),this}toSeconds(e,t){return typeof e>"u"?t:e/1e3}atToSeconds(e){if(typeof e>"u")return e;if(typeof e=="number")return e/1e3;let n=/^([+-])(\d+)$/.exec(e);if(!n)throw new te("Invalid at definition. At definition must be a number or a string in the format of `+n` or `-n`.");let[i,r,s]=n,a=Number(s);if(isNaN(a))throw new te("Invalid number in at definition.");let c=a/1e3;return r==="+"?`+${c}`:`-${c}`}};de.defaultConfig={sync:!0},de.defaultOptions={duration:0,ease:"linear"},de.CommonImagePositionMap=Gs;var z=de;var Zn=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 cr=Symbol("_Chained"),lr;lr=cr;var Ji=class Ji{constructor(e){this[lr]=!0;this.__actions=[];this.__self=e}static isChained(e){return e&&e[cr]}static toActions(e){return e.flat(2).map(t=>Ji.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()}},ge=Ji,qt=class extends Zn{chain(e){let t=ge.isChained(this)?this:this.proxy(this,new ge(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 X=class extends qt{constructor(){super()}toData(){return null}fromChained(e){return e.getActions()}};var tt=class extends U{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)}}`:""}`)}};tt.ActionTypes=jo;var nt=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=I({},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=
|
|
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(Re.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(Re.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(Re.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(Re.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(Re.ActionTypes.setRate,[e])}pause(e){return this.pushAction(Re.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(Re.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}getSrc(){return this.config.src}toData(){return{state:oe.StateSerializer.serialize(this.state)}}fromData(e){return this.state=oe.StateSerializer.deserialize(e.state),this}copy(){return new oe(this.userConfig.get())}reset(){return this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return oe.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new Re(this.chain(),e,new v().setContent(t)))}};oe.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",oe.DefaultUserConfig=new K({src:oe.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,type:"sound"}),oe.DefaultConfig=new K({src:oe.noSound,loop:!1,streaming:!1,seek:0,type:"sound"}),oe.DefaultState=new K({volume:1,rate:1,paused:!1,muted:!1}),oe.StateSerializer=new Le;var Z=oe;var ru={};var Qt=class extends qt{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 Nt=class Nt{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===Nt.SrcTypes.image?t.add(s):r===Nt.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 G?G.getSrcURL(e):e.type==="image"?G.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(O,H.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 Y){let n=t;if(t.is(Y,Ge.setSrc)){let i=t.contentNode.getContent()[0];if(A.isImageSrc(i))return{type:"image",src:A.srcToURL(i),activeType:"scene"}}else{if(t.type===Ge.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===Ge.setAppearance){let i=t.contentNode.getContent()[0];if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(G.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:G.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 Z){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof G||A.isStaticImageData(e)){if(e instanceof G){if(!A.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(G.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 Z?t:new Z({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 Z?e.getSrc():e;return this.src.some(n=>n.type===Nt.SrcTypes.audio?t===n.src.getSrc():n.type===Nt.SrcTypes.image?t===G.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)}};Nt.SrcTypes={image:"image",video:"video",audio:"audio"};var Ae=Nt;var At=class extends U{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===On.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===On.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")}};At.ActionTypes=On;var Se=class extends U{executeAction(e,t){if(this.type===he.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===he.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===he.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 g().registerSkipController(new M(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=e.getExposedStateForce(t),c=t.transformState.clone(),l=a.applyTransform(n,()=>{r?.(),s.resolve(super.executeAction(e,i))}),u=e.timelines.attachTimeline(s).attachChild(l);return e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},m=>{s.isSettled()||s.abort(),l.abort(),t.transformState.forceOverwrite(m.state)},[c]),s}applyTransition(e,t,n,i,r){let s=new g().registerSkipController(new M(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),c=e.getExposedStateForce(t).applyTransition(n,()=>{r?.(),s.resolve(super.executeAction(e,i))}),l=e.timelines.attachTimeline(s).attachChild(c);return e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{s.isSettled()||s.abort(),c.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 g().registerSkipController(new M(()=>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")}};Se.ActionTypes=he;var it=class extends X{constructor(){super(...arguments);this.srcManager=new Ae}pos(t,n,i){return this.transform(new z({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new z({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new z({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new z({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new z({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new z({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new z({opacity:t},{duration:n,ease:i}))}transform(t){let n=this.chain(),i=new Se(n,he.applyTransform,new v().setContent([t.copy()]));return n.chain(i)}show(t){let n=this.chain(),i=t instanceof z?t.copy():new z({opacity:1},t),r=new Se(n,he.applyTransform,new v().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof z?t.copy():new z({opacity:0},t),r=new Se(n,he.applyTransform,new v().setContent([i]));return n.chain(r)}};var Mt=(t=>(t[t.Number=0]="Number",t[t.HexColor=1]="HexColor",t))(Mt||{});import{animate as Hs}from"motion/react";var ot=class{requestAnimations(e){let t=e.map(m=>m.start),n=[],i=0,r=[],s=[],a=[];return{onUpdate:m=>(r.push(m),{cancel:()=>{let p=r.indexOf(m);p!==-1&&r.splice(p,1)}}),onComplete:m=>(s.push(m),{cancel:()=>{let p=s.indexOf(m);p!==-1&&s.splice(p,1)}}),onCanceled:m=>(a.push(m),{cancel:()=>{let p=a.indexOf(m);p!==-1&&a.splice(p,1)}}),complete:()=>{i!==e.length&&n.forEach(m=>m.complete())},start:()=>{if(n.length>0)throw new Error("Animation controllers are already started");e.forEach((m,p)=>{n.push(this.requestMotion(m,{onComplete:()=>{t[p]=m.end,r.forEach(h=>h(t)),i++,i===e.length&&s.forEach(h=>h())},onUpdate:h=>{t[p]=h,r.forEach(d=>d(t))}}))})},cancel:()=>{n.forEach(m=>m.cancel()),a.forEach(m=>m())}}}toFinalStyle(e){return e.resolve.map(t=>typeof t=="function"?t(...e.animations.map(n=>n.end)):t.resolver(...e.animations.map(n=>n.end)))}asPrev(e){return{resolver:e,key:"current"}}asTarget(e){return{resolver:e,key:"target"}}requestMotion(e,t){return Hs(e.start,e.end,{duration:e.duration/1e3,onUpdate:n=>{t.onUpdate&&t.onUpdate(n)},onComplete:()=>{t.onComplete&&t.onComplete()},ease:e.ease})}};ot.AnimationType=Mt;var hn=class extends ot{_setElement(e){return this._element=e,this}getTextState(){if(this._element===void 0)throw new b(`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:
|
|
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: `+
|
|
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 G({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 O(this.chain(),"scene:jumpTo",new v().setContent([t])))}_exit(){return new O(this.chain(),"scene:exit",new v().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 O(this.chain(),"scene:init",new v().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)]}};De.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"},De.DefaultUserConfig=new K({backgroundMusic:null,backgroundMusicFade:0,voices:void 0,background:"#fff",layers:[]}),De.DefaultSceneConfig=new K({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new _t("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new _t("[[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=>{Z.isSound(r)&&De.validateVoice(r)}),i(t))return t;throw new ye(`Invalid voices config: ${t}`)}});var Ue=De;import*as hr from"howler";var si=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 Us={volume:1,limit:1/0},Fs=class dr{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={...Us,...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 dr(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}}},mr=!1;function Ks(o){mr=o}function kt(o,e){mr||(e!==void 0?console.warn(o,e):console.warn(o))}var Vs=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){kt("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){kt("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){kt("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()}},pr=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}},Os=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 Vs(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){kt("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){kt("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 pr(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new pr(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}},Ws=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}},zs=10*1024*1024,Bs=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 Ws(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}}},$s={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},fr=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...$s,...o},Ks(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Bs(this.audioContext),this.masterChannel=new Fs("__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=>{kt("Failed to resume AudioContext while unlocking.",t)})};this.unlockHandler=e,document.addEventListener("click",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",e)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let o=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",o),document.removeEventListener("touchstart",o),document.removeEventListener("keydown",o)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(o,e,t){this.ensureNotDestroyed(),this.ensureReady();let{volume:n=1,rate:i=1,startTime:r=0,endTime:s,load:a="auto",loop:c=!1}=e??{},l,u=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")l=this.createStreamSource(o);else{u=await this.audioCache.load(o),u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=u.raw(),l=p}else{u=o,u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=o.raw(),l=p}let m=new Os(this.audioContext,l,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(l instanceof AudioBufferSourceNode?(l.loop=c,c&&s!==void 0&&(l.loopStart=r,l.loopEnd=s)):l instanceof HTMLAudioElement&&(l.loop=c),u){let p=!1,h=()=>{p||(p=!0,u.releaseRef?.())};m.once("ended",h),m.once("stop",h)}return m}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<zs?"full":"stream"}catch(t){return kt("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=>{kt("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var ai=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;Object.values(Ct).forEach(t=>{this.channelVolumes.set(t,1)})}initialize(){this.isReady||(this.sound=new fr,this.ready=this.sound.onceReady().then(()=>{this.sound.setVolume(this.globalVolume),Object.values(Ct).forEach(e=>{let t=this.channelVolumes.get(e)??1,n=this.sound.createChannel(e,{volume:t});this.channels.set(e,n)}),this.isReady=!0,this.setupGroupVolume()}))}play(e,t={end:1,duration:0}){let n=new g;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 b(`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 g;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 g;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 g;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 g;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 g;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,g.resolve(void 0)):g.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 b(`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 g,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 M(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")}};st.ActionTypes=$t;var mi=st;var en=class en extends X{constructor(e){super();let t=en.DefaultVideoConfig.create(e);if(this.config=t.get(),this.state=this.getInitialState(),!this.config.src)throw new te("Video must have a src")}show(){return this.chain(this.createAction($t.show,[]))}hide(){return this.chain(this.createAction($t.hide,[]))}play(){return this.chain(this.createAction($t.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 en.DefaultVideoState.create().get()}createAction(e,t){return new mi(this.chain(),e,v.create(t))}};en.DefaultVideoConfig=new K({src:"",muted:!1}),en.DefaultVideoState=new K({display:!1});var no=en;var ee=class ee{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 un;this.htmlToImage=js;this.pageRouter=null;this.stageClickBuffer=null;this.nvlAdvanceWaiters=new Map;this.stage=t,this.game=e,this.events=new W,this.logger=new si(e,"NarraLeaf-React"),this.audioManager=new ai(this),this.guard=new ti(e.config.app.guard).observe(this),this.timelines=new ni(this.guard),this.notificationMgr=new ci(this,[]),this.idManager=new Bn,this.actionHistory=new li(e.config.maxActionHistory,this.game.getLiveGame()),this.gameHistory=new ui(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=Ue.isScene(e)?e:e.entryScene;if(!t)throw new b("Trying to preload a story but the story is not loaded");return this.preloadingScene=t,this.events.emit(ee.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}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(re.getCtx({gameState:this}));this.game.getLiveGame().events.emit(rt.EventTypes["event:character.prompt"],{character:t.config.character,sentence:t,text:F.getText(s)});let a=this.createWaitableAction({character:t.config.character,sentence:t,id:e,words:s},()=>{r.splice(r.indexOf(a),1),n&&n()});return r.push(a),this.stage.update(),{cancel:()=>{let c=r.indexOf(a);c!==-1&&r.splice(c,1)},text:F.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(re.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(rt.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?F.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(ee.EventTypes["event:state.nvl.enter"],t,e||null),this.events.emit(ee.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(ee.EventTypes["event:state.nvl.visibilityChange"],!1,t),this.events.emit(ee.EventTypes["event:state.nvl.exit"]),this.emitNvlStateChange(),this}setNvlVisibility(e,t){return this.nvlState={...this.nvlState,visible:e},this.events.emit(ee.EventTypes["event:state.nvl.visibilityChange"],e,t),this.emitNvlStateChange(),this}appendNvlDialog(e){return this.nvlState.dialogs=[...this.nvlState.dialogs,e],this.events.emit(ee.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(ee.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})=>O.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(ee.EventTypes["event:state.nvl.enter"],this.nvlState.sessionId||"",this.nvlState.options),this.events.emit(ee.EventTypes["event:state.nvl.visibilityChange"],this.nvlState.visible,this.nvlState.visible?this.nvlState.options?.showTransition:this.nvlState.options?.hideTransition)):(this.events.emit(ee.EventTypes["event:state.nvl.visibilityChange"],!1,this.nvlState.options?.hideTransition),this.events.emit(ee.EventTypes["event:state.nvl.exit"])),this.emitNvlStateChange(),this}restorePresentationSnapshot(e){return e.scenes.forEach(t=>{O.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(ee.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(ee.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 b(`Displayables not found when disposing. (disposing: ${e.getId()})`);return r.splice(s,1),this}forceReset(){this.state.elements.forEach(({scene:e})=>{this.offSrcManager(e.srcManager),this.removeScene(e),e.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 hr.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 b("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]=fe.proxy(g.nothing),n=[];return Array.from(this.exposedState.keys()).forEach(i=>{i instanceof it&&n.push(i)}),n.forEach(i=>{let r=this.getExposedStateForce(i),s=r.applyTransform(z.immediate({}),()=>{});t.attachChild(s),r.updateStyleSync()}),this.timelines.attachTimeline(t),e}mountState(e,t){if(this.exposedState.has(e))throw new xe("State already mounted");if(!e)throw new xe("Invalid state key");return this.exposedState.set(e,t),this.events.emit(ee.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 b("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(ee.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 b("Scene not found, id: "+a+`
|
|
26
|
-
NarraLeaf cannot find the element with the id from the saved game`);let
|
|
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,
|
|
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`);d.reset(),d.fromData(h)}),this.currentSavedGame=e,t.loadData(r,m),this.stackModel.deserialize(c,u),l.forEach(p=>this.asyncStackModels.add(we.createStackModel(this,p,u))),this.asyncStackModels.forEach(p=>t.timelines.attachTimeline(p.execute())),n.deserializeServices(a),this.game.hooks.trigger("afterRestore",[]),t.events.once(w.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===Bt.say&&this.gameState.isNvlMode()&&this.gameState.suppressNextNvlTyping(),this.stackModel.deserialize(r,i),s===this.stackModel&&this.stackModel.push(we.fromAction(n.action)),this.gameLock.off(t.unlock()),this.gameState.logger.info("LiveGame.undo","Undo until",e,"action",n),this.gameState.stage.forceUpdate(),this.gameState.stage.next(),this.gameState.schedule(()=>{this.gameState&&this.gameState.forceAnimation()},0)}else this.gameState.logger.warn("LiveGame.undo","No action found"),this.gameLock.off(t.unlock())}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=g.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 Z({src:t}):t;return this.gameState.audioManager.playSoundToken(n)}skipDialog(){this.assertGameState(),this.gameState.events.emit(w.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(ht.EventTypes["event:character.prompt"],e)}onMenuChoose(e){return this.events.on(ht.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(we.fromAction(i)):e.logger.warn("No scene root found");let r=this.story?.getAllElementMap(this.story,this.story?.entryScene?.getSceneRoot()||[]);return r?r.forEach(s=>{e.logger.debug("reset element",s),s.reset()}):e.logger.warn("No elements found"),e.stage.forceUpdate(),e.stage.next(),t.end(),this}waitForRouterExit(){let e=null;return{promise:new Promise(t=>{e=this.game.router.onceExitComplete(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}waitForPageMount(){let e=null;return{promise:new Promise(t=>{e=this.game.router.oncePageMount(()=>{t()})}),cancel:()=>{e&&e.cancel()}}}requestFullScreen(e){this.assertGameState();let t="LiveGame.requestFullScreen";try{let n=this.gameState.playerCurrent;if(!n){this.gameState.logger.warn(t,"No player element found");return}if(n.requestFullscreen)return n.requestFullscreen(e);this.gameState.logger.warn(t,"Fullscreen is not supported")}catch(n){this.gameState.logger.error(t,n)}}exitFullScreen(){this.assertGameState();let e="LiveGame.exitFullScreen";try{if(document.exitFullscreen)return document.exitFullscreen();this.gameState.logger.warn(e,"Fullscreen is not supported")}catch(t){this.gameState.logger.error(e,t)}}constructMaps(){let e=this.story;if(!e)throw new Error("No story loaded");if(this.mapCache)return this.mapCache;let t=new Map,n=new Map;return e.forEachChild(e,e.entryScene?.getSceneRoot()||[],i=>{t.set(i.getId(),i),n.set(i.callee.getId(),i.callee)},{allowFutureScene:!0}),this.mapCache=[t,n],this.mapCache}getScreenshotOptions(){return{quality:this.game.config.screenshotQuality}}onPlayerEvent(e,t,n){this.assertPlayerElement();let i=this.gameState.playerCurrent;return i?(i.addEventListener(e,t,n),{cancel:()=>i.removeEventListener(e,t,n)}):(this.gameState.logger.warn("LiveGame.onEvent","No player element found"),{cancel:()=>{}})}onWindowEvent(e,t,n){return window.addEventListener(e,t,n),{cancel:()=>window.removeEventListener(e,t,n)}}reset(){this.assertGameState();let e=this.gameState;this.resetStackModels(),this.stackModel.reset(),this.currentSavedGame=null,this.lastDialog=null,e.forceReset()}next(){this.assertGameState();let e=this.gameState;if(this.gameLock.isLocked())return this.gameLock;if(!this.story)throw new Error("No story loaded");return this.stackModel.isEmpty()?(e.logger.weakWarn("Game Actions","Action stack is empty"),this.currentSavedGame?e.events.emit("event:state.end"):this.currentSavedGame=null,null):this.stackModel.rollNext()}setLastDialog(e,t){this.lastDialog={sentence:e,speaker:t}}requestAsyncStackModel(e){this.assertGameState();let t=new we(this);return this.asyncStackModels.add(t),t.push(...e),t}createStackModel(e){let t=new we(this);return t.push(...e),t}resetStackModels(){this.asyncStackModels.forEach(e=>e.reset()),this.asyncStackModels.clear()}isPlaying(){return this.stackModel&&!this.stackModel.isEmpty()}executeAction(e,t,n){if(!this.stackModel)throw new Error("Stack model is not initialized");let i=t.executeAction(e,n);return g.isAwaitable(i)?i:i||null}setGameState(e){if(e&&this.gameState)throw new xe("GameState already set");return this.gameState=e,e&&!this.stackModel&&(this.stackModel=new we(this,"$root")),this}getGameState(){return this.gameState}getGameStateForce(){if(!this.gameState)throw new xe("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),[tt].some(c=>i?.action&&i.action instanceof c)){i=null;continue}if(i.action&&i.action.is(O,H.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.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 xe("No stack model found");return this.stackModel.reset(),this}getStackModelForce(){if(!this.stackModel)throw new xe("No stack model found");return this.stackModel}getNewSavedGame(){return{name:"",meta:{created:Date.now(),updated:Date.now(),id:or(),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 b("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 b("Player Element Not Mounted")}};ht.DefaultNamespaces={game:{}},ht.GameSpacesKey={game:"game"},ht.EventTypes={"event:character.prompt":"event:character.prompt","event:menu.choose":"event:menu.choose"};var rt=ht;var bn=class bn{constructor(e){this.settings=e;this.events=new W;this.events.setMaxListeners(64)}setPreference(e,t){this.settings[e]=t,this.events.emit(bn.EventTypes["event:game.preference.change"],e,t)}getPreference(e){return this.settings[e]}getPreferences(){return this.settings}onPreferenceChange(e,t){return this.events.on(bn.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))}};bn.EventTypes={"event:game.preference.change":"event:game.preference.change"};var Cn=bn;import"client-only";import Yr,{useEffect as Cc,useRef as Ao}from"react";import"client-only";import yr,{useContext as Qs,useState as Xs}from"react";var Sr=yr.createContext(null);function vr({children:o,game:e}){"use client";let t=new B({}),[n]=Xs(e||t);return yr.createElement(Sr,{value:n},o)}function C(){let o=Qs(Sr);if(!o)throw new Error("useGame must be used within a GameProvider");return o}import Ys,{createContext as Js,useContext as Tr}from"react";var br="/",fi=class fi{constructor(e,t=fi.rootPath){this.events=new W;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 b(`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 b(`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(),ze(()=>{t()}))})}else ze(()=>{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)}};fi.rootPath=br;var Et=fi,io=Js(null);function Cr({children:o}){let e=C();return Ys.createElement(io,{value:{router:e.router}},o)}function at(){if(!Tr(io))throw new Error("useRouter must be used within a RouterProvider");return Tr(io).router}import xr from"react";import oa from"clsx";import Zs,{createContext as _s,useContext as ea,useLayoutEffect as ta,useReducer as na,useState as ia}from"react";var gt=class gt{constructor(){this.state={width:0,height:0,minWidth:800,minHeight:450,paused:!1,scale:0};this.events=new W().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(gt.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(gt.EventTypes["event:aspectRatio.pause"])}resume(){this.state.paused=!1,this.events.emit(gt.EventTypes["event:aspectRatio.resume"])}onUpdate(e){return this.events.on(gt.EventTypes["event:aspectRatio.update"],e).cancel}requestUpdate(){this.events.emit(gt.EventTypes["event:aspectRatio.requestUpdate"])}onRequestedUpdate(e){return this.events.on(gt.EventTypes["event:aspectRatio.requestUpdate"],e).cancel}triggerUpdate(){this.updater&&this.updater()}};gt.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 oo=gt,ro=_s(null);function Ar({children:o}){"use client";let[e]=ia(()=>new oo);return Zs.createElement(ro,{value:{ratio:e}},o)}function se(){let o=ea(ro),[,e]=na(n=>n+1,0);if(!ro||!o)throw new Error("useRatio must be used within a RatioProvider");let{ratio:t}=o;return ta(()=>(e(),t.onUpdate(()=>{e()})),[t]),o}function ct({children:o,className:e,style:t,ref:n,...i}){let{ratio:r}=se(),s=r.getStyle();return xr.createElement("div",{className:oa("inset-0",e),style:{width:"100%",height:"100%",minWidth:`${r.state.minWidth}px`,minHeight:`${r.state.minHeight}px`},...i},xr.createElement("div",{style:{...s,position:"relative",...t||{}},...i||{},ref:n},o))}import ra,{useEffect as sa}from"react";function Je(o){let e=C(),[t,n]=ra.useState(e.preference.getPreference(o)),i=r=>{e.preference.setPreference(o,r),n(r)};return sa(()=>e.preference.onPreferenceChange(o,n).cancel,[o,e.preference,n]),[t,i]}import so from"react";import hi from"react";import wr from"clsx";function gi({children:o,className:e,style:t,...n}){let{ratio:i}=se(),r=C();return hi.createElement(ct,{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},hi.createElement("div",{className:"absolute inset-0 w-full h-full"},hi.createElement("div",{className:"inset-0 w-full h-full"},hi.createElement("div",{className:wr("pointer-events-auto-rest",e),style:t},o))))}function aa({children:o,className:e,style:t}){return so.createElement(so.Fragment,null,so.createElement(gi,{style:t,className:e,"data-element-type":"stage","data-code-source":"Stage.tsx"},o))}import kr from"clsx";import Er from"react";function yi({className:o,children:e,...t}){let{ratio:n}=se();return Er.createElement("div",{style:{transform:`scale(${n.state.scale})`,transformOrigin:"left top"},className:kr("w-full h-full")},Er.createElement("div",{className:kr("z-20",o),...t},e))}import qe,{useState as Pr}from"react";import{motion as ca}from"motion/react";function Si({children:o,border:e="solid",color:t="red",tag:n,borderWidth:i=1,as:r="div",ref:s,...a}){let c=C(),[l,u]=Pr(!1);if(!c.config.app.inspector)return qe.createElement(r,{...a,ref:s},o);let m={...a,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),style:{...a.style||{},outline:`${i}px ${e} ${t}`,zIndex:l?1e3:"auto"}};return qe.createElement(r,{...m,ref:s},n&&l&&qe.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black text-sm"},n),o)}function la({border:o="solid",color:e="red",tag:t,borderWidth:n=1,as:i="img",...r}){let s=C(),[a,c]=Pr(!1);if(!s.config.app.inspector)return qe.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 qe.createElement("div",null,qe.createElement(i,{...l}),t&&a&&qe.createElement("span",{className:"absolute top-0 left-0 bg-white text-black border-2 border-black"},t))}function ua(o){return qe.createElement(Si,{...o,as:"div"})}function pa(o){return qe.createElement(Si,{...o,as:"span"})}function da(o){return qe.createElement(la,{...o,as:"img"})}function ma(o){return qe.createElement(Si,{...o,as:"button"})}function fa(o){return qe.createElement(Si,{...o,as:ca.div,ref:o.ref,layout:o.layout})}var ha={Div:ua,Span:pa,Button:ma,Img:da,mDiv:fa},Ft=ha;import Ir from"clsx";import lt,{useEffect as ao,useRef as Aa,useState as xa}from"react";import{useEffect as ga,useState as ya}from"react";function $(o){let[e,t]=ya(0);ga(()=>{n()},o??[]);function n(){t(i=>i+1)}return[n,e]}import Dr from"react";var Kt=Dr.createContext(null);function yt(){let o=Dr.useContext(Kt);if(!o)throw new Error("useDialogContext must be used within a DialogContext");return o}import vi,{useLayoutEffect as Lr,useMemo as Sa,useState as va}from"react";var Ze=class Ze{constructor(e){this.events=new W;this._forceSkipped=!1;this._idle=!1;this.config=e,this._state="pending",this.autoForwardScheduler=new Wn,this._count=0}get state(){return this._state}get deps(){return[this._count]}isIdle(){return this._idle}setIdle(e){this._idle=e}requestComplete(){this.state==="ended"?this.safeEmit(Ze.Events.complete):this.safeEmit(Ze.Events.requestComplete)}forceSkip(){this.state==="ended"?this.emitComplete():(this._forceSkipped=!0,this.safeEmit(Ze.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(Ze.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(B.Preferences.autoForward)&&this.scheduleAutoForward(),this.emitComplete(),this}emitComplete(){return this.safeEmit(Ze.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(Ze.Events.onFlush),this}onFlush(e){return this.events.on(Ze.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;!e.getPreference(B.Preferences.autoForward)||this.state!=="ended"||this.autoForwardScheduler.cancelTask().scheduleTask(()=>{this.events.emit(Ze.Events.simulateClick)},this.config.gameState.game.config.autoForwardDelay/e.getPreference(B.Preferences.gameSpeed))}};Ze.Events={requestComplete:"event:dialog.requestComplete",complete:"event:dialog.complete",forceSkip:"event:dialog.forceSkip",onFlush:"event:dialog.onFlush",simulateClick:"event:dialog.simulateClick"};var le=Ze;function An({action:o,onFinished:e,useTypeEffect:t=!0,gameState:n}){let i=Sa(()=>o.sentence?.evaluate(re.getCtx({gameState:n})),[o.sentence,n]),[r]=va(()=>new le({useTypeEffect:t,action:o,evaluatedWords:i||[],gameState:n})),s=n.game.config.dialog;return Lr(()=>(n.logger.debug("NarraLeaf-React: Say","dialogState",r),r.events.on(le.Events.complete,a=>{n.logger.log("NarraLeaf-React: Say","Complete",r.isIdle()),r.isIdle()||a?e?.(!1):r.setIdle(!0)}).cancel),[r]),Lr(()=>n.events.on(w.EventTypes["event:state.player.skip"],a=>{a?(r.setIdle(!0),r.forceSkip()):r.isIdle()?e?.(!0):r.forceSkip()}).cancel,[r]),vi.createElement(vi.Fragment,null,vi.createElement(Kt,{value:r,key:o.id},vi.createElement(s,null)))}import{useEffect as Ti,useState as Ca}from"react";import{useEffect as Ta,useState as ba}from"react";function Vt(o){let e=C(),[t,n]=ba(e.keyMap.getKeyBinding(o)),i=r=>{e.keyMap.setKeyBinding(o,r),n(r)};return Ta(()=>e.keyMap.onKeyBindingChange(o,n).cancel,[o,e.keyMap,n]),[t,i]}var tn=(t=>(t.skipAction="skipAction",t.nextAction="nextAction",t))(tn||{});function bi({entry:o,gameState:e,words:t,isActive:n,useTypeEffect:i}){let r=C(),[s]=Vt("nextAction"),[a]=Ca(()=>new le({useTypeEffect:i,action:{sentence:o.sentence,character:o.character,words:t,id:o.id},evaluatedWords:t,gameState:e}));return Ti(()=>{if(!n)return;let c=()=>{e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()},l=()=>{e.requestNvlSkip(o.id)==="typing"&&a.forceSkip()},u=e.events.on(w.EventTypes["event:state.player.stageClick"],c),m=e.events.on(w.EventTypes["event:state.player.skip"],l);return()=>{u.cancel(),m.cancel()}},[a,o.id,e,n]),Ti(()=>{if(!n)return;let c=u=>{if(!r.keyMap.match("nextAction",u.key))return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()};if(r.config.useWindowListener){let u=r.getLiveGame().onWindowEvent("keyup",c);return()=>{u.cancel()}}let l=r.getLiveGame().onPlayerEvent("keyup",c);return()=>{l.cancel()}},[a,o.id,r,e,n,s]),Ti(()=>{let c=a.events.on(le.Events.complete,l=>{n&&(e.completeNvlTyping(o.id),!a.isIdle()&&!l&&a.setIdle(!0))});return()=>{c.cancel()}},[a,o.id,e,n]),Ti(()=>{let c=a.events.on(le.Events.simulateClick,()=>{if(!n)return;e.requestNvlAdvance(o.id)==="typing"&&a.requestComplete()});return()=>{c.cancel()}},[a,n]),a}function*Rr(o){let e=[...o];for(let t=0;t<e.length;t++){let n=e[t];if(Pe.isPause(n.text)){yield Pe.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
|
|
37
|
-
`&&
|
|
38
|
-
`&&
|
|
39
|
-
`?
|
|
40
|
-
`&&
|
|
41
|
-
`?
|
|
42
|
-
This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function Qa({children:o,name:e,propagate:t}){let n=C(),[i]=$(),{path:r,router:s,consumedBy:a}=En(),c=s.joinPath(r,e),l=Pi(()=>s.createToken(c+"@layout")),u=s.getCurrentPath(),m=qa(!1),p=d=>{m.current=d,i()},h=s.matchPath(u,c);if(kn(),Li(d=>{let T=d.matchPath(d.getCurrentPath(),c);if(m.current&&!T){if(!o){p(!1);return}d.registerUnmountingPath(l)}T&&d.isPathsUnmounting()&&d.unregisterUnmountingPath(l),T&&!m.current&&!d.isTransitioning()&&p(!0)},[h,o]),ja(()=>{if(!h)return;let d=s.mount(c);return()=>{d.cancel()}},[c,s,h]),a)throw new b("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Pn.createElement(Dn,{path:c},Pn.createElement(Di,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),p(!1)}},h&&m.current&&o))}function Kr({children:o}){return kn(),Pn.createElement(Dn,{path:Et.rootPath},Pn.createElement(gi,{"data-layout-path":Et.rootPath,key:Et.rootPath},o))}var fo=Xa(null);function Za(){return Ya(fo)}function _a({children:o,name:e}){let[t]=$(),{path:n,router:i,consumedBy:r}=En(),s=Za(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,u=Pi(()=>i.createToken(l+"@page")),m=i.getCurrentPath(),p=!a,h=Ja(!1),d=f=>{h.current=f,t()},T=p&&i.exactMatch(m,n)||i.exactMatch(m,l);if(r&&r!==c)throw new b("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");kn(),Li(f=>{let S=p&&f.exactMatch(f.getCurrentPath(),n)||f.exactMatch(f.getCurrentPath(),l);if(h.current&&!S){if(!o){d(!1);return}f.registerUnmountingPath(u)}S&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(u),S&&!h.current&&!f.isTransitioning()&&d(!0)},[T,o]),Vr(()=>{if(!T)return;let f=p?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{f.cancel()}},[l,T]),Vr(()=>()=>{i.unregisterUnmountingPath(u),d(!1)},[]);let y=mo.createElement(Dn,{path:n,consumedBy:c},mo.createElement(Di,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),d(!1)}},T&&h.current&&o));return(f=>s?mo.createElement(fo,{value:{name:null}},f):f)(y)}import ho,{useCallback as ec,useEffect as go,useImperativeHandle as tc,useMemo as Or,useRef as yo,useState as nc}from"react";var ic=50,oc={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Wr={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function rc(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function zr(o,e){return e==null?o:Math.max(o,e)}function sc(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 Br=ho.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:c,dataAttributes:l,onUpdate:u,children:m},p){let h=yo(null),[d,T]=nc({...Wr,width:"0px",height:"0px"}),y=yo(u),x=yo(null);go(()=>{y.current=u},[u]);let f=ec(()=>{let q=h.current;if(!q)return;let ae=q.clientWidth,Ve=q.clientHeight;if(ae<=0||Ve<=0||e<=0)return;let Te=sc(ae,Ve,e),ke=zr(Te.width,n),be=zr(Te.height,i),Oe=x.current;(!Oe||Oe.width!==ke||Oe.height!==be)&&(x.current={width:ke,height:be},T({...Wr,width:`${ke}px`,height:`${be}px`}));let Qe=t>0?ke/t:1;y.current?.({width:ke,height:be,scale:Qe,containerWidth:ae,containerHeight:Ve})},[e,t,n,i]),S=Or(()=>Jo(f,typeof r=="number"?r:ic),[f,r]);go(()=>{f()},[f]),go(()=>{let q=new ResizeObserver(()=>{S()});h.current&&q.observe(h.current);let ae=()=>{S()};return window.addEventListener("resize",ae),()=>{q.disconnect(),window.removeEventListener("resize",ae)}},[S]),tc(p,()=>({requestUpdate:f}),[f]);let N=Or(()=>rc(l),[l]);return ho.createElement("div",{id:c,ref:h,style:oc,...N},ho.createElement("div",{className:s,style:{...d,...a}},m))}),$r=Br;function ac(){return C().getLiveGame()}import To from"react";import cc,{createContext as lc,useContext as uc,useEffect as pc,useState as jr}from"react";var dc={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},qr=lc({state:dc,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function ut(){return uc(qr)}function So(){let{dialogs:o}=ut();return o}function mc(){let{isActive:o}=ut();return o}function fc(){let{isVisible:o}=ut();return o}function vo({children:o}){let t=C().getLiveGame().getGameState(),[n,i]=jr(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=jr(null);pc(()=>{let c=d=>({...d,dialogs:[...d.dialogs]}),l=t.events.on(w.EventTypes["event:state.nvl.enter"],(d,T)=>{i(c(t.getNvlState())),s(T?.showTransition||null)}),u=t.events.on(w.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState())),s(null)}),m=t.events.on(w.EventTypes["event:state.nvl.dialogAppend"],()=>{i(c(t.getNvlState()))}),p=t.events.on(w.EventTypes["event:state.nvl.visibilityChange"],(d,T)=>{i(c(t.getNvlState())),s(T||null)}),h=t.events.on(w.EventTypes["event:state.nvl.change"],d=>{i(c(d))});return()=>{l.cancel(),u.cancel(),m.cancel(),p.cancel(),h.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return cc.createElement(qr.Provider,{value:a},o)}import{AnimatePresence as hc,motion as gc}from"motion/react";import yc from"clsx";function bo({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=ut(),{ratio:r}=se(),s=C(),a=i?.duration?i.duration/1e3:.3;return To.createElement(hc,null,n&&To.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},To.createElement(gc.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:yc("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 Ot from"react";function Co({renderDialogItem:o,dialogs:e}){return Ot.createElement(bo,{className:"bg-black/80 text-white p-16 inset-8"},Ot.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?Ot.createElement(Dt,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Ot.createElement(Pt,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Ot.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}):Ot.createElement(Ot.Fragment,null,r,s))})))}import Fe,{useMemo as Sc}from"react";import Qr from"clsx";function vc({children:o,className:e,style:t,renderDialogItem:n}){let i=So(),{state:r}=ut();return Fe.createElement("div",{"data-element-type":"nvl-dialog-list",className:Qr("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>Fe.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},Fe.createElement(Tc,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?Fe.createElement(Dt,{className:"nvl-character-name font-bold mr-2"}):null,texts:Fe.createElement(Pt,{className:"nvl-dialog-text"})}):o?Fe.Children.map(o,c=>Fe.isValidElement(c)?Fe.cloneElement(c,{entry:s,index:a}):c):Fe.createElement(Xr,{entry:s,index:a})))))}function Xr({entry:o,index:e,className:t,style:n,texts:i}){let r=C(),s=o.character?.state.name||null,a=mt(o.character?.config.color||r.config.defaultTextColor),c=i??Fe.createElement(Pt,{className:"nvl-dialog-text"});return Fe.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:Qr("nvl-dialog-item",t),style:n},s&&Fe.createElement("span",{className:"nvl-character-name font-bold mr-2",style:{color:a}},s,":"),c)}function Tc({entry:o,children:e}){let n=C().getLiveGame().getGameState(),i=Sc(()=>o.sentence.evaluate(re.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=bi({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return Fe.createElement(Kt,{value:c},e)}function Jr({state:o}){let e=C(),t=at(),n=Ao(null),i=Ao(null),r=Ao(!1),[s]=Je(B.Preferences.skipDelay),[a]=Je(B.Preferences.skipInterval),[c]=Vt("skipAction");return Cc(()=>{if(!e.getLiveGame().gameState.playerCurrent){o.logger.warn("KeyEventAnnouncer","Failed to listen to playerElement events");return}if(!window){o.logger.warn("KeyEventAnnouncer","Failed to listen to window events");return}let u=()=>{i.current&&(clearTimeout(i.current),i.current=null),n.current&&(clearInterval(n.current),n.current=null),r.current=!1},m=h=>{if(e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(B.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let d=()=>{n.current=setInterval(()=>{o.events.emit(w.EventTypes["event:state.player.skip"],!1)},a)};u(),o.events.emit(w.EventTypes["event:state.player.skip"],!1),r.current=!0,s===0?d():i.current=setTimeout(d,s)}},p=h=>{e.keyMap.match("skipAction",h.key)&&u()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",m).cancel,d=e.getLiveGame().onWindowEvent("keyup",p).cancel;return()=>{u(),h(),d()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",m).cancel,d=e.getLiveGame().onPlayerEvent("keyup",p).cancel;return()=>{u(),h(),d()}}},[t,s,a,c]),Yr.createElement(Yr.Fragment,null)}import Zr,{useEffect as Ac}from"react";function xc(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var _r=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],wc=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]'];function kc(o,e){return!o||e&&_r.some(t=>!!o.closest(t))?!1:[...wc,..._r].some(t=>!!o.closest(t))}function es(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 ts({state:o}){let e=C();return Ac(()=>{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)||!es(i,t))return;let s=o.mainContentNode;s&&(!s.contains(r)||!es(i,s))||xc(r)||kc(r,o.isNvlMode())||(o.events.emit(w.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]),Zr.createElement(Zr.Fragment,null)}import{useEffect as Ln}from"react";function xo({gameState:o}){let e=o.audioManager,[t]=Je("voiceVolume"),[n]=Je("bgmVolume"),[i]=Je("soundVolume"),[r,s]=Je("globalVolume");return Ln(()=>{s(e.getGlobalVolume())},[]),Ln(()=>{e.setGroupVolume("voice",t)},[t]),Ln(()=>{e.setGroupVolume("bgm",n)},[n]),Ln(()=>{e.setGroupVolume("sound",i)},[i]),Ln(()=>{e.setGlobalVolume(r)},[r]),null}import{useEffect as Ri,useRef as Dc}from"react";import wo,{createContext as Ec,useContext as Pc,useState as ns}from"react";var Wt=class Wt{constructor(){this.preloaded=[];this.events=new W}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(Wt.EventTypes["event:preloaded.add"],e),this.events.emit(Wt.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(Wt.EventTypes["event:preloaded.remove"],e),this.events.emit(Wt.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Ae.getSrc(e)}};Wt.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 Ke=Wt;var Ii=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 _o(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 m={abort:()=>{},onFinished:()=>m,onErrored:()=>m};return m}let n=t,i={};this.game.hooks.rawTrigger("preloadImage",()=>[n,(m,p)=>{n=m,i={...i,...p}}]);let r=new AbortController,s=r.signal,a=[],l={promise:o.getImage(n,s,i).then(m=>{this.preloadTasks.delete(t),m&&this.add(t,m)}).catch(m=>{e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${m}`),a.forEach(p=>p(m))}),controller:r};this.preloadTasks.set(t,l);let u={abort:()=>{r.abort(),this.preloadTasks.delete(t)},onFinished:m=>(l.promise.then(m),u),onErrored:m=>(a.push(m),u)};return u}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=Ec(null);function is({children:o}){let e=C(),[t]=ns(()=>new Ke),[n]=ns(()=>new Ii(e));return wo.createElement(wo.Fragment,null,wo.createElement(ko,{value:{preloaded:t,cacheManager:n}},o))}function nn(){if(!ko)throw new Error("usePreloaded must be used within a PreloadedProvider");return Pc(ko)}function os({state:o}){let{preloaded:e,cacheManager:t}=nn(),n=C(),i=Dc(new Set),[r]=$(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),c=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,l=n.getLiveGame().story;function u(){o.logger.debug(s,"Preload unmounted"),e.events.emit(Ke.EventTypes["event:preloaded.unmount"])}return Ri(()=>o.events.on(w.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Ri(()=>{if(typeof fetch>"u")return e.events.emit(Ke.EventTypes["event:preloaded.ready"]),o.logger.warn(s,"Fetch is not supported in this environment, skipping preload"),u;if(!n.config.preloadAllImages)return e.events.emit(Ke.EventTypes["event:preloaded.ready"]),o.logger.debug(s,"Preload all images is disabled, skipping preload"),u;if(n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(s,"Cache cleared")),!l||!a)return o.logger.weakWarn(s,"Story/Scene not found, skipping preload"),u;let m=performance.now(),p=Ae.catSrc([...a.srcManager?.src||[],...a.srcManager?.getFutureSrc()||[]]),h=new pn(n.config.preloadConcurrency,n.config.preloadDelay),d=[],T=o.logger.group(s,!0),y=[];o.logger.debug(s,"preloading:",p,a);for(let x of p.image){let f=Ae.getSrc(x);if(f){if(d.push(f),t.has(f)||t.isPreloading(f)||y.includes(f)){o.logger.debug(s,`Image already loaded (${p.image.indexOf(x)+1}/${p.image.length})`,f),y.push(f);continue}y.push(f),h.addTask(()=>new Promise(S=>{t.preload(o,f).onFinished(()=>{o.logger.debug(s,`Image loaded (${p.image.indexOf(x)+1}/${p.image.length})`,f),S()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${p.image.indexOf(x)+1}/${p.image.length})`,f),S()})}))}}return T.end(),h.start().then(()=>{o.logger.info(s,"Image preload",`loaded ${t.size()} images in ${performance.now()-m}ms`),n.config.waitForPreload&&e.events.emit(Ke.EventTypes["event:preloaded.ready"]),t.filter(d)}),n.config.waitForPreload||e.events.emit(Ke.EventTypes["event:preloaded.ready"]),e.events.emit(Ke.EventTypes["event:preloaded.mount"]),u},[a,l]),Ri(()=>{i.current.clear()},[a]),Ri(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!l){o.logger.weakWarn(s,"Story not found, skipping preload");return}let m=performance.now(),p=n.getLiveGame().getAllPredictableActions(l,c,n.config.maxPreloadActions).map(f=>Ae.getPreloadableSrc(l,f)).filter(function(f){return f!==null});p.filter(function(f){return f?.activeType==="scene"}).forEach(f=>{i.current.has(f)||i.current.add(f)});let d=Ae.catSrc([...i.current,...p]),T=new pn(n.config.preloadConcurrency,n.config.preloadDelay),y=[],x=o.logger.group(s);o.logger.debug(s,"preloading:",d);for(let f of d.image){let S=Ae.getSrc(f);if(S){if(y.push(S),t.has(S)||t.isPreloading(S)){o.logger.debug(s,`Image already loaded (${d.image.indexOf(f)+1}/${d.image.length})`,S);continue}T.addTask(()=>new Promise(N=>{t.preload(o,S).onFinished(()=>{o.logger.debug(s,`Image loaded (${d.image.indexOf(f)+1}/${d.image.length})`,S),N()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${d.image.indexOf(f)+1}/${d.image.length})`,S),N()})}))}}x.end(),T.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-m}ms`),t.filter(y)})},[c,l]),null}import Lc from"clsx";import pt,{useCallback as Eo,useMemo as Ic,useRef as Rc}from"react";function Po({prompt:o,choices:e,afterChoose:t,state:n,words:i}){let r=C(),s=Rc([]),a=Eo(h=>(s.current.push(h),s.current.indexOf(h)),[]),c=Eo(h=>{let d=s.current.indexOf(h);d!==-1&&s.current.splice(d,1)},[]),l=Eo(h=>s.current.indexOf(h),[]),u=r.config.menu,m=Ic(()=>e.map(h=>({...h,words:h.prompt.evaluate(re.getCtx({gameState:n}))})),[]);function p(h){t(h)}return pt.createElement(pt.Fragment,null,pt.createElement(lo,{value:{evaluated:m,choose:p,gameState:n}},pt.createElement(uo,{value:{register:a,unregister:c,getIndex:l}},pt.createElement(ct,{className:"absolute"},o&&pt.createElement(An,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),pt.createElement(Ft.Div,{color:"green",border:"dashed",className:Lc("absolute"),style:{width:`${r.config.width}px`,height:`${r.config.height}px`}},pt.createElement(u,{items:m.map((h,d)=>d)})))))}function rs({items:o}){return pt.createElement(yi,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>pt.createElement(xi,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Ui from"react";import Ni from"react";import Do,{useEffect as ss,useLayoutEffect as as,useRef as cs,useState as Lo}from"react";function on({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c}){let[l,u]=Lo(null),[m,p]=Lo(null),h=Do.useRef(null),[d]=Lo(()=>new zn("displayable.refGroup")),T=cs(d.next()),y=cs(Qe()),f=C().getLiveGame().getGameState(),S=typeof a=="function"?a(l):a,[N]=$([m,l,y]);ss(()=>f.events.depends([f.events.on(w.EventTypes["event:state.player.skip"],Oe)]).cancel,[m,l,y]),as(()=>{if(q(),!l)return;if(y.current.some(([ce])=>!ce.current))throw new b("Displayable: Trying to access transition groups before they are mounted");let{controller:P,task:Q}=l;return P.onUpdate(ce=>{y.current.forEach(([We],et)=>{let D=Q.resolve[et],L=typeof D=="function"?D:D.resolver;if(!L)throw new b(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${et}])`);let ie=L(...ce),J=I(S[et]||S[S.length-1]||{},ie);Ve(We,c?c(J):J)})}).cancel},[l]),ss(()=>{if(!h.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),as(()=>{let P=e.toStyle(f,i);Object.assign(h.current.style,P),f.logger.debug("Displayable","Initial style applied",h.current,P)},[]);function q(){let P=typeof a=="function"?a(l):a;if(!y.current||!y.current.length)throw new b("Displayable: Transition group refs are not initialized correctly");if(y.current.some(([Q])=>!Q.current))throw new b("Displayable: Trying to access transition groups before they are mounted");y.current.forEach(([Q],E)=>{if(!Q.current)throw new b("Displayable: Trying to assign properties to unmounted element");Ve(Q,P[E]||P[P.length-1]||{})})}function ae(P){f.logger.debug("Displayable","Transform applied",e.toStyle(f,i),h.current),N(),r?.(P)}function Ve(P,Q){if(!P.current)throw new b("Displayable: Trying to assign properties to unmounted element");let E=P.current,ce={},We={};Object.keys(Q).forEach(D=>{let L=D;L==="style"&&Q.style?Object.assign(ce,Q.style):Q[L]!==void 0&&L!=="key"&&(We[L]=Q[L])}),Object.keys(ce).length>0&&Object.assign(E.style,ce);let et=c?c(We):We;for(let[D,L]of Object.entries(et))E.getAttribute(D)!==L&&E.setAttribute(D,L)}function Te(P,Q){m&&(m.abort(),p(null));let E=P.animate(e,{gameState:f,ref:h,overwrites:i}),ce=new fe(E);return f.timelines.attachTimeline(ce),E.onSkipControllerRegister(We=>{We.onAbort(()=>{ce.abort(),p(null)})}),p(E),E.then(()=>{p(null),ae(P),Q()}),ce}function ke(P,Q){l&&l.controller.complete();let E=P.createTask(f),ce=P.requestAnimations(E.animations),We=new g().registerSkipController(new M(ce.cancel)),et=new fe(We);We.skipController.onAbort(()=>{ce.cancel()}),ce.onCanceled(()=>{et.abort(),u(null),f.logger.debug("Displayable","Transition cancelled",P)}),f.timelines.attachTimeline(et),u({task:E,controller:ce,transition:P,resolve:Q});let D;if(y.current=E.resolve.map(ie=>{let J=Do.createRef(),Ce=typeof ie=="function"?void 0:ie.key;if(!Ce)return[J,d.next()];if(Ce==="target")return D=d.next(),[J,D];if(Ce==="current")return[J,T.current];throw new b("Displayable: Invalid key type")}),!D)throw new b("Displayable: No target key found");T.current=D;let L=y.current.map(([ie])=>{let J=ie.current;return J?.waitForLoad?J.waitForLoad():Promise.resolve()});return Promise.all(L).then(()=>{ce.start(),ce.onComplete(()=>{ue(),u(null),s?.(P),Q(),We.resolve()})}),et}function be(P){return f.logger.debug("initDisplayable",o),Te(z.immediate(e.get()),P)}function Oe(){t&&m&&(m.abort(),p(null),f.logger.debug("transform skipped")),n&&l&&(l.controller.complete(),f.logger.debug("transition skipped"))}function Qe(){return[[Do.createRef(),T.current]]}function ue(){y.current.forEach(([P])=>{P.current=null}),y.current=Qe()}return{transformRef:h,transitionRefs:y.current,isTransforming:!!m,transitionTask:l,initDisplayable:be,applyTransform:Te,applyTransition:ke,updateStyleSync:q,deps:[m,l,y]}}import{useEffect as Nc}from"react";function Lt(o,e,t=[]){let i=C().getLiveGame().getGameState();return Nc(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function Io({state:o,text:e}){let{ratio:t}=se(),[n]=$(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyTransition:c,updateStyleSync:l,deps:u,isTransforming:m}=on({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:p=>({width:"fit-content",transform:z.propToCSSTransform(o,p,{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 Lt(e,{initDisplayable:s,applyTransform:a,applyTransition:c,flush:n,updateStyleSync:l},[...u]),Ni.createElement(Ft.Div,{"data-element-type":"text"},Ni.createElement(Ft.mDiv,{tag:"text.container",color:"green",border:"dashed",layout:m,ref:i,className:"absolute"},r.map(([p,h])=>Ni.createElement("span",{key:h,ref:p,className:e.config.className},Ni.createElement("span",null,e.state.text)))))}import rn,{useRef as ps,useState as ds}from"react";import Mi,{useEffect as Ro,useRef as Gi,forwardRef as Mc}from"react";var ls=Mc(({onSizeChanged:o,onLoad:e,autoFit:t=!1},n)=>{let i=Gi(null),{ratio:r}=se(),[s,a]=Mi.useState(()=>r.state.width),[c,l]=Mi.useState(()=>r.state.height),u=C(),m=Gi(!1),p=Gi(null),h=Gi(null);Mi.useImperativeHandle(n,()=>i.current,[]),Ro(()=>{i.current&&Object.defineProperties(i.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>m.current?Promise.resolve():(p.current||(p.current=new Promise(y=>{h.current=y})),p.current),configurable:!0}})},[]),Ro(()=>(d(),r.onUpdate(d)),[o]),Ro(()=>{let y=new MutationObserver(x=>{x.forEach(f=>{f.type==="attributes"&&f.attributeName==="src"&&i.current&&d()})});return i.current&&y.observe(i.current,{attributes:!0}),()=>{y.disconnect()}},[o]);function d(){if(i.current&&i.current.naturalWidth)if(i.current.naturalWidth*i.current.naturalHeight===1){let y=r.state.width,x=r.state.height,f=`${y} / ${x}`;a(y),l(x),i.current.style.aspectRatio=f,o&&o(y,x)}else{let y=t?u.config.width/i.current.naturalWidth:1,x=i.current.naturalWidth*r.state.scale*y,f=i.current.naturalHeight*r.state.scale*y;a(x),l(f),i.current.style.aspectRatio="auto",o&&o(x,f)}}function T(){d(),m.current=!0,h.current&&(h.current(),h.current=null,p.current=null),e&&e()}return Mi.createElement("img",{ref:i,onLoad:T,width:s,height:c,alt:""})});ls.displayName="AspectScaleImage";var us=ls;import ms from"clsx";import{motion as Gc}from"motion/react";function Hi({image:o,state:e}){let[t]=ds(()=>new W),[n,i]=ds([]),{cacheManager:r}=nn(),s=ps([]),a=ps(null),{transformRef:c,transitionRefs:l,isTransforming:u,initDisplayable:m,applyTransition:p,applyTransform:h,updateStyleSync:d,deps:T}=on({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:f=>{let S=f?f.transition._getCurrentSrc():o.state.currentSrc;return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:A.isColor(S)?A.colorToString(S):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:A.isImageSrc(S)?A.srcToURL(S):G.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}".
|
|
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
|
+
`&&e!==`
|
|
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}".
|
|
43
45
|
This may be caused by complicated image action behavior that cannot be predicted.
|
|
44
|
-
To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(
|
|
45
|
-
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 m=t.current;return m.currentTime=0,new Promise(p=>{o.schedule(({retry:h})=>{if(m.readyState<3){let x=()=>{m.removeEventListener("loadeddata",x),h()};m.addEventListener("loadeddata",x);return}let d=()=>{y(),p()},T=()=>{y(),p()},y=()=>{m.removeEventListener("ended",d),m.removeEventListener("stopped",T)};m.addEventListener("ended",d),m.addEventListener("stopped",T),u.push(y),m.play().catch(x=>{o.logger.error("Failed to play video: "+x),y(),p()})},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:m=>{if(!t.current)throw c();t.current.currentTime=m}}))},u=[];return s.addEventListener("canplay",l),()=>{a=!1,s.removeEventListener("canplay",l),u.forEach(m=>m()),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 Vc.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 Wc from"clsx";import zc,{useCallback as Bc,useEffect as Ki,useRef as $c}from"react";function Uo({children:o,className:e,gameState:t}){let{ratio:n}=se(),i=C(),[r]=$(),s=$c(null),a=i.config.minWidth,c=i.config.minHeight,l=Bc(u=>{if(n.isLocked()){t.logger.weakWarn("AspectRatio","ratio is locked, skipping update");return}n.update(u.width,u.height,u.scale),n.updateMin(a,c),r()},[r,t.logger,c,a,n]);return Ki(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),Ki(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),Ki(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),Ki(()=>t.events.on(w.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),zc.createElement($r,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:Wc(e),onUpdate:l},o)}import Ss,{useEffect as jc,useRef as qc,useState as vs}from"react";function Fo({src:o,width:e,height:t}){let[n,i]=vs({x:0,y:0}),[r,s]=vs(!1),a=qc(null),{ratio:c}=se();return jc(()=>{let l=u=>{if(a.current){let m=a.current.getBoundingClientRect(),p=u.clientX-m.left,h=u.clientY-m.top;i({x:p,y:h}),r||s(!0)}};return window.addEventListener("mousemove",l),()=>{window.removeEventListener("mousemove",l)}},[r]),Ss.createElement(ct,{ref:a,className:"overflow-hidden absolute"},Ss.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 Ts from"react";import St from"react";function Ko({error:o,errorInfo:e}){return C().config.app.debug?St.createElement("div",{className:"text-left"},St.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),St.createElement("p",{className:"text-red-700"},"Message: ",o.message),St.createElement("pre",null,"Error Stack: ",o?.stack),St.createElement("pre",null,"Component Stack: ",e?.componentStack),St.createElement("pre",null,"Digest: ",e?.digest)):St.createElement("div",{className:"bg-white w-full h-full"},St.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),St.createElement("p",null,"Please contact the game developer for further assistance."))}var Vi=class extends Ts.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?Ts.createElement(Ko,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import As from"clsx";import V,{useEffect as an,useReducer as Jc,useState as Rn}from"react";import{flushSync as xs}from"react-dom";import{useRef as Qc}from"react";import{useEffect as Xc}from"react";function bs({gameState:o}){let e=Qc(null);return Xc(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(w.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import In,{useEffect as Yc}from"react";function Vo({gameState:o}){let[e]=$(),{ratio:t}=se(),n=o.notificationMgr;Yc(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return In.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"},In.createElement(i,{notifications:n.toArray()}))}function Cs({notifications:o}){return In.createElement(ki,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>In.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},In.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function ws({story:o=vn.empty(),width:e,height:t,className:n,onReady:i,onEnd:r,onError:s,children:a,active:c=!0}){let[l,u]=Jc(ue=>ue+1,0),[m,p]=Rn(0),h=C(),[d]=Rn(()=>new w(h,{update:u,forceUpdate:()=>{d.logger.weakWarn("Player","force update"),xs(()=>{u()})},forceRemount:()=>{d.logger.weakWarn("Player","force remount"),xs(()=>{p(ue=>ue+1),u()})},next:be})),T=V.createRef(),y=V.createRef(),[x,f]=Rn(!1),S=V.useRef(!1),N=V.useRef(null),q=V.useRef(null),{preloaded:ae}=nn(),[Ve,Te]=Rn(!1),[ke]=Rn(new Map);function be(){let ue=()=>{ke.forEach(E=>E.cancel())};if(d.rollLock.isLocked())return;ue();let P=!1,Q=0;for(;!P;){if(Q++>h.config.maxStackModelLoop)throw new b("Max stack model loop reached");let E=h.getLiveGame().next();if(!E){if(h.getLiveGame().stackModel&&!h.getLiveGame().stackModel.isEmpty())continue;break}if(g.isAwaitable(E)){if(N.current===E)break;N.current=E,E.onSettled(()=>{N.current===E&&(N.current=null),be()}),P=!0;break}if(E instanceof jt){if(q.current===E)break;q.current=E,E.nextUnlock().then(()=>{q.current===E&&(q.current=null),be()}),P=!0;break}if(we.isCalledActionResult(E)&&E.wait&&we.isStackModelsAwaiting(E.wait.type,E.wait.stackModels)){if(N.current===E)break;N.current=E,E.wait&&we.executeStackModelGroup(E.wait.type,E.wait.stackModels).then(()=>{N.current===E&&(N.current=null),be()}),P=!0;break}d.handle(E)}d.stage.update()}an(()=>{d.audioManager.initialize()},[]),an(()=>(h.getLiveGame().setGameState(d),o&&!h.getLiveGame().isPlaying()&&h.getLiveGame().loadStory(o),d.playerCurrent=T.current,d.mainContentNode=y.current,()=>{h.getLiveGame().setGameState(void 0),d.playerCurrent=null}),[h,o]),an(()=>ze(()=>{f(!0);let ue=d.getLastScene(),P=[];ue?P.push(ue.events.once("event:scene.mount",()=>{d.stage.next()}).cancel):d.stage.next();let Q=d.events.on(w.EventTypes["event:state.end"],()=>{r&&r({game:h,gameState:d,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable()})});return d.stage.update(),()=>{ue&&P.forEach(E=>E()),Q.cancel()}}),[]),an(()=>ze(()=>{x&&i&&!S.current&&(S.current=!0,d.stage.forceUpdate(),h.hooks.trigger("init",[]),i({game:h,gameState:d,liveGame:h.getLiveGame(),storable:h.getLiveGame().getStorable()}))}),[x]),an(()=>ae.events.depends([ae.events.on(Ke.EventTypes["event:preloaded.ready"],()=>{Te(!0),d.stage.update(),o&&be()})]).cancel,[]),an(()=>{d.flushDep=l},[l]);let Oe=e||h.config.width,Qe=t||h.config.height;return V.createElement(Vi,{onError:s},V.createElement("div",{style:{width:typeof Oe=="number"?`${Oe}px`:Oe,height:typeof Qe=="number"?`${Qe}px`:Qe},className:As(n,"__narraleaf_content-player"),ref:T,tabIndex:0},V.createElement(Uo,{className:As("flex-grow overflow-auto"),gameState:d},V.createElement(xo,{gameState:d}),V.createElement(bs,{gameState:d}),V.createElement(ct,{className:"absolute",ref:y,style:{cursor:d.game.config.cursor?"none":"auto",overflow:d.game.config.showOverflow?"visible":"hidden"}},h.config.cursor&&V.createElement(Fo,{src:h.config.cursor,width:h.config.cursorWidth,height:h.config.cursorHeight}),V.createElement(Zc,{show:Ve&&c,key:m},V.createElement(vo,null,V.createElement(Jr,{state:d}),V.createElement(ts,{state:d}),d.getSceneElements().map(ue=>V.createElement(Mo,{key:"scene-"+ue.scene.getId(),state:d,elements:ue})),d.getVideos().map((ue,P)=>V.createElement("div",{className:"w-full h-full absolute",key:"video-"+P,"data-element-type":"video"},V.createElement(Ho,{gameState:d,video:ue}))),V.createElement(_c,{NvlComponent:h.config.nvlDialog}))),V.createElement(os,{state:d}),V.createElement(Kr,null,a),V.createElement(Vo,{gameState:d})))))}function Zc({children:o,show:e}){return V.createElement(V.Fragment,null,e?o:null)}function _c({NvlComponent:o}){let{dialogs:e,state:t}=ut(),i=C().getLiveGame().getGameState(),r=V.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(re.getCtx({gameState:i})),l=t.activeDialogId===s.id,u=l&&t.phase==="typing";return{entry:s,index:a,isActive:l,gameState:i,words:c,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return V.createElement(o,{dialogs:r})}import"client-only";import cn from"react";function ks({children:o,game:e}){return cn.createElement(cn.Fragment,null,cn.createElement(Ar,null,cn.createElement(vr,{game:e},cn.createElement(is,null,cn.createElement(Cr,null,o)))))}var el=(r=>(r.image="narraleaf:image",r.text="narraleaf:text",r.layer="narraleaf:layer",r.scene="narraleaf:scene",r.video="narraleaf:video",r))(el||{});import tl from"clsx";import zt,{useEffect as Es,useRef as nl}from"react";function il({children:o,...e}){let t=C(),n=yt(),{ratio:i}=se(),[r]=Je(B.Preferences.showDialog),s=nl(null),[a]=Vt("nextAction");function c(){n.requestComplete()}return Es(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
|
|
46
|
-
at Say.tsx: onElementClick`);return}let l=m=>{t.keyMap.match("nextAction",m.key)&&n.requestComplete()};window.addEventListener("keyup",l);let u=n.events.on(le.Events.simulateClick,()=>{s.current&&s.current.click()});return()=>{window.removeEventListener("keyup",l),u.cancel()}},[n,a]),Es(()=>{let l=t.preference.onPreferenceChange(B.Preferences.autoForward,u=>{u&&n.isEnded()?n.tryScheduleAutoForward():n.cancelAutoForward()});return()=>{l.cancel()}},[n]),zt.createElement("div",{"data-element-type":"dialog",className:"w-full h-full"},zt.createElement("div",{className:tl("absolute bottom-0 w-full h-full",!r&&"invisible pointer-events-auto"),onClick:c,style:{...Xn(t.config.useAspectScale,{maxWidth:t.config.dialogWidth,maxHeight:t.config.dialogHeight,transform:`scale(${i.state.scale})`,transformOrigin:"bottom left",width:t.config.width,height:t.config.height})},ref:s},zt.createElement("div",{...e},o)))}function Ps({children:o,...e}){let t=yt();return!t.config.action.sentence||!t.config.action.words?null:zt.createElement(il,{...e},o)}var bc=Ps;function Ds(){return zt.createElement(Ps,null,zt.createElement(Dt,null),zt.createElement(Pt,null))}var Nn={say:Ds,menu:rs,notification:Cs,nvlDialog:Co};var Oi=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 Mn=class{constructor(e={}){this.keyMap=e;this.events=new W}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 Ls=(e=>(e.game="game",e))(Ls||{}),vt=class vt{constructor(e){this.hooks=new $n;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new Cn(vt.DefaultPreference);this.keyMap=new Mn({skipAction:["Control"],nextAction:[" "]});this.config=I(vt.DefaultConfig,e),this.plugins=new Oi(this),this.router=new Et(this)}configure(e){let[t,n]=rr(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=I(this.config,t),this.getLiveGame().getGameState()?.events.emit(w.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 rt(this)}};vt.defaultSettings={volume:1},vt.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},vt.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"},vt.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:Nn.notification,menu:Nn.menu,dialog:Nn.say,nvlDialog:Nn.nvlDialog,onError:e=>{console.error(e)},fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif",stage:null,defaultMenuChoiceColor:"#000",maxStackModelLoop:1e3,maxActionHistory:100},vt.GameSettingsNamespace=Ls;var B=vt;var Wi=class Wi extends U{static executeActionsAsync(e,t){return e.game.getLiveGame().requestAsyncStackModel([{type:t.type,node:t.contentNode}]).execute()}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===pe.do)return[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:i[0].contentNode}];if(this.type===pe.doAsync){let r=Wi.executeActionsAsync(e,i[0]);return e.timelines.attachTimeline(r),super.executeAction(e,t)}else if(this.type===pe.any){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{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:r}}}else if(this.type===pe.all){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{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:r}}}else if(this.type===pe.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(g.all(...r.map(s=>s.execute()))),super.executeAction(e,t)}else if(this.type===pe.repeat){let[r,s]=this.contentNode.getContent();if(s<=0||r.length===0)return super.executeAction(e,t);let a=we.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===pe.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=we.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===pe.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===pe.sleep){let[,r]=this.contentNode.getContent(),s;typeof r=="number"?s=g.delay(r):g.isAwaitable(r)?s=r:s=g.fromPromise(r);let a=new g,c=new fe(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===pe.waitForClick){if(e.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let r=new g,s=new g,a=new fe(s);e.timelines.attachTimeline(a);let c=e.game.preference,l=c.getPreference(B.Preferences.autoForward),u=c.getPreference(B.Preferences.gameSpeed),m=l?e.game.config.autoForwardDelay/u:null,p=!1,h=null,d=null,T=null,y=()=>{d?.cancel(),T?.cancel(),h&&(clearTimeout(h),h=null)},x=()=>{p||(p=!0,y(),s.resolve())};return d=e.events.on(w.EventTypes["event:state.player.stageClick"],x),T=e.events.on(w.EventTypes["event:state.player.skip"],x),m!==null&&(h=setTimeout(x,m)),s.then(()=>{r.resolve({type:this.type,node:this.contentNode.getChild()})}),r.onSkipControllerRegister(f=>{f.onAbort(()=>{p||(p=!0,y(),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===pe.break||this.type===pe.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===pe.break)return super.stringifyWithContent("Control","break");if(this.type===pe.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(";"))}};Wi.ActionTypes=pe;var _=Wi;var He=class o extends X{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(_.ActionTypes.do,t)}doAsync(t){return this.push(_.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(_.ActionTypes.any,t)}all(t){return this.pushUnchained(_.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(_.ActionTypes.allAsync,t)}repeat(t,n){return this.push(_.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=R.from(t);return this.pushWithLambda(_.ActionTypes.while,n,i)}breakLoop(){let t=new _(this.chain(),_.ActionTypes.break,new v().setContent([]));return this.chain(t)}sleep(t){return this.push(_.ActionTypes.sleep,[],t)}waitForClick(){let t=new _(this.chain(),_.ActionTypes.waitForClick,new v().setContent([]));return this.chain(t)}push(t,n,...i){let r=this.narrativeToActions(n),s=new _(this.chain(),t,new v().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new _(this.chain(),t,new v().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new _(this.chain(),t,new v().setContent([this.construct(r),i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?wt.say(n).getActions():ge.toActions([n]))}};var j=class j extends it{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):j.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:j.isTagSrc(e)?j.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):j.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 j({src:e})}constructor(e={}){super();let t=j.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new He,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 Y(n,Y.ActionTypes.setAppearance,new v().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new He,i=>i.chain(this._setDarkness(i,e,t,n)))}addWearable(e){let t=Array.isArray(e)?e:[e];for(let n of t){if(n===this)throw new te("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:j.StateSerializer.serialize(this.state),transformState:me.TransformStateSerializer.serialize(this.transformState.get())}}fromData(e){return this.state=j.StateSerializer.deserialize(e.state),this.transformState=me.deserialize(e.transformState),this}_applyTransition(e,t){return new Se(this.chain(),he.applyTransition,new v().setContent([e,t]))}_init(e,t){return new Se(this.chain(),he.init,new v().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new Y(this.chain(),Y.ActionTypes.initWearable,new v().setContent([e]))}_flush(){return new Y(this.chain(),Y.ActionTypes.flush,new v)}reset(){return this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(this.userConfig),this}resolveTags(e,t){if(!j.isTagSrc(this))throw new Error(`Tag not defined
|
|
47
|
-
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
|
|
48
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
|
|
49
51
|
Wearable must be an Image with isWearable set to true
|
|
50
52
|
It seems like you are trying to add a non-wearable image to wearables
|
|
51
53
|
Image below violates the rule:
|
|
52
|
-
`+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
|
|
53
55
|
Tag "${r}" is conflicting with another tag
|
|
54
56
|
Error found in config.tag.defaults`);if(!n.has(r))throw new Error(`Tag not found
|
|
55
57
|
Tag "${r}" is not defined in tagDefinitions
|
|
56
|
-
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 Y(e,Y.ActionTypes.setDarkness,new v().setContent([t,n,i]))}};j.DefaultImagePlaceholder="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1' height='1'></svg>",j.StateSerializer=new Le,j.DefaultUserConfig=new K({name:"(anonymous)",autoInit:!0,src:j.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...me.DefaultTransformState.getDefaultConfig()},{position:e=>k.tryParsePosition(e)}),j.DefaultImageConfig=new K({wearables:[],isWearable:!1,name:"(anonymous)",autoInit:!0,src:null,autoFit:!1,layer:void 0,isBackground:!1}),j.DefaultImageState=new K({currentSrc:j.DefaultImagePlaceholder,darkness:0});var G=j;var Tt=class extends ot{_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)=>I(e(...t),this._srcToProps(this._prevSrc)))}asTarget(e){return super.asTarget((...t)=>I(e(...t),this._srcToProps(this._targetSrc)))}_srcToProps(e){if(A.isColor(e))return{src:G.DefaultImagePlaceholder,style:{backgroundColor:A.isRGBAColor(e)?A.RGBAColorToHex(e):e}};if(A.isImageSrc(e))return{src:A.srcToURL(e)};throw new te("Image transition src cannot be identified, using: "+e)}};var zi=class o extends Tt{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 Gn=class Gn extends U{static resolveTagSrc(e,t){if(!G.isTagSrc(e))throw e._mixedSrcError();let n=e.state.currentSrc,i=e.resolveTags(n,t);return G.getSrcFromTags(i,e.config.src.resolve)}static resolveCurrentSrc(e){if(G.isStaticSrc(e))return A.isImageSrc(e.state.currentSrc)?A.srcToURL(e.state.currentSrc):e.state.currentSrc;if(G.isTagSrc(e))return G.getSrcFromTags(e.state.currentSrc,e.config.src.resolve);throw e._mixedSrcError()}executeAction(e,t){if(this.type===Ge.initWearable){let[n]=this.contentNode.getContent(),i=e.getExposedStateForce(this.callee),r=new g(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===Ge.setSrc){let n=this.contentNode.getContent()[0];if(A.isColor(n)&&!this.callee.config.isBackground)throw new te("Color src is not allowed for non-background image");let i=this.callee.state.currentSrc;return this.callee.state.currentSrc=n,e.logger.debug("Image Set Src",n),e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{this.callee.state.currentSrc=r},[i]),e.stage.update(),super.executeAction(e,t)}else{if(this.type===Ge.flush)return super.executeAction(e,t);if(this.type===Ge.setAppearance){let[n,i]=this.contentNode.getContent();if(!G.isTagSrc(this.callee))throw this.callee._mixedSrcError();let r=this.callee.state.currentSrc,s=this.callee.resolveTags(r,n),a=[...r],c=G.getSrcFromTags(s,this.callee.config.src.resolve),l=()=>{this.callee.state.currentSrc=a};if(e.logger.debug("Image - Set Appearance",s,c),i){let u=new g(d=>d).registerSkipController(new M(()=>super.executeAction(e,t)));i._setPrevSrc(Gn.resolveCurrentSrc(this.callee))._setTargetSrc(c);let p=e.getExposedStateForce(this.callee).applyTransition(i,()=>{this.callee.state.currentSrc=s,u.resolve(super.executeAction(e,t))}),h=e.timelines.attachTimeline(u).attachChild(p);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:h},l,[]),u}return this.callee.state.currentSrc=s,e.actionHistory.push({action:this,stackModel:t.stackModel},l),super.executeAction(e,t)}else if(this.type===Ge.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=Gn.resolveCurrentSrc(this.callee),u=new g(d=>d),m=new zi(s,n,i,r)._setPrevSrc(l)._setTargetSrc(l),p=c.applyTransition(m,()=>{this.callee.state.darkness=n,u.resolve(super.executeAction(e,t))}),h=e.timelines.attachTimeline(u).attachChild(p);return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:h},()=>{u.isSettled()||u.abort(),p.abort(),a()}),u}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")}};Gn.ActionTypes=Ge;var Y=Gn;var bt=class bt extends U{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 bt.initBackgroundMusic(e,r),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t){e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new te("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);t.addElement(r),n.local.getNamespace(t.getStorable()).load(e.local),e.state&&n.fromData(e.state),e.background&&n.background.fromData(e.background)}applyTransition(e,t,n){let i=new g().registerSkipController(new M(()=>(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 g(l=>l),c=null;return a.registerSkipController(new M(()=>(c&&(clearTimeout(c),c=null),s))),c=e.setTimeout(()=>{c=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===H.action)return super.executeAction(e,t);if(this.is(bt,"scene:init")){let n=new g(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 bt.handleSceneInit(this.callee,r,e,g.forward(n,r))}else if(this.type===H.exit){let n=bt.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new g(s=>s);e.timelines.attachTimeline(r),bt.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),bt.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===H.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===H.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=>{c&&s.setBackgroundMusic(c,0)},[a]),s.setBackgroundMusic(n,i||0),this.callee.state.backgroundMusic=n,super.executeAction(e,t)}else{if(this.type===H.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===H.transitionToScene){let[n,i,r]=this.contentNode.getContent();return n._setPrevSrc(Y.resolveCurrentSrc(this.callee.background)),i?n._setTargetSrc(Y.resolveCurrentSrc(i.background)):r&&n._setTargetSrc(r),this.applyTransition(e,n,t)}else if(this.type===H.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===H.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=g.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===H.nvlHide){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!1,n,t),s=g.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===H.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===H.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===H.nvlBlock){let[i]=this.contentNode.getContent(),r=super.getFutureActions(e,t);return[...i??[],...r]}let n=this.contentNode.getChild()?.action;return n?[n]:[]}_sceneNotFoundError(e){return new te(`Scene with name ${e} not found
|
|
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
|
|
57
59
|
Make sure you have registered the scene using story.register
|
|
58
60
|
Action: (id: ${this.getId()}) ${this.type}
|
|
59
|
-
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
|
|
60
62
|
Scene: ${s.config.name}
|
|
61
63
|
|
|
62
|
-
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`
|
|
63
65
|
Using action (id: ${e.getId()})
|
|
64
|
-
at: ${e.__stack}`}constructor(e,t){super(o.toMessage(e,t)),this.name="RuntimeScriptError"}},
|
|
65
|
-
@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}}}.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}.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,)}.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
|
|
66
|
-
`,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};
|