narraleaf-react 0.47.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/game/nlcore/action/actions/sceneAction.d.ts +9 -1
- package/dist/game/nlcore/elements/transform/type.d.ts +1 -1
- package/dist/game/nlcore/elements/type.d.ts +6 -1
- package/dist/game/player/gameState.d.ts +4 -4
- package/dist/game/player/lib/AudioManager.d.ts +33 -0
- package/dist/main.js +3 -3
- package/package.json +9 -1
|
@@ -46,12 +46,20 @@ export declare class SceneAction<T extends typeof SceneActionTypes[keyof typeof
|
|
|
46
46
|
* Waits until the previous BGM has completely faded out (if any) before
|
|
47
47
|
* resolving, ensuring seamless audio transition when jumping between scenes.
|
|
48
48
|
*
|
|
49
|
-
* A **suspended** scene starts nothing
|
|
49
|
+
* A **suspended** scene starts nothing, and neither does a scene whose music a load has
|
|
50
|
+
* already put back and left playing. This is the one place every path that starts a scene's
|
|
50
51
|
* music passes through, and it has to be the guard, because the call that reaches it is not
|
|
51
52
|
* always the one that asked: `getExposedStateAsync` waits on a component that is not mounted
|
|
52
53
|
* yet, and a stage remount - which is what loading a save performs - fires those waiting
|
|
53
54
|
* callbacks all over again. A caller parked behind a scene call therefore came back from a save
|
|
54
55
|
* with its music playing over the scene it had called.
|
|
56
|
+
*
|
|
57
|
+
* The same reason makes the second refusal necessary rather than something the load could sort
|
|
58
|
+
* out for itself. Every host applies a save as `newGame().deserialize(saved)`, and `newGame()`
|
|
59
|
+
* mounts the entry scene *first*: the callback that starts its music is armed before the load
|
|
60
|
+
* has run at all, and comes back once the load has finished restoring the audio. Whatever the
|
|
61
|
+
* load arms or declines to arm, that one is already in flight - so the refusal has to be here,
|
|
62
|
+
* where the order the callbacks were armed in cannot matter.
|
|
55
63
|
*/
|
|
56
64
|
static initBackgroundMusic(scene: Scene, exposed: ExposedState[ExposedStateType.scene], state?: GameState): Promise<void>;
|
|
57
65
|
static createSceneSnapshot(scene: Scene, state: GameState): SceneSnapshot;
|
|
@@ -24,5 +24,10 @@ export type SoundPlayOptions = FadeOptions & {
|
|
|
24
24
|
waitForEnd?: boolean;
|
|
25
25
|
};
|
|
26
26
|
export type ChainedActions = (Proxied<LogicAction.GameElement, Chained<LogicAction.Actions>> | LogicAction.Actions)[];
|
|
27
|
-
|
|
27
|
+
/**
|
|
28
|
+
* What a scene, a menu choice, a condition branch or a control block runs. Each entry is read on
|
|
29
|
+
* its own: an action or chained element runs as itself, and a plain string is a line of narration,
|
|
30
|
+
* so the two can sit side by side in one list.
|
|
31
|
+
*/
|
|
32
|
+
export type ActionStatements = (ChainedActions[number] | string)[];
|
|
28
33
|
export type { TransitionAnimationType, TransitionTask, };
|
|
@@ -468,10 +468,10 @@ export declare class GameState {
|
|
|
468
468
|
getStorable(): Storable;
|
|
469
469
|
getSceneByName(name: string): Scene | null;
|
|
470
470
|
getStory(): Story;
|
|
471
|
-
setInterval(callback: () => void, delay: number):
|
|
472
|
-
clearInterval(interval:
|
|
473
|
-
setTimeout(callback: () => void, delay: number):
|
|
474
|
-
clearTimeout(timeout:
|
|
471
|
+
setInterval(callback: () => void, delay: number): ReturnType<typeof setInterval>;
|
|
472
|
+
clearInterval(interval: ReturnType<typeof setInterval>): void;
|
|
473
|
+
setTimeout(callback: () => void, delay: number): ReturnType<typeof setTimeout>;
|
|
474
|
+
clearTimeout(timeout: ReturnType<typeof setTimeout>): void;
|
|
475
475
|
forceAnimation(): Awaitable;
|
|
476
476
|
/**
|
|
477
477
|
* Mounts a new state to the game state manager
|
|
@@ -79,6 +79,20 @@ export declare class AudioManager {
|
|
|
79
79
|
* whether the reference was really taken, which a release has to wait for.
|
|
80
80
|
*/
|
|
81
81
|
private retained;
|
|
82
|
+
/**
|
|
83
|
+
* What the most recent load put on the wire, keyed by the clip it put there.
|
|
84
|
+
*
|
|
85
|
+
* Written the moment {@link AudioManager.fromData} is handed a record - before any of the
|
|
86
|
+
* fetching and decoding it starts - because the question it answers is asked by callers that
|
|
87
|
+
* run a turn or two later and must not depend on having lost a race with the restore.
|
|
88
|
+
*
|
|
89
|
+
* An entry stands until something else takes the clip over: every other transport that starts
|
|
90
|
+
* or ends a clip drops it, so the answer can only be "yes" while the load really is the reason
|
|
91
|
+
* that clip is where it is. The value is whether the record wanted the clip *running* - a
|
|
92
|
+
* stopped or paused one is restored just as faithfully, but it is not something a scene start
|
|
93
|
+
* would be taking away.
|
|
94
|
+
*/
|
|
95
|
+
private restoredByLoad;
|
|
82
96
|
private globalVolume;
|
|
83
97
|
private sound;
|
|
84
98
|
private ready;
|
|
@@ -252,6 +266,25 @@ export declare class AudioManager {
|
|
|
252
266
|
fromData(data: AudioManagerDataRaw, elementMap: Map<string, LogicAction.GameElement>): this;
|
|
253
267
|
soundFromData(sound: SoundElement, data: AudioDataRaw): void;
|
|
254
268
|
isManaged(sound: SoundElement): boolean;
|
|
269
|
+
/**
|
|
270
|
+
* Whether the most recent load is the reason `sound` is on the wire, and left it running.
|
|
271
|
+
*
|
|
272
|
+
* The question a scene has to ask before it starts its own background music: the clip the save
|
|
273
|
+
* restored *is* that music already, playing at the position the player saved, and starting it
|
|
274
|
+
* again is a cross-fade of the track into itself - which stops it and plays it from the top.
|
|
275
|
+
* That throws the saved position away, and the stop lands while the restored element's `play()`
|
|
276
|
+
* is still pending, which the browser reports as an `AbortError`.
|
|
277
|
+
*
|
|
278
|
+
* Answered from the record rather than from the live token on purpose. A restore takes several
|
|
279
|
+
* turns to fetch and start a clip, and a scene mounting can get here first; reading
|
|
280
|
+
* `isPlaying()` would then say "nothing is playing" and the scene would start the very clip the
|
|
281
|
+
* load is in the middle of putting back. The record is written synchronously, so this is true
|
|
282
|
+
* from the instant the load is asked for.
|
|
283
|
+
*
|
|
284
|
+
* A record that says the clip is stopped or paused is not "running": the save wants silence
|
|
285
|
+
* there, and a scene that would have started music still does.
|
|
286
|
+
*/
|
|
287
|
+
isRunningFromLoad(sound: SoundElement): boolean;
|
|
255
288
|
/**
|
|
256
289
|
* Fetch and decode a sound into the audio cache without playing it, so the first `play()` of
|
|
257
290
|
* this source starts on the same frame it is asked to instead of after a fetch and a decode.
|
package/dist/main.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var de={action:"displayable:action",applyTransform:"displayable:applyTransform",applyTransition:"displayable:applyTransition",applyLoop:"displayable:applyLoop",stopLoop:"displayable:stopLoop",init:"displayable:init",bringToFront:"displayable:bringToFront"},Zt={say:"character:say",action:"character:action",setName:"character:setName"},B={action:"scene:action",init:"scene:init",exit:"scene:exit",jumpTo:"scene:jumpTo",callTo:"scene:callTo",preSuspend:"scene:preSuspend",resume:"scene:resume",setBackgroundMusic:"scene:setBackgroundMusic",preUnmount:"scene:preUnmount",transitionToScene:"scene:transitionToScene",nvlBlock:"scene:nvlBlock",nvlShow:"scene:nvlShow",nvlHide:"scene:nvlHide",nvlEnd:"scene:nvlEnd"};var mt={action:"image:action",setSrc:"image:setSrc",flush:"image:flush",initWearable:"image:initWearable",setAppearance:"image:setAppearance",setDarkness:"image:setDarkness"},ra={action:"condition:action"},sa={action:"script:action"},aa={action:"menu:action"},Ht={action:"sound:action",play:"sound:play",stop:"sound:stop",setVolume:"sound:setVolume",setRate:"sound:setRate",pause:"sound:pause",resume:"sound:resume",mute:"sound:mute",seek:"sound:seek"},re={action:"control:action",do:"control:do",doAsync:"control:doAsync",any:"control:any",all:"control:all",allAsync:"control:allAsync",repeat:"control:repeat",while:"control:while",break:"control:break",sleep:"control:sleep",waitForClick:"control:waitForClick",label:"control:label",jump:"control:jump"},Wi={action:"text:action",setText:"text:setText",setFontSize:"text:setFontSize"},ei={action:"persistent:action",set:"persistent:set",assign:"persistent:assign"},Tn={action:"layer:action",setZIndex:"layer:setZIndex"},Et={action:"video:action",preload:"video:preload",show:"video:show",hide:"video:hide",play:"video:play",pause:"video:pause",resume:"video:resume",stop:"video:stop",seek:"video:seek"},en={action:"vfx:action",preload:"vfx:preload",show:"vfx:show",hide:"vfx:hide",pause:"vfx:pause",resume:"vfx:resume",setRate:"vfx:setRate"},Ze={action:"puppet:action",setMotion:"puppet:setMotion",setExpression:"puppet:setExpression",setSkin:"puppet:setSkin",setParam:"puppet:setParam",setSlot:"puppet:setSlot",command:"puppet:command"};var la=(d=>(d[d.string=0]="string",d[d.number=1]="number",d[d.boolean=2]="boolean",d[d.object=3]="object",d[d.array=4]="array",d[d.function=5]="function",d[d.symbol=6]="symbol",d[d.undefined=7]="undefined",d[d.null=8]="null",d[d.date=9]="date",d[d.regexp=10]="regexp",d[d.other=11]="other",d))(la||{}),dr=(function(o){return typeof o=="string"?0:typeof o=="number"?1:typeof o=="boolean"?2:typeof o=="object"?Array.isArray(o)?4:o===null?8:o instanceof Date?9:o instanceof RegExp?10:3:typeof o=="function"?5:typeof o=="symbol"?6:typeof o>"u"?7:11});dr.DataTypes=la;function $(o,e,...t){let n=(s,a)=>Object.prototype.hasOwnProperty.call(s,a),i={},r=(s,a,l)=>dr(a)===3&&dr(l)===3?a.constructor!==Object||l.constructor!==Object?l||a:$(a,l):Array.isArray(a)&&Array.isArray(l)?l&&l.length>0?[...l]:[...a]:a===void 0&&Array.isArray(l)?[...l]:l===void 0?Array.isArray(a)?[...a]:a:Array.isArray(l)?[...l]:l;for(let s in o)n(o,s)&&(i[s]=r(s,o[s],e[s]));for(let s in e)n(e,s)&&!n(i,s)&&(typeof e[s]=="object"&&e[s]!==null?e[s].constructor===Object?i[s]=$({},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 $(i,s,...a)}return i}var $e=class $e{constructor(e=(n=>n),t){this.solved=!1;this.aborted=!1;this.failed=!1;this.error=null;this.listeners=[];this.failListeners=[];this.settledListeners=[];this.onRegisterSkipController=[];this.skipControllerAbortToken=null;this.settledNotified=!1;this.receiver=e,this.skipController=t,this.__stack=mr()}static isAwaitable(e){return e instanceof $e}static fromPromise(e){let t=new $e;return e.then(n=>t.resolve(n)).catch(n=>t.fail(n)),t}static resolve(e){let t=new $e;return t.resolve(e),t}static delay(e){let t=new $e;return setTimeout(()=>t.resolve(),e),t}static create(e){let t=new $e;return e(t),t}static wait(e){let t=new $e;return e.then(()=>t.resolve()),e.onFailed(n=>t.fail(n)),t}static race(e){let t=new $e;return e.length===0?(t.resolve(void 0),t):(e.forEach(n=>{n.then(i=>{e.forEach(r=>{r!==n&&r.skipController?.abort()}),t.resolve(i)}),n.onFailed(i=>t.fail(i))}),t.registerSkipController(new V(()=>{e.forEach(n=>n.skipController?.abort())})),t)}static forward(e,t,n){let i=new $e().registerSkipController(n||new V(()=>t));e.then(()=>i.resolve(t)),e.onFailed(a=>i.fail(a));let r=e.skipController?.onAbort(()=>{i.skipController?.abort(),r?.cancel(),s?.cancel()}),s=i.skipController?.onAbort(()=>{e.skipController?.abort(),r?.cancel(),s?.cancel()});return i}static toPromise(e){return new Promise((t,n)=>{e.then(t),e.onFailed(n)})}static toPromiseForce(e){return new Promise(t=>{e.onSettled(t)})}static any(...e){let t=new $e;return e.length===0?(t.resolve(),t):(e.forEach(n=>{n.onSettled(()=>t.resolve()),n.onFailed(i=>{t.fail(i),e.forEach(r=>{r!==n&&r.abort()})})}),t.registerSkipController(new V(()=>{e.forEach(n=>n.abort())})),t)}static all(...e){let t=new $e;if(e.length===0)return t.resolve(),t;let n=0;return e.forEach(i=>{i.onSettled(()=>{n++,n===e.length&&t.resolve()}),i.onFailed(r=>{e.forEach(s=>{s!==i&&s.abort()}),t.fail(r)})}),t.registerSkipController(new V(()=>{e.forEach(i=>i.abort())})),t}registerSkipController(e){this.skipControllerAbortToken?.cancel(),this.skipController=e,this.skipControllerAbortToken=e.onAbort(()=>{this.aborted=!0,this.notifySettled()});for(let t of this.onRegisterSkipController)t(e);return this}resolve(e){if(!this.isSettled()){this.result=this.receiver(e),this.solved=!0,this.skipController&&this.skipController.cancel();for(let t of this.listeners)t(this.result);this.notifySettled()}}fail(e){if(!this.isSettled()){this.error=e,this.failed=!0,this.skipController&&this.skipController.cancel();for(let t of this.failListeners)t(e);this.notifySettled()}}then(e,t){return this.solved?e(this.result):this.failed?t?.(this.error):(this.pushListener(e),t&&this.pushFailListener(t)),this}onSettled(e){if(this.isSettled())e();else return this.settledListeners.push(e),{cancel:()=>{this.offSettledListener(e)}};return{cancel:()=>{}}}onFailed(e){if(this.failed)e(this.error);else if(!this.isSettled())return this.pushFailListener(e),{cancel:()=>{this.offFailListener(e)}};return{cancel:()=>{}}}onSkipControllerRegister(e){return this.skipController?e(this.skipController):this.onRegisterSkipController.push(e),{cancel:()=>{this.offSkipControllerRegister(e)}}}offSkipControllerRegister(e){let t=this.onRegisterSkipController.indexOf(e);return t!==-1&&this.onRegisterSkipController.splice(t,1),this}abort(){return this.isSettled()?this.result:(this.aborted=!0,this.skipController?this.skipController.abort():this.notifySettled(),this.result)}isSolved(){return this.solved&&!this.aborted&&!this.failed}isAborted(){return this.aborted}isFailed(){return this.failed}isSettled(){return this.solved||this.aborted||this.failed}pushListener(e){return this.listeners.length>=$e.maxListeners&&console.warn("NarraLeaf-React: Awaitable has too many listeners, this may cause performance issues."),this.listeners.push(e),this}pushFailListener(e){return this.failListeners.length>=$e.maxListeners&&console.warn("NarraLeaf-React: Awaitable has too many failure listeners, this may cause performance issues."),this.failListeners.push(e),this}offListener(e){let t=this.listeners.indexOf(e);return t!==-1&&this.listeners.splice(t,1),this}offFailListener(e){let t=this.failListeners.indexOf(e);return t!==-1&&this.failListeners.splice(t,1),this}offSettledListener(e){let t=this.settledListeners.indexOf(e);return t!==-1&&this.settledListeners.splice(t,1),this}notifySettled(){if(!this.settledNotified){this.settledNotified=!0;for(let e of this.settledListeners)e()}}};$e.nothing=e=>e,$e.maxListeners=8;var S=$e;function ca(o){let e=new WeakSet;function t(n){if(n===null||typeof n!="object")return n;if(e.has(n))return;if(e.add(n),Array.isArray(n)){let r=[];for(let s of n)r.push(t(s));return r}let i={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(i[r]=t(n[r]));return i}return t(o)}function Gn(o){return typeof o=="string"?o:`#${(o.r||0).toString(16).padStart(2,"0")}${(o.g||0).toString(16).padStart(2,"0")}${(o.b||0).toString(16).padStart(2,"0")}${o.a===void 0?"":o.a.toString(16).padStart(2,"0")}`}var X=class{constructor(){this.events={};this.maxListeners=10}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),this.events[e].length>this.maxListeners&&console.warn(`NarraLeaf-React: Event ${e} has more than ${this.maxListeners} listeners (total: ${this.events[e].length}), this may cause performance issues.`),this.emit("event:EventDispatcher.register",e,t),{type:e,listener:t,cancel:()=>{this.off(e,t)}}}depends(e){return{cancel:()=>{e.forEach(t=>t.cancel())}}}off(e,t){this.events[e]&&(this.events[e]=this.events[e].filter(n=>n!==t))}emit(e,...t){if(!this.events[e])return 0;let n=this.events[e].length;return this.events[e].forEach(i=>{i(...t)}),n}once(e,t){let n=(...i)=>{t(...i),this.off(e,n)};return this.on(e,n)}async any(e,...t){if(this.events[e]||(this.events[e]=[]),this.events[e].length>0){await Promise.all(this.events[e].map(n=>n(...t)));return}return new Promise(n=>{let i="event:EventDispatcher.register",r=this.on(i,(s,a)=>{if(s===e){this.off(i,r);let l=a?.(...t);l!==null&&typeof l=="object"&&l.then?l.then(n):n(l)}}).listener})}setMaxListeners(e){return this.maxListeners=e,this}hasListeners(e){return this.events[e]?.length>0}clear(){this.events={}}};function mr(o=1){let e=new Error().stack;return e?e.split(`
|
|
2
2
|
`).slice(o+1).join(`
|
|
3
|
-
`).trim():""}function Qi(o){return new Promise(e=>setTimeout(e,o))}var qi=class qi{constructor(e){this.abortHandler=e;this.events=new X;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(qi.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};qi.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=qi;var ti=class{constructor(){this.locked=!1;this.listeners=[];this.unlockListeners=[]}lock(){return this.locked=!0,this}unlock(){this.locked=!1;for(let e of this.listeners)e();for(let e of this.unlockListeners)e();return this.listeners=[],this}onUnlock(e){return this.unlockListeners.push(e),e}offUnlock(e){this.unlockListeners=this.unlockListeners.filter(t=>t!==e)}async nextUnlock(){if(this.locked)return new Promise(e=>{this.listeners.push(e)})}isLocked(){return this.locked}},Mn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new ti;return this.locks.push(t),t}off(e){this.locks=this.locks.filter(t=>t!==e)}async nextUnlock(){let e=this.locks.map(t=>t.nextUnlock());return Promise.all(e)}isLocked(){return this.locks.some(e=>e.isLocked())}};function Fn(o,e,t={}){return o?e:t}function ua(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var _i=class{constructor(){this.taskToken=null}scheduleTask(e,t){this.taskToken&&this.taskToken.cancel();let n=!1,i=setTimeout(()=>{n||e()},t);return this.taskToken={cancel:()=>{clearTimeout(i),n=!0},isCancelled:()=>n},this.taskToken}cancelTask(){return this.taskToken&&(this.taskToken.cancel(),this.taskToken=null),this}};function pa(o,e){let t=[];for(let n=0;n<Math.max(o.length,e.length);n++)n<o.length&&t.push(o[n]),n<e.length&&t.push(e[n]);return t}async function da(o,e){let n=await(await fetch(o,e)).blob();return{url:URL.createObjectURL(n),bytes:n.size}}var Nn=class{constructor(e,t){this.concurrency=e;this.delay=t;this.tasks=[]}addTask(e){this.tasks.push(e)}get size(){return this.tasks.length}async start(){let e=async()=>{if(this.tasks.length===0)return;let t=this.tasks.splice(0,this.concurrency);await Promise.all(t.map(n=>n())),this.tasks.length!==0&&(await Qi(this.delay),await e())};await e()}};function st(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function ma(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var je=class o{constructor(e={},t={}){this.serializer=e;this.deserializer=t}serialize(e){let t={};for(let n of Object.keys(e))n in this.serializer&&e[n]!==void 0?t[n]=this.serializer[n]?.(e[n]):t[n]=e[n];return t}deserialize(e){let t={};for(let n of Object.keys(e))typeof this.deserializer[n]=="function"&&e[n]!==void 0?t[n]=this.deserializer[n](e[n]):t[n]=e[n];return t}extend(e,t){let n={...this.serializer,...e},i={...this.deserializer,...t};return new o(n,i)}};function fa(o){return["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"].includes(o)}function ha(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ni(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function fr(o,e=new WeakSet){if(o===null||typeof o!="object"||Array.isArray(o)||o instanceof Date||o instanceof RegExp||Object.getPrototypeOf(o)!==Object.prototype||e.has(o))return!1;e.add(o);for(let t in o)if(Object.prototype.hasOwnProperty.call(o,t)){let n=o[t];if(n!==null&&typeof n=="object"&&!fr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var zi=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Yi(o=16){let e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=t.length;for(let i=0;i<o;i++)e+=t.charAt(Math.floor(Math.random()*n));return e}function ga(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Ki=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},$i=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 ji=class{constructor(e){this.items=[];this.pushValidator=[];e&&(this.items=[...e])}addPushValidator(e){return this.pushValidator.push(e),this}removePushValidator(e){this.pushValidator=this.pushValidator.filter(t=>t!==e)}push(...e){for(let t of e)this.pushValidator.some(n=>!n(t))||this.items.push(t)}pop(){return this.items.pop()}peek(){return this.items[this.items.length-1]}isEmpty(){return this.items.length===0}size(){return this.items.length}clear(){this.items=[]}toArray(){return[...this.items]}forEach(e){this.items.forEach(e)}forEachReverse(e){for(let t=this.items.length-1;t>=0;t--)e(this.items[t])}map(e){return this.items.map(e)}get(e){return this.items[e]}};function ya(o,e){let t={},n=[];for(let i in o)Object.prototype.hasOwnProperty.call(o,i)&&(e.includes(i)?n.push(i):t[i]=o[i]);return[t,n]}function va(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,l=16777216,c=r*a>>>0,u=r*l+s*a>>>0,p=s*l+(u>>>0)>>>0;e=c,t=p}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var ii=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=mr(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}abandon(e){}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};ii.ActionTypes={action:"action"};var q=class extends ii{constructor(e,t,n){super(e,t,n),this.callee=e.getSelf(),this.contentNode.action=this}unknownTypeError(){throw new Error("Unknown action type: "+this.type)}resolveAwaitable(e,t){let n=t||new S(i=>i);return(async()=>await e(n.resolve.bind(n),n))(),n}is(e,t){return this instanceof e&&this.type===t}stringify(e,t,n){return this.stringifyWithName("Action")}stringifyWithName(e){return`${e}#${this._id}(${this.type})`}stringifyWithContent(e,t){return`${e}#${this._id}(${this.type}){${t}}`}};var ve=class ve extends q{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await ve.initBackgroundMusic(e,r,n),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t,n){n?.isSceneSuspended(e)||e.state.backgroundMusic&&await t.setBackgroundMusic(e.state.backgroundMusic,e.config.backgroundMusicFade)}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new J("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);if(t.addElement(r),t.setSceneSuspended(n,e.element.suspended===!0),n.local.getNamespace(t.getStorable()).load(e.local),e.state){let[,s]=t.getLiveGame().constructMaps();n.fromData(e.state,s)}e.background&&n.background.fromData(e.background)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new V(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),l=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{r.isSettled()||r.abort(),a.abort()}),r}static unloadScene(e,t){t.settlePendingLines(e),t.getStorable().removeNamespace(e.local.getNamespaceName()),t.offSrcManager(e.srcManager).removeScene(e),e.state.backgroundImage.reset()}static unwindCallStack(e){let t=e.getSuspendedScenes(),n=t.map(i=>[i,ve.createSceneSnapshot(i,e)]);return t.forEach(i=>{i.events.emit("event:scene.preUnmount"),ve.unloadScene(i,e)}),n}static rewindCallStack(e,t){e.forEach(([n,i])=>{let r=new S(s=>s);t.timelines.attachTimeline(r),ve.handleSceneInit(n,{type:B.callTo,node:null},t,r),ve.restoreSceneSnapshot(i,t),t.setSceneSuspended(n,!0)})}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}abandon(e){if(this.type!==B.resume)return;let t=this.contentNode.getContent()[0],n=this.callee,i=n.state.backgroundMusic;e.isSceneActive(t)&&(t.events.emit("event:scene.preUnmount"),ve.unloadScene(t,e)),e.setSceneSuspended(n,!1),i&&e.audioManager.isManaged(i)&&e.audioManager.resume(i,n.config.backgroundMusicFade)}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new S(c=>c),l=null;return a.registerSkipController(new V(()=>(l&&(clearTimeout(l),l=null),s))),l=e.setTimeout(()=>{l=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===B.action)return super.executeAction(e,t);if(this.is(ve,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{ve.unloadScene(this.callee,e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return ve.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===B.exit){let n=ve.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),ve.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),ve.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===B.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize(),s=ve.unwindCallStack(e);e.actionHistory.push({action:this,stackModel:t.stackModel},(l,c)=>{ve.rewindCallStack(c,e);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(l,u)},[r,s]);let a=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:a}),null}else if(this.type===B.preSuspend){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));if(e.isSceneActive(i))throw new J(`Cannot call scene ${this.getSceneName(n)}: it is already on stage.
|
|
3
|
+
`).trim():""}function Qi(o){return new Promise(e=>setTimeout(e,o))}var qi=class qi{constructor(e){this.abortHandler=e;this.events=new X;this.aborted=!1}abort(...e){this.aborted||(this.aborted=!0,this.abortHandler(...e),this.events.emit(qi.EventTypes["event:skipController.abort"]))}isAborted(){return this.aborted}cancel(){this.aborted=!0}onAbort(e){return this.events.on("event:skipController.abort",e)}};qi.EventTypes={"event:skipController.abort":"event:skipController.abort"};var V=qi;var ti=class{constructor(){this.locked=!1;this.listeners=[];this.unlockListeners=[]}lock(){return this.locked=!0,this}unlock(){this.locked=!1;for(let e of this.listeners)e();for(let e of this.unlockListeners)e();return this.listeners=[],this}onUnlock(e){return this.unlockListeners.push(e),e}offUnlock(e){this.unlockListeners=this.unlockListeners.filter(t=>t!==e)}async nextUnlock(){if(this.locked)return new Promise(e=>{this.listeners.push(e)})}isLocked(){return this.locked}},Mn=class{constructor(){this.locks=[]}unlock(e){return e.unlock(),this.off(e),e}register(e){let t=e||new ti;return this.locks.push(t),t}off(e){this.locks=this.locks.filter(t=>t!==e)}async nextUnlock(){let e=this.locks.map(t=>t.nextUnlock());return Promise.all(e)}isLocked(){return this.locks.some(e=>e.isLocked())}};function Fn(o,e,t={}){return o?e:t}function ua(o,e){if(e<=0)return o;let t=null;return function(...n){t&&clearTimeout(t),t=setTimeout(()=>{o(...n)},e)}}var _i=class{constructor(){this.taskToken=null}scheduleTask(e,t){this.taskToken&&this.taskToken.cancel();let n=!1,i=setTimeout(()=>{n||e()},t);return this.taskToken={cancel:()=>{clearTimeout(i),n=!0},isCancelled:()=>n},this.taskToken}cancelTask(){return this.taskToken&&(this.taskToken.cancel(),this.taskToken=null),this}};function pa(o,e){let t=[];for(let n=0;n<Math.max(o.length,e.length);n++)n<o.length&&t.push(o[n]),n<e.length&&t.push(e[n]);return t}async function da(o,e){let n=await(await fetch(o,e)).blob();return{url:URL.createObjectURL(n),bytes:n.size}}var Nn=class{constructor(e,t){this.concurrency=e;this.delay=t;this.tasks=[]}addTask(e){this.tasks.push(e)}get size(){return this.tasks.length}async start(){let e=async()=>{if(this.tasks.length===0)return;let t=this.tasks.splice(0,this.concurrency);await Promise.all(t.map(n=>n())),this.tasks.length!==0&&(await Qi(this.delay),await e())};await e()}};function st(o){let e,t=Promise.resolve().then(()=>{e=o()});return()=>{t.then(()=>{e&&e()})}}function ma(o,e){let t={};for(let n in o)e.includes(n)||(t[n]=o[n]);return t}var je=class o{constructor(e={},t={}){this.serializer=e;this.deserializer=t}serialize(e){let t={};for(let n of Object.keys(e))n in this.serializer&&e[n]!==void 0?t[n]=this.serializer[n]?.(e[n]):t[n]=e[n];return t}deserialize(e){let t={};for(let n of Object.keys(e))typeof this.deserializer[n]=="function"&&e[n]!==void 0?t[n]=this.deserializer[n](e[n]):t[n]=e[n];return t}extend(e,t){let n={...this.serializer,...e},i={...this.deserializer,...t};return new o(n,i)}};function fa(o){return["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"].includes(o)}function ha(o){return o.constructor.name==="AsyncFunction"||Object.prototype.toString.call(o)==="[object AsyncFunction]"}function ni(o){let e={};for(let t in o)o[t]!==void 0&&(e[t]=o[t]);return e}function fr(o,e=new WeakSet){if(o===null||typeof o!="object"||Array.isArray(o)||o instanceof Date||o instanceof RegExp||Object.getPrototypeOf(o)!==Object.prototype||e.has(o))return!1;e.add(o);for(let t in o)if(Object.prototype.hasOwnProperty.call(o,t)){let n=o[t];if(n!==null&&typeof n=="object"&&!fr(n,e)||typeof n=="function"||typeof n=="symbol")return!1}return!0}var zi=class{constructor(e=""){this.prefix=e;this.counter=0}next(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}};function Yi(o=16){let e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=t.length;for(let i=0;i<o;i++)e+=t.charAt(Math.floor(Math.random()*n));return e}function ga(o=16){let e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",t="";for(let n=0;n<o;n++)t+=e[Math.floor(Math.random()*e.length)];return t}var Ki=class{constructor(e=""){this.prefix=e;this.counter=0}generateId(){return`${this.prefix?this.prefix+"-":""}${this.counter++}`}},$i=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 ji=class{constructor(e){this.items=[];this.pushValidator=[];e&&(this.items=[...e])}addPushValidator(e){return this.pushValidator.push(e),this}removePushValidator(e){this.pushValidator=this.pushValidator.filter(t=>t!==e)}push(...e){for(let t of e)this.pushValidator.some(n=>!n(t))||this.items.push(t)}pop(){return this.items.pop()}peek(){return this.items[this.items.length-1]}isEmpty(){return this.items.length===0}size(){return this.items.length}clear(){this.items=[]}toArray(){return[...this.items]}forEach(e){this.items.forEach(e)}forEachReverse(e){for(let t=this.items.length-1;t>=0;t--)e(this.items[t])}map(e){return this.items.map(e)}get(e){return this.items[e]}};function ya(o,e){let t={},n=[];for(let i in o)Object.prototype.hasOwnProperty.call(o,i)&&(e.includes(i)?n.push(i):t[i]=o[i]);return[t,n]}function va(o){let e=3421674724,t=2216829733;for(let n=0;n<o.length;n++){let i=o.charCodeAt(n);e^=i;let r=e>>>0,s=t>>>0,a=435,l=16777216,c=r*a>>>0,u=r*l+s*a>>>0,p=s*l+(u>>>0)>>>0;e=c,t=p}return("00000000"+t.toString(16)).slice(-8)+("00000000"+e.toString(16)).slice(-8)}var ii=class{constructor(e,t,n){this.callee=e,this.type=t,this.contentNode=n,this.__stack=mr(),this._id="",this._staticId=null}executeAction(e,t){return{type:this.type,node:this.contentNode.getChild()}}abandon(e){}getId(){return this._id}setId(e){this._id=e}getStaticId(){return this._staticId}setStaticId(e){return this._staticId=e,this}resolveId(e){return this.setId(this._staticId||e),this}setContent(e){return this.contentNode.setContent(e),this}setContentNode(e){return this.contentNode=e,this}getFutureActions(e,t){let n=this.contentNode.getChild();return n&&n.action?[n.action]:[]}};ii.ActionTypes={action:"action"};var q=class extends ii{constructor(e,t,n){super(e,t,n),this.callee=e.getSelf(),this.contentNode.action=this}unknownTypeError(){throw new Error("Unknown action type: "+this.type)}resolveAwaitable(e,t){let n=t||new S(i=>i);return(async()=>await e(n.resolve.bind(n),n))(),n}is(e,t){return this instanceof e&&this.type===t}stringify(e,t,n){return this.stringifyWithName("Action")}stringifyWithName(e){return`${e}#${this._id}(${this.type})`}stringifyWithContent(e,t){return`${e}#${this._id}(${this.type}){${t}}`}};var ve=class ve extends q{static handleSceneInit(e,t,n,i){return n.isSceneActive(e)?t:(n.registerSrcManager(e.srcManager).addScene(e).flush(),e.local.init(n.getStorable()),n.getExposedStateAsync(e,async r=>{await ve.initBackgroundMusic(e,r,n),i.resolve(t),n.logger.debug("Scene Action","Scene init")}),i)}static async initBackgroundMusic(e,t,n){if(n?.isSceneSuspended(e))return;let i=e.state.backgroundMusic;i&&(n?.audioManager.isRunningFromLoad(i)||await t.setBackgroundMusic(i,e.config.backgroundMusicFade))}static createSceneSnapshot(e,t){let n=t.findElementByScene(e);if(!n)throw new J("Scene not found when creating snapshot (scene: "+e.getId()+")");return{state:e.toData(),local:e.local.getNamespace(t.getStorable()).toData(),element:t.createElementSnapshot(n),background:e.background.toData()}}static restoreSceneSnapshot(e,t){let n=e.element.scene,i=t.findElementByScene(n);i&&t.removeElement(i);let r=t.fromElementSnapshot(e.element);if(t.addElement(r),t.setSceneSuspended(n,e.element.suspended===!0),n.local.getNamespace(t.getStorable()).load(e.local),e.state){let[,s]=t.getLiveGame().constructMaps();n.fromData(e.state,s)}e.background&&n.background.fromData(e.background)}applyStageTransition(e,t,n,i){let r=new S().registerSkipController(new V(()=>(e.logger.info("Stage Transition","Skipped"),super.executeAction(e,i)))),s=()=>{r.isSettled()||r.resolve(super.executeAction(e,i))},a=e.stageTransition.apply(t,{from:this.callee,to:n},s),l=e.timelines.attachTimeline(r).attachChild(a);return a.onCancelled(s),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:l},()=>{r.isSettled()||r.abort(),a.abort()}),r}static unloadScene(e,t){t.settlePendingLines(e),t.getStorable().removeNamespace(e.local.getNamespaceName()),t.offSrcManager(e.srcManager).removeScene(e),e.state.backgroundImage.reset()}static unwindCallStack(e){let t=e.getSuspendedScenes(),n=t.map(i=>[i,ve.createSceneSnapshot(i,e)]);return t.forEach(i=>{i.events.emit("event:scene.preUnmount"),ve.unloadScene(i,e)}),n}static rewindCallStack(e,t){e.forEach(([n,i])=>{let r=new S(s=>s);t.timelines.attachTimeline(r),ve.handleSceneInit(n,{type:B.callTo,node:null},t,r),ve.restoreSceneSnapshot(i,t),t.setSceneSuspended(n,!0)})}exit(e){e.offSrcManager(this.callee.srcManager).removeScene(this.callee),this.callee.state.backgroundImage.reset()}abandon(e){if(this.type!==B.resume)return;let t=this.contentNode.getContent()[0],n=this.callee,i=n.state.backgroundMusic;e.isSceneActive(t)&&(t.events.emit("event:scene.preUnmount"),ve.unloadScene(t,e)),e.setSceneSuspended(n,!1),i&&e.audioManager.isManaged(i)&&e.audioManager.resume(i,n.config.backgroundMusicFade)}applyNvlVisibility(e,t,n,i){e.setNvlVisibility(t,n);let r=Math.max(0,n?.duration||0);if(r===0)return super.executeAction(e,i);let s=super.executeAction(e,i),a=new S(c=>c),l=null;return a.registerSkipController(new V(()=>(l&&(clearTimeout(l),l=null),s))),l=e.setTimeout(()=>{l=null,a.resolve(s)},r),a}executeAction(e,t){if(this.type===B.action)return super.executeAction(e,t);if(this.is(ve,"scene:init")){let n=new S(s=>s),i=e.timelines.attachTimeline(n);e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:i},()=>{ve.unloadScene(this.callee,e)},[]);let r={type:this.type,node:this.contentNode.getChild()};return ve.handleSceneInit(this.callee,r,e,S.forward(n,r))}else if(this.type===B.exit){let n=ve.createSceneSnapshot(this.callee,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{let r=new S(s=>s);e.timelines.attachTimeline(r),ve.handleSceneInit(this.callee,{type:this.type,node:this.contentNode.getChild()},e,r),ve.restoreSceneSnapshot(i,e)},[n]),e.getStorable().removeNamespace(this.callee.local.getNamespaceName()),this.exit(e),super.executeAction(e,t)}else if(this.type===B.jumpTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=e.getLiveGame().getStackModelForce().serialize(),s=ve.unwindCallStack(e);e.actionHistory.push({action:this,stackModel:t.stackModel},(l,c)=>{ve.rewindCallStack(c,e);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(l,u)},[r,s]);let a=i.getSceneRoot().contentNode;return e.getLiveGame().clearMainStack().getStackModelForce().push({type:this.type,node:a}),null}else if(this.type===B.preSuspend){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));if(e.isSceneActive(i))throw new J(`Cannot call scene ${this.getSceneName(n)}: it is already on stage.
|
|
4
4
|
A returnable jump suspends the scene it leaves rather than unloading it, so a scene cannot be called from itself or from anything it has called.`,this);if(e.isSceneSuspended(this.callee))throw this._callerAlreadyParkedError(n);let r=e.getSuspendedScenes().length,s=e.game.config.maxSceneCallDepth;if(r>=s)throw new J(`Scene call depth limit reached (${s}).
|
|
5
5
|
Each returnable jump keeps the scene it left mounted, so a chain of them holds every scene in the chain on the stage at once. Raise maxSceneCallDepth if the story really needs to go this deep.`,this);let a=this.callee.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{a&&e.audioManager.isManaged(a)&&e.audioManager.resume(a,0)},[]),a&&e.audioManager.isManaged(a)&&e.audioManager.pause(a,this.callee.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===B.callTo){let n=this.contentNode.getContent()[0],i=e.getStory().getScene(n);if(!i)throw this._sceneNotFoundError(this.getSceneName(n));let r=this.contentNode.getChild();if(!r?.action)throw new Ce("A scene call has no return address. `scene:callTo` is only ever built with a `scene:resume` chained behind it (see Scene._callScene).");let s=this.callee;if(e.isSceneSuspended(s))throw this._callerAlreadyParkedError(n);let a=e.getLiveGame().getStackModelForce().serialize();e.actionHistory.push({action:this,stackModel:t.stackModel},c=>{e.setSceneSuspended(s,!1);let[u]=e.getLiveGame().constructMaps();e.getLiveGame().getStackModelForce().deserialize(c,u)},[a]),e.setSceneSuspended(s,!0);let l=i.getSceneRoot().contentNode;return[{type:this.type,node:r},{type:this.type,node:l}]}else if(this.type===B.resume){let n=this.contentNode.getContent()[0],i=this.callee,r=i.state.backgroundMusic,s=ve.createSceneSnapshot(n,e);return e.actionHistory.push({action:this,stackModel:t.stackModel},a=>{let l=new S(c=>c);e.timelines.attachTimeline(l),ve.handleSceneInit(n,{type:this.type,node:this.contentNode.getChild()},e,l),ve.restoreSceneSnapshot(a,e),e.setSceneSuspended(i,!0),r&&e.audioManager.isManaged(r)&&e.audioManager.pause(r,0)},[s]),n.events.emit("event:scene.preUnmount"),ve.unloadScene(n,e),e.setSceneSuspended(i,!1),r&&e.audioManager.isManaged(r)&&e.audioManager.resume(r,i.config.backgroundMusicFade),super.executeAction(e,t)}else if(this.type===B.setBackgroundMusic){let[n,i]=this.contentNode.getContent(),r=this.callee,s=e.getExposedStateForce(r),a=r.state.backgroundMusic;return e.actionHistory.push({action:this,stackModel:t.stackModel},l=>{s.setBackgroundMusic(l,0)},[a]),s.setBackgroundMusic(n,i||0),super.executeAction(e,t)}else{if(this.type===B.preUnmount)return this.callee.events.emit("event:scene.preUnmount"),super.executeAction(e,t);if(this.type===B.transitionToScene){let[n,i]=this.contentNode.getContent();return this.applyStageTransition(e,n,i,t)}else if(this.type===B.nvlBlock){let[n,i]=this.contentNode.getContent(),r=e.createNvlSnapshot();return e.enterNvlMode(i),e.actionHistory.push({action:this,stackModel:t.stackModel},s=>{e.restoreNvlSnapshot(s)},[r]),n.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:n[0].contentNode}]}else if(this.type===B.nvlShow){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!0,n,t),s=S.isAwaitable(r)?e.timelines.attachTimeline(r):void 0;return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:s},a=>{e.setNvlVisibility(a)},[i]),r}else if(this.type===B.nvlHide){let[n]=this.contentNode.getContent(),i=e.getNvlState().visible,r=this.applyNvlVisibility(e,!1,n,t),s=S.isAwaitable(r)?e.timelines.attachTimeline(r):void 0;return e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:s},a=>{e.setNvlVisibility(a)},[i]),r}else if(this.type===B.nvlEnd){let[n]=this.contentNode.getContent(),i=e.createNvlSnapshot();return e.actionHistory.push({action:this,stackModel:t.stackModel},r=>{e.restoreNvlSnapshot(r)},[i]),e.exitNvlMode(n||null),{type:this.type,node:null}}}throw new Error("Unknown scene action type: "+this.type)}getFutureActions(e,t={}){if(this.type===B.callTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=r.getSceneRoot()?.contentNode,a=this.contentNode.getChild()?.action;return[...s?.action?[s.action]:[],...a?[a]:[]]}if(this.type===B.jumpTo&&t.allowFutureScene!==!1){let i=this.contentNode.getContent()[0],r=e.getScene(i,!0);r.isSceneRootConstructed()||r.constructSceneRoot(e);let s=e.getScene(i,!0).getSceneRoot()?.contentNode;return s?.action?[s.action]:[]}if(this.type===B.nvlBlock){let[i]=this.contentNode.getContent(),r=super.getFutureActions(e,t);return[...i??[],...r]}let n=this.contentNode.getChild()?.action;return n?[n]:[]}_sceneNotFoundError(e){return new J(`Scene with name ${e} not found
|
|
6
6
|
Make sure you have registered the scene using story.register`,this)}_callerAlreadyParkedError(e){let t=this.getSceneName(this.callee);return new J(`Cannot call scene ${this.getSceneName(e)} from ${t}: ${t} is already parked behind another call.
|
|
@@ -12,10 +12,10 @@ A returnable jump suspends the scene it is taken from, and a scene has one place
|
|
|
12
12
|
A saved game is a tree. Cutting the back-edge would save a different object graph
|
|
13
13
|
than the one you built, so this is refused rather than guessed at \u2014 break the
|
|
14
14
|
reference, or store an id in place of the object.`);if(Array.isArray(o)||xa(o)){n.add(o);try{if(Array.isArray(o))return o.map((l,c)=>Sr(l,[...e,c],t+1,n,i,r,s));let a={};return Object.entries(o).forEach(([l,c])=>{a[l]=Sr(c,[...e,l],t+1,n,i,r,s)}),a}finally{n.delete(o)}}}return console.warn(`Value of type "${iu(o)}" cannot be saved and was stored as null
|
|
15
|
-
at ${s}, ${vr(e)}`),null}function iu(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function ka(o,e,t){let n=Ca(o,e,br);return n=Ca(n,t,()=>{}),n}function Ca(o,e,t){if(!Array.isArray(e)||!e.length)return o;let n=o;for(let
|
|
15
|
+
at ${s}, ${vr(e)}`),null}function iu(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function ka(o,e,t){let n=Ca(o,e,br);return n=Ca(n,t,()=>{}),n}function Ca(o,e,t){if(!Array.isArray(e)||!e.length)return o;let n=(r,s)=>Object.prototype.hasOwnProperty.call(r,s),i=o;for(let r of e){if(!Array.isArray(r))continue;if(!r.length){i=t(i);continue}let s=i;for(let l=0;l<r.length-1&&s!==null&&typeof s=="object";l++)s=n(s,r[l])?s[r[l]]:void 0;if(s===null||typeof s!="object")continue;let a=r[r.length-1];Object.defineProperty(s,a,{value:t(n(s,a)?s[a]:void 0),writable:!0,enumerable:!0,configurable:!0})}return i}function br(o){return o instanceof Date?o:typeof o=="string"||typeof o=="number"?new Date(o):new Date(NaN)}function Pa(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function Tr(o,e,t=0){if(Object.is(o,e))return!0;if(t>oi)return!1;if(o instanceof Date||e instanceof Date)return o instanceof Date&&e instanceof Date&&o.getTime()===e.getTime();if(Array.isArray(o)||Array.isArray(e))return Array.isArray(o)&&Array.isArray(e)&&o.length===e.length&&o.every((n,i)=>Tr(n,e[i],t+1));if(Pa(o)&&Pa(e)){let n=Object.keys(o);return n.length===Object.keys(e).length&&n.every(i=>Object.prototype.hasOwnProperty.call(e,i)&&Tr(o[i],e[i],t+1))}return!1}var Ut=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=$({},t),this.defaultContent=t}static isSerializable(e){return eo(e)}set(e,t){let n=this.content[e];return o.isSerializable(t)?(this.content[e]=t,this.reportChange(e,n,t),this):(console.warn(`Value "${t}" in key "${String(e)}" is not serializable, and will not be set
|
|
16
16
|
at namespace "${this.name}"`),this.content[e]=t,this.reportChange(e,n,t),this)}get(e){return this.content[e]}equals(e,t){return this.content[e]===t}assign(e){return Object.entries(e).forEach(([t,n])=>{this.set(t,n)}),this}has(e){return this.content[e]!==void 0}keys(){return Object.keys(this.content)}values(){return Object.values(this.content)}entries(){return Object.entries(this.content)}reset(){let e=this.content;return this.content=$({},this.defaultContent),new Set([...Object.keys(e),...Object.keys(this.content)]).forEach(n=>{this.reportChange(n,e[n],this.content[n])}),this}getContent(){return this.content}toData(){return this.serialize()}load(e){if(!e){console.warn("No data to load");return}this.content={},this.deserialize(e)}serialize(){let e={};return Object.entries(this.content).forEach(([t,n])=>{e[t]=this.wrap(n,t)}),e}deserialize(e){if(!e){console.warn("No data to load");return}Object.entries(e).forEach(([t,n])=>{this.content[t]=this.unwrap(n)}),this.owner?.reportRestore(this.key)}toTypeName(e){return e instanceof Date?"date":"any"}wrap(e,t){let n=`namespace "${this.name}"`+(t===void 0?"":`, key "${t}"`),i={any:s=>{let a=wa(s,n),l={type:"any",data:a.data};return a.dates.length&&(l.dates=a.dates),a.undefineds.length&&(l.undefineds=a.undefineds),l},date:s=>({type:"date",data:s.toISOString()})},r=this.toTypeName(e);return i[r](e)}unwrap(e){let n={any:i=>ka(i.data,i.dates,i.undefineds),date:i=>br(i.data)}[e?.type];return n?n(e):(console.warn(`Unknown stored value type "${e?.type}", reading it as-is
|
|
17
17
|
at namespace "${this.name}"`),e?.data)}attach(e){return this.owner=e,this}detach(e){return this.owner===e&&(this.owner=null),this}reportChange(e,t,n){!this.owner||Tr(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},pn=class pn{constructor(){this.events=new X;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new Ut(e,t,n)}addNamespace(e){if(!this.namespaces[e.key])return this.namespaces[e.key]=e,e.attach(this),this}getNamespace(e){if(!this.namespaces[e])throw new E(`Namespace ${e} is not initialized, did you forget to register it?
|
|
18
|
-
Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(pn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(pn.EventTypes["event:storable.restore"],e)}toData(){return this.entries().reduce((e,[t,n])=>(e[t]=n.toData(),e),{})}load(e){if(!e){console.warn("No data to load");return}let t=this.restoreBatch=new Set;try{Object.entries(e).forEach(([n,i])=>{this.namespaces[n]||this.addNamespace(new Ut(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(pn.EventTypes["event:storable.restore"],{namespaces:Array.from(t)})}clear(){return this.values().forEach(e=>e.detach(this)),this.namespaces={},this}reportChange(e){this.events.emit(pn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(pn.EventTypes["event:storable.restore"],{namespaces:[e]})}};pn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var ri=pn;var qf={};var Vn=class extends Hn{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let l=a.getFutureActions(e,i).filter(c=>!r.has(c));s.push(...l)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var et=class extends q{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ht.play){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.play(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.stop){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.stop(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=S.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,l=>{l&&this.callee.fromData(l)},[s]),a}else if(this.type===Ht.setRate){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.setRate(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.pause){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.pause(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.resume){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.resume(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.seek){let[i]=this.contentNode.getContent(),r=e.audioManager.getPosition(this.callee),s=S.forward(e.audioManager.seek(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{e.audioManager.seek(this.callee,a)},[r]),s}else if(this.type===Ht.mute){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.mute(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("SoundAction")}};et.ActionTypes=Ht;var tt={bgm:"bgm",sound:"sound",voice:"voice"},to=8,dn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Un(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ai=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=l=>{t.set(l.id,{id:l.id,parentId:l.parentId??null,volume:Un(l.volume)})};Object.values(tt).forEach(l=>n({id:l}));let i=new Set;e.forEach(l=>{let c=l?.id;if(typeof c!="string"||c.trim().length===0)throw new dn(`Audio bus id must be a non-empty string, got ${JSON.stringify(c)}.`);if(i.has(c))throw new dn(`Audio bus "${c}" is declared more than once.`);i.add(c),n(l)}),o.assertResolvable(t);let r=[],s=new Map,a=l=>{let c=s.get(l);if(c)return c;let u=t.get(l),p=u.parentId===null?null:a(u.parentId),d={id:u.id,parentId:u.parentId,volume:u.volume,depth:p?p.depth+1:1};return s.set(l,d),r.push(d),d};return t.forEach(l=>a(l.id)),new o(r,s)}static isSeeded(e){return Object.values(tt).includes(e)}static assertResolvable(e){e.forEach(t=>{let n=[t.id],i=new Set([t.id]),r=t;for(;r.parentId!==null;){let s=e.get(r.parentId);if(!s)throw new dn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new dn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>to)throw new dn(`Audio bus "${t.id}" nests deeper than ${to}: ${n.join(" -> ")}.`);r=s}})}getNodes(){return this.nodes}get(e){return this.index.get(e)??null}has(e){return this.index.has(e)}isUnder(e,t){let n=this.index.get(e),i=0;for(;n&&i<=to;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},Ar=ai.resolve();function ou(o){Ar=o}function Cr(){return Ar}function no(o,e){let t=Ar;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var Ea={[tt.bgm]:"bgmVolume",[tt.sound]:"soundVolume",[tt.voice]:"voiceVolume"};function Da(o){let e={};return Object.entries(Ea).forEach(([t,n])=>{e[t]={get:()=>Un(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var si=class si{constructor(e,t={}){this.declarations=e;this.events=new X;this.overrides=new Map;this.aliasTokens=[];this.tree=null;this.events.setMaxListeners(64),this.aliases=t,Object.entries(t).forEach(([n,i])=>{this.aliasTokens.push(i.subscribe(r=>{this.announce(n,Un(r))}))})}dispose(){this.aliasTokens.forEach(e=>e.cancel()),this.aliasTokens.length=0}announce(e,t){let n=t;try{n=this.getEffectiveVolume(e)}catch{}this.events.emit(si.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ai.resolve(this.declarations()??[]),ou(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Un(t),i=this.aliases[e];return i?(i.set(n),this):(this.overrides.set(e,n),this.announce(e,n),this)}setVolumes(e){return Object.entries(e).forEach(([t,n])=>this.setVolume(t,n)),this}getVolume(e){let t=this.aliases[e];return t?Un(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Un(this.getDeclaredVolume(e)*this.getVolume(e))}list(){return this.getTree().getNodes().map(e=>({id:e.id,parentId:e.parentId,volume:this.getVolume(e.id),declaredVolume:e.volume,effectiveVolume:this.getEffectiveVolume(e.id)}))}getVolumes(){let e={};return this.list().forEach(t=>{e[t.id]=t.volume}),e}onVolumeChange(e){return this.events.on(si.EventTypes["event:audioBus.volumeChange"],e)}};si.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var li=si;var La=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(La||{}),xe=class xe extends ue{static toSound(e){return e==null?null:typeof e=="string"?new xe({src:e}):e}static isSound(e){return e instanceof xe}static voice(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=xe.DefaultUserConfig.create(t),[i]=n.extract(xe.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e,t){return Cr().isUnder(this.config.type,tt.bgm)&&console.warn(`NarraLeaf-React [Sound] Playing a bgm-typed sound (src: ${this.config.src}) with \`play()\`. It will play on the music bus but is not the scene's background music, so leaving the scene will not stop it and it will not cross-fade. Use \`scene.setBackgroundMusic()\` if that is what you wanted.`),this.pushAction(et.ActionTypes.play,[{end:this.state.volume,duration:e||0,waitForEnd:t?.waitForEnd===!0}])}stop(e){return this.pushAction(et.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(et.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(et.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(et.ActionTypes.setRate,[e])}pause(e){return this.pushAction(et.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(et.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(et.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:xe.StateSerializer.serialize(this.state)}}fromData(e){return this.state=xe.StateSerializer.deserialize(e.state),this}copy(){return new xe(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return xe.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new et(this.chain(),e,new C().setContent(t)))}};xe.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",xe.DefaultUserConfig=new z({src:xe.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultConfig=new z({src:xe.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultState=new z({volume:1,rate:1,paused:!1,muted:!1}),xe.StateSerializer=new je;var ge=xe;var Cn=class Cn{constructor(){this.src=[];this.future=[]}static catSrc(e){let t=new Set,n=new Set,i=new Set;return e.forEach(({type:r,src:s})=>{r===Cn.SrcTypes.image?t.add(s):r===Cn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof O?O.getSrcURL(e):e.type==="image"?O.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ne,B.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(P.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof Se){let n=t;if(t.is(Se,mt.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===mt.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===mt.setAppearance){let i=t.contentNode.getContent()[0];if(O.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(O.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:O.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof O||P.isStaticImageData(e)){if(e instanceof O){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(O.getSrcURL(e)))return this}else if(this.isSrcRegistered(P.srcToURL(e.src)))return this;this.src.push({type:"image",src:P.isStaticImageData(e)?P.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Cn.SrcTypes.audio?t===n.src.getSrc():n.type===Cn.SrcTypes.image?t===O.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Cn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Cn;import*as ja from"howler";var ze=class o{static from(e){return o.isPauseConstructor(e)?new o:e}static wait(e){return new o({duration:e})}static isPause(e){return this.isPauseConstructor(e)||e instanceof o}static isPauseConstructor(e){return e===o}constructor(e={}){this.config=e}};var lt=class o{static isTextEvent(e){return e instanceof o}static expression(e,t,n={}){return new o({expression:{image:e,appearance:t},sound:n.sound})}static sound(e){return new o({sound:e})}constructor(e){this.config=e}};function Ra(o,e){let{render:t,data:n,...i}=e,r=$(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var be=class be{static isWord(e){return e instanceof be}static color(e,t){return be.isWord(e)?e.copy().assign({color:t}):new be(e,{color:t})}static bold(e){return be.isWord(e)?e.copy().assign({bold:!0}):new be(e,{bold:!0})}static italic(e){return be.isWord(e)?e.copy().assign({italic:!0}):new be(e,{italic:!0})}static emphasis(e,t={}){return be.isWord(e)?e.copy().assign({emphasis:t}):new be(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return be.isWord(e)?e.copy().assign(i):new be(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=Ra(be.defaultConfig,t)}evaluate(e){if(ze.isPause(this.text))return[this];if(lt.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>be.isWord(n)?n.inherit(this.config).evaluate(e):new be(n,this.config)).flat():be.isWord(t)?t.inherit(this.config).evaluate(e):[new be(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=Ra(this.config,e),this}copy(){return new be(this.text,this.config)}isPause(){return ze.isPause(this.text)}isTextEvent(){return lt.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};be.defaultConfig={},be.defaultColor="#000";var oe=be;var ct=class ct{static isSentence(e){return e instanceof ct}static toSentence(e){return ct.isSentence(e)?e:new ct(e)}static format(e){let t=[];if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(this.formatWord(e[n]));else t.push(this.formatWord(e));return t}static formatWord(e){return oe.isWord(e)?e:new oe(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[oe.isWord(e)?e:new oe(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(ct.isSingleWord):ct.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||oe.isWord(e)||ze.isPause(e)||lt.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=ct.format(e),this.config=$(ct.defaultConfig,{...t,voice:typeof t.voice=="string"?ge.voice(t.voice):ge.toSound(t.voice)}),this.state=ca(ct.defaultState)}toData(){return null}fromData(e){return this.state=$(this.state,e),this}toString(){return this.text.map(e=>e.text).join("")}setCharacter(e){return this.config.character=e,this}evaluate(e){let t=[];for(let n=0;n<this.text.length;n++){let i=this.text[n].evaluate(e);t.push(...ct.formatStaticWord(i))}return t}copy(){return new ct([...this.text],this.config)}};ct.defaultConfig={voice:null,character:null,voiceId:null},ct.defaultState={};var fe=ct;var io=class{constructor(e,t){this.game=e,this.prefix=t}log(e,...t){this.isEnabled("log")&&console.log(...this.colorLog("gray",e,...t))}info(e,...t){this.isEnabled("info")&&console.info(...this._log(e,...t))}warn(e,...t){this.isEnabled("warn")&&console.warn(...this._log(e,...t))}error(e,...t){this.isEnabled("error")&&console.error(...this._log(e,...t))}debug(e,...t){this.isEnabled("debug")&&console.debug(...this.colorLog("gray",e,...t))}trace(e,...t){this.isEnabled("trace")&&console.trace(this._log(e,...t))}weakWarn(e,...t){this.isEnabled("warn")&&console.log(...this.colorLog("yellow",e,...t))}weakError(e,...t){this.isEnabled("error")&&console.log(...this.colorLog("red",e,...t))}verbose(e,...t){this.isEnabled("verbose")&&console.log(...this.colorLog("gray",e,...t))}group(e,t=!1){let n=this._log(e).join(" ");return this.isEnabled("info")&&(t?console.groupCollapsed(n):console.group(n)),{end:()=>{this.isEnabled("info")&&console.groupEnd()}}}isEnabled(e){return typeof this.game.config.app.logger=="boolean"?this.game.config.app.logger:this.game.config.app.logger[e]}_log(e,...t){return t.length===0?[this.prefix||"",e]:[`${this.prefix||""} [${e}]`,...t]}colorLog(e,t,...n){if(n.length===0)return[`%c${this.prefix||""} ${t}`,`color: ${e}`];let i=[],r=[],s=[];return this.prefix?(i.push(`%c${this.prefix} [${t}]`),r.push(`color: ${e}`)):(i.push(`%c[${t}]`),r.push(`color: ${e}`)),n.forEach(a=>{typeof a=="string"?(i.push(`%c${a}`),r.push(`color: ${e}`)):(i.push("%O"),s.push(a),r.push(""))}),[i.join(" ")].concat(r,s)}};var mn=class extends q{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};mn.ActionTypes=sa;var we=class o extends ue{static getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}static execute(e){return new o(e)}constructor(e){super(),this.handler=e;let t=this.chain(),n=new mn(t,mn.ActionTypes.action,new C().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new mn(this.chain(),mn.ActionTypes.action,new C().setContent(e))]}};var ru={volume:1,limit:1/0},su=class Ma{constructor(e,t,n,i){this.subChannels=new Map,this.tokens=new Set,this.tokenQueue=[],this.muted=!1,this.removed=!1,this.name=e,this.audioProvider=t,this.parentChannel=i??null,this.options={...ru,...n},this.volume=this.options.volume;let r=this.audioProvider.getAudioContext();this.gainNode=r.createGain(),this.gainNode.gain.value=this.muted?0:this.volume,this.connectToParent()}connectToParent(){this.parentChannel?this.gainNode.connect(this.parentChannel.getGainNode()):this.gainNode.connect(this.audioProvider.getAudioContext().destination)}getGainNode(){return this.gainNode}ensureNotRemoved(){if(this.removed)throw new Error(`Channel "${this.name}" has been removed and cannot be used.`)}getName(){return this.name}async play(e,t){if(this.ensureNotRemoved(),this.tokens.size>=this.options.limit){let r=this.tokenQueue.shift();r&&r.stop()}let n=await this.audioProvider.createToken(e,t,this.gainNode);this.tokens.add(n),this.tokenQueue.push(n);let i=()=>{this.tokens.delete(n);let r=this.tokenQueue.indexOf(n);r!==-1&&this.tokenQueue.splice(r,1)};return n.once("ended",i),n.once("stop",i),n}createChannel(e,t){if(this.ensureNotRemoved(),this.subChannels.has(e))throw new Error(`Channel "${e}" already exists under "${this.name}".`);this.audioProvider.checkChannelLimit();let n=new Ma(e,this.audioProvider,t,this);return this.subChannels.set(e,n),this.audioProvider.registerChannel(n),n}getChannel(e){return this.ensureNotRemoved(),this.subChannels.get(e)??null}getChannels(){return this.ensureNotRemoved(),Array.from(this.subChannels.values())}setVolume(e){return this.ensureNotRemoved(),this.volume=Math.max(0,Math.min(1,e)),this.muted||(this.gainNode.gain.value=this.volume),this}getVolume(){return this.volume}mute(e){return this.ensureNotRemoved(),this.muted=e!==void 0?e:!0,this.gainNode.gain.value=this.muted?0:this.volume,this}unmute(){return this.mute(!1)}isMuted(){return this.muted}remove(){if(this.removed)return this;this.removed=!0;for(let t of this.tokens)t.stop();this.tokens.clear();let e=Array.from(this.subChannels.values());this.subChannels.clear();for(let t of e)t.remove();try{this.gainNode.disconnect()}catch(t){console.warn("Failed to disconnect Channel gain node during remove().",t)}return this.audioProvider.unregisterChannel(this),this.parentChannel&&this.parentChannel.removeSubChannel(this.name),this}removeSubChannel(e){this.subChannels.delete(e)}getTokens(){this.ensureNotRemoved();let e=[...this.tokenQueue];for(let t of this.subChannels.values())e.push(...t.getTokens());return e}isRemoved(){return this.removed}getParent(){return this.parentChannel}getOptions(){return{...this.options}}},Na=!1;function au(o){Na=o}function tn(o,e){Na||(e!==void 0?console.warn(o,e):console.warn(o))}var lu=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.onSourceEnded=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){tn("Failed to disconnect AudioBufferSourceNode in disconnectSource().",o)}else this.currentSource instanceof HTMLAudioElement&&(this.currentSource.pause(),this.currentSource.src="",this.currentSource.load());if(this.mediaElementSource){try{this.mediaElementSource.disconnect()}catch(o){tn("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=()=>{this.onSourceEnded?this.onSourceEnded():this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}setSourceEndedHandler(o){this.onSourceEnded=o}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){tn("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){if(this.currentSource instanceof AudioBufferSourceNode)this.currentSource.start(o,e);else if(this.currentSource instanceof HTMLAudioElement){e>0&&(this.currentSource.currentTime=e);let t=this.currentSource.play();t&&typeof t.catch=="function"&&t.catch(n=>{tn("Failed to start HTMLAudioElement playback.",n)})}}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},Ia=class{constructor(o,e){this.token=o,this.endVolume=e,this.cancelled=!1,this.finishedInternal=!1,this._finished=new Promise(t=>{this.resolveFinished=t})}get finished(){return this._finished}cancel(){this.cancelled||this.finishedInternal||(this.cancelled=!0,this.resolveFinished())}finish(){this.finishedInternal||(this.finishedInternal=!0,this.token.setVolume(this.endVolume),this.resolveFinished())}isCancelled(){return this.cancelled}isFinished(){return this.finishedInternal}getTargetVolume(){return this.endVolume}},cu=class{constructor(o,e,t={},n){this._isPlaying=!1,this._isPaused=!1,this._isMuted=!1,this.volume=1,this.rate=1,this.contextStartTime=0,this.startOffset=0,this.pauseOffset=0,this.duration=0,this.currentFade=null,this.audioContext=o,this.volume=t.volume??1,this.rate=t.rate??1,this.startOffset=t.startOffset??0,this.duration=t.duration??0,this.outputNode=n??o.destination,this.gainNode=o.createGain(),this.gainNode.gain.value=this.volume,this.gainNode.connect(this.outputNode),this.sourceController=new lu(o,this.gainNode),this.sourceController.setSourceEndedHandler(()=>this.emit("ended")),this.sourceController.setSource(e),this.applyRate(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1,this._isPaused=!1;try{this.gainNode.disconnect()}catch(e){tn("Failed to disconnect gain node on natural end.",e)}}}setVolume(o){return this.currentFade&&(this.currentFade.cancel(),this.currentFade=null),o=Math.max(0,Math.min(1,o)),this.volume=o,this._isMuted||(this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=o),this}getVolume(){return this.volume}mute(o){let e=o!==void 0?o:!0;if(this._isMuted=e,this.currentFade&&!this.currentFade.isFinished()&&!this.currentFade.isCancelled()){let t=this.currentFade.getTargetVolume();this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.volume=t,this.gainNode.gain.value=e?0:t,this.currentFade.finish(),this.currentFade=null}else this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=e?0:this.volume;return this}unmute(){return this.mute(!1)}isMuted(){return this._isMuted}pause(){if(!this._isPlaying||this._isPaused)return this;let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?(o.pause(),this.pauseOffset=o.currentTime):o instanceof AudioBufferSourceNode&&(this.pauseOffset=this.getCurrentTime(),this.sourceController.stop()),this._isPlaying=!1,this._isPaused=!0,this.emit("pause"),this}resume(){if(!this._isPaused)return this;let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement){let e=o.play();e&&typeof e.catch=="function"&&e.catch(()=>{this._isPlaying=!1,this._isPaused=!0})}else if(o instanceof AudioBufferSourceNode){let e=this.audioContext.createBufferSource();e.buffer=o.buffer,e.playbackRate.value=this.rate,e.loop=o.loop,e.loopStart=o.loopStart,e.loopEnd=o.loopEnd,this.sourceController.refreshSource(e),this.startOffset=this.pauseOffset,this.contextStartTime=this.audioContext.currentTime,this.sourceController.start(0,this.pauseOffset)}return this._isPlaying=!0,this._isPaused=!1,this.emit("resume"),this}isPlaying(){return this._isPlaying}isPaused(){return this._isPaused}stop(o={}){let{fadeDuration:e=0}=o;return e>0?this.fade(this.getVolume(),0,e).finished.then(()=>{this.doStop()}):this.doStop(),this}doStop(){this.sourceController.stop(),this._isPlaying=!1,this._isPaused=!1,this.emit("stop"),this.sourceController.destroy();try{this.gainNode.disconnect()}catch(o){tn("Failed to disconnect gain node on stop().",o)}}setRate(o){return o=Math.max(.001,o),this.rate=o,this.applyRate(this.sourceController.getSource()),this}applyRate(o){o instanceof HTMLAudioElement?o.playbackRate=this.rate:o instanceof AudioBufferSourceNode&&(o.playbackRate.value=this.rate)}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new Ia(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Ia(this,e);this.currentFade=n;let i=this.audioContext.currentTime;return this.gainNode.gain.setValueAtTime(o,i),this.gainNode.gain.linearRampToValueAtTime(e,i+t/1e3),setTimeout(()=>{!n.isCancelled()&&!n.isFinished()&&(this.volume=e,n.finish(),this.currentFade=null)},t),n}on(o,e){return this.sourceController.on(o,e),this}off(o,e){return this.sourceController.off(o,e),this}once(o,e){return this.sourceController.once(o,e),this}},uu=class{constructor(o,e,t){this.owner=e,this.releaseDelay=t,this.references=0,this.playing=0,this.dropWhenIdle=!1,this.releaseTimer=null,this.audioBuffer=o}retain(){return this.references++,this.dropWhenIdle=!1,this.cancelPendingRelease(),this}release(){this.references>0&&this.references--,this.reconsider()}addRef(){this.playing++,this.cancelPendingRelease()}releaseRef(){this.playing>0&&this.playing--,this.reconsider()}getReferenceCount(){return this.references}getPlayingCount(){return this.playing}getRefCount(){return this.playing}async unload(){this.references=0,this.dropWhenIdle=!0,this.reconsider()}async forceUnload(){this.drop()}isAlive(){return this.audioBuffer!==null}raw(){if(!this.audioBuffer)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}byteLength(){return this.audioBuffer?this.audioBuffer.length*this.audioBuffer.numberOfChannels*4:0}isIdle(){return this.audioBuffer!==null&&this.references===0&&this.playing===0}reconsider(){if(this.isIdle()){if(this.releaseDelay>0&&!this.dropWhenIdle){this.releaseTimer||(this.releaseTimer=setTimeout(()=>{this.releaseTimer=null,this.isIdle()&&this.drop()},this.releaseDelay));return}this.drop()}}cancelPendingRelease(){this.releaseTimer&&(clearTimeout(this.releaseTimer),this.releaseTimer=null)}drop(){this.cancelPendingRelease(),this.audioBuffer&&(this.audioBuffer=null,this.references=0,this.playing=0,this.owner.evict(this))}},pu=class{constructor(o,e=0){this.cache=new Map,this.loadingPromises=new Map,this.generation=0,this.audioContext=o,this.releaseDelay=Math.max(0,e)}async load(o){return(await this.acquire(o)).retain()}async acquire(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.generation,i=this.doLoad(o);this.loadingPromises.set(o,i);try{let r=await i;return n!==this.generation?(await r.forceUnload(),r):(this.cache.set(o,r),r)}finally{this.loadingPromises.get(o)===i&&this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new uu(t,this,this.releaseDelay)}get(o){let e=this.cache.get(o);return e&&e.isAlive()?e:null}release(o){let e=this.cache.get(o);return e?(e.release(),!0):!1}async unload(o){let e=this.cache.get(o);return e?(await e.unload(),!0):!1}evict(o){for(let[e,t]of this.cache)if(t===o){this.cache.delete(e);return}}clear(){this.generation++;for(let o of Array.from(this.cache.values()))o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){let o=0;for(let e of this.cache.values())o+=e.byteLength();return{entries:this.cache.size,loading:this.loadingPromises.size,decodedBytes:o}}},du=10*1024*1024,mu={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1,cacheReleaseDelay:0},Ga=class xr{constructor(e){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...mu,...e},au(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new pu(this.audioContext,this.options.cacheReleaseDelay),this.masterChannel=new su("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(e=>{let t=()=>{if(this.destroyed){this.clearUnlockHandler(),e();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,e())}).catch(n=>{tn("Failed to resume AudioContext while unlocking.",n)})};this.unlockHandler=t,document.addEventListener("click",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",t)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let e=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",e),document.removeEventListener("touchstart",e),document.removeEventListener("keydown",e)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(e,t,n){this.ensureNotDestroyed(),this.ensureReady();let{volume:i=1,rate:r=1,startTime:s=0,endTime:a,loopStart:l,load:c="auto",loop:u=!1}=t??{},p,d=null;if(typeof e=="string")if(await this.resolveLoadMode(e,c)==="stream")p=this.createStreamSource(e);else{d=await this.audioCache.acquire(e),d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=d.raw(),p=m}else{d=e,d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=e.raw(),p=m}let h=u&&a!==void 0&&a>s?{start:xr.clampLoopStart(l,s,a),end:a}:null;p instanceof AudioBufferSourceNode?(p.loop=u,h&&(p.loopStart=h.start,p.loopEnd=h.end)):p instanceof HTMLAudioElement&&(p.loop=u);let f=new cu(this.audioContext,p,{volume:i,rate:r,startOffset:s,duration:!u&&a?a-s:0},n);if(d){let m=!1,g=()=>{m||(m=!0,d.releaseRef?.())};f.once("ended",g),f.once("stop",g)}return f}static clampLoopStart(e,t,n){return e===void 0||!Number.isFinite(e)?t:e>=t&&e<n?e:t}async resolveLoadMode(e,t){if(t==="stream"||t==="full")return t;let n=xr.schemeOf(e);if(n==="data:"||n==="blob:")return"full";if(n!==null&&n!=="http:"&&n!=="https:")return"stream";try{let i=await fetch(e,{method:"HEAD"});if(!i.ok)return"stream";let r=i.headers.get("Content-Length");if(!r)return"stream";let s=parseInt(r,10);return isNaN(s)?"stream":s<du?"full":"stream"}catch(i){return tn("Failed to resolve load mode via HEAD request, falling back to 'stream'.",i),"stream"}}static schemeOf(e){try{let t=typeof location<"u"&&location?.href?location.href:void 0;return new URL(e,t).protocol}catch{return null}}createStreamSource(e){let t=new Audio(e);return t.crossOrigin="anonymous","preservesPitch"in t&&(t.preservesPitch=!1),t}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(e){this.registeredChannels.add(e)}unregisterChannel(e){this.registeredChannels.delete(e)}setVolume(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(e),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(e){return this.ensureNotDestroyed(),this.ensureReady(),e===void 0?this.masterChannel.mute():this.masterChannel.mute(e),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(e,t){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(e,t)}getChannel(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(e)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(e){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(e)}release(e){return this.ensureNotDestroyed(),this.audioCache.release(e)}async unload(e){return this.ensureNotDestroyed(),this.audioCache.unload(e)}getCached(e){return this.ensureNotDestroyed(),this.audioCache.get(e)}getCacheStats(){return this.audioCache.getStats()}async play(e,t){this.ensureNotDestroyed(),this.ensureReady();let n=this.masterChannel.getTokens();for(let i of n)try{i.stop()}catch{}return this.masterChannel.play(e,t)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(e=>{tn("Failed to close AudioContext during destroy().",e)}))}isDestroyed(){return this.destroyed}};var Ie=class Ie{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.retained=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new Ga({maxChannels:Ie.MaxChannels,cacheReleaseDelay:Ie.CacheGrace});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=Ie.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,Ie.BusRampTimeConstant),r.setValueAtTime(s,a+Ie.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${tt.sound}" instead.`)),this.channels.get(tt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=Ie.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let r=await this.channelFor(e).play(e.config.src,{volume:0,...this.playOptionsOf(e)}),s=e.state.muted??!1;r.mute(s),e.state.muted=s,this.state.set(e,{token:r,originalVolume:t.end}),t.duration>0?await r.fade(0,t.end,t.duration).finished:r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,!e.config.loop&&t.waitForEnd!==!1&&await new Promise(a=>{r.once("ended",()=>a())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t=Ie.defaultFade(e)){await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await n.play(e.config.src,{volume:0,...this.playOptionsOf(e)}),r=e.state.muted??!1;return i.mute(r),e.state.muted=r,this.state.set(e,{token:i,originalVolume:t.end}),t.duration>0?i.fade(0,t.end,t.duration):i.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,i}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return this.arm(e,i),t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new S;if(!this.state.has(e))return i.resolve(),i;let r=this.state.get(e);return r.originalVolume=t,n===0?(r.token.setVolume(t),e.state.volume=t,i.resolve()):r.token.fade(r.token.getVolume(),t,n).finished.then(()=>{e.state.volume=t,i.resolve()}),i}mute(e,t=!0){let n=new S;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}arm(e,t){let n=(t.transport??0)+1;return t.transport=n,()=>this.state.get(e)===t&&t.transport===n}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{if(!r()){n.resolve();return}i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,i.token.fade(0,i.originalVolume,t).finished.then(()=>{if(!r()){n.resolve();return}e.state.paused=!1,n.resolve()})),n}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=Ie.clampToRegion(t,Ie.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}playOptionsOf(e){return{...Ie.clipRegionOf(e),loop:e.config.loop,rate:e.state.rate,load:this.loadModeOf(e)}}loadModeOf(e){let{src:t,streaming:n,loop:i,endTime:r}=e.config;return t.startsWith("data:")||t.startsWith("blob:")?"full":n?"stream":this.gameState.game.config.audioStreaming==="declared"?"full":i&&r===void 0?"stream":"full"}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime(),...e.state.paused?{paused:!0}:{}}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=Ie.clipRegionOf(e),r=i.endTime!==void 0&&e.config.loop,s=await n.play(e.config.src,{volume:e.state.volume,...this.playOptionsOf(e),startTime:r?i.startTime:t.position});r&&Math.abs(t.position-i.startTime)>.01&&s.seek(Ie.clampToRegion(t.position,i)),this.state.set(e,{token:s,originalVolume:e.state.volume});let a=e.state.muted??!1;s.mute(a),e.state.muted=a;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?s.pause():t.isPlaying||s.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}preload(e){let t=e.config.src;if(this.loadModeOf(e)==="stream"||this.retained.has(t))return Promise.resolve();let n=this.ready.then(()=>this.sound.load(t)).then(()=>!0).catch(i=>(this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${t}")`,i),!1));return this.retained.set(t,n),n.then(()=>{})}retainOnly(e){let t=new Set(e.map(n=>n.config.src));for(let n of[...this.retained.keys()])t.has(n)||this.releaseSource(n);for(let n of e)this.preload(n)}getCacheStats(){return this.isReady?this.sound.getCacheStats():{entries:0,loading:0,decodedBytes:0}}releaseSource(e){let t=this.retained.get(e);t&&(this.retained.delete(e),t.then(n=>{n&&this.isReady&&this.sound.release(e)}))}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.retainOnly([]),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.retained.clear(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};Ie.MaxChannels=1024,Ie.BusRampTimeConstant=.02,Ie.BusRampSettle=Ie.BusRampTimeConstant*5,Ie.CacheGrace=5e3;var oo=Ie;function Fa(o){if(typeof MessageChannel>"u"){let n=setTimeout(o,0);return()=>clearTimeout(n)}let e=!1,t=new MessageChannel;return t.port1.onmessage=()=>{t.port1.close(),t.port2.close(),e||o()},t.port2.postMessage(void 0),()=>{e=!0}}var ro=class{constructor(e){this.config=e;this.watching=null;this.warnings=[]}observe(e){return this.watching=e,this}warn(e,t){return this.warnings.push([e,t]),this.watching?.logger.warn(t),t}getWarnings(){return[...this.warnings]}};import*as Su from"html-to-image";var ke=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),st(()=>{this.preventAttach()})}static proxy(e){let t=new S,n=new S,i=new o(n);return i.onTimelineRegistered(()=>{n.resolve()}).onSettled(()=>{let[r,s]=i.catSettled();e(r,s)}),t.onSkipControllerRegister(r=>{r.onAbort(()=>{i.abort()})}),[t,i]}static any(e){if(e.length===0)throw new E("Cannot create an 'any' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=!1;for(let s of e)i.attachChild(s),s.then(a=>{r||(r=!0,t.resolve(a))});return t.onSkipControllerRegister(s=>{s.onAbort(()=>{i.abort()})}),[t,i]}static all(e){if(e.length===0)throw new E("Cannot create an 'all' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let l=e[a];i.attachChild(l),l.then(c=>{r[a]=c,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(l=>{a=l.onAbort(()=>{r.abort()})}),i.then(l=>{a?.cancel(),n=l,i=e(l),i?st(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?st(()=>s()):st(()=>r.resolve(n)),r}get status(){return this._status}isSettled(){return this._status!=="pending"}isResolved(){return this._status==="resolved"}isCancelled(){return this._status==="cancelled"}isFailed(){return this._status==="failed"}onResolved(e){this._onResolved.push(e)}onCancelled(e){this._onCancelled.push(e)}onFailed(e){this._onFailed.push(e)}onSettled(e){this.isSettled()?st(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.isSettled()||this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
|
|
18
|
+
Use \`story.registerPersistent\` to register a persistent namespace`);return this.namespaces[e]}setNamespace(e,t){return this.namespaces[e]?.detach(this),this.namespaces[e]=t,t.attach(this),this}hasNamespace(e){return!!this.namespaces[e]}removeNamespace(e){return this.namespaces[e]?.detach(this),delete this.namespaces[e],this}getNamespaces(){return this.namespaces}keys(){return Object.keys(this.namespaces)}values(){return Object.values(this.namespaces)}entries(){return Object.entries(this.namespaces)}onChange(e,t,n){let i=typeof e=="string"?e:null,r=typeof t=="string"?t:null,s=typeof e=="function"?e:typeof t=="function"?t:n;if(!s)throw new E("No listener provided when subscribing to storable changes");return this.events.on(pn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(pn.EventTypes["event:storable.restore"],e)}toData(){return this.entries().reduce((e,[t,n])=>(e[t]=n.toData(),e),{})}load(e){if(!e){console.warn("No data to load");return}let t=this.restoreBatch=new Set;try{Object.entries(e).forEach(([n,i])=>{this.namespaces[n]||this.addNamespace(new Ut(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(pn.EventTypes["event:storable.restore"],{namespaces:Array.from(t)})}clear(){return this.values().forEach(e=>e.detach(this)),this.namespaces={},this}reportChange(e){this.events.emit(pn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(pn.EventTypes["event:storable.restore"],{namespaces:[e]})}};pn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var ri=pn;var qf={};var Vn=class extends Hn{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let l=a.getFutureActions(e,i).filter(c=>!r.has(c));s.push(...l)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var et=class extends q{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ht.play){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.play(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.stop){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.stop(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.setVolume){let[i,r]=this.contentNode.getContent(),s=this.callee.toData(),a=S.forward(e.audioManager.setVolume(this.callee,i,r),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(a),e.actionHistory.push(n,l=>{l&&this.callee.fromData(l)},[s]),a}else if(this.type===Ht.setRate){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.setRate(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.pause){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.pause(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.resume){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.resume(this.callee,i.duration),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}else if(this.type===Ht.seek){let[i]=this.contentNode.getContent(),r=e.audioManager.getPosition(this.callee),s=S.forward(e.audioManager.seek(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{e.audioManager.seek(this.callee,a)},[r]),s}else if(this.type===Ht.mute){let[i]=this.contentNode.getContent(),r=this.callee.toData(),s=S.forward(e.audioManager.mute(this.callee,i),{type:this.type,node:this.contentNode?.getChild()});return e.timelines.attachTimeline(s),e.actionHistory.push(n,a=>{a&&this.callee.fromData(a)},[r]),s}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("SoundAction")}};et.ActionTypes=Ht;var tt={bgm:"bgm",sound:"sound",voice:"voice"},to=8,dn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Un(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ai=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=l=>{t.set(l.id,{id:l.id,parentId:l.parentId??null,volume:Un(l.volume)})};Object.values(tt).forEach(l=>n({id:l}));let i=new Set;e.forEach(l=>{let c=l?.id;if(typeof c!="string"||c.trim().length===0)throw new dn(`Audio bus id must be a non-empty string, got ${JSON.stringify(c)}.`);if(i.has(c))throw new dn(`Audio bus "${c}" is declared more than once.`);i.add(c),n(l)}),o.assertResolvable(t);let r=[],s=new Map,a=l=>{let c=s.get(l);if(c)return c;let u=t.get(l),p=u.parentId===null?null:a(u.parentId),d={id:u.id,parentId:u.parentId,volume:u.volume,depth:p?p.depth+1:1};return s.set(l,d),r.push(d),d};return t.forEach(l=>a(l.id)),new o(r,s)}static isSeeded(e){return Object.values(tt).includes(e)}static assertResolvable(e){e.forEach(t=>{let n=[t.id],i=new Set([t.id]),r=t;for(;r.parentId!==null;){let s=e.get(r.parentId);if(!s)throw new dn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new dn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>to)throw new dn(`Audio bus "${t.id}" nests deeper than ${to}: ${n.join(" -> ")}.`);r=s}})}getNodes(){return this.nodes}get(e){return this.index.get(e)??null}has(e){return this.index.has(e)}isUnder(e,t){let n=this.index.get(e),i=0;for(;n&&i<=to;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},Ar=ai.resolve();function ou(o){Ar=o}function Cr(){return Ar}function no(o,e){let t=Ar;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var Ea={[tt.bgm]:"bgmVolume",[tt.sound]:"soundVolume",[tt.voice]:"voiceVolume"};function Da(o){let e={};return Object.entries(Ea).forEach(([t,n])=>{e[t]={get:()=>Un(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var si=class si{constructor(e,t={}){this.declarations=e;this.events=new X;this.overrides=new Map;this.aliasTokens=[];this.tree=null;this.events.setMaxListeners(64),this.aliases=t,Object.entries(t).forEach(([n,i])=>{this.aliasTokens.push(i.subscribe(r=>{this.announce(n,Un(r))}))})}dispose(){this.aliasTokens.forEach(e=>e.cancel()),this.aliasTokens.length=0}announce(e,t){let n=t;try{n=this.getEffectiveVolume(e)}catch{}this.events.emit(si.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ai.resolve(this.declarations()??[]),ou(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Un(t),i=this.aliases[e];return i?(i.set(n),this):(this.overrides.set(e,n),this.announce(e,n),this)}setVolumes(e){return Object.entries(e).forEach(([t,n])=>this.setVolume(t,n)),this}getVolume(e){let t=this.aliases[e];return t?Un(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Un(this.getDeclaredVolume(e)*this.getVolume(e))}list(){return this.getTree().getNodes().map(e=>({id:e.id,parentId:e.parentId,volume:this.getVolume(e.id),declaredVolume:e.volume,effectiveVolume:this.getEffectiveVolume(e.id)}))}getVolumes(){let e={};return this.list().forEach(t=>{e[t.id]=t.volume}),e}onVolumeChange(e){return this.events.on(si.EventTypes["event:audioBus.volumeChange"],e)}};si.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var li=si;var La=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(La||{}),xe=class xe extends ue{static toSound(e){return e==null?null:typeof e=="string"?new xe({src:e}):e}static isSound(e){return e instanceof xe}static voice(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new xe({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=xe.DefaultUserConfig.create(t),[i]=n.extract(xe.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e,t){return Cr().isUnder(this.config.type,tt.bgm)&&console.warn(`NarraLeaf-React [Sound] Playing a bgm-typed sound (src: ${this.config.src}) with \`play()\`. It will play on the music bus but is not the scene's background music, so leaving the scene will not stop it and it will not cross-fade. Use \`scene.setBackgroundMusic()\` if that is what you wanted.`),this.pushAction(et.ActionTypes.play,[{end:this.state.volume,duration:e||0,waitForEnd:t?.waitForEnd===!0}])}stop(e){return this.pushAction(et.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(et.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(et.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(et.ActionTypes.setRate,[e])}pause(e){return this.pushAction(et.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(et.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(et.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:xe.StateSerializer.serialize(this.state)}}fromData(e){return this.state=xe.StateSerializer.deserialize(e.state),this}copy(){return new xe(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return xe.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new et(this.chain(),e,new C().setContent(t)))}};xe.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",xe.DefaultUserConfig=new z({src:xe.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultConfig=new z({src:xe.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),xe.DefaultState=new z({volume:1,rate:1,paused:!1,muted:!1}),xe.StateSerializer=new je;var ge=xe;var Cn=class Cn{constructor(){this.src=[];this.future=[]}static catSrc(e){let t=new Set,n=new Set,i=new Set;return e.forEach(({type:r,src:s})=>{r===Cn.SrcTypes.image?t.add(s):r===Cn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof O?O.getSrcURL(e):e.type==="image"?O.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ne,B.jumpTo)){let n=t.contentNode.getContent()[0],r=e.getScene(n,!0).state.backgroundImage;if(P.isImageURL(r.config.src))return{type:"image",src:r.config.src,activeType:"once"}}else if(t instanceof Se){let n=t;if(t.is(Se,mt.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===mt.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===mt.setAppearance){let i=t.contentNode.getContent()[0];if(O.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(O.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:O.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof ge){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof O||P.isStaticImageData(e)){if(e instanceof O){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(O.getSrcURL(e)))return this}else if(this.isSrcRegistered(P.srcToURL(e.src)))return this;this.src.push({type:"image",src:P.isStaticImageData(e)?P.srcToURL(e):e.state.currentSrc})}else if(typeof e=="object"){if(this.isSrcRegistered(e.src||""))return this;this.src.push(e)}else if(e==="audio"){if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t instanceof ge?t:new ge({src:t})})}else{if(this.isSrcRegistered(t||""))return this;this.src.push({type:e,src:t})}return this}registerRawSrc(e){return this.isSrcRegistered(e)?this:(this.src.push({type:"image",src:e}),this)}isSrcRegistered(e){if(!e)return!1;let t=e instanceof ge?e.getSrc():e;return this.src.some(n=>n.type===Cn.SrcTypes.audio?t===n.src.getSrc():n.type===Cn.SrcTypes.image?t===O.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Cn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Cn;import*as ja from"howler";var ze=class o{static from(e){return o.isPauseConstructor(e)?new o:e}static wait(e){return new o({duration:e})}static isPause(e){return this.isPauseConstructor(e)||e instanceof o}static isPauseConstructor(e){return e===o}constructor(e={}){this.config=e}};var lt=class o{static isTextEvent(e){return e instanceof o}static expression(e,t,n={}){return new o({expression:{image:e,appearance:t},sound:n.sound})}static sound(e){return new o({sound:e})}constructor(e){this.config=e}};function Ra(o,e){let{render:t,data:n,...i}=e,r=$(o,i);return"render"in e?r.render=e.render:"render"in o&&(r.render=o.render),"data"in e?r.data=e.data:"data"in o&&(r.data=o.data),r}var be=class be{static isWord(e){return e instanceof be}static color(e,t){return be.isWord(e)?e.copy().assign({color:t}):new be(e,{color:t})}static bold(e){return be.isWord(e)?e.copy().assign({bold:!0}):new be(e,{bold:!0})}static italic(e){return be.isWord(e)?e.copy().assign({italic:!0}):new be(e,{italic:!0})}static emphasis(e,t={}){return be.isWord(e)?e.copy().assign({emphasis:t}):new be(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return be.isWord(e)?e.copy().assign(i):new be(e,i)}static getText(e){return e.filter(t=>!t.isPause()&&!t.isTextEvent()).map(t=>t.toString()).join("")}constructor(e,t={}){this.text=e,this.config=Ra(be.defaultConfig,t)}evaluate(e){if(ze.isPause(this.text))return[this];if(lt.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>be.isWord(n)?n.inherit(this.config).evaluate(e):new be(n,this.config)).flat():be.isWord(t)?t.inherit(this.config).evaluate(e):[new be(t,this.config)]}return[this]}inherit(e){return this.config.color=this.config.color||e.color,this.config.italic=this.config.italic??e.italic,this.config.bold=this.config.bold??e.bold,this.config.cps=this.config.cps??e.cps,this.config.emphasis=this.config.emphasis??e.emphasis,this.config.fontScale=this.config.fontScale??e.fontScale,this}assign(e){return this.config=Ra(this.config,e),this}copy(){return new be(this.text,this.config)}isPause(){return ze.isPause(this.text)}isTextEvent(){return lt.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};be.defaultConfig={},be.defaultColor="#000";var oe=be;var ct=class ct{static isSentence(e){return e instanceof ct}static toSentence(e){return ct.isSentence(e)?e:new ct(e)}static format(e){let t=[];if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(this.formatWord(e[n]));else t.push(this.formatWord(e));return t}static formatWord(e){return oe.isWord(e)?e:new oe(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[oe.isWord(e)?e:new oe(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(ct.isSingleWord):ct.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||oe.isWord(e)||ze.isPause(e)||lt.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=ct.format(e),this.config=$(ct.defaultConfig,{...t,voice:typeof t.voice=="string"?ge.voice(t.voice):ge.toSound(t.voice)}),this.state=ca(ct.defaultState)}toData(){return null}fromData(e){return this.state=$(this.state,e),this}toString(){return this.text.map(e=>e.text).join("")}setCharacter(e){return this.config.character=e,this}evaluate(e){let t=[];for(let n=0;n<this.text.length;n++){let i=this.text[n].evaluate(e);t.push(...ct.formatStaticWord(i))}return t}copy(){return new ct([...this.text],this.config)}};ct.defaultConfig={voice:null,character:null,voiceId:null},ct.defaultState={};var fe=ct;var io=class{constructor(e,t){this.game=e,this.prefix=t}log(e,...t){this.isEnabled("log")&&console.log(...this.colorLog("gray",e,...t))}info(e,...t){this.isEnabled("info")&&console.info(...this._log(e,...t))}warn(e,...t){this.isEnabled("warn")&&console.warn(...this._log(e,...t))}error(e,...t){this.isEnabled("error")&&console.error(...this._log(e,...t))}debug(e,...t){this.isEnabled("debug")&&console.debug(...this.colorLog("gray",e,...t))}trace(e,...t){this.isEnabled("trace")&&console.trace(this._log(e,...t))}weakWarn(e,...t){this.isEnabled("warn")&&console.log(...this.colorLog("yellow",e,...t))}weakError(e,...t){this.isEnabled("error")&&console.log(...this.colorLog("red",e,...t))}verbose(e,...t){this.isEnabled("verbose")&&console.log(...this.colorLog("gray",e,...t))}group(e,t=!1){let n=this._log(e).join(" ");return this.isEnabled("info")&&(t?console.groupCollapsed(n):console.group(n)),{end:()=>{this.isEnabled("info")&&console.groupEnd()}}}isEnabled(e){return typeof this.game.config.app.logger=="boolean"?this.game.config.app.logger:this.game.config.app.logger[e]}_log(e,...t){return t.length===0?[this.prefix||"",e]:[`${this.prefix||""} [${e}]`,...t]}colorLog(e,t,...n){if(n.length===0)return[`%c${this.prefix||""} ${t}`,`color: ${e}`];let i=[],r=[],s=[];return this.prefix?(i.push(`%c${this.prefix} [${t}]`),r.push(`color: ${e}`)):(i.push(`%c[${t}]`),r.push(`color: ${e}`)),n.forEach(a=>{typeof a=="string"?(i.push(`%c${a}`),r.push(`color: ${e}`)):(i.push("%O"),s.push(a),r.push(""))}),[i.join(" ")].concat(r,s)}};var mn=class extends q{executeAction(e,t){let n=this.contentNode.getContent().execute({gameState:e});return n&&e.actionHistory.push({action:this,stackModel:t.stackModel},()=>{n()},[]),super.executeAction(e,t)}stringify(e,t,n){return super.stringifyWithName("ScriptAction")}};mn.ActionTypes=sa;var we=class o extends ue{static getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}static execute(e){return new o(e)}constructor(e){super(),this.handler=e;let t=this.chain(),n=new mn(t,mn.ActionTypes.action,new C().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new mn(this.chain(),mn.ActionTypes.action,new C().setContent(e))]}};var ru={volume:1,limit:1/0},su=class Ma{constructor(e,t,n,i){this.subChannels=new Map,this.tokens=new Set,this.tokenQueue=[],this.muted=!1,this.removed=!1,this.name=e,this.audioProvider=t,this.parentChannel=i??null,this.options={...ru,...n},this.volume=this.options.volume;let r=this.audioProvider.getAudioContext();this.gainNode=r.createGain(),this.gainNode.gain.value=this.muted?0:this.volume,this.connectToParent()}connectToParent(){this.parentChannel?this.gainNode.connect(this.parentChannel.getGainNode()):this.gainNode.connect(this.audioProvider.getAudioContext().destination)}getGainNode(){return this.gainNode}ensureNotRemoved(){if(this.removed)throw new Error(`Channel "${this.name}" has been removed and cannot be used.`)}getName(){return this.name}async play(e,t){if(this.ensureNotRemoved(),this.tokens.size>=this.options.limit){let r=this.tokenQueue.shift();r&&r.stop()}let n=await this.audioProvider.createToken(e,t,this.gainNode);this.tokens.add(n),this.tokenQueue.push(n);let i=()=>{this.tokens.delete(n);let r=this.tokenQueue.indexOf(n);r!==-1&&this.tokenQueue.splice(r,1)};return n.once("ended",i),n.once("stop",i),n}createChannel(e,t){if(this.ensureNotRemoved(),this.subChannels.has(e))throw new Error(`Channel "${e}" already exists under "${this.name}".`);this.audioProvider.checkChannelLimit();let n=new Ma(e,this.audioProvider,t,this);return this.subChannels.set(e,n),this.audioProvider.registerChannel(n),n}getChannel(e){return this.ensureNotRemoved(),this.subChannels.get(e)??null}getChannels(){return this.ensureNotRemoved(),Array.from(this.subChannels.values())}setVolume(e){return this.ensureNotRemoved(),this.volume=Math.max(0,Math.min(1,e)),this.muted||(this.gainNode.gain.value=this.volume),this}getVolume(){return this.volume}mute(e){return this.ensureNotRemoved(),this.muted=e!==void 0?e:!0,this.gainNode.gain.value=this.muted?0:this.volume,this}unmute(){return this.mute(!1)}isMuted(){return this.muted}remove(){if(this.removed)return this;this.removed=!0;for(let t of this.tokens)t.stop();this.tokens.clear();let e=Array.from(this.subChannels.values());this.subChannels.clear();for(let t of e)t.remove();try{this.gainNode.disconnect()}catch(t){console.warn("Failed to disconnect Channel gain node during remove().",t)}return this.audioProvider.unregisterChannel(this),this.parentChannel&&this.parentChannel.removeSubChannel(this.name),this}removeSubChannel(e){this.subChannels.delete(e)}getTokens(){this.ensureNotRemoved();let e=[...this.tokenQueue];for(let t of this.subChannels.values())e.push(...t.getTokens());return e}isRemoved(){return this.removed}getParent(){return this.parentChannel}getOptions(){return{...this.options}}},Na=!1;function au(o){Na=o}function tn(o,e){Na||(e!==void 0?console.warn(o,e):console.warn(o))}var lu=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.onSourceEnded=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){tn("Failed to disconnect AudioBufferSourceNode in disconnectSource().",o)}else this.currentSource instanceof HTMLAudioElement&&(this.currentSource.pause(),this.currentSource.src="",this.currentSource.load());if(this.mediaElementSource){try{this.mediaElementSource.disconnect()}catch(o){tn("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=()=>{this.onSourceEnded?this.onSourceEnded():this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}setSourceEndedHandler(o){this.onSourceEnded=o}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){tn("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){if(this.currentSource instanceof AudioBufferSourceNode)this.currentSource.start(o,e);else if(this.currentSource instanceof HTMLAudioElement){e>0&&(this.currentSource.currentTime=e);let t=this.currentSource.play();t&&typeof t.catch=="function"&&t.catch(n=>{tn("Failed to start HTMLAudioElement playback.",n)})}}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},Ia=class{constructor(o,e){this.token=o,this.endVolume=e,this.cancelled=!1,this.finishedInternal=!1,this._finished=new Promise(t=>{this.resolveFinished=t})}get finished(){return this._finished}cancel(){this.cancelled||this.finishedInternal||(this.cancelled=!0,this.resolveFinished())}finish(){this.finishedInternal||(this.finishedInternal=!0,this.token.setVolume(this.endVolume),this.resolveFinished())}isCancelled(){return this.cancelled}isFinished(){return this.finishedInternal}getTargetVolume(){return this.endVolume}},cu=class{constructor(o,e,t={},n){this._isPlaying=!1,this._isPaused=!1,this._isMuted=!1,this.volume=1,this.rate=1,this.contextStartTime=0,this.startOffset=0,this.pauseOffset=0,this.duration=0,this.currentFade=null,this.audioContext=o,this.volume=t.volume??1,this.rate=t.rate??1,this.startOffset=t.startOffset??0,this.duration=t.duration??0,this.outputNode=n??o.destination,this.gainNode=o.createGain(),this.gainNode.gain.value=this.volume,this.gainNode.connect(this.outputNode),this.sourceController=new lu(o,this.gainNode),this.sourceController.setSourceEndedHandler(()=>this.emit("ended")),this.sourceController.setSource(e),this.applyRate(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1,this._isPaused=!1;try{this.gainNode.disconnect()}catch(e){tn("Failed to disconnect gain node on natural end.",e)}}}setVolume(o){return this.currentFade&&(this.currentFade.cancel(),this.currentFade=null),o=Math.max(0,Math.min(1,o)),this.volume=o,this._isMuted||(this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=o),this}getVolume(){return this.volume}mute(o){let e=o!==void 0?o:!0;if(this._isMuted=e,this.currentFade&&!this.currentFade.isFinished()&&!this.currentFade.isCancelled()){let t=this.currentFade.getTargetVolume();this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.volume=t,this.gainNode.gain.value=e?0:t,this.currentFade.finish(),this.currentFade=null}else this.gainNode.gain.cancelScheduledValues(this.audioContext.currentTime),this.gainNode.gain.value=e?0:this.volume;return this}unmute(){return this.mute(!1)}isMuted(){return this._isMuted}pause(){if(!this._isPlaying||this._isPaused)return this;let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?(o.pause(),this.pauseOffset=o.currentTime):o instanceof AudioBufferSourceNode&&(this.pauseOffset=this.getCurrentTime(),this.sourceController.stop()),this._isPlaying=!1,this._isPaused=!0,this.emit("pause"),this}resume(){if(!this._isPaused)return this;let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement){let e=o.play();e&&typeof e.catch=="function"&&e.catch(()=>{this._isPlaying=!1,this._isPaused=!0})}else if(o instanceof AudioBufferSourceNode){let e=this.audioContext.createBufferSource();e.buffer=o.buffer,e.playbackRate.value=this.rate,e.loop=o.loop,e.loopStart=o.loopStart,e.loopEnd=o.loopEnd,this.sourceController.refreshSource(e),this.startOffset=this.pauseOffset,this.contextStartTime=this.audioContext.currentTime,this.sourceController.start(0,this.pauseOffset)}return this._isPlaying=!0,this._isPaused=!1,this.emit("resume"),this}isPlaying(){return this._isPlaying}isPaused(){return this._isPaused}stop(o={}){let{fadeDuration:e=0}=o;return e>0?this.fade(this.getVolume(),0,e).finished.then(()=>{this.doStop()}):this.doStop(),this}doStop(){this.sourceController.stop(),this._isPlaying=!1,this._isPaused=!1,this.emit("stop"),this.sourceController.destroy();try{this.gainNode.disconnect()}catch(o){tn("Failed to disconnect gain node on stop().",o)}}setRate(o){return o=Math.max(.001,o),this.rate=o,this.applyRate(this.sourceController.getSource()),this}applyRate(o){o instanceof HTMLAudioElement?o.playbackRate=this.rate:o instanceof AudioBufferSourceNode&&(o.playbackRate.value=this.rate)}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new Ia(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Ia(this,e);this.currentFade=n;let i=this.audioContext.currentTime;return this.gainNode.gain.setValueAtTime(o,i),this.gainNode.gain.linearRampToValueAtTime(e,i+t/1e3),setTimeout(()=>{!n.isCancelled()&&!n.isFinished()&&(this.volume=e,n.finish(),this.currentFade=null)},t),n}on(o,e){return this.sourceController.on(o,e),this}off(o,e){return this.sourceController.off(o,e),this}once(o,e){return this.sourceController.once(o,e),this}},uu=class{constructor(o,e,t){this.owner=e,this.releaseDelay=t,this.references=0,this.playing=0,this.dropWhenIdle=!1,this.releaseTimer=null,this.audioBuffer=o}retain(){return this.references++,this.dropWhenIdle=!1,this.cancelPendingRelease(),this}release(){this.references>0&&this.references--,this.reconsider()}addRef(){this.playing++,this.cancelPendingRelease()}releaseRef(){this.playing>0&&this.playing--,this.reconsider()}getReferenceCount(){return this.references}getPlayingCount(){return this.playing}getRefCount(){return this.playing}async unload(){this.references=0,this.dropWhenIdle=!0,this.reconsider()}async forceUnload(){this.drop()}isAlive(){return this.audioBuffer!==null}raw(){if(!this.audioBuffer)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}byteLength(){return this.audioBuffer?this.audioBuffer.length*this.audioBuffer.numberOfChannels*4:0}isIdle(){return this.audioBuffer!==null&&this.references===0&&this.playing===0}reconsider(){if(this.isIdle()){if(this.releaseDelay>0&&!this.dropWhenIdle){this.releaseTimer||(this.releaseTimer=setTimeout(()=>{this.releaseTimer=null,this.isIdle()&&this.drop()},this.releaseDelay));return}this.drop()}}cancelPendingRelease(){this.releaseTimer&&(clearTimeout(this.releaseTimer),this.releaseTimer=null)}drop(){this.cancelPendingRelease(),this.audioBuffer&&(this.audioBuffer=null,this.references=0,this.playing=0,this.owner.evict(this))}},pu=class{constructor(o,e=0){this.cache=new Map,this.loadingPromises=new Map,this.generation=0,this.audioContext=o,this.releaseDelay=Math.max(0,e)}async load(o){return(await this.acquire(o)).retain()}async acquire(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.generation,i=this.doLoad(o);this.loadingPromises.set(o,i);try{let r=await i;return n!==this.generation?(await r.forceUnload(),r):(this.cache.set(o,r),r)}finally{this.loadingPromises.get(o)===i&&this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new uu(t,this,this.releaseDelay)}get(o){let e=this.cache.get(o);return e&&e.isAlive()?e:null}release(o){let e=this.cache.get(o);return e?(e.release(),!0):!1}async unload(o){let e=this.cache.get(o);return e?(await e.unload(),!0):!1}evict(o){for(let[e,t]of this.cache)if(t===o){this.cache.delete(e);return}}clear(){this.generation++;for(let o of Array.from(this.cache.values()))o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){let o=0;for(let e of this.cache.values())o+=e.byteLength();return{entries:this.cache.size,loading:this.loadingPromises.size,decodedBytes:o}}},du=10*1024*1024,mu={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1,cacheReleaseDelay:0},Ga=class xr{constructor(e){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...mu,...e},au(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new pu(this.audioContext,this.options.cacheReleaseDelay),this.masterChannel=new su("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(e=>{let t=()=>{if(this.destroyed){this.clearUnlockHandler(),e();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,e())}).catch(n=>{tn("Failed to resume AudioContext while unlocking.",n)})};this.unlockHandler=t,document.addEventListener("click",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",t)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let e=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",e),document.removeEventListener("touchstart",e),document.removeEventListener("keydown",e)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(e,t,n){this.ensureNotDestroyed(),this.ensureReady();let{volume:i=1,rate:r=1,startTime:s=0,endTime:a,loopStart:l,load:c="auto",loop:u=!1}=t??{},p,d=null;if(typeof e=="string")if(await this.resolveLoadMode(e,c)==="stream")p=this.createStreamSource(e);else{d=await this.audioCache.acquire(e),d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=d.raw(),p=m}else{d=e,d.addRef?.();let m=this.audioContext.createBufferSource();m.buffer=e.raw(),p=m}let h=u&&a!==void 0&&a>s?{start:xr.clampLoopStart(l,s,a),end:a}:null;p instanceof AudioBufferSourceNode?(p.loop=u,h&&(p.loopStart=h.start,p.loopEnd=h.end)):p instanceof HTMLAudioElement&&(p.loop=u);let f=new cu(this.audioContext,p,{volume:i,rate:r,startOffset:s,duration:!u&&a?a-s:0},n);if(d){let m=!1,g=()=>{m||(m=!0,d.releaseRef?.())};f.once("ended",g),f.once("stop",g)}return f}static clampLoopStart(e,t,n){return e===void 0||!Number.isFinite(e)?t:e>=t&&e<n?e:t}async resolveLoadMode(e,t){if(t==="stream"||t==="full")return t;let n=xr.schemeOf(e);if(n==="data:"||n==="blob:")return"full";if(n!==null&&n!=="http:"&&n!=="https:")return"stream";try{let i=await fetch(e,{method:"HEAD"});if(!i.ok)return"stream";let r=i.headers.get("Content-Length");if(!r)return"stream";let s=parseInt(r,10);return isNaN(s)?"stream":s<du?"full":"stream"}catch(i){return tn("Failed to resolve load mode via HEAD request, falling back to 'stream'.",i),"stream"}}static schemeOf(e){try{let t=typeof location<"u"&&location?.href?location.href:void 0;return new URL(e,t).protocol}catch{return null}}createStreamSource(e){let t=new Audio(e);return t.crossOrigin="anonymous","preservesPitch"in t&&(t.preservesPitch=!1),t}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(e){this.registeredChannels.add(e)}unregisterChannel(e){this.registeredChannels.delete(e)}setVolume(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(e),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(e){return this.ensureNotDestroyed(),this.ensureReady(),e===void 0?this.masterChannel.mute():this.masterChannel.mute(e),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(e,t){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(e,t)}getChannel(e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(e)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(e){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(e)}release(e){return this.ensureNotDestroyed(),this.audioCache.release(e)}async unload(e){return this.ensureNotDestroyed(),this.audioCache.unload(e)}getCached(e){return this.ensureNotDestroyed(),this.audioCache.get(e)}getCacheStats(){return this.audioCache.getStats()}async play(e,t){this.ensureNotDestroyed(),this.ensureReady();let n=this.masterChannel.getTokens();for(let i of n)try{i.stop()}catch{}return this.masterChannel.play(e,t)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(e=>{tn("Failed to close AudioContext during destroy().",e)}))}isDestroyed(){return this.destroyed}};var Ie=class Ie{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;this.retained=new Map;this.restoredByLoad=new Map;this.globalVolume=1;this.ready=Promise.resolve();this.isReady=!1;this.isInitializing=!1}get mixer(){return this.gameState.game.audioBuses}initialize(){if(this.isReady||this.isInitializing)return;this.mixer.getTree();let e=new Ga({maxChannels:Ie.MaxChannels,cacheReleaseDelay:Ie.CacheGrace});this.sound=e,this.isInitializing=!0,this.ready=e.onceReady().then(()=>{e.setVolume(this.globalVolume),this.realizeBusTree(e),this.isReady=!0,this.isInitializing=!1}).catch(t=>{throw this.isInitializing=!1,this.gameState.logger.error("AudioManager","Failed to initialize audio subsystem",t),t})}realizeBusTree(e){let t=this.mixer.getTree();this.busTree=t,this.channels.clear(),t.getNodes().forEach(n=>{let i=this.mixer.getEffectiveVolume(n.id),r=n.parentId===null?null:this.channels.get(n.parentId)??null,a=(r?r.getChannel(n.id):e.getChannel(n.id))??(r?r.createChannel(n.id,{volume:i}):e.createChannel(n.id,{volume:i}));this.applyBusVolume(a,i,!1),this.channels.set(n.id,a)}),this.busSubscription?.cancel(),this.busSubscription=this.mixer.onVolumeChange((n,i,r)=>{this.applyBusVolume(this.channels.get(n)??null,r,!0)})}applyBusVolume(e,t,n){if(!e)return;let i=Ie.readGain(e);if(e.setVolume(t),!n||i===null)return;let r=e.getGainNode().gain,s=e.getVolume();if(typeof r.setTargetAtTime!="function"||typeof r.cancelScheduledValues!="function"||typeof this.sound?.getAudioContext!="function")return;let a=this.sound.getAudioContext().currentTime;r.cancelScheduledValues(a),r.setValueAtTime(i,a),r.setTargetAtTime(s,a,Ie.BusRampTimeConstant),r.setValueAtTime(s,a+Ie.BusRampSettle)}static readGain(e){if(typeof e.getGainNode!="function")return null;let t=e.getGainNode()?.gain;return typeof t?.value=="number"?t.value:null}channelFor(e){let t=this.channels.get(e.config.type);return t||(this.channels.size>0&&!this.unknownBuses.has(e.config.type)&&(this.unknownBuses.add(e.config.type),this.gameState.logger.weakWarn("AudioManager",`No audio bus "${e.config.type}" is declared; playing on "${tt.sound}" instead.`)),this.channels.get(tt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=Ie.defaultFade(e)){let n=new S;return this.restoredByLoad.delete(e),this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let r=await this.channelFor(e).play(e.config.src,{volume:0,...this.playOptionsOf(e)}),s=e.state.muted??!1;r.mute(s),e.state.muted=s,this.state.set(e,{token:r,originalVolume:t.end}),t.duration>0?await r.fade(0,t.end,t.duration).finished:r.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,!e.config.loop&&t.waitForEnd!==!1&&await new Promise(a=>{r.once("ended",()=>a())}),n.resolve()}catch(i){this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,i),n.resolve()}}),n}async playSoundToken(e,t=Ie.defaultFade(e)){this.restoredByLoad.delete(e),await this.ready,this.state.has(e)&&this.state.get(e).token.stop();try{let n=this.channelFor(e);if(!n)throw new E(`Channel not found for audio bus: "${e.config.type}"`);let i=await n.play(e.config.src,{volume:0,...this.playOptionsOf(e)}),r=e.state.muted??!1;return i.mute(r),e.state.muted=r,this.state.set(e,{token:i,originalVolume:t.end}),t.duration>0?i.fade(0,t.end,t.duration):i.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,i}catch(n){throw this.gameState.logger.error("AudioManager",`Failed to play sound (src: "${e.config.src}")`,n),n}}stop(e,t=0){let n=new S;if(this.restoredByLoad.delete(e),!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);return this.arm(e,i),t===0?(i.token.stop(),this.state.delete(e),n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{i.token.stop(),this.state.delete(e),n.resolve()}),n}setVolume(e,t,n=0){let i=new S;if(!this.state.has(e))return i.resolve(),i;let r=this.state.get(e);return r.originalVolume=t,n===0?(r.token.setVolume(t),e.state.volume=t,i.resolve()):r.token.fade(r.token.getVolume(),t,n).finished.then(()=>{e.state.volume=t,i.resolve()}),i}mute(e,t=!0){let n=new S;return e.state.muted=t,this.state.has(e)?(this.state.get(e).token.mute(t),n.resolve(),n):(n.resolve(),n)}arm(e,t){let n=(t.transport??0)+1;return t.transport=n,()=>this.state.get(e)===t&&t.transport===n}pause(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition=i.token.getCurrentTime(),i.token.pause(),e.state.paused=!0,n.resolve()):i.token.fade(i.token.getVolume(),0,t).finished.then(()=>{if(!r()){n.resolve();return}i.pausePosition=i.token.getCurrentTime(),i.token.pause(),i.token.setVolume(i.originalVolume),e.state.paused=!0,n.resolve()}),n}resume(e,t=0){let n=new S;if(!this.state.has(e))return n.resolve(),n;let i=this.state.get(e);e.markDirty();let r=this.arm(e,i);return t===0?(i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,n.resolve()):(i.token.setVolume(0),i.pausePosition!==void 0&&i.token.seek(i.pausePosition),i.token.resume(),e.state.paused=!1,i.token.fade(0,i.originalVolume,t).finished.then(()=>{if(!r()){n.resolve();return}e.state.paused=!1,n.resolve()})),n}seek(e,t){if(!this.state.has(e))return S.resolve(void 0);let n=this.state.get(e),i=Ie.clampToRegion(t,Ie.clipRegionOf(e));return n.token.seek(i),n.pausePosition!==void 0&&(n.pausePosition=i),S.resolve(void 0)}static clipRegionOf(e){let t=e.config.seek,n=e.config.endTime;if(n===void 0||!Number.isFinite(n)||n<=t)return{startTime:t};let i=e.config.loopStart;return i===void 0||!Number.isFinite(i)?{startTime:t,endTime:n}:{startTime:t,endTime:n,loopStart:i}}playOptionsOf(e){return{...Ie.clipRegionOf(e),loop:e.config.loop,rate:e.state.rate,load:this.loadModeOf(e)}}loadModeOf(e){let{src:t,streaming:n,loop:i,endTime:r}=e.config;return t.startsWith("data:")||t.startsWith("blob:")?"full":n?"stream":this.gameState.game.config.audioStreaming==="declared"?"full":i&&r===void 0?"stream":"full"}static clampToRegion(e,t){let n=Math.max(0,e);return t.endTime===void 0?n:n>=t.endTime?t.startTime:n}setRate(e,t){return this.state.has(e)?(this.state.get(e).token.setRate(t),e.state.rate=t,S.resolve(void 0)):S.resolve(void 0)}getPosition(e){return this.state.has(e)?this.state.get(e).token.getCurrentTime():0}isPlaying(e){return this.isManaged(e)?this.state.get(e).token.isPlaying():!1}getToken(e){return this.state.get(e)?.token??null}toData(){return{sounds:[...this.state.entries()].map(([e,t])=>[e.getId(),{isPlaying:t.token.isPlaying(),position:t.token.getCurrentTime(),...e.state.paused?{paused:!0}:{}}]),groups:this.getBuses().map(e=>[e.id,e.volume])}}fromData(e,t){return this.restoredByLoad.clear(),e.groups?.forEach(([n,i])=>{this.setBusVolume(n,i)}),e.sounds.forEach(([n,i])=>{let r=t.get(n);if(!r){this.gameState.logger.weakWarn("AudioManager",`Skipped restoring a sound that is not in this story (id: "${n}")`);return}this.soundFromData(r,i)}),this}soundFromData(e,t){this.restoredByLoad.set(e,t.isPlaying&&!(t.paused??e.state.paused??!1)),this.state.has(e)&&this.state.get(e).token.stop(),this.ready.then(async()=>{try{let n=this.channelFor(e),i=Ie.clipRegionOf(e),r=i.endTime!==void 0&&e.config.loop,s=await n.play(e.config.src,{volume:e.state.volume,...this.playOptionsOf(e),startTime:r?i.startTime:t.position});r&&Math.abs(t.position-i.startTime)>.01&&s.seek(Ie.clampToRegion(t.position,i)),this.state.set(e,{token:s,originalVolume:e.state.volume});let a=e.state.muted??!1;s.mute(a),e.state.muted=a;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?s.pause():t.isPlaying||s.stop()}catch(n){this.gameState.logger.error("AudioManager",`Failed to restore sound (src: "${e.config.src}")`,n)}})}isManaged(e){return this.state.has(e)}isRunningFromLoad(e){return this.restoredByLoad.get(e)===!0}preload(e){let t=e.config.src;if(this.loadModeOf(e)==="stream"||this.retained.has(t))return Promise.resolve();let n=this.ready.then(()=>this.sound.load(t)).then(()=>!0).catch(i=>(this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${t}")`,i),!1));return this.retained.set(t,n),n.then(()=>{})}retainOnly(e){let t=new Set(e.map(n=>n.config.src));for(let n of[...this.retained.keys()])t.has(n)||this.releaseSource(n);for(let n of e)this.preload(n)}getCacheStats(){return this.isReady?this.sound.getCacheStats():{entries:0,loading:0,decodedBytes:0}}releaseSource(e){let t=this.retained.get(e);t&&(this.retained.delete(e),t.then(n=>{n&&this.isReady&&this.sound.release(e)}))}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),this.restoredByLoad.clear(),this.retainOnly([]),this.globalVolume=1,this.isReady&&this.sound.setVolume(1),this.isReady&&this.busTree&&this.busTree.getNodes().forEach(e=>{this.applyBusVolume(this.channels.get(e.id),this.mixer.getEffectiveVolume(e.id),!1)})}setBusVolume(e,t){this.mixer.setVolume(e,t)}getBusVolume(e){return this.mixer.getVolume(e)}getBuses(){return this.mixer.list()}setGroupVolume(e,t){this.setBusVolume(e,t)}getGroupVolume(e){return this.getBusVolume(e)}setGlobalVolume(e){this.globalVolume=e,this.isReady&&this.sound.setVolume(e)}getGlobalVolume(){return this.globalVolume}destroy(){this.reset(),this.retained.clear(),this.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};Ie.MaxChannels=1024,Ie.BusRampTimeConstant=.02,Ie.BusRampSettle=Ie.BusRampTimeConstant*5,Ie.CacheGrace=5e3;var oo=Ie;function Fa(o){if(typeof MessageChannel>"u"){let n=setTimeout(o,0);return()=>clearTimeout(n)}let e=!1,t=new MessageChannel;return t.port1.onmessage=()=>{t.port1.close(),t.port2.close(),e||o()},t.port2.postMessage(void 0),()=>{e=!0}}var ro=class{constructor(e){this.config=e;this.watching=null;this.warnings=[]}observe(e){return this.watching=e,this}warn(e,t){return this.warnings.push([e,t]),this.watching?.logger.warn(t),t}getWarnings(){return[...this.warnings]}};import*as Su from"html-to-image";var ke=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),st(()=>{this.preventAttach()})}static proxy(e){let t=new S,n=new S,i=new o(n);return i.onTimelineRegistered(()=>{n.resolve()}).onSettled(()=>{let[r,s]=i.catSettled();e(r,s)}),t.onSkipControllerRegister(r=>{r.onAbort(()=>{i.abort()})}),[t,i]}static any(e){if(e.length===0)throw new E("Cannot create an 'any' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=!1;for(let s of e)i.attachChild(s),s.then(a=>{r||(r=!0,t.resolve(a))});return t.onSkipControllerRegister(s=>{s.onAbort(()=>{i.abort()})}),[t,i]}static all(e){if(e.length===0)throw new E("Cannot create an 'all' timeline with no awaitables.");let t=new S,n=new S,i=new o(n),r=new Array(e.length),s=0;for(let a=0;a<e.length;a++){let l=e[a];i.attachChild(l),l.then(c=>{r[a]=c,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(l=>{a=l.onAbort(()=>{r.abort()})}),i.then(l=>{a?.cancel(),n=l,i=e(l),i?st(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?st(()=>s()):st(()=>r.resolve(n)),r}get status(){return this._status}isSettled(){return this._status!=="pending"}isResolved(){return this._status==="resolved"}isCancelled(){return this._status==="cancelled"}isFailed(){return this._status==="failed"}onResolved(e){this._onResolved.push(e)}onCancelled(e){this._onCancelled.push(e)}onFailed(e){this._onFailed.push(e)}onSettled(e){this.isSettled()?st(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.isSettled()||this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
|
|
19
19
|
Timeline attaching is only allowed synchronously after the timeline is created.
|
|
20
20
|
Current _ableToAttach: `+this._ableToAttach);let t=S.isAwaitable(e)?new o(e,this.guard):e;return this.children.push(t),this.guard&&t.setGuard(this.guard),t.onSettled(()=>{this.resolveStatus()}),this}setGuard(e){return this.guard=e,this}catSettled(){return this.children.reduce(([e,t],n)=>(n.isResolved()?e.push(n):n.isCancelled()&&t.push(n),[e,t]),[[],[]])}onTimelineRegistered(e){return this._onTimelineRegistered.push(e),this}resolveStatus(){if(this.isSettled())return;let e=this.children.find(t=>t.isFailed());this.awaitable.failed||e?this.setStatus("failed",this.emitEvents.bind(this)):this.awaitable.solved?this.children.every(t=>t.isSettled())&&this.setStatus("resolved",this.emitEvents.bind(this)):this.awaitable.skipController?.isAborted()&&this.setStatus("cancelled",this.emitEvents.bind(this))}emitEvents(){if(this.isResolved())this._onResolved.forEach(e=>e());else if(this.isCancelled())this._onCancelled.forEach(e=>e());else if(this.isFailed()){let e=this.children.find(t=>t.isFailed());this._onFailed.forEach(t=>t(this.awaitable.error??e?.awaitable.error))}this._onResolved=[],this._onCancelled=[],this._onFailed=[]}setStatus(e,t){if(this.isSettled()){this.guard&&this.guard.warn("unexpectedTimelineStatusChange",`Trying to resolve a settled timeline: ${this._status} -> ${e}`);return}e!==this._status&&t?(this._status=e,t()):this._status=e}preventAttach(){this._ableToAttach=!1,this._onTimelineRegistered.forEach(e=>e())}},so=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof ke?e:new ke(e);return this.timelines.push(t),this.guard&&t.setGuard(this.guard),t}abortAll(){for(let e of this.timelines)e.abort();this.cleanupSettled()}cleanupSettled(){this.timelines=this.timelines.filter(e=>!e.isSettled())}};var ao=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new X}addNotification(e){this.notifications.push(e),this.flush()}removeNotification(e){this.notifications=this.notifications.filter(t=>t!==e),this.flush()}clearNotifications(){this.notifications=[],this.flush()}consume(e){let t=new S,n=new ke(t);return t.registerSkipController(new V(()=>{this.removeNotification(e)})),this.addNotification(e),e.duration&&this.gameState.schedule(()=>{t.resolve(),this.removeNotification(e)},e.duration),this.gameState.timelines.attachTimeline(n),t}onFlush(e){return this.events.on("event:notifications.flush",e)}toArray(){return[...this.notifications]}flush(){this.events.emit("event:notifications.flush")}};function lo(o,e,t){let n={},i={};Object.keys(e).forEach(s=>{let a=s;a==="style"&&e.style?Object.assign(n,e.style):e[a]!==void 0&&a!=="key"&&(i[a]=e[a])}),Object.keys(n).length>0&&Object.assign(o.style,n);let r=t?t(i):i;for(let[s,a]of Object.entries(r))o.getAttribute(s)!==a&&o.setAttribute(s,a)}var fu=4e3,Ua={zIndex:0,visibility:"visible"},hu={...Ua,zIndex:1},Ha={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function ci(){return{zIndex:"auto",visibility:"visible",opacity:1,transform:"none",translate:"none",filter:"none",clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat"}}function wr(){return{...ci(),visibility:"hidden"}}var co=class{constructor(e){this.gameState=e;this.sceneElements=new Map;this.overlayHost=null;this.running=null}registerScene(e,t){t?(this.sceneElements.set(e.getId(),t),this.gameState.isSceneSuspended(e)&&Object.assign(t.style,wr())):this.sceneElements.delete(e.getId())}syncScenePose(e,t){if(this.running&&(this.running.roles.from===e||this.running.roles.to===e))return;let n=this.sceneElements.get(e.getId());n&&Object.assign(n.style,t?wr():ci())}registerOverlayHost(e){this.overlayHost=e}reset(){this.running?.controller.complete(),this.running=null}skip(){this.running&&(this.gameState.logger.debug("StageTransition","Transition skipped"),this.running.controller.complete())}apply(e,t,n){this.running?.controller.complete();let i=e;typeof i._setDetached=="function"&&i._setDetached(!0);let r=e.createTask(this.gameState),s=e.requestAnimations(r.animations),a=new S().registerSkipController(new V(s.cancel)),l=new ke(a),c=[],u=r.resolve.map(h=>{if(typeof h=="function"){let m=this.createOverlay();return c.push(m),{kind:"overlay",element:m}}return{kind:"scene",sceneId:(h.key==="target"?t.to:t.from).getId(),role:h.key}}),p={task:r,controller:s,roles:t,targets:u,overlays:c,cancelLoadGate:()=>{},stale:!1};this.running=p,s.onUpdate(h=>this.applyFrame(p,h)),s.onComplete(()=>{this.settle(p,[[t.to,ci()],[t.from,wr()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(p,[[t.from,ci()],[t.to,ci()]]),l.abort()}),this.applyFrame(p,r.animations.map(h=>h.start));let d=this.waitForSceneReady(t.to);return p.cancelLoadGate=d.cancel,d.promise.then(()=>{p.stale||s.start()}),l}applyFrame(e,t){e.task.resolve.forEach((n,i)=>{let r=e.targets[i],s=r.kind==="overlay"?r.element:this.sceneElements.get(r.sceneId)??null;if(!s)return;let a=typeof n=="function"?n:n.resolver,l=r.kind==="overlay"?Ha:r.role==="target"?hu:Ua,c=$({style:l},a(...t));lo(s,c,gu)})}settle(e,t){e.stale=!0,e.cancelLoadGate(),e.overlays.forEach(n=>n.remove()),e.overlays.length=0,t.forEach(([n,i])=>{let r=this.sceneElements.get(n.getId());r&&Object.assign(r.style,i)}),this.running===e&&(this.running=null)}createOverlay(){let e=document.createElement("div");return e.setAttribute("data-element-type","stage-transition-overlay"),Object.assign(e.style,Ha),this.overlayHost?.appendChild(e),e}waitForSceneReady(e){let t=this.sceneElements.get(e.getId());if(!t)return{promise:Promise.resolve(),cancel:()=>{}};let n=()=>{},i=new Promise(s=>{n=this.gameState.schedule(()=>{this.gameState.logger.weakWarn("StageTransition","Timed out waiting for the incoming scene to load"),s()},fu)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(yu)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},Va=["src","width","height"];function gu(o){if(!Va.some(t=>t in o))return o;let e={...o};return Va.forEach(t=>delete e[t]),e}function yu(o){return o.getAttribute("src")?typeof o.decode=="function"?o.decode().then(()=>{},()=>{}):o.complete?Promise.resolve():new Promise(e=>{let t=()=>{o.removeEventListener("load",t),o.removeEventListener("error",t),e()};o.addEventListener("load",t),o.addEventListener("error",t)}):Promise.resolve()}var uo=class{constructor(e){this.options=e;this.planned=new Set;this.desired=[];this.admitted=[];this.pending=null;this.pendingTimer=null}retain(e){this.planned=new Set(e),this.desired=e.filter(i=>!this.options.isDeclared(i));let t=!1,n=[];for(let i of this.admitted)this.desired.includes(i)?n.push(i):t=!0;this.admitted=n,this.pending&&!this.admitted.includes(this.pending)&&this.clearPending(),(this.admit()||t)&&this.options.onChange()}noteReady(e){!this.pending||this.pending!==e||(this.clearPending(),this.admit()&&this.options.onChange())}forget(e){let t=this.admitted.indexOf(e);t>=0&&this.admitted.splice(t,1),this.desired=this.desired.filter(n=>n!==e),this.pending===e&&this.clearPending(),this.admit()&&this.options.onChange()}getAdmitted(){return this.admitted}isPlanned(e){return this.planned.has(e)}clear(){this.clearPending(),this.planned=new Set,this.desired=[],this.admitted.length&&(this.admitted=[],this.options.onChange())}admit(){if(this.pending||this.admitted.length>=3)return!1;let e=this.desired.find(t=>!this.admitted.includes(t));return e?(this.admitted.push(e),this.pending=e,this.pendingTimer=setTimeout(()=>{this.pendingTimer=null,this.pending=null,this.admit()&&this.options.onChange()},5e3),!0):!1}clearPending(){this.pendingTimer!==null&&(clearTimeout(this.pendingTimer),this.pendingTimer=null),this.pending=null}};var po=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=Yi(6),{action:r,timeline:s,stackModel:a}=e,l=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:l,stackModel:a}),this.history.length>this.maxHistorySize){let c=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(c))}return{id:i}}has(e){return this.history.some(t=>t.id===e)}undoUntil(e){let t=-1;for(let r=this.history.length-1;r>=0;r--)if(this.history[r].id===e){t=r;break}if(t===-1)return null;let n=[];for(let r=this.history.length-1;r>=t;r--)this.history[r].timeline&&!this.history[r].timeline.isSettled()&&this.history[r].timeline.abort(),this.liveGame.getGameStateForce?.().logger?.debug("ActionHistory","Undoing",this.history[r].action.type),this.history[r].undo?.(...this.history[r].args||[]),n.push(this.history[r]);this.history.length=t,this.hooks.onUndo.forEach(r=>r(n));let i=this.liveGame.getStackModelForce().serialize();if(i){let[r]=this.liveGame.constructMaps();this.liveGame.getStackModelForce().deserialize(i,r)}return n[n.length-1]||null}undo(e){if(!this.ableToUndo(e))return null;let t=e.getHistory(),n;for(let i=t.length-1;i>=0;i--)if(t[i].isPending!==!0){n=t[i];break}return n?this.undoUntil(n.token):null}ableToUndo(e){return this.history.length>0&&e.getHistory().some(t=>t.isPending!==!0)}onUndo(e){return this.hooks.onUndo.push(e),{cancel:()=>this.offUndo(e)}}offUndo(e){this.hooks.onUndo=this.hooks.onUndo.filter(t=>t!==e)}getHistory(){return this.history}onHistoryLimit(e){return this.hooks.onHistoryLimit.push(e),{cancel:()=>this.offHistoryLimit(e)}}offHistoryLimit(e){this.hooks.onHistoryLimit=this.hooks.onHistoryLimit.filter(t=>t!==e)}reset(){this.history.forEach(e=>{e.timeline&&!e.timeline.isSettled()&&e.timeline.abort()}),this.history=[]}};var mo=class o{constructor(e){this.history=[];this.cursor=-1;this.resumingAtCursor=!1;this.actionHistoryMgr=e,this.actionHistoryMgr.onHistoryLimit(t=>{this.crossFilter(t)})}push(e){let t=this.history[this.cursor];if(this.resumingAtCursor&&t&&t.action===e.action)return this.history[this.cursor]={...e,token:t.token},this.resumingAtCursor=!1,this;this.resumingAtCursor=!1;let n=this.history[this.cursor+1];return n&&n.action===e.action?this.history[this.cursor+1]={...e,token:n.token}:(this.history.length=this.cursor+1,this.history.push(e)),this.cursor++,this}getHistory(){return this.history.slice(0,this.cursor+1)}getFuture(){return this.history.slice(this.cursor+1)}getCursor(){return this.cursor}getAt(e){return this.history[e]??null}indexOfToken(e){return this.history.findIndex(t=>t.token===e)}setCursor(e){return this.cursor=Math.max(-1,Math.min(e,this.history.length-1)),this.resumingAtCursor=!0,this}canUndo(){return this.cursor>0}canRedo(){return this.cursor<this.history.length-1}getByToken(e){return this.history.find(t=>t.token===e)??null}serialize(){return this.history.slice(0,this.cursor+1).map(e=>o.toSerialized(e))}serializeAll(){return this.history.map(e=>o.toSerialized(e))}load(e,t){this.history=[];for(let n of e){let i=n.actionId!=null?t.get(n.actionId):void 0;i&&this.history.push({token:n.token??Yi(6),action:i,element:n.element,isPending:n.isPending,snapshot:n.snapshot})}this.cursor=this.history.length-1,this.resumingAtCursor=this.cursor>=0}reset(){this.history=[],this.cursor=-1,this.resumingAtCursor=!1}static toSerialized(e){return{token:e.token,actionId:e.action.getId(),element:e.element,isPending:e.isPending,snapshot:e.snapshot??null}}updateByToken(e,t){let n=this.history.find(i=>i.token===e);t(n||null)}resolvePending(e){let t=this.history.find(n=>n.token===e);t&&(t.isPending=!1)}crossFilter(e){let t=new Set(e.map(i=>i.id)),n=this.history.slice(0,this.cursor+1).filter(i=>t.has(i.token)).length;this.history=this.history.filter(i=>!t.has(i.token)),this.cursor=Math.max(-1,Math.min(this.cursor-n,this.history.length-1))}};var nn=class nn extends q{executeAction(e,t){if(this.type===de.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===de.applyTransition){let[n,i]=this.contentNode.getContent(),r=this.callee,s=i?i(n):n;return this.applyTransition(e,r,s,t)}else if(this.type===de.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===de.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===de.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}else if(this.type===de.bringToFront)return this.bringToFront(e,this.callee,t);throw this.unknownTypeError()}applyTransform(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},l=e.getExposedStateForce(t),c=t.transformState.clone(),u=t._getLoop(),p=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let d=l.applyTransform(n,a),h=e.timelines.attachTimeline(s).attachChild(d);return d.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:h},(f,m,g)=>{s.isSettled()||s.abort(),d.abort(),t.transformState.forceOverwrite(f.state),nn.restoreLoop(e,t,m,g)},[c,u,p]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),l=i??{};t._setLoop(n,l,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,l),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,p)=>{nn.restoreLoop(e,t,u,p)},[s,a]);let c=new S;return c.resolve(super.executeAction(e,r)),c}stopLoop(e,t,n,i){let r=t._getLoop(),s=t._getLoopActionId();t._setLoop(null,{},null),t.markDirty();let a=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Loop","Skipped"),super.executeAction(e,i)))),l=()=>{a.isSettled()||a.resolve(super.executeAction(e,i))},c=e.getExposedState(t);if(!c||!r)return e.actionHistory.push({action:this,stackModel:i.stackModel},(d,h)=>{nn.restoreLoop(e,t,d,h)},[r,s]),l(),a;let u=c.stopLoop(n,l),p=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(l),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:p},(d,h)=>{a.isSettled()||a.abort(),u.abort(),nn.restoreLoop(e,t,d,h)},[r,s]),a}static restoreLoop(e,t,n,i){if(!n&&!t._getLoop())return;t._setLoop(n?.transform??null,n?.options??{},i),t.markDirty();let r=e.getExposedState(t);r&&(n?r.applyLoop(n.transform,n.options):r.stopLoop(void 0,()=>{}))}applyTransition(e,t,n,i,r){let s=new S().registerSkipController(new V(()=>(e.logger.info("Displayable Transition","Skipped"),super.executeAction(e,i)))),a=()=>{s.isSettled()||(r?.(),s.resolve(super.executeAction(e,i)))},c=e.getExposedStateForce(t).applyTransition(n,a),u=e.timelines.attachTimeline(s).attachChild(c);return c.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},()=>{s.isSettled()||s.abort(),c.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let c=e.findElementByDisplayable(this.callee,i);c&&e.disposeDisplayable(n,c.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new S().registerSkipController(new V(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,c=>{c.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let l=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:l},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}bringToFront(e,t,n){let i=e.findElementByDisplayable(t),r=i&&nn.getLayerElements(i,t);if(!r)throw new E(`Displayable not found when bringing it to front. The element may not be on stage yet. (element: ${t.getId()})`);let s=r.indexOf(t);s!==r.length-1&&(r.splice(s,1),r.push(t),e.flush()),e.actionHistory.push({action:this,stackModel:n.stackModel},l=>{let c=e.findElementByDisplayable(t),u=c&&nn.getLayerElements(c,t);if(!u)return;let p=u.indexOf(t);p!==l&&(u.splice(p,1),u.splice(l,0,t),e.flush())},[s]);let a=new S;return a.resolve(super.executeAction(e,n)),a}static getLayerElements(e,t){for(let n of e.layers.values())if(n.includes(t))return n;return null}stringify(e,t,n){return super.stringifyWithName("DisplayableAction")}};nn.ActionTypes=de;var Te=nn;var Ke=class o extends ue{constructor(){super(...arguments);this.srcManager=new Re;this.loopTransform=null;this.loopOptions={};this.loopActionId=null}_getLoop(){return this.loopTransform?{transform:this.loopTransform,options:this.loopOptions}:null}_setLoop(t,n,i){return this.loopTransform=t,this.loopOptions=t?n:{},this.loopActionId=t?i:null,this}_getLoopActionId(){return this.loopActionId}_serializeLoop(){return this.loopActionId?{actionId:this.loopActionId,options:{...this.loopOptions}}:null}_deserializeLoop(t){return this.loopTransform=null,this.loopOptions=t?{...t.options}:{},this.loopActionId=t?t.actionId:null,this}_rebindLoop(t){if(!this.loopActionId||this.loopTransform)return this;let i=t.get(this.loopActionId)?.contentNode?.getContent(),r=Array.isArray(i)?i[0]:void 0;return r instanceof Z?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}pos(t,n,i){return this.transform(new Z({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new Z({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new Z({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new Z({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new Z({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new Z({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new Z({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new Z(t,n))}mask(t,n={}){let i=P.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l,...c}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:l},c)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:l="easeInOut",...c}=t,u={duration:a,ease:l,...c},p=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,d=>d.transform(p).clearClip({duration:0})):this.transform(p)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...l}=t,c={duration:s,ease:a,...l},u=o.wipeClipPath(n,100),p=o.wipeClipPath(n,0),d=o.createClipPathTransform([[i?p:u,{duration:0}],[i?u:p,c]]);return r?this.combineActions(new Fe,h=>h.transform(d).clearClip({duration:0})):this.transform(d)}filter(t,n){return this.effect({filter:t},n)}clearFilter(t){return this.effect({filter:"none"},t)}backdrop(t,n){return this.effect({backdropFilter:t},n)}blend(t,n){return this.effect({mixBlendMode:t},n)}transform(t){let n=this.chain(),i=new Te(n,de.applyTransform,new C().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new Te(i,de.applyLoop,new C().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new Te(n,de.stopLoop,new C().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new Te(t,de.bringToFront,new C().setContent([]));return t.chain(n)}registerEffectSrc(t){let n=t.maskImage;if(typeof n=="string")for(let i of o.extractCSSUrls(n))this.srcManager.registerRawSrc(i)}static toCSSUrl(t){return`url("${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}")`}static extractCSSUrls(t){let n=[],i=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/g,r;for(;r=i.exec(t);){let s=r[1]||r[2]||r[3];s&&n.push(s.trim())}return n}static createClipPathTransform(t){return new Z(t.map(([n,i])=>({props:{clipPath:n},options:i})))}static circleClipPath(t,n){return`circle(${t}% at ${n})`}static wipeClipPath(t,n){switch(t){case"right":return`inset(0 0 0 ${n}%)`;case"top":return`inset(0 0 ${n}% 0)`;case"bottom":return`inset(${n}% 0 0 0)`;case"left":default:return`inset(0 ${n}% 0 0)`}}show(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:1},t),r=new Te(n,de.applyTransform,new C().setContent([i]));return n.chain(r)}hide(t){let n=this.chain(),i=t instanceof Z?t.copy():new Z({opacity:0},t),r=new Te(n,de.applyTransform,new C().setContent([i]));return n.chain(r)}};var fn=class fn extends ue{constructor(e,t={}){super(),this.config=$(fn.defaultConfig,t),this.authoredName=e||"",this.state=this.getInitialState();let n=this,i=function(r,s,...a){return n.call(r,s,...a)};return new Proxy(i,{get(r,s){return n[s]},set(r,s,a){return n[s]=a,!0},has(r,s){return s in n}})}say(e,t,...n){if(Array.isArray(e)&&e.every(l=>typeof l=="string")&&[t,...n].length>0&&[t,...n].every(l=>fe.isSingleWord(l))){let l=e,c=fe.format([t,...n]),u=new fe(pa(l,c),{character:this}),p=new nt(this.chain(),nt.ActionTypes.say,new C().setContent(u));return this.chain(p)}let i=t||{},r=e,s=Array.isArray(r)?new fe(r,{...i,character:this}):(fe.isSentence(r)?r:new fe(r,{...i,character:this})).copy();s.setCharacter(this);let a=new nt(this.chain(),nt.ActionTypes.say,new C().setContent(s));return this.chain(a)}setName(e){let t=new nt(this.chain(),nt.ActionTypes.setName,new C().setContent([e]));return this.chain(t)}setAvatar(e){return this.config.avatar=e===null?null:e,this}addPortrait(e,t={}){return this.config.portraits.push({image:e,avatar:t.avatar}),this}setPortraits(e){return this.config.portraits=[...e],this}apply(e,t,...n){return this.say.apply(this,[e,t,...n])}call(e,t,...n){return Array.isArray(e)&&"raw"in e?t&&fe.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):fe.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:fn.StateSerializer.serialize(this.state)}}fromData(e){return this.state=fn.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};fn.defaultCharacterColor="#000",fn.defaultConfig={portraits:[]},fn.StateSerializer=new je;var fo=fn,on=new fo(null);var Q=class o{static isLambda(e){return e instanceof o&&"handler"in e}static isLambdaHandler(e){return typeof e=="function"}static from(e){return o.isLambda(e)?e:new o(e)}static not(e){return new o(t=>!e.evaluate(t).value)}constructor(e){this.handler=e}evaluate({gameState:e}){return{value:this.handler(this.getCtx({gameState:e}))}}getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}toString(){return`Lambda(${this.handler.toString()})`}},kr=class o extends ue{constructor(){super();this.conditions={If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static getInitialState(){return{If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static If(t,n){return new o().createIfCondition(t,n)}ElseIf(t,n){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
|
|
21
21
|
You are trying to set an ELSE-IF condition after an ELSE condition`);return this.conditions.ElseIf.push({condition:Q.from(t),action:this.construct(Array.isArray(n)?n:[n])}),this.chain()}Else(t){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "narraleaf-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "A React visual novel player framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/main.js",
|
|
@@ -101,6 +101,14 @@
|
|
|
101
101
|
"narraleaf",
|
|
102
102
|
"nvl"
|
|
103
103
|
],
|
|
104
|
+
"homepage": "https://www.narraleaf.com/docs/narraleaf-react",
|
|
105
|
+
"repository": {
|
|
106
|
+
"type": "git",
|
|
107
|
+
"url": "git+https://github.com/NarraLeaf/narraleaf-react.git"
|
|
108
|
+
},
|
|
109
|
+
"bugs": {
|
|
110
|
+
"url": "https://github.com/NarraLeaf/narraleaf-react/issues"
|
|
111
|
+
},
|
|
104
112
|
"author": "helloyork@icloud.com",
|
|
105
113
|
"license": "MPL-2.0",
|
|
106
114
|
"dependencies": {
|