narraleaf-react 0.40.0 → 0.41.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.
@@ -12,7 +12,6 @@ import type { DialogAvatar } from "../../elements/character/avatar";
12
12
  */
13
13
  export type SentenceMetadata = Record<string, unknown>;
14
14
  export type SentenceConfig = {
15
- pause?: boolean | number;
16
15
  voice: Sound | null;
17
16
  character: Character | null;
18
17
  voiceId: string | number | null;
@@ -73,7 +73,6 @@ export type WordConfig = {
73
73
  className: string;
74
74
  ruby: string;
75
75
  color: Color;
76
- pause: boolean;
77
76
  cps?: number;
78
77
  /**
79
78
  * Emphasis marks drawn beside this word's characters. See {@link Word.emphasis}.
package/dist/main.js CHANGED
@@ -15,7 +15,7 @@ A returnable jump suspends the scene it is taken from, and a scene has one place
15
15
  at ${s}, ${ur(e)}`),null}function Ml(o){return typeof o!="object"||o===null?typeof o:o.constructor?.name??"object"}function ma(o,e,t){let n=ua(o,e,dr);return n=ua(n,t,()=>{}),n}function ua(o,e,t){if(!Array.isArray(e)||!e.length)return o;let n=o;for(let i of e){if(!Array.isArray(i))continue;if(!i.length){n=t(n);continue}let r=n;for(let a=0;a<i.length-1&&r!==null&&typeof r=="object";a++)r=r[i[a]];if(r===null||typeof r!="object")continue;let s=i[i.length-1];r[s]=t(r[s])}return n}function dr(o){return o instanceof Date?o:typeof o=="string"||typeof o=="number"?new Date(o):new Date(NaN)}function fa(o){return typeof o=="object"&&o!==null&&Object.getPrototypeOf(o)===Object.prototype}function mr(o,e,t=0){if(Object.is(o,e))return!0;if(t>_n)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)=>mr(n,e[i],t+1));if(fa(o)&&fa(e)){let n=Object.keys(o);return n.length===Object.keys(e).length&&n.every(i=>Object.prototype.hasOwnProperty.call(e,i)&&mr(o[i],e[i],t+1))}return!1}var Ht=class o{constructor(e,t,n){this.owner=null;this.name=e,this.key=n||e,this.content=q({},t),this.defaultContent=t}static isSerializable(e){return Qi(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=q({},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=da(s,n),c={type:"any",data:a.data};return a.dates.length&&(c.dates=a.dates),a.undefineds.length&&(c.undefineds=a.undefineds),c},date:s=>({type:"date",data:s.toISOString()})},r=this.toTypeName(e);return i[r](e)}unwrap(e){let n={any:i=>ma(i.data,i.dates,i.undefineds),date:i=>dr(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||mr(t,n)||this.owner.reportChange({namespace:this.key,key:String(e),previous:t,next:n})}},rn=class rn{constructor(){this.events=new _;this.namespaces={};this.restoreBatch=null;this.events.setMaxListeners(64)}static createNamespace(e,t,n){return new Ht(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(rn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(rn.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 Ht(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(rn.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(rn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(rn.EventTypes["event:storable.restore"],{namespaces:[e]})}};rn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var Jn=rn;var Tf={};var Mn=class extends In{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let c=a.getFutureActions(e,i).filter(l=>!r.has(l));s.push(...c)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var tt=class extends X{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ft.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===Ft.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===Ft.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,c=>{c&&this.callee.fromData(c)},[s]),a}else if(this.type===Ft.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===Ft.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===Ft.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===Ft.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===Ft.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")}};tt.ActionTypes=Ft;var nt={bgm:"bgm",sound:"sound",voice:"voice"},_i=8,sn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Nn(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ei=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=c=>{t.set(c.id,{id:c.id,parentId:c.parentId??null,volume:Nn(c.volume)})};Object.values(nt).forEach(c=>n({id:c}));let i=new Set;e.forEach(c=>{let l=c?.id;if(typeof l!="string"||l.trim().length===0)throw new sn(`Audio bus id must be a non-empty string, got ${JSON.stringify(l)}.`);if(i.has(l))throw new sn(`Audio bus "${l}" is declared more than once.`);i.add(l),n(c)}),o.assertResolvable(t);let r=[],s=new Map,a=c=>{let l=s.get(c);if(l)return l;let u=t.get(c),d=u.parentId===null?null:a(u.parentId),p={id:u.id,parentId:u.parentId,volume:u.volume,depth:d?d.depth+1:1};return s.set(c,p),r.push(p),p};return t.forEach(c=>a(c.id)),new o(r,s)}static isSeeded(e){return Object.values(nt).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 sn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new sn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>_i)throw new sn(`Audio bus "${t.id}" nests deeper than ${_i}: ${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<=_i;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},fr=ei.resolve();function Nl(o){fr=o}function hr(){return fr}function Ji(o,e){let t=fr;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var ha={[nt.bgm]:"bgmVolume",[nt.sound]:"soundVolume",[nt.voice]:"voiceVolume"};function ga(o){let e={};return Object.entries(ha).forEach(([t,n])=>{e[t]={get:()=>Nn(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var Zn=class Zn{constructor(e,t={}){this.declarations=e;this.events=new _;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,Nn(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(Zn.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ei.resolve(this.declarations()??[]),Nl(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Nn(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?Nn(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Nn(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(Zn.EventTypes["event:audioBus.volumeChange"],e)}};Zn.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var ti=Zn;var ya=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(ya||{}),Ce=class Ce extends ce{static toSound(e){return e==null?null:typeof e=="string"?new Ce({src:e}):e}static isSound(e){return e instanceof Ce}static voice(e){let t=typeof e=="string"?{src:e}:e;return new Ce({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new Ce({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new Ce({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=Ce.DefaultUserConfig.create(t),[i]=n.extract(Ce.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){return hr().isUnder(this.config.type,nt.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(tt.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(tt.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(tt.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(tt.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(tt.ActionTypes.setRate,[e])}pause(e){return this.pushAction(tt.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(tt.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(tt.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:Ce.StateSerializer.serialize(this.state)}}fromData(e){return this.state=Ce.StateSerializer.deserialize(e.state),this}copy(){return new Ce(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return Ce.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new tt(this.chain(),e,new C().setContent(t)))}};Ce.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",Ce.DefaultUserConfig=new $({src:Ce.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),Ce.DefaultConfig=new $({src:Ce.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),Ce.DefaultState=new $({volume:1,rate:1,paused:!1,muted:!1}),Ce.StateSerializer=new qe;var fe=Ce;var Sn=class Sn{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===Sn.SrcTypes.image?t.add(s):r===Sn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof N?N.getSrcURL(e):e.type==="image"?N.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ee,z.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 ve){let n=t;if(t.is(ve,ht.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===ht.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===ht.setAppearance){let i=t.contentNode.getContent()[0];if(N.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(N.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:N.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof fe){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof N||P.isStaticImageData(e)){if(e instanceof N){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(N.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 fe?t:new fe({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 fe?e.getSrc():e;return this.src.some(n=>n.type===Sn.SrcTypes.audio?t===n.src.getSrc():n.type===Sn.SrcTypes.image?t===N.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Sn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Sn;import*as Ma 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 ut=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 va(o,e){let{render:t,data:n,...i}=e,r=q(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 Se=class Se{static isWord(e){return e instanceof Se}static color(e,t){return Se.isWord(e)?e.copy().assign({color:t}):new Se(e,{color:t})}static bold(e){return Se.isWord(e)?e.copy().assign({bold:!0}):new Se(e,{bold:!0})}static italic(e){return Se.isWord(e)?e.copy().assign({italic:!0}):new Se(e,{italic:!0})}static emphasis(e,t={}){return Se.isWord(e)?e.copy().assign({emphasis:t}):new Se(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return Se.isWord(e)?e.copy().assign(i):new Se(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=va(Se.defaultConfig,t)}evaluate(e){if(ze.isPause(this.text))return[this];if(ut.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Se.isWord(n)?n.inherit(this.config).evaluate(e):new Se(n,this.config)).flat():Se.isWord(t)?t.inherit(this.config).evaluate(e):[new Se(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=va(this.config,e),this}copy(){return new Se(this.text,this.config)}isPause(){return ze.isPause(this.text)}isTextEvent(){return ut.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Se.defaultConfig={},Se.defaultColor="#000";var ie=Se;var pt=class pt{static isSentence(e){return e instanceof pt}static toSentence(e){return pt.isSentence(e)?e:new pt(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 ie.isWord(e)?e:new ie(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[ie.isWord(e)?e:new ie(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(pt.isSingleWord):pt.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||ie.isWord(e)||ze.isPause(e)||ut.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=pt.format(e),this.config=q(pt.defaultConfig,{...t,voice:typeof t.voice=="string"?fe.voice(t.voice):fe.toSound(t.voice)}),this.state=Qs(pt.defaultState)}toData(){return null}fromData(e){return this.state=q(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(...pt.formatStaticWord(i))}return t}copy(){return new pt([...this.text],this.config)}};pt.defaultConfig={pause:!0,voice:null,character:null,voiceId:null},pt.defaultState={};var me=pt;var Zi=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 an=class extends X{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")}};an.ActionTypes=qs;var xe=class o extends ce{static getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}static execute(e){return new o(e)}constructor(e){super(),this.handler=e;let t=this.chain(),n=new an(t,an.ActionTypes.action,new C().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new an(this.chain(),an.ActionTypes.action,new C().setContent(e))]}};var Gl={volume:1,limit:1/0},Fl=class Ta{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={...Gl,...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 Ta(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}}},ba=!1;function Ol(o){ba=o}function cn(o,e){ba||(e!==void 0?console.warn(o,e):console.warn(o))}var Hl=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){cn("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){cn("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=o=>{this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){cn("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){this.currentSource instanceof AudioBufferSourceNode?this.currentSource.start(o,e):this.currentSource instanceof HTMLAudioElement&&this.currentSource.play()}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},Sa=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}},Vl=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 Hl(o,this.gainNode),this.sourceController.setSource(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1;try{this.gainNode.disconnect()}catch(e){cn("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){cn("Failed to disconnect gain node on stop().",o)}}setRate(o){o=Math.max(.001,o),this.rate=o;let e=this.sourceController.getSource();return e instanceof HTMLAudioElement?e.playbackRate=o:e instanceof AudioBufferSourceNode&&(e.playbackRate.value=o),this}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new Sa(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Sa(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}},Ul=class{constructor(o){this.alive=!0,this.refCount=0,this.audioBuffer=o}addRef(){this.refCount++}releaseRef(){this.refCount>0&&this.refCount--}getRefCount(){return this.refCount}async unload(){this.refCount>0||(this.alive=!1)}async forceUnload(){this.alive=!1,this.refCount=0}isAlive(){return this.alive}raw(){if(!this.alive)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}},Wl=10*1024*1024,Bl=class{constructor(o){this.cache=new Map,this.loadingPromises=new Map,this.audioContext=o}async load(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.doLoad(o);this.loadingPromises.set(o,n);try{let i=await n;return this.cache.set(o,i),i}finally{this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new Ul(t)}clear(){for(let o of this.cache.values())o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){return{cached:this.cache.size,loading:this.loadingPromises.size}}},zl={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},Aa=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...zl,...o},Ol(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Bl(this.audioContext),this.masterChannel=new Fl("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(o=>{let e=()=>{if(this.destroyed){this.clearUnlockHandler(),o();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,o())}).catch(t=>{cn("Failed to resume AudioContext while unlocking.",t)})};this.unlockHandler=e,document.addEventListener("click",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",e)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let o=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",o),document.removeEventListener("touchstart",o),document.removeEventListener("keydown",o)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(o,e,t){this.ensureNotDestroyed(),this.ensureReady();let{volume:n=1,rate:i=1,startTime:r=0,endTime:s,load:a="auto",loop:c=!1}=e??{},l,u=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")l=this.createStreamSource(o);else{u=await this.audioCache.load(o),u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=u.raw(),l=p}else{u=o,u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=o.raw(),l=p}let d=new Vl(this.audioContext,l,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(l instanceof AudioBufferSourceNode?(l.loop=c,c&&s!==void 0&&(l.loopStart=r,l.loopEnd=s)):l instanceof HTMLAudioElement&&(l.loop=c),u){let p=!1,h=()=>{p||(p=!0,u.releaseRef?.())};d.once("ended",h),d.once("stop",h)}return d}async resolveLoadMode(o,e){if(e==="stream"||e==="full")return e;try{let t=await fetch(o,{method:"HEAD"});if(!t.ok)return"stream";let n=t.headers.get("Content-Length");if(!n)return"stream";let i=parseInt(n,10);return isNaN(i)?"stream":i<Wl?"full":"stream"}catch(t){return cn("Failed to resolve load mode via HEAD request, falling back to 'stream'.",t),"stream"}}createStreamSource(o){let e=new Audio(o);return e.crossOrigin="anonymous",e}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(o){this.registeredChannels.add(o)}unregisterChannel(o){this.registeredChannels.delete(o)}setVolume(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(o),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(o){return this.ensureNotDestroyed(),this.ensureReady(),o===void 0?this.masterChannel.mute():this.masterChannel.mute(o),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(o,e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(o,e)}getChannel(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(o)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(o){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(o)}async play(o,e){this.ensureNotDestroyed(),this.ensureReady();let t=this.masterChannel.getTokens();for(let n of t)try{n.stop()}catch{}return this.masterChannel.play(o,e)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(o=>{cn("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var de=class de{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;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 Aa({maxChannels:de.MaxChannels});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=de.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,de.BusRampTimeConstant),r.setValueAtTime(s,a+de.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 "${nt.sound}" instead.`)),this.channels.get(nt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=de.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channelFor(e),r=await this.sound.load(e.config.src),s=de.clipRegionOf(e),a=await i.play(r,{volume:0,...de.playRegionOf(s,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,s);let c=e.state.muted??!1;a.mute(c),e.state.muted=c,this.state.set(e,{token:a,cachedAudio:r,originalVolume:t.end}),t.duration>0?await a.fade(0,t.end,t.duration).finished:a.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(l=>{a.once("ended",()=>l())}),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=de.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 this.sound.load(e.config.src),r=de.clipRegionOf(e),s=await n.play(i,{volume:0,...de.playRegionOf(r,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(s,r);let a=e.state.muted??!1;return s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:i,originalVolume:t.end}),t.duration>0?s.fade(0,t.end,t.duration):s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,s}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=de.clampToRegion(t,de.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}}static playRegionOf(e,t){return t||e.endTime===void 0?{startTime:e.startTime}:{startTime:e.startTime,endTime:e.endTime}}static applyLoopRegion(e,t){let{startTime:n,endTime:i}=t;if(i===void 0||!Number.isFinite(i)||i<=n||typeof AudioBufferSourceNode>"u")return;let r=e.sourceController;if(typeof r?.getSource!="function")return;let s=r.getSource();if(!(s instanceof AudioBufferSourceNode))return;let a=t.loopStart,c=a!==void 0&&Number.isFinite(a)?Math.min(Math.max(a,n),i):n;s.loop=!0,s.loopStart=c<i?c:n,s.loopEnd=i}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=await this.sound.load(e.config.src),r=de.clipRegionOf(e),s=r.endTime!==void 0&&e.config.loop,a=await n.play(i,{volume:e.state.volume,...de.playRegionOf(r,e.config.loop),startTime:s?r.startTime:t.position,loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,r),s&&Math.abs(t.position-r.startTime)>.01&&a.seek(de.clampToRegion(t.position,r)),this.state.set(e,{token:a,cachedAudio:i,originalVolume:e.state.volume});let c=e.state.muted??!1;a.mute(c),e.state.muted=c;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?a.pause():t.isPlaying||a.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){return this.ready.then(()=>this.sound.load(e.config.src)).then(()=>{}).catch(t=>{this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${e.config.src}")`,t)})}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),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.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};de.MaxChannels=1024,de.BusRampTimeConstant=.02,de.BusRampSettle=de.BusRampTimeConstant*5;var eo=de;var to=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 Xl from"html-to-image";var we=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),ct(()=>{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 c=e[a];i.attachChild(c),c.then(l=>{r[a]=l,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(c=>{a=c.onAbort(()=>{r.abort()})}),i.then(c=>{a?.cancel(),n=c,i=e(c),i?ct(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?ct(()=>s()):ct(()=>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()?ct(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
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(rn.EventTypes["event:storable.change"],a=>{i!==null&&a.namespace!==i||r!==null&&a.key!==r||s(a)})}onRestore(e){return this.events.on(rn.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 Ht(n,{})),this.namespaces[n].deserialize(i)})}finally{this.restoreBatch=null}this.events.emit(rn.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(rn.EventTypes["event:storable.change"],e)}reportRestore(e){if(this.restoreBatch){this.restoreBatch.add(e);return}this.events.emit(rn.EventTypes["event:storable.restore"],{namespaces:[e]})}};rn.EventTypes={"event:storable.change":"event:storable.change","event:storable.restore":"event:storable.restore"};var Jn=rn;var Tf={};var Mn=class extends In{constructor(){super()}fromChained(e){return e.getActions()}forEachChild(e,t,n,i={}){let r=new Set,s=[];for(Array.isArray(t)?s.push(...t):s.push(t);s.length;){let a=s.shift();if(r.has(a))continue;r.add(a),n(a);let c=a.getFutureActions(e,i).filter(l=>!r.has(l));s.push(...c)}}getAllChildren(e,t,n={}){let i=[];return this.forEachChild(e,t,r=>i.push(r),n),i}getAllChildrenMap(e,t){let n=new Map;return this.forEachChild(e,t,i=>n.set(i.getId(),i)),n}getAllElementMap(e,t,n={}){let i=new Map;return this.forEachChild(e,t,r=>i.set(r.callee.getId(),r.callee),n),i}getAllChildrenElements(e,t,n={}){return Array.from(new Set(this.getAllChildren(e,t,n).map(i=>i.callee)))}toData(){return null}constructNodes(e,t){for(let n=0;n<e.length;n++){let i=e[n];n===0&&t?t.setChild(i.contentNode):n>0&&e[n-1].contentNode?.setChild(i.contentNode)}return e.length?e[0].contentNode:null}};var tt=class extends X{executeAction(e,t){let n={action:this,stackModel:t.stackModel};if(this.type===Ft.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===Ft.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===Ft.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,c=>{c&&this.callee.fromData(c)},[s]),a}else if(this.type===Ft.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===Ft.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===Ft.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===Ft.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===Ft.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")}};tt.ActionTypes=Ft;var nt={bgm:"bgm",sound:"sound",voice:"voice"},_i=8,sn=class extends Error{constructor(e){super(e),this.name="AudioBusError"}};function Nn(o){return o===void 0||!Number.isFinite(o)?1:Math.min(1,Math.max(0,o))}var ei=class o{constructor(e,t){this.nodes=e;this.index=t}static resolve(e=[]){let t=new Map,n=c=>{t.set(c.id,{id:c.id,parentId:c.parentId??null,volume:Nn(c.volume)})};Object.values(nt).forEach(c=>n({id:c}));let i=new Set;e.forEach(c=>{let l=c?.id;if(typeof l!="string"||l.trim().length===0)throw new sn(`Audio bus id must be a non-empty string, got ${JSON.stringify(l)}.`);if(i.has(l))throw new sn(`Audio bus "${l}" is declared more than once.`);i.add(l),n(c)}),o.assertResolvable(t);let r=[],s=new Map,a=c=>{let l=s.get(c);if(l)return l;let u=t.get(c),d=u.parentId===null?null:a(u.parentId),p={id:u.id,parentId:u.parentId,volume:u.volume,depth:d?d.depth+1:1};return s.set(c,p),r.push(p),p};return t.forEach(c=>a(c.id)),new o(r,s)}static isSeeded(e){return Object.values(nt).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 sn(`Audio bus "${r.id}" names an unknown parent "${r.parentId}".`);if(i.has(s.id))throw new sn(`Audio bus tree has a cycle: ${[...n,s.id].join(" -> ")}.`);if(i.add(s.id),n.push(s.id),n.length>_i)throw new sn(`Audio bus "${t.id}" nests deeper than ${_i}: ${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<=_i;){if(n.id===t)return!0;n=n.parentId===null?void 0:this.index.get(n.parentId),i++}return!1}},fr=ei.resolve();function Nl(o){fr=o}function hr(){return fr}function Ji(o,e){let t=fr;return t.has(o)?e.some(n=>t.isUnder(o,n)):!0}var ha={[nt.bgm]:"bgmVolume",[nt.sound]:"soundVolume",[nt.voice]:"voiceVolume"};function ga(o){let e={};return Object.entries(ha).forEach(([t,n])=>{e[t]={get:()=>Nn(o.getPreference(n)),set:i=>o.setPreference(n,i),subscribe:i=>o.onPreferenceChange(n,i)}}),e}var Zn=class Zn{constructor(e,t={}){this.declarations=e;this.events=new _;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,Nn(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(Zn.EventTypes["event:audioBus.volumeChange"],e,t,n)}getTree(){return this.tree||(this.tree=ei.resolve(this.declarations()??[]),Nl(this.tree)),this.tree}invalidate(){return this.tree=null,this}isResolved(){return this.tree!==null}setVolume(e,t){let n=Nn(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?Nn(t.get()):this.overrides.get(e)??1}getDeclaredVolume(e){return this.getTree().get(e)?.volume??1}getEffectiveVolume(e){return Nn(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(Zn.EventTypes["event:audioBus.volumeChange"],e)}};Zn.EventTypes={"event:audioBus.volumeChange":"event:audioBus.volumeChange"};var ti=Zn;var ya=(n=>(n.Voice="voice",n.Bgm="bgm",n.Sound="sound",n))(ya||{}),Ce=class Ce extends ce{static toSound(e){return e==null?null:typeof e=="string"?new Ce({src:e}):e}static isSound(e){return e instanceof Ce}static voice(e){let t=typeof e=="string"?{src:e}:e;return new Ce({type:"voice",...t})}static bgm(e){let t=typeof e=="string"?{src:e}:e;return new Ce({type:"bgm",...t})}static sound(e){let t=typeof e=="string"?{src:e}:e;return new Ce({type:"sound",...t})}constructor(e={}){super();let t=typeof e=="string"?{src:e}:e,n=Ce.DefaultUserConfig.create(t),[i]=n.extract(Ce.DefaultConfig.keys());this.config=i.get(),this.state=this.getInitialState(n),this.userConfig=n}play(e){return hr().isUnder(this.config.type,nt.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(tt.ActionTypes.play,[{end:this.state.volume,duration:e||0}])}stop(e){return this.pushAction(tt.ActionTypes.stop,[{end:0,duration:e||0}])}setVolume(e,t){return this.pushAction(tt.ActionTypes.setVolume,[e,t||0])}mute(e=!0){return this.pushAction(tt.ActionTypes.mute,[e])}unmute(){return this.mute(!1)}setRate(e){return this.pushAction(tt.ActionTypes.setRate,[e])}pause(e){return this.pushAction(tt.ActionTypes.pause,[{end:0,duration:e||0}])}resume(e){return this.pushAction(tt.ActionTypes.resume,[{end:this.state.volume,duration:e||0}])}seek(e){return this.pushAction(tt.ActionTypes.seek,[e])}getSrc(){return this.config.src}toData(){return{state:Ce.StateSerializer.serialize(this.state)}}fromData(e){return this.state=Ce.StateSerializer.deserialize(e.state),this}copy(){return new Ce(this.userConfig.get())}reset(){return super.reset(),this.state=this.getInitialState(this.userConfig),this}getInitialState(e){return Ce.DefaultState.create({...e.get()}).get()}pushAction(e,t){return this.chain(new tt(this.chain(),e,new C().setContent(t)))}};Ce.noSound="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgA",Ce.DefaultUserConfig=new $({src:Ce.noSound,loop:!1,volume:1,streaming:!1,rate:1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),Ce.DefaultConfig=new $({src:Ce.noSound,loop:!1,streaming:!1,seek:0,endTime:void 0,loopStart:void 0,type:"sound"}),Ce.DefaultState=new $({volume:1,rate:1,paused:!1,muted:!1}),Ce.StateSerializer=new qe;var fe=Ce;var Sn=class Sn{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===Sn.SrcTypes.image?t.add(s):r===Sn.SrcTypes.video?n.add(s):i.add(s)}),{image:Array.from(t),video:Array.from(n),audio:Array.from(i)}}static getSrc(e){return typeof e=="string"?e:e instanceof N?N.getSrcURL(e):e.type==="image"?N.getSrcURL(e.src):e.type==="video"?e.src:e.type==="audio"?e.src.getSrc():""}static getPreloadableSrc(e,t){if(t.is(ee,z.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 ve){let n=t;if(t.is(ve,ht.setSrc)){let i=t.contentNode.getContent()[0];if(P.isImageSrc(i))return{type:"image",src:P.srcToURL(i),activeType:"scene"}}else{if(t.type===ht.initWearable)return{type:"image",src:t.contentNode.getContent()[0],activeType:"scene"};if(t.type===ht.setAppearance){let i=t.contentNode.getContent()[0];if(N.isLayeredSrc(n.callee))return null;if(!n.callee.config.src||typeof n.callee.config.src?.resolve!="function")throw n.callee._invalidSrcHandlerError();if(N.isTagSrc(n.callee)&&i.length===n.callee.config.src.groups.length)return{type:"image",src:N.getSrcFromTags(i,n.callee.config.src.resolve),activeType:"scene"}}}}return null}register(e,t){if(Array.isArray(e))e.forEach(n=>this.register(n));else if(e instanceof fe){if(this.isSrcRegistered(e.getSrc()))return this;this.src.push({type:"audio",src:e})}else if(e instanceof N||P.isStaticImageData(e)){if(e instanceof N){if(!P.isImageURL(e.state.currentSrc))return this;if(this.isSrcRegistered(N.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 fe?t:new fe({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 fe?e.getSrc():e;return this.src.some(n=>n.type===Sn.SrcTypes.audio?t===n.src.getSrc():n.type===Sn.SrcTypes.image?t===N.getSrcURL(n.src):t===n.src)}getSrc(){return[...this.src]}getSrcByType(e){return this.src.filter(t=>t.type===e)}registerFuture(e){return this.future.includes(e)||this.hasFuture(e)?this:(this.future.push(e),this)}hasFuture(e){return this.future.includes(e)}getFutureSrc(){return this.future.map(e=>e.getSrc()).flat(2)}};Sn.SrcTypes={image:"image",video:"video",audio:"audio"};var Re=Sn;import*as Ma 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 ut=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 va(o,e){let{render:t,data:n,...i}=e,r=q(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 Se=class Se{static isWord(e){return e instanceof Se}static color(e,t){return Se.isWord(e)?e.copy().assign({color:t}):new Se(e,{color:t})}static bold(e){return Se.isWord(e)?e.copy().assign({bold:!0}):new Se(e,{bold:!0})}static italic(e){return Se.isWord(e)?e.copy().assign({italic:!0}):new Se(e,{italic:!0})}static emphasis(e,t={}){return Se.isWord(e)?e.copy().assign({emphasis:t}):new Se(e,{emphasis:t})}static custom(e,t,n={}){let i={...n,render:t};return Se.isWord(e)?e.copy().assign(i):new Se(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=va(Se.defaultConfig,t)}evaluate(e){if(ze.isPause(this.text))return[this];if(ut.isTextEvent(this.text))return[this];if(typeof this.text=="function"){let t=this.text(e);return Array.isArray(t)?t.map(n=>Se.isWord(n)?n.inherit(this.config).evaluate(e):new Se(n,this.config)).flat():Se.isWord(t)?t.inherit(this.config).evaluate(e):[new Se(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=va(this.config,e),this}copy(){return new Se(this.text,this.config)}isPause(){return ze.isPause(this.text)}isTextEvent(){return ut.isTextEvent(this.text)}toString(){return typeof this.text=="string"?this.text:""}};Se.defaultConfig={},Se.defaultColor="#000";var ie=Se;var pt=class pt{static isSentence(e){return e instanceof pt}static toSentence(e){return pt.isSentence(e)?e:new pt(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 ie.isWord(e)?e:new ie(e)}static formatStaticWord(e,t){return Array.isArray(e)?e.map(n=>this.formatStaticWord(n,t)).flat(2):[ie.isWord(e)?e:new ie(e,t)]}static isSentencePrompt(e){return Array.isArray(e)?e.every(pt.isSingleWord):pt.isSingleWord(e)}static isSingleWord(e){return typeof e=="string"||ie.isWord(e)||ze.isPause(e)||ut.isTextEvent(e)||typeof e=="function"}getMetadata(){return this.config.metadata}constructor(e,t={}){this.text=pt.format(e),this.config=q(pt.defaultConfig,{...t,voice:typeof t.voice=="string"?fe.voice(t.voice):fe.toSound(t.voice)}),this.state=Qs(pt.defaultState)}toData(){return null}fromData(e){return this.state=q(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(...pt.formatStaticWord(i))}return t}copy(){return new pt([...this.text],this.config)}};pt.defaultConfig={voice:null,character:null,voiceId:null},pt.defaultState={};var me=pt;var Zi=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 an=class extends X{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")}};an.ActionTypes=qs;var xe=class o extends ce{static getCtx({gameState:e}){let t=e.game.getLiveGame(),n=t.getStorable();return{gameState:e,game:e.game,liveGame:t,storable:n,$:i=>n.getNamespace(i)}}static execute(e){return new o(e)}constructor(e){super(),this.handler=e;let t=this.chain(),n=new an(t,an.ActionTypes.action,new C().setContent(this));return this.chain(n)}execute({gameState:e}){return this.handler(o.getCtx({gameState:e}))}fromChained(e){return[new an(this.chain(),an.ActionTypes.action,new C().setContent(e))]}};var Gl={volume:1,limit:1/0},Fl=class Ta{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={...Gl,...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 Ta(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}}},ba=!1;function Ol(o){ba=o}function cn(o,e){ba||(e!==void 0?console.warn(o,e):console.warn(o))}var Hl=class{constructor(o,e){this.currentSource=null,this.mediaElementSource=null,this.endedHandler=null,this.eventListeners=new Map,this.audioContext=o,this.gainNode=e}setSource(o){this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.setupEventListeners()}getSource(){return this.currentSource}refreshSource(o){let e=new Map(this.eventListeners);this.disconnectSource(),this.currentSource=o,o instanceof AudioBufferSourceNode?o.connect(this.gainNode):o instanceof HTMLAudioElement&&(this.mediaElementSource=this.audioContext.createMediaElementSource(o),this.mediaElementSource.connect(this.gainNode)),this.eventListeners=e,this.setupEventListeners()}disconnectSource(){if(this.currentSource){if(this.removeAllEventListeners(),this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.disconnect()}catch(o){cn("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){cn("Failed to disconnect MediaElementAudioSourceNode in disconnectSource().",o)}this.mediaElementSource=null}this.currentSource=null}}setupEventListeners(){this.currentSource&&(this.endedHandler=o=>{this.emit("ended")},this.currentSource instanceof HTMLAudioElement?this.currentSource.addEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.addEventListener("ended",this.endedHandler))}removeAllEventListeners(){!this.currentSource||!this.endedHandler||(this.currentSource instanceof HTMLAudioElement?this.currentSource.removeEventListener("ended",this.endedHandler):this.currentSource instanceof AudioBufferSourceNode&&this.currentSource.removeEventListener("ended",this.endedHandler),this.endedHandler=null)}emit(o){let e=this.eventListeners.get(o);e&&[...e].forEach((t,n)=>{try{t.callback()}catch(i){console.error(`Error in event listener for '${o}':`,i)}t.once&&e.splice(e.indexOf(t),1)})}on(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!1})}off(o,e){let t=this.eventListeners.get(o);if(!t)return;let n=t.findIndex(i=>i.callback===e);n!==-1&&t.splice(n,1)}once(o,e){this.eventListeners.has(o)||this.eventListeners.set(o,[]),this.eventListeners.get(o).push({callback:e,once:!0})}stop(){if(this.currentSource){if(this.currentSource instanceof HTMLAudioElement)this.currentSource.pause(),this.currentSource.currentTime=0;else if(this.currentSource instanceof AudioBufferSourceNode)try{this.currentSource.stop()}catch(o){cn("Failed to stop AudioBufferSourceNode in stop().",o)}}}destroy(){this.disconnectSource(),this.eventListeners.clear()}start(o=0,e=0){this.currentSource instanceof AudioBufferSourceNode?this.currentSource.start(o,e):this.currentSource instanceof HTMLAudioElement&&this.currentSource.play()}pause(){this.currentSource instanceof HTMLAudioElement?this.currentSource.pause():this.currentSource instanceof AudioBufferSourceNode&&this.stop()}},Sa=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}},Vl=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 Hl(o,this.gainNode),this.sourceController.setSource(e);let i=this.startOffset;this.sourceController.start(0,i),this.contextStartTime=this.audioContext.currentTime,this._isPlaying=!0,this.duration>0&&setTimeout(()=>{this._isPlaying&&this.stop()},this.duration*1e3)}emit(o){if(this.sourceController.emit(o),o==="ended"){this._isPlaying=!1;try{this.gainNode.disconnect()}catch(e){cn("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){cn("Failed to disconnect gain node on stop().",o)}}setRate(o){o=Math.max(.001,o),this.rate=o;let e=this.sourceController.getSource();return e instanceof HTMLAudioElement?e.playbackRate=o:e instanceof AudioBufferSourceNode&&(e.playbackRate.value=o),this}getRate(){return this.rate}seek(o){o=Math.max(0,o);let e=this.sourceController.getSource();if(e instanceof HTMLAudioElement)e.currentTime=o,this.emit("seek");else if(e instanceof AudioBufferSourceNode){let t=this.getCurrentTime();if(Math.abs(o-t)>.01){if(this._isPlaying){this.sourceController.stop();let n=this.audioContext.createBufferSource();n.buffer=e.buffer,n.playbackRate.value=this.rate,n.loop=e.loop,n.loopStart=e.loopStart,n.loopEnd=e.loopEnd,this.sourceController.refreshSource(n),this.startOffset=this.audioContext.currentTime-o,this.sourceController.start(0,o)}else this._isPaused&&(this.pauseOffset=o);this.emit("seek")}}return this}getCurrentTime(){let o=this.sourceController.getSource();if(o instanceof HTMLAudioElement)return o.currentTime;if(o instanceof AudioBufferSourceNode){if(this._isPaused)return this.pauseOffset;if(this._isPlaying)return(this.audioContext.currentTime-this.contextStartTime)*this.rate+this.startOffset}return 0}getDuration(){let o=this.sourceController.getSource();return o instanceof HTMLAudioElement?o.duration||0:o instanceof AudioBufferSourceNode&&o.buffer?o.buffer.duration:this.duration}fade(o,e,t){if(this.currentFade&&this.currentFade.cancel(),o=Math.max(0,Math.min(1,o)),e=Math.max(0,Math.min(1,e)),t=Math.max(0,t),t===0){this.setVolume(e);let r=new Sa(this,e);return r.finish(),r}this.volume=o,this._isMuted||(this.gainNode.gain.value=o);let n=new Sa(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}},Ul=class{constructor(o){this.alive=!0,this.refCount=0,this.audioBuffer=o}addRef(){this.refCount++}releaseRef(){this.refCount>0&&this.refCount--}getRefCount(){return this.refCount}async unload(){this.refCount>0||(this.alive=!1)}async forceUnload(){this.alive=!1,this.refCount=0}isAlive(){return this.alive}raw(){if(!this.alive)throw new Error("CachedAudio has been unloaded.");return this.audioBuffer}},Wl=10*1024*1024,Bl=class{constructor(o){this.cache=new Map,this.loadingPromises=new Map,this.audioContext=o}async load(o){let e=this.cache.get(o);if(e&&e.isAlive())return e;let t=this.loadingPromises.get(o);if(t)return t;let n=this.doLoad(o);this.loadingPromises.set(o,n);try{let i=await n;return this.cache.set(o,i),i}finally{this.loadingPromises.delete(o)}}async doLoad(o){let e=await(await fetch(o)).arrayBuffer(),t=await this.audioContext.decodeAudioData(e);return new Ul(t)}clear(){for(let o of this.cache.values())o.forceUnload();this.cache.clear(),this.loadingPromises.clear()}getStats(){return{cached:this.cache.size,loading:this.loadingPromises.size}}},zl={volume:1,latencyHint:"interactive",sampleRate:44100,maxChannels:128,silent:!1},Aa=class{constructor(o){this.registeredChannels=new Set,this.isReady=!1,this.readyPromise=null,this.destroyed=!1,this.unlockHandler=null,this.options={...zl,...o},Ol(!!this.options.silent),this.audioContext=new AudioContext({latencyHint:this.options.latencyHint,sampleRate:this.options.sampleRate}),this.audioCache=new Bl(this.audioContext),this.masterChannel=new Fl("__master__",this,{volume:this.options.volume},null),this.initialize()}async onceReady(){return this.readyPromise?(await this.readyPromise,this):this}initialize(){this.isReady||(this.readyPromise=this.waitForUnlock())}waitForUnlock(){return typeof document>"u"?(this.isReady=!0,Promise.resolve()):this.audioContext.state==="running"?(this.isReady=!0,Promise.resolve()):new Promise(o=>{let e=()=>{if(this.destroyed){this.clearUnlockHandler(),o();return}this.audioContext.resume().then(()=>{this.audioContext.state==="running"&&(this.clearUnlockHandler(),this.isReady=!0,o())}).catch(t=>{cn("Failed to resume AudioContext while unlocking.",t)})};this.unlockHandler=e,document.addEventListener("click",e),document.addEventListener("touchstart",e),document.addEventListener("keydown",e)})}clearUnlockHandler(){if(!this.unlockHandler||typeof document>"u")return;let o=this.unlockHandler;this.unlockHandler=null,document.removeEventListener("click",o),document.removeEventListener("touchstart",o),document.removeEventListener("keydown",o)}ensureNotDestroyed(){if(this.destroyed)throw new Error("Sound instance has been destroyed and cannot be used.")}ensureReady(){if(!this.isReady)throw new Error("Audio context is not ready. Call onceReady() and wait for it to resolve before creating channels or playing audio.")}getAudioContext(){return this.audioContext}async createToken(o,e,t){this.ensureNotDestroyed(),this.ensureReady();let{volume:n=1,rate:i=1,startTime:r=0,endTime:s,load:a="auto",loop:c=!1}=e??{},l,u=null;if(typeof o=="string")if(await this.resolveLoadMode(o,a)==="stream")l=this.createStreamSource(o);else{u=await this.audioCache.load(o),u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=u.raw(),l=p}else{u=o,u.addRef?.();let p=this.audioContext.createBufferSource();p.buffer=o.raw(),l=p}let d=new Vl(this.audioContext,l,{volume:n,rate:i,startOffset:r,duration:s?s-r:0},t);if(l instanceof AudioBufferSourceNode?(l.loop=c,c&&s!==void 0&&(l.loopStart=r,l.loopEnd=s)):l instanceof HTMLAudioElement&&(l.loop=c),u){let p=!1,h=()=>{p||(p=!0,u.releaseRef?.())};d.once("ended",h),d.once("stop",h)}return d}async resolveLoadMode(o,e){if(e==="stream"||e==="full")return e;try{let t=await fetch(o,{method:"HEAD"});if(!t.ok)return"stream";let n=t.headers.get("Content-Length");if(!n)return"stream";let i=parseInt(n,10);return isNaN(i)?"stream":i<Wl?"full":"stream"}catch(t){return cn("Failed to resolve load mode via HEAD request, falling back to 'stream'.",t),"stream"}}createStreamSource(o){let e=new Audio(o);return e.crossOrigin="anonymous",e}checkChannelLimit(){if(this.registeredChannels.size+1>=this.options.maxChannels)throw new Error(`Maximum number of channels (${this.options.maxChannels}) reached.`)}registerChannel(o){this.registeredChannels.add(o)}unregisterChannel(o){this.registeredChannels.delete(o)}setVolume(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.setVolume(o),this}getVolume(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getVolume()}mute(o){return this.ensureNotDestroyed(),this.ensureReady(),o===void 0?this.masterChannel.mute():this.masterChannel.mute(o),this}unmute(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.unmute(),this}isMuted(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.isMuted()}createChannel(o,e){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.createChannel(o,e)}getChannel(o){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannel(o)}getChannels(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getChannels()}async load(o){return this.ensureNotDestroyed(),this.ensureReady(),this.audioCache.load(o)}async play(o,e){this.ensureNotDestroyed(),this.ensureReady();let t=this.masterChannel.getTokens();for(let n of t)try{n.stop()}catch{}return this.masterChannel.play(o,e)}getTokens(){return this.ensureNotDestroyed(),this.ensureReady(),this.masterChannel.getTokens()}destroy(){this.destroyed||(this.destroyed=!0,this.clearUnlockHandler(),this.audioCache.clear(),this.masterChannel.remove(),this.registeredChannels.clear(),this.audioContext.close().catch(o=>{cn("Failed to close AudioContext during destroy().",o)}))}isDestroyed(){return this.destroyed}};var de=class de{constructor(e){this.gameState=e;this.state=new Map;this.channels=new Map;this.busTree=null;this.busSubscription=null;this.unknownBuses=new Set;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 Aa({maxChannels:de.MaxChannels});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=de.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,de.BusRampTimeConstant),r.setValueAtTime(s,a+de.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 "${nt.sound}" instead.`)),this.channels.get(nt.sound)??null)}static defaultFade(e){return{end:e.state.volume,duration:0}}play(e,t=de.defaultFade(e)){let n=new S;return this.ready.then(async()=>{this.state.has(e)&&this.state.get(e).token.stop();try{let i=this.channelFor(e),r=await this.sound.load(e.config.src),s=de.clipRegionOf(e),a=await i.play(r,{volume:0,...de.playRegionOf(s,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,s);let c=e.state.muted??!1;a.mute(c),e.state.muted=c,this.state.set(e,{token:a,cachedAudio:r,originalVolume:t.end}),t.duration>0?await a.fade(0,t.end,t.duration).finished:a.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,e.config.loop||await new Promise(l=>{a.once("ended",()=>l())}),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=de.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 this.sound.load(e.config.src),r=de.clipRegionOf(e),s=await n.play(i,{volume:0,...de.playRegionOf(r,e.config.loop),loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(s,r);let a=e.state.muted??!1;return s.mute(a),e.state.muted=a,this.state.set(e,{token:s,cachedAudio:i,originalVolume:t.end}),t.duration>0?s.fade(0,t.end,t.duration):s.setVolume(t.end),e.state.volume=t.end,e.state.paused=!1,s}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=de.clampToRegion(t,de.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}}static playRegionOf(e,t){return t||e.endTime===void 0?{startTime:e.startTime}:{startTime:e.startTime,endTime:e.endTime}}static applyLoopRegion(e,t){let{startTime:n,endTime:i}=t;if(i===void 0||!Number.isFinite(i)||i<=n||typeof AudioBufferSourceNode>"u")return;let r=e.sourceController;if(typeof r?.getSource!="function")return;let s=r.getSource();if(!(s instanceof AudioBufferSourceNode))return;let a=t.loopStart,c=a!==void 0&&Number.isFinite(a)?Math.min(Math.max(a,n),i):n;s.loop=!0,s.loopStart=c<i?c:n,s.loopEnd=i}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=await this.sound.load(e.config.src),r=de.clipRegionOf(e),s=r.endTime!==void 0&&e.config.loop,a=await n.play(i,{volume:e.state.volume,...de.playRegionOf(r,e.config.loop),startTime:s?r.startTime:t.position,loop:e.config.loop,rate:e.state.rate});e.config.loop&&de.applyLoopRegion(a,r),s&&Math.abs(t.position-r.startTime)>.01&&a.seek(de.clampToRegion(t.position,r)),this.state.set(e,{token:a,cachedAudio:i,originalVolume:e.state.volume});let c=e.state.muted??!1;a.mute(c),e.state.muted=c;let l=t.paused??e.state.paused??!1;e.state.paused=l,l?a.pause():t.isPlaying||a.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){return this.ready.then(()=>this.sound.load(e.config.src)).then(()=>{}).catch(t=>{this.gameState.logger.weakWarn("AudioManager",`Failed to preload sound (src: "${e.config.src}")`,t)})}reset(){this.state.forEach(e=>{e.token.stop()}),this.state.clear(),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.busSubscription?.cancel(),this.busSubscription=null,this.sound.destroy()}};de.MaxChannels=1024,de.BusRampTimeConstant=.02,de.BusRampSettle=de.BusRampTimeConstant*5;var eo=de;var to=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 Xl from"html-to-image";var we=class o{constructor(e,t){this.awaitable=e;this.guard=t;this.children=[];this._onResolved=[];this._onCancelled=[];this._onFailed=[];this._onTimelineRegistered=[];this._ableToAttach=!0;this._status="pending";e.onSettled(()=>{this.resolveStatus()}),ct(()=>{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 c=e[a];i.attachChild(c),c.then(l=>{r[a]=l,s++,s===e.length&&t.resolve(r)})}return t.onSkipControllerRegister(a=>{a.onAbort(()=>{i.abort()})}),[t,i]}static sequence(e,t){let n=t,i=null,r=new S,s=()=>{if(i){let a;i.onSkipControllerRegister(c=>{a=c.onAbort(()=>{r.abort()})}),i.then(c=>{a?.cancel(),n=c,i=e(c),i?ct(()=>s()):r.resolve(n)})}else r.resolve(n)};return r.registerSkipController(new V(()=>(i&&i.abort(),t))),i=e(t),i?ct(()=>s()):ct(()=>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()?ct(e):(this.onResolved(e),this.onCancelled(e),this.onFailed(e))}abort(){this.isSettled()||(this.awaitable.abort(),this.setStatus("cancelled",this.emitEvents.bind(this)),this.children.forEach(e=>e.abort()))}attachChild(e){if(!this._ableToAttach)throw new E(`Attaching to this timeline violates the timeline's state.
19
19
  Timeline attaching is only allowed synchronously after the timeline is created.
20
20
  Current _ableToAttach: `+this._ableToAttach);let t=S.isAwaitable(e)?new o(e,this.guard):e;return this.children.push(t),this.guard&&t.setGuard(this.guard),t.onSettled(()=>{this.resolveStatus()}),this}setGuard(e){return this.guard=e,this}catSettled(){return this.children.reduce(([e,t],n)=>(n.isResolved()?e.push(n):n.isCancelled()&&t.push(n),[e,t]),[[],[]])}onTimelineRegistered(e){return this._onTimelineRegistered.push(e),this}resolveStatus(){let e=this.children.find(t=>t.isFailed());this.awaitable.failed||e?this.setStatus("failed",this.emitEvents.bind(this)):this.awaitable.solved&&this.children.every(t=>t.isSettled())?this.setStatus("resolved",this.emitEvents.bind(this)):this.awaitable.skipController?.isAborted()&&this.setStatus("cancelled",this.emitEvents.bind(this))}emitEvents(){if(this.isResolved())this._onResolved.forEach(e=>e());else if(this.isCancelled())this._onCancelled.forEach(e=>e());else if(this.isFailed()){let e=this.children.find(t=>t.isFailed());this._onFailed.forEach(t=>t(this.awaitable.error??e?.awaitable.error))}this._onResolved=[],this._onCancelled=[],this._onFailed=[]}setStatus(e,t){if(this.isSettled()){this.guard&&this.guard.warn("unexpectedTimelineStatusChange",`Trying to resolve a settled timeline: ${this._status} -> ${e}`);return}e!==this._status&&t?(this._status=e,t()):this._status=e}preventAttach(){this._ableToAttach=!1,this._onTimelineRegistered.forEach(e=>e())}},no=class{constructor(e){this.guard=e;this.timelines=[]}attachTimeline(e){this.cleanupSettled();let t=e instanceof we?e:new we(e);return this.timelines.push(t),this.guard&&t.setGuard(this.guard),t}abortAll(){for(let e of this.timelines)e.abort();this.cleanupSettled()}cleanupSettled(){this.timelines=this.timelines.filter(e=>!e.isSettled())}};var io=class{constructor(e,t){this.gameState=e;this.notifications=t;this.events=new _}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 we(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 oo(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 Kl=4e3,ka={zIndex:0,visibility:"visible"},$l={...ka,zIndex:1},xa={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:2};function ni(){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 gr(){return{...ni(),visibility:"hidden"}}var ro=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,gr())):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?gr():ni())}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)),c=new we(a),l=[],u=r.resolve.map(h=>{if(typeof h=="function"){let m=this.createOverlay();return l.push(m),{kind:"overlay",element:m}}return{kind:"scene",sceneId:(h.key==="target"?t.to:t.from).getId(),role:h.key}}),d={task:r,controller:s,roles:t,targets:u,overlays:l,cancelLoadGate:()=>{},stale:!1};this.running=d,s.onUpdate(h=>this.applyFrame(d,h)),s.onComplete(()=>{this.settle(d,[[t.to,ni()],[t.from,gr()]]),n(),a.resolve()}),s.onCanceled(()=>{this.settle(d,[[t.from,ni()],[t.to,ni()]]),c.abort()}),this.applyFrame(d,r.animations.map(h=>h.start));let p=this.waitForSceneReady(t.to);return d.cancelLoadGate=p.cancel,p.promise.then(()=>{d.stale||s.start()}),c}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,c=r.kind==="overlay"?xa:r.role==="target"?$l:ka,l=q({style:c},a(...t));oo(s,l,jl)})}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,xa),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()},Kl)}),r=Promise.all(Array.from(t.querySelectorAll("img")).map(ql)).then(()=>{});return{promise:Promise.race([r,i]),cancel:()=>n()}}},wa=["src","width","height"];function jl(o){if(!wa.some(t=>t in o))return o;let e={...o};return wa.forEach(t=>delete e[t]),e}function ql(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 so=class{constructor(e=100,t){this.liveGame=t;this.history=[];this.hooks={onUndo:[],onHistoryLimit:[]};this.maxHistorySize=e}push(e,t,n){let i=ji(6),{action:r,timeline:s,stackModel:a}=e,c=this.liveGame.getStackModelForce().serialize(!1);if(this.history.push({action:r,id:i,args:n||[],undo:t,timeline:s,rootStackSnapshot:c,stackModel:a}),this.history.length>this.maxHistorySize){let l=this.history.splice(0,this.history.length-this.maxHistorySize);this.hooks.onHistoryLimit.forEach(u=>u(l))}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 ao=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??ji(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 Qt=class Qt extends X{executeAction(e,t){if(this.type===pe.applyTransform){let[n]=this.contentNode.getContent(),i=this.callee;return this.applyTransform(e,i,n,t)}else if(this.type===pe.applyTransition){let[n,i]=this.contentNode.getContent(),r=this.callee,s=i?i(n):n;return this.applyTransition(e,r,s,t)}else if(this.type===pe.applyLoop){let[n,i]=this.contentNode.getContent();return this.applyLoop(e,this.callee,n,i,t)}else if(this.type===pe.stopLoop){let[n]=this.contentNode.getContent();return this.stopLoop(e,this.callee,n,t)}else if(this.type===pe.init){let[n,i,r]=this.contentNode.getContent(),s=this.callee;return this.initDisplayable(e,n,s,i||null,r,t)}else if(this.type===pe.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)))},c=e.getExposedStateForce(t),l=t.transformState.clone(),u=t._getLoop(),d=t._getLoopActionId();u&&(t._setLoop(null,{},null),t.markDirty());let p=c.applyTransform(n,a),h=e.timelines.attachTimeline(s).attachChild(p);return p.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:h},(f,m,v)=>{s.isSettled()||s.abort(),p.abort(),t.transformState.forceOverwrite(f.state),Qt.restoreLoop(e,t,m,v)},[l,u,d]),s}applyLoop(e,t,n,i,r){let s=t._getLoop(),a=t._getLoopActionId(),c=i??{};t._setLoop(n,c,this.getId()),t.markDirty(),e.getExposedState(t)?.applyLoop(n,c),e.actionHistory.push({action:this,stackModel:r.stackModel},(u,d)=>{Qt.restoreLoop(e,t,u,d)},[s,a]);let l=new S;return l.resolve(super.executeAction(e,r)),l}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)))),c=()=>{a.isSettled()||a.resolve(super.executeAction(e,i))},l=e.getExposedState(t);if(!l||!r)return e.actionHistory.push({action:this,stackModel:i.stackModel},(p,h)=>{Qt.restoreLoop(e,t,p,h)},[r,s]),c(),a;let u=l.stopLoop(n,c),d=e.timelines.attachTimeline(a).attachChild(u);return u.onCancelled(c),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:d},(p,h)=>{a.isSettled()||a.abort(),u.abort(),Qt.restoreLoop(e,t,p,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)))},l=e.getExposedStateForce(t).applyTransition(n,a),u=e.timelines.attachTimeline(s).attachChild(l);return l.onCancelled(a),e.actionHistory.push({action:this,stackModel:i.stackModel,timeline:u},()=>{s.isSettled()||s.abort(),l.abort()}),s}initDisplayable(e,t,n,i,r=!0,s){if(r!==!1){let l=e.findElementByDisplayable(this.callee,i);l&&e.disposeDisplayable(n,l.scene,i),e.createDisplayable(n,t,i)}e.flush();let a=new S().registerSkipController(new V(()=>super.executeAction(e,s)));e.getExposedStateAsync(n,l=>{l.initDisplayable(()=>{a.resolve(super.executeAction(e,s))})});let c=e.timelines.attachTimeline(a);return e.actionHistory.push({action:this,stackModel:s.stackModel,timeline:c},()=>{r!==!1&&e.findElementByDisplayable(n,i)&&e.disposeDisplayable(n,t,i)}),a}bringToFront(e,t,n){let i=e.findElementByDisplayable(t),r=i&&Qt.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},c=>{let l=e.findElementByDisplayable(t),u=l&&Qt.getLayerElements(l,t);if(!u)return;let d=u.indexOf(t);d!==c&&(u.splice(d,1),u.splice(c,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")}};Qt.ActionTypes=pe;var Te=Qt;var Ke=class o extends ce{constructor(){super(...arguments);this.srcManager=new Re;this.loopTransform=null;this.loopOptions={};this.loopActionId=null}_getLoop(){return this.loopTransform?{transform:this.loopTransform,options:this.loopOptions}:null}_setLoop(t,n,i){return this.loopTransform=t,this.loopOptions=t?n:{},this.loopActionId=t?i:null,this}_getLoopActionId(){return this.loopActionId}_serializeLoop(){return this.loopActionId?{actionId:this.loopActionId,options:{...this.loopOptions}}:null}_deserializeLoop(t){return this.loopTransform=null,this.loopOptions=t?{...t.options}:{},this.loopActionId=t?t.actionId:null,this}_rebindLoop(t){if(!this.loopActionId||this.loopTransform)return this;let i=t.get(this.loopActionId)?.contentNode?.getContent(),r=Array.isArray(i)?i[0]:void 0;return r instanceof Z?(this.loopTransform=r,this):this._setLoop(null,{},null)}reset(){super.reset(),this._setLoop(null,{},null)}pos(t,n,i){return this.transform(new Z({position:t},{duration:n,ease:i}))}zoom(t,n,i){return this.transform(new Z({zoom:t},{duration:n,ease:i}))}scaleX(t,n,i){return this.transform(new Z({scaleX:t},{duration:n,ease:i}))}scaleY(t,n,i){return this.transform(new Z({scaleY:t},{duration:n,ease:i}))}scale(t,n,i,r){return this.transform(new Z({scaleX:t,scaleY:n},{duration:i,ease:r}))}scaleXY(t,n,i,r){return this.scale(t,n,i,r)}rotate(t,n,i){return this.transform(new Z({rotation:t},{duration:n,ease:i}))}opacity(t,n,i){return this.transform(new Z({opacity:t},{duration:n,ease:i}))}effect(t,n){return this.registerEffectSrc(t),this.transform(new Z(t,n))}mask(t,n={}){let i=P.srcToURL(t),{maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c,...l}=n;return this.srcManager.registerRawSrc(i),this.effect({maskImage:o.toCSSUrl(i),maskSize:r,maskPosition:s,maskRepeat:a,maskMode:c},l)}clearMask(t){return this.effect({maskImage:"none",maskSize:"auto",maskPosition:"0% 0%",maskRepeat:"repeat",maskMode:"match-source"},t)}clip(t,n){return this.effect({clipPath:t},n)}clearClip(t){return this.effect({clipPath:"none"},t)}circleReveal(t={}){let{center:n="50% 50%",from:i=0,to:r=150,clearClip:s=!0,duration:a=600,ease:c="easeInOut",...l}=t,u={duration:a,ease:c,...l},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,p=>p.transform(d).clearClip({duration:0})):this.transform(d)}circleClose(t={}){let{center:n="50% 50%",from:i=150,to:r=0,clearClip:s=!1,duration:a=600,ease:c="easeInOut",...l}=t,u={duration:a,ease:c,...l},d=o.createClipPathTransform([[o.circleClipPath(i,n),{duration:0}],[o.circleClipPath(r,n),u]]);return s?this.combineActions(new Fe,p=>p.transform(d).clearClip({duration:0})):this.transform(d)}wipe(t={}){let{direction:n="left",reverse:i=!1,clearClip:r=!i,duration:s=600,ease:a="easeInOut",...c}=t,l={duration:s,ease:a,...c},u=o.wipeClipPath(n,100),d=o.wipeClipPath(n,0),p=o.createClipPathTransform([[i?d:u,{duration:0}],[i?u:d,l]]);return r?this.combineActions(new Fe,h=>h.transform(p).clearClip({duration:0})):this.transform(p)}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,pe.applyTransform,new C().setContent([t.copy()]));return n.chain(i)}loop(t,n){let i=this.chain(),r=new Te(i,pe.applyLoop,new C().setContent([t.copy(),n]));return i.chain(r)}stopLoop(t){let n=this.chain(),i=new Te(n,pe.stopLoop,new C().setContent([t]));return n.chain(i)}bringToFront(){let t=this.chain(),n=new Te(t,pe.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,pe.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,pe.applyTransform,new C().setContent([i]));return n.chain(r)}};var ln=class ln extends ce{constructor(e,t={}){super(),this.config=q(ln.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(c=>typeof c=="string")&&[t,...n].length>0&&[t,...n].every(c=>me.isSingleWord(c))){let c=e,l=me.format([t,...n]),u=new me(Js(c,l),{character:this}),d=new it(this.chain(),it.ActionTypes.say,new C().setContent(u));return this.chain(d)}let i=t||{},r=e,s=Array.isArray(r)?new me(r,{...i,character:this}):(me.isSentence(r)?r:new me(r,{...i,character:this})).copy();s.setCharacter(this);let a=new it(this.chain(),it.ActionTypes.say,new C().setContent(s));return this.chain(a)}setName(e){let t=new it(this.chain(),it.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&&me.isSingleWord(t)?this.say(e,t,...n):this.say(e):typeof e=="string"?this.say(e,t):me.isSentence(e)?this.say(e):this.say(e,t)}toData(){return{state:ln.StateSerializer.serialize(this.state)}}fromData(e){return this.state=ln.StateSerializer.deserialize(e.state),this}reset(){return super.reset(),this.state=this.getInitialState(),this}getInitialState(){return{name:this.authoredName}}};ln.defaultCharacterColor="#000",ln.defaultConfig={portraits:[]},ln.StateSerializer=new qe;var co=ln,_t=new co(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()})`}},yr=class o extends ce{constructor(){super();this.conditions={If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static getInitialState(){return{If:{condition:null,action:null},ElseIf:[],Else:{action:null}}}static If(t,n){return new o().createIfCondition(t,n)}ElseIf(t,n){if(this.conditions.Else.action)throw new Oe(`ELSE condition already set
21
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
@@ -35,7 +35,7 @@ NarraLeaf cannot find the element with the id from the saved game`);return l.fro
35
35
  NarraLeaf cannot find the element with the id from the saved game`);return[r,i.map(s=>{if(!t.has(s))throw new E("Displayable not found, id: "+s+`
36
36
  NarraLeaf cannot find the element with the id from the saved game
37
37
  This may be caused by the damage of the saved game file or the change of the story file`);return t.get(s)})]}))}};le.EventTypes={"event:state.end":"event:state.end","event:state.player.skip":"event:state.player.skip","event:state.player.lineEnd":"event:state.player.lineEnd","event:state.dialog.change":"event:state.dialog.change","event:state.player.requestFlush":"event:state.player.requestFlush","event:state.player.stageClick":"event:state.player.stageClick","event:state.scene.mount":"event:state.scene.mount","event:state.scene.unmount":"event:state.scene.unmount","event.state.onExpose":"event.state.onExpose","event:state.onRender":"event:state.onRender","event:state:flushPreloadedScenes":"event:state:flushPreloadedScenes","event:state.nvl.enter":"event:state.nvl.enter","event:state.nvl.exit":"event:state.nvl.exit","event:state.nvl.dialogComplete":"event:state.nvl.dialogComplete","event:state.nvl.dialogAppend":"event:state.nvl.dialogAppend","event:state.nvl.visibilityChange":"event:state.nvl.visibilityChange","event:state.nvl.change":"event:state.nvl.change"};var L=le;var Lt=class Lt extends X{static getVoice(e,t){let n=e.getLastScene();if(!n)throw new Error("No scene found when trying to play voice");let{voiceId:i,voice:r}=t.config;return!i&&!r?null:fe.toSound(n.getVoice(i)||r)}static endVoiceWithPreference(e,t){let{voiceEndMode:n,voiceFadeDuration:i}=e.game.preference.getPreferences();if(n==="none")return null;let r=n==="fade"?Math.max(0,i):0;return e.audioManager.stop(t,r)}static cutTrailingVoice(e,t){let n=Lt.trailingVoice.get(e);n&&n!==t&&e.audioManager.isPlaying(n)&&e.timelines.attachTimeline(e.audioManager.stop(n,0)),t?Lt.trailingVoice.set(e,t):Lt.trailingVoice.delete(e)}executeAction(e,t){if(this.type===Yt.say){let n=null,i="",r=null,s=new S(v=>v).registerSkipController(new V(()=>{n?.()})),a=new we(s),c=this.contentNode.getContent(),l=e.isNvlMode(),u=e.getLiveGame(),d=e.createPresentationSnapshot(),p=u.lastDialog?{sentence:u.lastDialog.sentence,speaker:u.lastDialog.speaker}:null,h=Lt.getVoice(e,c);if(h){Lt.cutTrailingVoice(e,h);let v=e.audioManager.play(h);a.attachChild(v)}let f=h?e.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{let v=Lt.endVoiceWithPreference(e,h);v&&e.timelines.attachTimeline(v),f?.cancel()}):null;if(l){let v=this.getId(),g=(e.getActiveNvlDialogForAction(v)||e.getLatestNvlDialogForAction(v))?.id||e.allocateNvlDialogId(v),y=c.evaluate(xe.getCtx({gameState:e}));i=ie.getText(y),u.events.emit(Ut.EventTypes["event:character.prompt"],{character:c.config.character,sentence:c,text:i});let b=!1,k=()=>{b||(b=!0,e.events.emit(L.EventTypes["event:state.player.lineEnd"]),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()}))},{created:w}=e.ensureNvlDialog({id:g,actionId:v,character:this.callee,sentence:c,text:i});r=g;let A=e.consumeNvlTypingSuppression(),x=w&&!A?"typing":"awaitAdvance";e.activateNvlDialog(g,x,!w);let O=e.waitForNvlAdvance(g,()=>{e.settleNvlDialog(g),k()});n=()=>{O.cancel()}}else{let v=e.idManager.generateId(),T=e.createDialog(v,c,()=>{e.settleAdvDialog(v),e.gameHistory.resolvePending(m),s.resolve({type:this.type,node:this.contentNode.getChild()})});e.beginAdvDialog(v,this.getId()),i=T.text,n=()=>{e.settleAdvDialog(v),T.cancel()}}u.setLastDialog(i,this.callee.state.name),e.timelines.attachTimeline(a);let{id:m}=e.actionHistory.push({action:this,stackModel:t.stackModel,timeline:a},()=>{if(f?.cancel(),h&&e.audioManager.isPlaying(h)){let v=Lt.endVoiceWithPreference(e,h);v&&a.attachChild(v)}n?.(),r&&(e.removeNvlDialog(r),e.settleNvlDialog(r)),e.restorePresentationSnapshot(d),p?u.setLastDialog(p.sentence,p.speaker):u.lastDialog=null});return e.gameHistory.push({token:m,action:this,element:{type:"say",text:i,voice:h?h.getSrc():null,voiceId:c.config.voiceId??null,character:this.callee.state.name},isPending:!0,snapshot:u.captureGameState()}),s}else if(this.type===Yt.setName){let n=this.callee.state.name;return this.callee.state.name=this.contentNode.getContent()[0],e.actionHistory.push({action:this,stackModel:t.stackModel},i=>{this.callee.state.name=i},[n]),super.executeAction(e,t)}throw super.unknownTypeError()}stringify(e,t,n){return super.stringifyWithName("CharacterAction")}};Lt.ActionTypes=Yt,Lt.trailingVoice=new WeakMap;var it=Lt;var Pe=class Pe extends Mn{constructor(t,n){super();this.srcManager=new Re;this.events=new _;this.actions=[];this.voiceCache=new Map;this._futureActions_=[];this.labelMap=new Map;let i=Pe.DefaultSceneConfig.getDefaultConfig().defaultBackgroundLayer.copy().setName("[[Background Layer of "+t+"]]"),r=Pe.DefaultSceneConfig.getDefaultConfig().defaultDisplayableLayer.copy().setName("[[Displayable Layer of "+t+"]]"),s=Pe.DefaultUserConfig.create(n),a=Pe.DefaultSceneConfig.create({...s.get(),name:t,layers:[...s.get().layers,i,r],defaultBackgroundLayer:i,defaultDisplayableLayer:r});this.userConfig=s,this.config=a.get(),this.state=this.getInitialState(),this.localPersistent=new Fn(t)}static get DefaultSceneConfig(){return Pe._defaultSceneConfig??(Pe._defaultSceneConfig=new $({name:"",backgroundMusicFade:0,voices:null,layers:[],defaultBackgroundLayer:new Hn("[[Background Layer]]",{zIndex:-1}),defaultDisplayableLayer:new Hn("[[Displayable Layer]]",{zIndex:0})},{voices:t=>{let n=r=>typeof r=="object"&&r!==null,i=r=>typeof r=="function";if(!t)return null;if(n(t)&&Object.values(t).forEach(r=>{fe.isSound(r)&&Pe.validateVoice(r)}),i(t))return t;throw new Oe(`Invalid voices config: ${t}`)}}))}static validateVoice(t){if(!Ji(t.config.type,[nt.voice,nt.sound]))throw new Oe(`Voice must be a voice, but got ${t.config.type}.
38
- To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Pe}static getOwnedSounds(t){let n=[],i=t.callee;if(Pe.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof ee&&t.type===z.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t,n){return new qe({backgroundImage:i=>i.toData(),backgroundMusic:i=>{let r=i?.toData();if(!r)return null;let s=i.getId();return s?{...r,id:s}:r}},{backgroundImage:i=>t.state.backgroundImage.fromData(i),backgroundMusic:i=>{if(!i)return null;let r=i.id?n?.get(i.id):void 0,s=r instanceof fe?r:t.state.backgroundMusic;return s?s.fromData(i):null}})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.chain().chain(Fe.do([this.background.char(t,n)]))}jumpTo(t,n={}){let i=q({},n instanceof Vt?{transition:n}:n);return i.returnable?this._callScene(t,i.transition):this.combineActions(new Fe({allowFutureScene:!1}),r=>(r.chain(new ee(r,"scene:preUnmount",new C().setContent([]))).chain(this._initScene(t))._transitionToScene(i.transition,t).chain(this._exit()),r))._jumpTo(t)}_callScene(t,n){return this.combineActions(new Fe({allowFutureScene:!1}),i=>(i.chain(this._preSuspend(t)).chain(this._initScene(t))._transitionToScene(n,t),i))._callTo(t)._resume(t)}setBackgroundMusic(t,n){return this.chain(new ee(this.chain(),z.setBackgroundMusic,new C().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new ui(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},u=new ee(this.chain(),z.nvlEnd,new C().setContent([l])),d=[...c,u];super.constructNodes(d);let p=new ee(this.chain(),z.nvlBlock,new C().setContent([d,l]));return this.chain(p)}action(t){return this.actions=t,this}preloadImage(t){if(!P.isImageSrc(t))throw new Error("Invalid image source: "+t);return(Array.isArray(t)?t:[t]).forEach(i=>{this.srcManager.register({type:"image",src:i})}),this}toData(){return{state:Pe.getStateSerializer(this).serialize(this.state)}}fromData(t,n){return this.state=Pe.getStateSerializer(this,n).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new ee(this.chain(),"scene:action",new C);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>Be.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[],c=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{Be.isChained(m)||(m instanceof N?s.push(m):m instanceof An?a.push(m):m instanceof Dt&&c.push(m))});let l=[],u=[],d=new Map;s.forEach(m=>{m.config.isWearable?u.push(m):m.config.autoInit&&l.push(m);for(let v of m.config.wearables){if(d.get(v)&&d.get(v)!==m)throw new Error(`Wearable image cannot be used multiple times
38
+ To prevent unintended behavior and unexpected results, the sound have to be on the voice bus (or any bus beneath it). Please use \`Sound.voice()\` to create the sound.`)}static isScene(t){return t instanceof Pe}static getOwnedSounds(t){let n=[],i=t.callee;if(Pe.isScene(i)){let r=i.userConfig.get().backgroundMusic;r&&n.push(r)}if(t instanceof ee&&t.type===z.setBackgroundMusic){let[r]=t.contentNode.getContent();r&&n.push(r)}return n}static getScene(t,n){return typeof n=="string"?t.getScene(n):n}static getStateSerializer(t,n){return new qe({backgroundImage:i=>i.toData(),backgroundMusic:i=>{let r=i?.toData();if(!r)return null;let s=i.getId();return s?{...r,id:s}:r}},{backgroundImage:i=>t.state.backgroundImage.fromData(i),backgroundMusic:i=>{if(!i)return null;let r=i.id?n?.get(i.id):void 0,s=r instanceof fe?r:t.state.backgroundMusic;return s?s.fromData(i):null}})}get __futureActions__(){return this._futureActions_}get local(){return this.localPersistent}get background(){return this.state.backgroundImage}get backgroundLayer(){return this.config.defaultBackgroundLayer}get displayableLayer(){return this.config.defaultDisplayableLayer}setBackground(t,n){return this.combineActions(new Fe,()=>this.background.char(t,n))}jumpTo(t,n={}){let i=q({},n instanceof Vt?{transition:n}:n);return i.returnable?this._callScene(t,i.transition):this.combineActions(new Fe({allowFutureScene:!1}),r=>(r.chain(new ee(r,"scene:preUnmount",new C().setContent([]))).chain(this._initScene(t))._transitionToScene(i.transition,t).chain(this._exit()),r))._jumpTo(t)}_callScene(t,n){return this.combineActions(new Fe({allowFutureScene:!1}),i=>(i.chain(this._preSuspend(t)).chain(this._initScene(t))._transitionToScene(n,t),i))._callTo(t)._resume(t)}setBackgroundMusic(t,n){return this.chain(new ee(this.chain(),z.setBackgroundMusic,new C().setContent([t,n])))}nvl(t,n){let i,r;n!==void 0?(i=t,r=n):(i=void 0,r=t);let s=new ui(this),a=typeof r=="function"?r(s):r,c=this.narrativeToActions(a),l={showTransition:i,hideTransition:i},u=new ee(this.chain(),z.nvlEnd,new C().setContent([l])),d=[...c,u];super.constructNodes(d);let p=new ee(this.chain(),z.nvlBlock,new C().setContent([d,l]));return this.chain(p)}action(t){return this.actions=t,this}preloadImage(t){if(!P.isImageSrc(t))throw new Error("Invalid image source: "+t);return(Array.isArray(t)?t:[t]).forEach(i=>{this.srcManager.register({type:"image",src:i})}),this}toData(){return{state:Pe.getStateSerializer(this).serialize(this.state)}}fromData(t,n){return this.state=Pe.getStateSerializer(this,n).deserialize(t.state),this}constructSceneRoot(t){this.sceneRoot=new ee(this.chain(),"scene:action",new C);let n=this.actions,r=this.narrativeToActions(typeof n=="function"?n(this):n).map(m=>Be.isChained(m)?m.fromChained(m):m).flat(2),s=[],a=[],c=[];this.getAllChildrenElements(t,r,{allowFutureScene:!1}).forEach(m=>{Be.isChained(m)||(m instanceof N?s.push(m):m instanceof An?a.push(m):m instanceof Dt&&c.push(m))});let l=[],u=[],d=new Map;s.forEach(m=>{m.config.isWearable?u.push(m):m.config.autoInit&&l.push(m);for(let v of m.config.wearables){if(d.get(v)&&d.get(v)!==m)throw new Error(`Wearable image cannot be used multiple times
39
39
  Maybe you bind the same wearable image to multiple parent images
40
40
  Parent Conflict (src: `+d.get(v)?.state.currentSrc+`)
41
41
  Current Parent (src: `+m.state.currentSrc+")");d.set(v,m)}});let p=[...this._initScene(this),...l.map(m=>m._init(this)),...u.map(m=>{if(!d.has(m))throw new Error("Wearable image must have a parent image");return d.get(m)._initWearable(m)}),...a.map(m=>m._init()),...c.map(m=>m._init()),...r],h=super.constructNodes(p),f=new C(this.sceneRoot,void 0,h||void 0).setContent(this);return h?.setParent(f),this.sceneRoot?.setContentNode(f),this._futureActions_=p,this.constructLabels(t),this}constructLabels(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!1}),i=new Map;for(let r of n)if(r instanceof re&&r.type===oe.label){let[s]=r.contentNode.getContent();if(i.has(s))throw new Oe(`Duplicate label "${s}" in scene "${this.config.name}". Label names must be unique within a scene.`);i.set(s,r)}this.labelMap=i;for(let r of n)if(r instanceof re&&r.type===oe.jump){let[s]=r.contentNode.getContent(),a=i.get(s);if(!a)throw new Oe(`Jump target label "${s}" not found in scene "${this.config.name}". Control.jump can only jump to a Control.label declared in the same scene.`);r.setJumpTarget(a)}}getLabel(t){return this.labelMap.get(t)||null}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?_t.say(n).getActions():Be.toActions([n]))}isSceneRootConstructed(){return!!this.sceneRoot}registerSrc(t,n=new Set){if(!this.sceneRoot)return;let i=new Set,r=new Set,s=[this.sceneRoot],a=new Set;for(;s.length;){let c=s.shift();if(!i.has(c)){if(i.add(c),c instanceof ee){let l=c.callee;if(P.isImageSrc(l.state.backgroundImage.state.currentSrc)&&this.srcManager.register({type:"image",src:P.srcToURL(l.state.backgroundImage.state.currentSrc)}),c.type===z.jumpTo||c.type===z.callTo){let d=c,p=d.contentNode.getContent()[0],h=Pe.getScene(t,p);if(!h)throw c._sceneNotFoundError(c.getSceneName(p));let f=Re.getPreloadableSrc(t,c);if(f&&this.srcManager.register(f),!r.has(d)&&!n.has(h))r.add(d),a.add(h),n.add(h);else if(c.type===z.jumpTo)continue}}else if(c instanceof ve){let l=Re.getPreloadableSrc(t,c);l&&this.srcManager.register(l)}else if(c instanceof tt)this.srcManager.register(c.callee);else if(c instanceof it){let l=c.type===Yt.say?c.contentNode.getContent():null;for(let u of Ia(c.callee,l))this.srcManager.register({type:"image",src:P.srcToURL(u)})}else if(c instanceof re){let u=c.getFutureActions(t,{allowFutureScene:!0});s.push(...u)}else c instanceof Te&&this.srcManager.register(c.callee.srcManager.getSrc());s.push(...c.getFutureActions(t,{allowFutureScene:!0}))}}a.forEach(c=>{c.registerSrc(t,n),this.srcManager.registerFuture(c.srcManager)})}assignActionId(t){let n=this.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}),i=new Set;n.forEach(a=>{let c=a.getStaticId();if(c){if(i.has(c))throw new Oe(`Duplicate static action id: ${c}`);i.add(c)}});let r=0,s=()=>{let a=`a-${r++}`;for(;i.has(a);)a=`a-${r++}`;return i.add(a),a};n.forEach(a=>{let c=a.getStaticId();a.resolveId(c||s())})}assignElementId(t){this.getAllChildrenElements(t,this.sceneRoot||[]).forEach((s,a)=>{s.resolveId(`e-${a}`)});let i=new Set;this.getAllChildren(t,this.sceneRoot||[]).forEach(s=>{Pe.getOwnedSounds(s).forEach(a=>i.add(a))});let r=0;i.forEach(s=>{s.getId()||s.resolveId(`s-${r}`),r++})}getVoice(t){if(!t)return null;let n=this.config.voices;if(n){if(typeof n=="function"){let r=n(t);return typeof r=="string"?this.voiceOfSrc(r):(Pe.validateVoice(r),r)}let i=n[t];return typeof i=="string"?this.voiceOfSrc(i):i||null}return null}voiceOfSrc(t){let n=this.voiceCache.get(t);if(n)return n;let i=fe.voice(t);return this.voiceCache.set(t,i),i}getSceneRoot(){if(!this.sceneRoot)throw new Error("Scene root is not constructed");return this.sceneRoot}stringify(t,n,i){return super.getAllChildren(t,this.sceneRoot||[],{allowFutureScene:!0}).map(r=>r.stringify(t,n,i)).join(";")}reset(){super.reset(),this.state.backgroundImage.reset(),this.state.backgroundMusic?.reset(),this.state=this.getInitialState()}getInitialState(){let t=this.userConfig.get();if(t.backgroundMusic&&!Ji(t.backgroundMusic.config.type,[nt.bgm]))throw new Oe(`[Scene: ${this.config.name}] Background music must be a bgm, but got ${t.backgroundMusic.config.type}.
@@ -60,7 +60,7 @@ actual: ${i}`)}dispose(){this.events.clear(),this.gameState?.dispose()}notify(e,
60
60
  `)return Ve.createElement("br",{key:D});let K=rt(F);return Ve.createElement("span",{key:D,style:{...K,...Hr()},className:Eo("inline-block",F.config.className)},Ve.createElement(hc,{word:F,vertical:Ue,tateChuYoko:g,done:!1,style:K,renderer:Ir(F.config.render)}))};return Ve.createElement("div",{...b,className:Eo("whitespace-pre-wrap",u),style:{...ft,...Or(v,T),...d}},gn.map(I))}function gc(o){return Ve.createElement(zr,{...o,key:o.dialog?.config.action.id})}function Wu({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i,...r}){let s=wo({entry:o,gameState:e,words:t,useTypeEffect:n,isActive:i});return Ve.createElement(zr,{...r,dialog:s,key:s.config.action.id})}function Bu(o){let e=Rt();return Ve.createElement(zr,{...o,dialog:e,key:e.config.action.id})}function fn(o){return"entry"in o&&o.entry&&"gameState"in o&&o.gameState&&"words"in o&&o.words?Ve.createElement(Wu,{...o}):Ve.createElement(Bu,{...o})}var zu=fn;import Ro,{useEffect as Ku,useLayoutEffect as $u,useMemo as vc,useRef as ju,useState as qu}from"react";import Lo from"react";var Kr=Lo.createContext(null);function $r(){let o=Lo.useContext(Kr);if(!o)throw new Error("useUIMenuContext must be used within a UIMenuContext");return o}var jr=Lo.createContext(null);function yc(){let o=Lo.useContext(jr);if(!o)throw new Error("useUIListContext must be used within a UIListContext");return o}function Io({className:o,style:e,bindKey:t,defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a}){let c=ju(null),{register:l,unregister:u,getIndex:d}=yc(),[p,h]=qu(-1),{choose:f,evaluated:m,gameState:v}=$r(),T=p===-1?null:m[p],g=vc(()=>xe.getCtx({gameState:v}),[v]),{hidden:y,disabled:b}=vc(()=>{if(!T)return{hidden:!1,disabled:!1};let A=T.config.hidden?.evaluate(g)?.value??!1,x=!A&&(T.config.disabled?.evaluate(g)?.value??!1);return{hidden:A,disabled:x}},[T,g]);$u(()=>{if(!c.current)return;let A=c;l(A);let x=d(A);return h(x),c.current.dataset.index=x.toString(),()=>u(A)},[l,u,d]),Ku(()=>{if(!t)return;let A=x=>{x.key.toLowerCase()===t.toLowerCase()&&!x.ctrlKey&&!x.metaKey&&(x.preventDefault(),x.stopPropagation(),k())};return window.addEventListener("keydown",A,!0),()=>{window.removeEventListener("keydown",A,!0)}},[t]);function k(){if(p===-1||!m[p]||y||b)return;let A=m[p];f({...A,evaluated:ie.getText(A.words||[])})}let w=T&&!y;return Ro.createElement(Ro.Fragment,null,Ro.createElement("button",{className:o,style:{...e,display:w?e?.display??void 0:"none"},onClick:k,ref:c,disabled:b},w&&Ro.createElement(gc,{defaultColor:n,fontSize:i,fontWeight:r,fontWeightBold:s,fontFamily:a,dialog:new Me({useTypeEffect:!1,action:{sentence:T.prompt,words:T.words,character:null},gameState:v,evaluatedWords:T.words})})))}import Mo from"react";import{AnimatePresence as Yu}from"motion/react";function No({children:o,...e}){let t=Yu;return Mo.createElement(Mo.Fragment,null,Mo.createElement("div",{...e},Mo.createElement(t,null,o)))}import Sc from"react";function en({entry:o,character:e,name:t,color:n,children:i,style:r,...s}){let a=Sc.useContext(Cn),c=e??o?.character??a?.config.action.character??null,l=n??c?.config.color,u=i??t??c?.state.name;return Sc.createElement("div",{...s,style:{color:l?Ln(l):void 0,...r}},u)}import _u from"clsx";import Ju from"react";import qr,{createContext as Xu,useContext as Qu,useState as Tc}from"react";var kn=class kn{constructor(){this.preloaded=[];this.events=new _}add(e){let t=this.getSrc(e);return t&&this.has(t)?this:(this.preloaded.push(e),this.events.emit(kn.EventTypes["event:preloaded.add"],e),this.events.emit(kn.EventTypes["event:preloaded.change"]),this)}get(e){return this.preloaded.find(t=>this.getSrc(t)===e)}has(e){return Array.isArray(e)?e.every(t=>this.has(t)):this.preloaded.some(t=>this.getSrc(t)===e)}remove(e){if(Array.isArray(e)){let n=e.map(i=>this.getSrc(i));return this.preloaded=this.preloaded.filter(i=>!n.includes(this.getSrc(i))),this}let t=this.getSrc(e);return this.preloaded=this.preloaded.filter(n=>this.getSrc(n)!==t),this.events.emit(kn.EventTypes["event:preloaded.remove"],e),this.events.emit(kn.EventTypes["event:preloaded.change"]),this}clear(){return this.preloaded=[],this}getSrc(e){return Re.getSrc(e)}};kn.EventTypes={"event:preloaded.add":"event:preloaded.add","event:preloaded.remove":"event:preloaded.remove","event:preloaded.change":"event:preloaded.change","event:preloaded.mount":"event:preloaded.mount","event:preloaded.ready":"event:preloaded.ready","event:preloaded.complete":"event:preloaded.complete","event:preloaded.unmount":"event:preloaded.unmount"};var $e=kn;var Go=class o{constructor(e){this.game=e;this.src=new Map;this.preloadTasks=new Map;this.decoded=new Map;this.game.addSideEffect(()=>{this.abortAll(),this.src.clear(),this.decoded.clear()})}static getImage(e,t,n){return Zs(e,{...n,signal:t})}static async decodeImage(e){if(typeof window>"u"||typeof window.Image>"u")return null;let t=new window.Image;if(t.src=e,typeof t.decode!="function")return null;try{await t.decode()}catch{return null}return t}has(e){return this.src.has(e)}add(e,t){return this.src.set(e,t),this}remove(e){return this.src.delete(e),this.decoded.delete(e),this}get(e){return this.src.get(e)}isDecoded(e){return this.decoded.has(e)}clear(){return this.src.clear(),this.decoded.clear(),this}size(){return this.src.size}isPreloading(e){return this.preloadTasks.has(e)}preload(e,t,n){if(this.src.has(t)||this.preloadTasks.has(t)){let p={abort:()=>{},onFinished:()=>p,onErrored:()=>p};return p}let i=t,r={};this.game.hooks.rawTrigger("preloadImage",()=>[i,(p,h)=>{i=p,r={...r,...h}}]);let s=new AbortController,a=s.signal,c=[],u={promise:o.getImage(i,a,r).then(async p=>{if(this.preloadTasks.delete(t),p){this.add(t,p);let h=await o.decodeImage(p);h&&n?.retainDecoded&&this.src.get(t)===p&&this.decoded.set(t,h)}}).catch(p=>{this.preloadTasks.delete(t),e.logger.error("ImageCacheManager",`Failed to preload image: ${t}`,`Reason: ${p}`),c.forEach(h=>h(p))}),controller:s};this.preloadTasks.set(t,u);let d={abort:()=>{s.abort(),this.preloadTasks.delete(t)},onFinished:p=>(u.promise.then(p),d),onErrored:p=>(c.push(p),d)};return d}abortAll(){this.preloadTasks.forEach(e=>{e.controller.abort()}),this.preloadTasks.clear()}abort(e){let t=this.preloadTasks.get(e);t&&(t.controller.abort(),this.preloadTasks.delete(e))}preloadedSrc(){return Array.from(this.src.values())}filter(e){let t=new Set(e);for(let n of this.src.keys())t.has(n)||(this.src.delete(n),this.decoded.delete(n));for(let n of this.decoded.keys())t.has(n)||this.decoded.delete(n);return this}};var Yr=Xu(null);function bc({children:o}){let e=R(),[t]=Tc(()=>new $e),[n]=Tc(()=>new Go(e));return qr.createElement(qr.Fragment,null,qr.createElement(Yr,{value:{preloaded:t,cacheManager:n}},o))}function Kt(){if(!Yr)throw new Error("usePreloaded must be used within a PreloadedProvider");return Qu(Yr)}function Ac(){let o=Rt(),{action:e,gameState:t}=o.config,n=e.character,i=e.sentence;if(!n||!i||!n.state.name)return tp(n||null,null);let r=t.findCurrentPortraitForCharacter(n),s=r?.image||null,a=s?N.getSrcURL(s):null,c=s&&N.isTagSrc(s)?[...s.state.currentSrc]:null,l=Ra({character:n,sentence:i,portrait:s,currentSrc:a,tags:c,gameState:t,sentenceAvatar:i.config.avatar,portraitAvatar:r?.avatar,characterAvatar:n.config.avatar}),u=ep(l.source);return{visible:!!u,src:u,character:l.character,portrait:l.portrait,alt:n.state.name?`${n.state.name} avatar`:"dialog avatar"}}function Zu({className:o,style:e,alt:t,...n}){let i=Ac(),{cacheManager:r}=Kt();if(!i.visible||!i.src)return null;let s=r.get(i.src)||i.src;return Ju.createElement("img",{...n,"data-element-type":"dialog-avatar",className:_u("dialog-avatar",o),src:s,alt:t??i.alt,style:{width:96,height:96,objectFit:"cover",borderRadius:6,flex:"0 0 auto",...e}})}function ep(o){return o?P.srcToURL(o):null}function tp(o,e){return{visible:!1,src:null,character:o,portrait:e,alt:o?.state.name?`${o.state.name} avatar`:"dialog avatar"}}var Xr=Zu;import{useEffect as np}from"react";function ip(){let o=Rt(),[e]=se(o.deps),t=ie.getText(o.config.evaluatedWords);return np(()=>o.events.on(Me.Events.onFlush,()=>{e()}).cancel,[o]),{done:o.isEnded(),text:t,isNarrator:o.config.action.character===null||o.config.action.character.state.name==="",metadata:o.config.action.sentence?.getMetadata()}}import{useCallback as Fo,useEffect as Qr,useMemo as op,useRef as rp,useState as Cc}from"react";function sp(){let o=Rt(),[e]=se(o.deps),[t,n]=Cc(!0),[i,r]=Cc(!0),s=rp(null),a=o.config.gameState,c=o.config.action.sentence,l=c?.config.voiceId??null;Qr(()=>o.events.on(Me.Events.onFlush,()=>{e()}).cancel,[o]);let u=op(()=>{if(!c)return null;try{return it.getVoice(a,c)}catch{return null}},[a,c,l,c?.config.voice]);Qr(()=>{s.current=null,r(!0)},[c]),Qr(()=>{let m=!1,v=null,T=null,g=null;if(!u){n(!0);return}n(!1);let y=()=>{m||n(!0)};v=a.audioManager.getToken(u),v&&(v.isPlaying()||n(!0),T=()=>y(),g=()=>y(),v.once("ended",T),v.once("stop",g));let b=a.events.on(L.EventTypes["event:state.player.lineEnd"],()=>{y()});return()=>{m=!0,b.cancel(),v&&T&&v.off("ended",T),v&&g&&v.off("stop",g)}},[a,u]);let d=Fo(async m=>{let v=m??u;if(!v)return r(!0),null;s.current?.isPlaying()&&s.current.stop(),r(!1);let T=v instanceof URL?fe.voice(v.toString()):typeof v=="string"?fe.voice(v):v,g=await a.getLiveGame().playSound(T);s.current=g;let y=()=>{r(!0)};return g.once("ended",y),g.once("stop",y),g},[a,u]),p=Fo(()=>u,[u]),h=Fo(()=>l,[l]),f=Fo(()=>u?.getSrc()??null,[u]);return{done:t&&i,voice:u,playVoice:d,getVoice:p,getVoiceId:h,getVoiceSrc:f}}import _r,{createContext as vp,useContext as Sp,useEffect as kc,useRef as Tp}from"react";import{useState as ap}from"react";function Oo(o){let[e]=ap(o);return e}import{AnimatePresence as cp}from"motion/react";var Ho=cp;import Ti,{createContext as mp,useContext as fp,useEffect as hp,useRef as gp}from"react";import{useEffect as yi,useLayoutEffect as lp}from"react";function up(){let o=Wt(),[e]=se();return yi(()=>o.onChange(e).cancel,[]),o.getPathname()}function pp(){let{router:o,path:e}=Si(),[t]=se();return yi(()=>o.onChange(t).cancel,[]),o.extractParams(o.getCurrentPath(),e)}function dp(){let o=Wt(),[e]=se();return yi(()=>o.onChange(e).cancel,[]),o.getQueryParams()}function Vo(o,e){let t=Wt();lp(()=>t.onUpdate(()=>o(t)).cancel,e),yi(()=>{o(t)},[])}function vi(){let o=Wt(),[e]=se();return yi(()=>o.onChange(e).cancel,[]),e}var xc=mp(null);function bi({children:o,path:e,consumedBy:t}){let i={router:Wt(),path:e,consumedBy:t};return Ti.createElement(xc,{value:i},o)}function Si(){let o=fp(xc);if(!o)throw new Error("useLayout must be used within a LayoutRouterProvider");if(o.path===null)throw new E(`Invalid useLayout call: Trying to access layout without a parent.
61
61
  This is likely caused by a nested Layout component or using Page inside a Page. `);return o}function yp({children:o,name:e,propagate:t}){let n=R(),[i]=se(),{path:r,router:s,consumedBy:a}=Si(),c=s.joinPath(r,e),l=Oo(()=>s.createToken(c+"@layout")),u=s.getCurrentPath(),d=gp(!1),p=f=>{d.current=f,i()},h=s.matchPath(u,c);if(vi(),Vo(f=>{let m=f.matchPath(f.getCurrentPath(),c);if(d.current&&!m){if(!o){p(!1);return}f.registerUnmountingPath(l)}m&&f.isPathsUnmounting()&&f.unregisterUnmountingPath(l),m&&!d.current&&!f.isTransitioning()&&p(!0)},[h,o]),hp(()=>{if(!h)return;let f=s.mount(c);return()=>{f.cancel()}},[c,s,h]),a)throw new E("[PageRouter] Layout is consumed by a different layout. This is likely caused by a nested layout inside a layout.");return Ti.createElement(bi,{path:c},Ti.createElement(Ho,{mode:"wait",propagate:t??n.config.animationPropagate,onExitComplete:()=>{s.unregisterUnmountingPath(l),p(!1)}},h&&d.current&&o))}function wc({children:o}){return vi(),Ti.createElement(bi,{path:dn.rootPath},Ti.createElement(To,{"data-layout-path":dn.rootPath,key:dn.rootPath},o))}var Jr=vp(null);function bp(){return Sp(Jr)}function Ap({children:o,name:e}){let[t]=se(),{path:n,router:i,consumedBy:r}=Si(),s=bp(),a=s?.name??e,c=a??n+"@default",l=a?i.joinPath(n,a):n,u=Oo(()=>i.createToken(l+"@page")),d=i.getCurrentPath(),p=!a,h=Tp(!1),f=g=>{h.current=g,t()},m=p&&i.exactMatch(d,n)||i.exactMatch(d,l);if(r&&r!==c)throw new E("[PageRouter] Layout Context is consumed by a different page. This is likely caused by a nested page/layout inside a page.");vi(),Vo(g=>{let y=p&&g.exactMatch(g.getCurrentPath(),n)||g.exactMatch(g.getCurrentPath(),l);if(h.current&&!y){if(!o){f(!1);return}g.registerUnmountingPath(u)}y&&g.isPathsUnmounting()&&g.unregisterUnmountingPath(u),y&&!h.current&&!g.isTransitioning()&&f(!0)},[m,o]),kc(()=>{if(!m)return;let g=p?i.mountDefaultHandler(l):i.mount(l);return i.emitOnPageMount(),()=>{g.cancel()}},[l,m]),kc(()=>()=>{i.unregisterUnmountingPath(u),f(!1)},[]);let v=_r.createElement(bi,{path:n,consumedBy:c},_r.createElement(Ho,{mode:"wait",onExitComplete:()=>{i.unregisterUnmountingPath(u),f(!1)}},m&&h.current&&o));return(g=>s?_r.createElement(Jr,{value:{name:null}},g):g)(v)}import Zr,{useCallback as Cp,useEffect as es,useImperativeHandle as xp,useMemo as Pc,useRef as ts,useState as wp}from"react";var kp=50,Pp={position:"relative",width:"100%",height:"100%",overflow:"hidden"},Ec={margin:"auto",position:"absolute",top:0,bottom:0,left:0,right:0,display:"flex",alignItems:"center",justifyContent:"center"};function Ep(o){return o?Object.entries(o).reduce((e,[t,n])=>(e[`data-${t}`]=n,e),{}):{}}function Dc(o,e){return e==null?o:Math.max(o,e)}function Dp(o,e,t){return o<=0||e<=0||t<=0?{width:o,height:e}:o/e>t?{width:e*t,height:e}:{width:o,height:o/t}}var Lc=Zr.forwardRef(function({aspectRatio:e,baseWidth:t,minWidth:n,minHeight:i,debounceMs:r,className:s,style:a,id:c,dataAttributes:l,onUpdate:u,children:d},p){let h=ts(null),[f,m]=wp({...Ec,width:"0px",height:"0px"}),v=ts(u),T=ts(null);es(()=>{v.current=u},[u]);let g=Cp(()=>{let k=h.current;if(!k)return;let w=k.clientWidth,A=k.clientHeight;if(w<=0||A<=0||e<=0)return;let x=Dp(w,A,e),O=Dc(x.width,n),U=Dc(x.height,i),ue=T.current;(!ue||ue.width!==O||ue.height!==U)&&(T.current={width:O,height:U},m({...Ec,width:`${O}px`,height:`${U}px`}));let Ne=t>0?O/t:1;v.current?.({width:O,height:U,scale:Ne,containerWidth:w,containerHeight:A})},[e,t,n,i]),y=Pc(()=>_s(g,typeof r=="number"?r:kp),[g,r]);es(()=>{g()},[g]),es(()=>{let k=new ResizeObserver(()=>{y()});h.current&&k.observe(h.current);let w=()=>{y()};return window.addEventListener("resize",w),()=>{k.disconnect(),window.removeEventListener("resize",w)}},[y]),xp(p,()=>({requestUpdate:g}),[g]);let b=Pc(()=>Ep(l),[l]);return Zr.createElement("div",{id:c,ref:h,style:Pp,...b},Zr.createElement("div",{className:s,style:{...f,...a}},d))}),Rc=Lc;function Lp(){return R().getLiveGame()}import os from"react";import Rp,{createContext as Ip,useContext as Mp,useEffect as Np,useState as Ic}from"react";var Gp={active:!1,visible:!1,sessionId:null,dialogs:[],options:null,activeDialogId:null,phase:"idle",pendingAdvance:!1,isTyping:!1},Mc=Ip({state:Gp,dialogs:[],isActive:!1,isVisible:!1,transitionOptions:null});function $t(){return Mp(Mc)}function ns(){let{dialogs:o}=$t();return o}function Fp(){let{isActive:o}=$t();return o}function Op(){let{isVisible:o}=$t();return o}function is({children:o}){let t=R().getLiveGame().getGameState(),[n,i]=Ic(()=>({...t.getNvlState(),dialogs:[...t.getNvlState().dialogs]})),[r,s]=Ic(null);Np(()=>{let c=f=>({...f,dialogs:[...f.dialogs]}),l=t.events.on(L.EventTypes["event:state.nvl.enter"],(f,m)=>{i(c(t.getNvlState())),s(m?.showTransition||null)}),u=t.events.on(L.EventTypes["event:state.nvl.exit"],()=>{i(c(t.getNvlState()))}),d=t.events.on(L.EventTypes["event:state.nvl.dialogAppend"],()=>{i(c(t.getNvlState()))}),p=t.events.on(L.EventTypes["event:state.nvl.visibilityChange"],(f,m)=>{i(c(t.getNvlState())),s(m||null)}),h=t.events.on(L.EventTypes["event:state.nvl.change"],f=>{i(c(f))});return()=>{l.cancel(),u.cancel(),d.cancel(),p.cancel(),h.cancel()}},[t]);let a={state:n,dialogs:n.dialogs,isActive:n.active,isVisible:n.visible,transitionOptions:r};return Rp.createElement(Mc.Provider,{value:a},o)}import{AnimatePresence as Hp,motion as Vp}from"motion/react";import Up from"clsx";function rs({children:o,className:e,style:t}){let{isVisible:n,transitionOptions:i}=$t(),{ratio:r}=he(),s=R(),a=i?.duration?i.duration/1e3:.3;return os.createElement(Hp,null,n&&os.createElement("div",{className:"absolute inset-0 p-6","data-element-type":"nvl-container-wrapper"},os.createElement(Vp.div,{key:"nvl-container",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:a},"data-element-type":"nvl-container",className:Up("w-full h-full overflow-auto",e),style:{transform:s.config.useAspectScale?`scale(${r.state.scale})`:void 0,transformOrigin:"top left",width:s.config.useAspectScale?s.config.width:"100%",height:s.config.useAspectScale?s.config.height:"100%",...t}},o)))}import Pn from"react";function ss({renderDialogItem:o,dialogs:e}){return Pn.createElement(rs,{className:"bg-black/80 text-white p-16 inset-8"},Pn.createElement("div",{"data-element-type":"nvl-dialog-list",className:"flex flex-col space-y-4 p-4"},(e??[]).map((n,i)=>{let r=n.entry.character?Pn.createElement(en,{className:"nvl-character-name font-bold mr-2",entry:n.entry}):null,s=Pn.createElement(fn,{className:"nvl-dialog-text",entry:n.entry,gameState:n.gameState,words:n.words,useTypeEffect:n.useTypeEffect,isActive:n.isActive});return Pn.createElement("div",{key:`${n.entry.id}:${n.isActive?"active":"idle"}`,"data-element-type":"nvl-dialog-item","data-dialog-index":i,className:"nvl-dialog-item"},o?o({entry:n.entry,index:i,isActive:n.isActive,nametag:r,texts:s}):Pn.createElement(Pn.Fragment,null,r,s))})))}import Tt,{useMemo as Wp}from"react";import Nc from"clsx";function Bp({children:o,className:e,style:t,renderDialogItem:n}){let i=ns(),{state:r}=$t();return Tt.createElement("div",{"data-element-type":"nvl-dialog-list",className:Nc("flex flex-col space-y-4 p-4",e),style:t},i.map((s,a)=>Tt.createElement("div",{key:`${s.id}:${r.activeDialogId===s.id?r.phase:"idle"}`},Tt.createElement(zp,{entry:s},n?n({entry:s,index:a,isActive:r.activeDialogId===s.id,nametag:s.character?Tt.createElement(en,{className:"nvl-character-name font-bold mr-2"}):null,texts:Tt.createElement(fn,{className:"nvl-dialog-text"})}):o?Tt.Children.map(o,c=>Tt.isValidElement(c)?Tt.cloneElement(c,{entry:s,index:a}):c):Tt.createElement(Gc,{entry:s,index:a})))))}function Gc({entry:o,index:e,className:t,style:n,texts:i}){let r=o.character?.state.name||null,s=i??Tt.createElement(fn,{className:"nvl-dialog-text"});return Tt.createElement("div",{"data-element-type":"nvl-dialog-item","data-dialog-index":e,className:Nc("nvl-dialog-item",t),style:n},r&&Tt.createElement(en,{entry:o,className:"nvl-character-name font-bold mr-2"},r,":"),s)}function zp({entry:o,children:e}){let n=R().getLiveGame().getGameState(),i=Wp(()=>o.sentence.evaluate(xe.getCtx({gameState:n})),[o.sentence,n]),r=n.getNvlState(),s=r.activeDialogId===o.id,a=s&&r.phase==="typing",c=wo({entry:o,gameState:n,words:i,isActive:s,useTypeEffect:a});return Tt.createElement(Cn,{value:c},e)}import Uo from"react";import{createPortal as Kp}from"react-dom";var as=Uo.createContext(null),$p={Portal:()=>null,measure:()=>null,container:null};function jp(){let o=Uo.useContext(as);return Uo.useMemo(()=>{if(!o)return $p;let e=t=>{let n=o.offsetWidth;return!n||!t.width?1:t.width/n};return{container:o,Portal:({children:t})=>Kp(Uo.createElement("div",{style:{position:"absolute",left:0,top:0,pointerEvents:"auto"}},t),o),measure:t=>{if(!t)return null;let n=o.getBoundingClientRect(),i=e(n),r=t.getBoundingClientRect(),s=(r.left-n.left)/i,a=(r.top-n.top)/i,c=r.width/i,l=r.height/i;return{left:s,top:a,width:c,height:l,right:s+c,bottom:a+l}}}},[o])}import{useEffect as qp}from"react";function Yp(o){let e=R();qp(()=>{if(!o)return;let t=e.getLiveGame().getGameState();if(t)return t.suspendAdvance()},[o,e])}function Oc({state:o}){let e=R(),t=Wt(),n=cs(null),i=cs(null),r=cs(!1),[s]=mn(te.Preferences.skipDelay),[a]=mn(te.Preferences.skipInterval),[c]=xn("skipAction");return Qp(()=>{if(!e.getLiveGame().gameState.playerCurrent){o.logger.warn("KeyEventAnnouncer","Failed to listen to playerElement events");return}if(!window){o.logger.warn("KeyEventAnnouncer","Failed to listen to window events");return}let u=()=>{i.current&&(clearTimeout(i.current),i.current=null),n.current&&(clearInterval(n.current),n.current=null),r.current=!1},d=h=>{if(!o.isAdvanceSuspended()&&e.keyMap.match("skipAction",h.key)&&e.preference.getPreference(te.Preferences.skip)&&!r.current){o.logger.verbose("KeyEventAnnouncer","Skipping");let f=()=>{n.current=setInterval(()=>{o.events.emit(L.EventTypes["event:state.player.skip"],!1)},a)};u(),o.events.emit(L.EventTypes["event:state.player.skip"],!1),r.current=!0,s===0?f():i.current=setTimeout(f,s)}},p=h=>{e.keyMap.match("skipAction",h.key)&&u()};if(e.config.useWindowListener){let h=e.getLiveGame().onWindowEvent("keydown",d).cancel,f=e.getLiveGame().onWindowEvent("keyup",p).cancel;return()=>{u(),h(),f()}}else{let h=e.getLiveGame().onPlayerEvent("keydown",d).cancel,f=e.getLiveGame().onPlayerEvent("keyup",p).cancel;return()=>{u(),h(),f()}}},[t,s,a,c]),Fc.createElement(Fc.Fragment,null)}import Vc,{useEffect as _p}from"react";function Hc({onStage:o,dialogShown:e,advanceSuspended:t}){return o?e?t?"ignore":"advance":"restoreDialog":"ignore"}function Jp(o){let e=o;for(;e;){if(e.hasAttribute("data-layout-path"))return!0;e=e.parentElement}return!1}var Uc=['[data-element-type="nvl-container"]','[data-element-type="nvl-dialog-list"]','[data-element-type="nvl-dialog-item"]'],Zp=["[data-layout-path]",'[data-element-type="menu"]','[data-element-type="notification"]','[data-element-type="interactive-word"]','[data-element-type="dialog-overlay"]'];function ed(o,e){return!o||e&&Uc.some(t=>!!o.closest(t))?!1:[...Zp,...Uc].some(t=>!!o.closest(t))}function Wc(o,e){if(!e)return!1;let t=e.getBoundingClientRect();return o.clientX>=t.left&&o.clientX<=t.right&&o.clientY>=t.top&&o.clientY<=t.bottom}function Bc({state:o}){let e=R();return _p(()=>{let t=e.getLiveGame().gameState?.playerCurrent;if(!t){o.logger.warn("StageClickAnnouncer","Failed to listen to playerElement events");return}let n=i=>{let r=i.target;if(!r||!t.contains(r)||!Wc(i,t))return;let s=o.mainContentNode;if(s&&(!s.contains(r)||!Wc(i,s))||Jp(r)||ed(r,o.isNvlMode()))return;let a=Hc({onStage:!0,dialogShown:e.preference.getPreference(te.Preferences.showDialog),advanceSuspended:o.isAdvanceSuspended()});if(a!=="ignore"){if(a==="restoreDialog"){e.preference.setPreference(te.Preferences.showDialog,!0);return}o.events.emit(L.EventTypes["event:state.player.stageClick"]),o.recordStageClick()}};if(e.config.useWindowListener){let i=e.getLiveGame().onWindowEvent("click",n);return()=>{i.cancel()}}else{let i=e.getLiveGame().onPlayerEvent("click",n);return()=>{i.cancel()}}},[e,o]),Vc.createElement(Vc.Fragment,null)}import{useEffect as zc}from"react";function ls({gameState:o}){let e=o.audioManager,[t,n]=mn("globalVolume");return zc(()=>{n(e.getGlobalVolume())},[]),zc(()=>{e.setGlobalVolume(t)},[t]),null}import{useEffect as Wo,useRef as td}from"react";function Kc(o){let e=Re.catSrc(o.srcManager?.src||[]),t=Re.catSrc(o.srcManager?.getFutureSrc()||[]),n=[],i=[],r=new Set;for(let s of e.image){let a=Re.getSrc(s);!a||r.has(a)||(r.add(a),n.push(a))}for(let s of t.image){let a=Re.getSrc(s);!a||r.has(a)||(r.add(a),i.push(a))}return{critical:n,lookAhead:i,all:[...n,...i],criticalAudio:e.audio}}function $c({state:o}){let{preloaded:e,cacheManager:t}=Kt(),n=R(),i=td(new Set),[r]=se(),s="Preload",a=o.getLastScene()||o.getPreloadingScene(),c=n.getLiveGame().stackModel?.getTopSync()?.node?.action||null,l=n.getLiveGame().story;function u(){o.logger.debug(s,"Preload unmounted"),e.events.emit($e.EventTypes["event:preloaded.unmount"])}return Wo(()=>o.events.on(L.EventTypes["event:state:flushPreloadedScenes"],()=>{r()}).cancel,[]),Wo(()=>{if(typeof fetch>"u")return e.events.emit($e.EventTypes["event:preloaded.complete"]),e.events.emit($e.EventTypes["event:preloaded.ready"]),o.logger.warn(s,"Fetch is not supported in this environment, skipping preload"),u;if(!n.config.preloadAllImages)return e.events.emit($e.EventTypes["event:preloaded.complete"]),e.events.emit($e.EventTypes["event:preloaded.ready"]),o.logger.debug(s,"Preload all images is disabled, skipping preload"),u;if(n.config.forceClearCache&&(t.clear(),o.logger.weakWarn(s,"Cache cleared")),!l||!a)return l?o.logger.debug(s,"Scene not ready yet, waiting for scene before preload"):o.logger.weakWarn(s,"Story not found, skipping preload"),u;let d=performance.now(),p=Kc(a),h=new Dn(n.config.preloadConcurrency,0),f=new Dn(n.config.preloadConcurrency,n.config.preloadDelay),m=o.logger.group(s,!0),v=!1;o.logger.debug(s,"preloading:",p,a);let T=(g,y,b,k)=>{y.forEach((w,A)=>{if(t.has(w)||t.isPreloading(w)){o.logger.debug(s,`Image already loaded (${b} ${A+1}/${y.length})`,w);return}g.addTask(()=>new Promise(x=>{t.preload(o,w,{retainDecoded:k}).onFinished(()=>{o.logger.debug(s,`Image loaded (${b} ${A+1}/${y.length})`,w),x()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${b} ${A+1}/${y.length})`,w),x()})}))})};T(h,p.critical,"first scene",!0),T(f,p.lookAhead,"look-ahead",!1);for(let g of p.criticalAudio)o.audioManager.preload(g);return m.end(),h.start().then(async()=>{o.logger.info(s,"Image preload (first scene)",`loaded ${t.size()} images in ${performance.now()-d}ms`),e.events.emit($e.EventTypes["event:preloaded.complete"]),n.config.waitForPreload&&e.events.emit($e.EventTypes["event:preloaded.ready"]),!v&&(await f.start(),!v&&(o.logger.info(s,"Image preload (look-ahead)",`loaded ${t.size()} images in ${performance.now()-d}ms`),t.filter(p.all)))}),n.config.waitForPreload||e.events.emit($e.EventTypes["event:preloaded.ready"]),e.events.emit($e.EventTypes["event:preloaded.mount"]),()=>{v=!0,u()}},[a,l]),Wo(()=>{i.current.clear()},[a]),Wo(()=>{if(typeof fetch>"u"||n.config.preloadAllImages)return;if(!l){o.logger.weakWarn(s,"Story not found, skipping preload");return}let d=performance.now(),p=n.getLiveGame().getAllPredictableActions(l,c,n.config.maxPreloadActions).map(g=>Re.getPreloadableSrc(l,g)).filter(function(g){return g!==null});p.filter(function(g){return g?.activeType==="scene"}).forEach(g=>{i.current.has(g)||i.current.add(g)});let f=Re.catSrc([...i.current,...p]),m=new Dn(n.config.preloadConcurrency,n.config.preloadDelay),v=[],T=o.logger.group(s);o.logger.debug(s,"preloading:",f);for(let g of f.image){let y=Re.getSrc(g);if(y){if(v.push(y),t.has(y)||t.isPreloading(y)){o.logger.debug(s,`Image already loaded (${f.image.indexOf(g)+1}/${f.image.length})`,y);continue}m.addTask(()=>new Promise(b=>{t.preload(o,y).onFinished(()=>{o.logger.debug(s,`Image loaded (${f.image.indexOf(g)+1}/${f.image.length})`,y),b()}).onErrored(()=>{o.logger.weakError(s,`Failed to preload image (${f.image.indexOf(g)+1}/${f.image.length})`,y),b()})}))}}T.end(),m.start().then(()=>{o.logger.info(s,"Image preload (quick reload)",`loaded ${t.size()} images in ${performance.now()-d}ms`),t.filter(v)})},[c,l]),null}import Ai from"react";import zo from"react";import us,{useEffect as ps,useLayoutEffect as ds,useRef as Bo,useState as ms}from"react";function jt({element:o,state:e,skipTransform:t,skipTransition:n,overwriteDefinition:i,onTransform:r,onTransition:s,transitionsProps:a=[],propOverwrite:c,companionRefs:l}){let[u,d]=ms(null),[p,h]=ms(null),f=Bo(null),m=us.useRef(null),[v]=ms(()=>new Vi("displayable.refGroup")),T=Bo(v.next()),g=Bo(rt()),b=R().getLiveGame().getGameState(),k=typeof a=="function"?a(u):a,[w]=se([p,u,g]);ps(()=>b.events.depends([b.events.on(L.EventTypes["event:state.player.skip"],ft)]).cancel,[p,u,g]),ds(()=>{if(U(),!u)return;if(g.current.some(([M])=>!M.current))throw new E("Displayable: Trying to access transition groups before they are mounted");let{controller:I,task:F}=u,D=M=>{g.current.forEach(([ge],De)=>{let st=F.resolve[De],Ge=typeof st=="function"?st:st.resolver;if(!Ge)throw new E(`Displayable: Trying to resolve element props but found no resolver. (reading: transitionTask.task.resolve[${De}])`);let Ri=Ge(...M),ir=q(k[De]||k[k.length-1]||{},Ri);Ne(ge,c?c(ir):ir)})},K=I.onUpdate(D);D(F.animations.map(M=>M.start));let ae=!1;return Promise.all(g.current.map(([M])=>{let ge=M.current;return ge?.waitForLoad?ge.waitForLoad():Promise.resolve()})).then(()=>{ae||I.start()}),()=>{ae=!0,K.cancel()}},[u]),ps(()=>{if(!m.current)throw new Error(`Scope not ready. Using element: ${o.constructor.name}`)},[]),ds(()=>{let I=e.toStyle(b,i);return Object.assign(m.current.style,I),O(),b.logger.debug("Displayable","Initial style applied",m.current,I),bt(),()=>{_e()}},[]);let A=Bo(()=>{});A.current=()=>{u||!m.current||(U(),!(p||f.current)&&(Object.assign(m.current.style,e.toStyle(b,i)),O()))},ds(()=>{f.current&&!o._getLoop()&&_e(),A.current()});let{ratio:x}=he();ps(()=>x.onUpdate(()=>{A.current(),requestAnimationFrame(()=>A.current())}),[x]);function O(){if(l)for(let{ref:I,project:F}of l)I.current&&Object.assign(I.current.style,F(e.get()))}function U(){let I=typeof a=="function"?a(u):a;if(!g.current||!g.current.length)throw new E("Displayable: Transition group refs are not initialized correctly");g.current.some(([F])=>!F.current)||g.current.forEach(([F],D)=>{Ne(F,I[D]||I[I.length-1]||{})})}function ue(I){b.logger.debug("Displayable","Transform applied",e.toStyle(b,i),m.current),w(),r?.(I)}function Ne(I,F){if(!I.current)throw new E("Displayable: Trying to assign properties to unmounted element");oo(I.current,F,c)}function _e(){f.current&&(f.current.stop(),f.current=null,b.logger.debug("Displayable","Loop stopped",o))}function bt(){let I=o._getLoop();if(!I){_e();return}f.current||At(I.transform,I.options)}function At(I,F){p&&(p.abort(),h(null)),_e(),m.current&&(f.current=I.startLoop(e,{gameState:b,ref:m,overwrites:i,companionRefs:l},F))}function gn(I,F){return mt(new Z({},{duration:I?.duration??0,ease:I?.ease??"linear"}),F)}function mt(I,F){p&&(p.abort(),h(null)),_e();let D=I.animate(e,{gameState:b,ref:m,overwrites:i,companionRefs:l}),K=new we(D);return b.timelines.attachTimeline(K),D.onSkipControllerRegister(ae=>{ae.onAbort(()=>{K.abort(),h(null)})}),h(D),D.then(()=>{h(null),ue(I),F(),bt()}),K}function B(I,F){u&&u.controller.complete();let D=I.createTask(b),K=I.requestAnimations(D.animations),ae=new S().registerSkipController(new V(K.cancel)),M=new we(ae);ae.skipController.onAbort(()=>{K.cancel()}),K.onCanceled(()=>{M.abort(),d(null),b.logger.debug("Displayable","Transition cancelled",I)}),K.onComplete(()=>{Ue(),d(null),s?.(I),F(),ae.resolve()}),b.timelines.attachTimeline(M),d({task:D,controller:K,transition:I,resolve:F});let ge;if(g.current=D.resolve.map(De=>{let st=us.createRef(),Ge=typeof De=="function"?void 0:De.key;if(!Ge)return[st,v.next()];if(Ge==="target")return ge=v.next(),[st,ge];if(Ge==="current")return[st,T.current];throw new E("Displayable: Invalid key type")}),!ge)throw new E("Displayable: No target key found");return T.current=ge,M}function Ee(I){return b.logger.debug("initDisplayable",o),mt(Z.immediate(e.get()),I)}function ft(){t&&p&&(p.abort(),h(null),b.logger.debug("transform skipped")),n&&u&&(u.controller.complete(),b.logger.debug("transition skipped"))}function rt(){return[[us.createRef(),T.current]]}function Ue(){g.current.forEach(([I])=>{I.current=null}),g.current=rt()}return{transformRef:m,transitionRefs:g.current,transitionTask:u,initDisplayable:Ee,applyTransform:mt,applyTransition:B,applyLoop:At,stopLoop:gn,updateStyleSync:U,flush:w,deps:[p,u,g]}}import{useEffect as nd}from"react";function xt(o,e,t=[]){let i=R().getLiveGame().getGameState();return nd(()=>{let r=typeof e=="function"?e():e;return i.mountState(o,r).unMount},[...t]),[]}function fs({state:o,text:e}){let{ratio:t}=he(),[n]=se(),{transformRef:i,transitionRefs:r,initDisplayable:s,applyTransform:a,applyLoop:c,stopLoop:l,applyTransition:u,updateStyleSync:d,deps:p}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipTextTransform,skipTransition:o.game.config.allowSkipTextTransition,overwriteDefinition:{overwrite:h=>({width:"fit-content",transform:Z.propToCSSTransform(o,h,{translate:[e.config.alignX==="left"?"0%":e.config.alignX==="right"?"-100%":void 0,e.config.alignY==="top"?"100%":e.config.alignY==="bottom"?"0%":void 0]})})},transitionsProps:[{style:{width:"fit-content",whiteSpace:"nowrap",transform:`scale(${t.state.scale})`,transformOrigin:`${e.config.alignX} ${e.config.alignY}`,fontSize:`${e.state.fontSize}px`}}]});return xt(e,{initDisplayable:s,applyTransform:a,applyLoop:c,stopLoop:l,applyTransition:u,flush:n,updateStyleSync:d},[...p]),zo.createElement(zt.Div,{"data-element-type":"text"},zo.createElement(zt.mDiv,{tag:"text.container",color:"green",border:"dashed",ref:i,className:"absolute"},r.map(([h,f])=>zo.createElement("span",{key:f,ref:h,className:e.config.className},zo.createElement("span",null,e.state.text)))))}import Mt,{forwardRef as od,useCallback as qc,useImperativeHandle as rd,useRef as jo,useState as Yc}from"react";import Ko,{useEffect as hs,useRef as zn,forwardRef as id}from"react";var jc=id(({onSizeChanged:o,onLoad:e,autoFit:t=!1,src:n,style:i},r)=>{let s=zn(null),{ratio:a}=he(),[c,l]=Ko.useState(0),[u,d]=Ko.useState(0),p=zn(null),h=zn(null),f=R(),m=zn(!1),v=zn(null),T=zn(null);Ko.useImperativeHandle(r,()=>s.current,[]),hs(()=>{s.current&&Object.defineProperties(s.current,{isLoaded:{value:()=>m.current,configurable:!0},waitForLoad:{value:()=>{let k=()=>{let w=s.current;return!w||typeof w.decode!="function"?Promise.resolve():w.decode().catch(()=>{})};return m.current?k():(v.current||(v.current=new Promise(w=>{T.current=w})),v.current.then(k))},configurable:!0}})},[]),hs(()=>(g(),a.onUpdate(g)),[o]),hs(()=>{let k=new MutationObserver(w=>{w.forEach(A=>{A.type==="attributes"&&A.attributeName==="src"&&s.current&&g()})});return s.current&&k.observe(s.current,{attributes:!0}),()=>{k.disconnect()}},[o]);function g(){if(s.current&&s.current.naturalWidth){let k,w,A;if(s.current.naturalWidth*s.current.naturalHeight===1)k=a.state.width,w=a.state.height,A=`${k} / ${w}`;else{let ue=t?f.config.width/s.current.naturalWidth:1;k=s.current.naturalWidth*a.state.scale*ue,w=s.current.naturalHeight*a.state.scale*ue,A="auto"}let x=p.current,O=!x||x.w!==k||x.h!==w||x.ar!==A,U=!!o&&h.current!==o;if(!O&&!U)return;O&&(p.current={w:k,h:w,ar:A},l(k),d(w),s.current.style.aspectRatio=A),o&&(h.current=o,o(k,w))}}function y(){g(),m.current=!0,T.current&&(T.current(),T.current=null,v.current=null),e&&e()}function b(){m.current=!0,T.current&&(T.current(),T.current=null,v.current=null)}return Ko.createElement("img",{ref:s,onLoad:y,onError:b,width:c,height:u,alt:"",src:n,style:i})});jc.displayName="AspectScaleImage";var $o=jc;import Xc from"clsx";import{motion as sd}from"motion/react";var ad={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"},Qc=od(({src:o,autoFit:e,resolveSrc:t,onSizeChanged:n,onLoad:i},r)=>{let s=jo(null),a=jo([]),c=o.findIndex(l=>l!==null);return rd(r,()=>Object.assign(s.current,{isLoaded:()=>a.current.every(l=>!l?.isLoaded||l.isLoaded()),waitForLoad:()=>Promise.all(a.current.map(l=>l?.waitForLoad?l.waitForLoad():Promise.resolve())).then(()=>{})}),[]),Mt.createElement("div",{ref:s},o.map((l,u)=>l===null?null:Mt.createElement($o,{key:"layer-"+u,ref:d=>{a.current[u]=d},src:t(l),style:ad,autoFit:e,onSizeChanged:u===c?n:void 0,onLoad:u===c?i:void 0})))});Qc.displayName="LayerStack";function cd(o){return{willChange:"filter, opacity",position:"absolute",top:0,left:0,right:0,bottom:0,transform:"none",translate:"none",opacity:1,clipPath:"none",maskImage:"none",WebkitMaskImage:"none",maskSize:"auto",WebkitMaskSize:"auto",maskRepeat:"repeat",WebkitMaskRepeat:"repeat",filter:`brightness(${1-o})`}}function ld(o){return N.isStaticSrc(o)?o.state.currentSrc:N.getSrcURL(o)??void 0}var ud={position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none"};function pd({image:o,state:e}){let[t]=Yc(()=>new _),[n,i]=Yc([]),{cacheManager:r}=Kt(),s=jo([]),a=jo(null),c=N.isLayeredSrc(o)?N.getSrcURLs(o):null;function l(A){return!P.isDataURI(A)&&!r.has(A)&&!r.isPreloading(A)&&!s.current.includes(A)&&(e.game.getLiveGame().getGameState()?.logger.warn("Image",`Image not preloaded: "${A}".
62
62
  This may be caused by complicated image action behavior that cannot be predicted.
63
- To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(A)),r.get(A)||A}let{transformRef:u,transitionRefs:d,transitionTask:p,initDisplayable:h,applyTransition:f,applyTransform:m,applyLoop:v,stopLoop:T,updateStyleSync:g,flush:y,deps:b}=jt({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:A=>{if(c)return(A?A.task.resolve:[null]).map(U=>U&&typeof U=="function"?{style:ud}:{style:cd(o.state.darkness)});let x=A?A.transition._getCurrentSrc():ld(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:P.isColor(x)?P.colorToString(x):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:P.isImageSrc(x)?P.srcToURL(x):N.DefaultImagePlaceholder},{style:{willChange:"filter",position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none",filter:"brightness(1)"}}]},propOverwrite:A=>A.src?{...A,src:l(A.src)}:A});xt(o,{createWearable:A=>{i(x=>[...x,A])},disposeWearable:A=>{i(x=>x.filter(O=>O.getId()!==A.getId()))},initDisplayable:h,applyTransform:m,applyLoop:v,stopLoop:T,applyTransition:f,events:t,updateStyleSync:g,flush:y},[...b]);let k=qc((A,x)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${A}px`,height:`${x}px`}))},[t]),w=qc(()=>{t.emit("event:image.onLoad")},[t]);return Mt.createElement(sd.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},Mt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},c?d.map(([A,x],O)=>{let U=p?p.task.resolve[O]:null;if(U&&typeof U=="function")return Mt.createElement($o,{key:x,ref:A,autoFit:o.config.autoFit});let ue=U?U.key==="target"?p.transition._getTargetLayers():p.transition._getPrevLayers():c;return Mt.createElement(Qc,{key:x,ref:A,src:ue||c,autoFit:o.config.autoFit,resolveSrc:l,onSizeChanged:O===0?k:void 0,onLoad:O===0?w:void 0})}):d.map(([A,x],O)=>Mt.createElement($o,{key:x,ref:A,autoFit:o.config.autoFit,onSizeChanged:O===0?k:void 0,onLoad:O===0?w:void 0})),Mt.createElement("div",{className:Xc("w-full h-full top-0 left-0 absolute")},n.map(A=>Mt.createElement("div",{className:Xc("w-full h-full relative"),key:"wearable-"+A.getId()},Mt.createElement(_c,{image:A,state:e}))))))}var _c=Mt.memo(pd),Jc=_c;import Yo,{useEffect as el,useMemo as gd,useRef as gs}from"react";var dd=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,md=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function Zc(o,e){if(typeof e!="string"||!e.length)return o;if(dd.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=fd(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+hd(r+e.replace(/\\/g,"/"))}function fd(o){let e=md.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function hd(o){let e=o.split("/"),t=[];for(let n=0;n<e.length;n++){let i=e[n];if(!(i==="."||i===""&&n!==e.length-1)){if(i===".."){t.pop();continue}t.push(i)}}return t.join("/")}var qo=class{constructor(){this.backends=new Map;this.reportedMissing=new Set}register(e){if(!e||typeof e.name!="string"||!e.name.length)throw new Error("A puppet backend must have a non-empty name.");if(typeof e.mount!="function")throw new Error(`Puppet backend "${e.name}" must implement mount().`);return this.backends.set(e.name,e),this.reportedMissing.delete(e.name),this}get(e){return this.backends.get(e)||null}has(e){return this.backends.has(e)}list(){return Array.from(this.backends.keys())}unregister(e){return this.backends.delete(e)}reportMissing(e,t){return this.reportedMissing.has(e)?!1:(this.reportedMissing.add(e),t(`No puppet backend is registered under "${e}". The element keeps its place on the stage, its transform and its saved state, but draws nothing. Register one with game.registerPuppetBackend({name, mount}) before the game mounts.`),!0)}};function ys({state:o,puppet:e}){let[t]=se(),{cacheManager:n}=Kt(),i=gs(null),r=gd(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=gs(r);s.current=r;let{transformRef:a,transitionRefs:c,initDisplayable:l,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,deps:m}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipImageTransform,skipTransition:o.game.config.allowSkipImageTransition,transitionsProps:[{style:{position:"relative",width:`${r.width}px`,height:`${r.height}px`}}]});xt(e,{initDisplayable:l,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,flush:t},[...m]),el(()=>{let g=i.current;if(!g)return;let y=o.game,b=e.config.backend,k=y.getPuppetBackend(b);if(!k)return e._setStatus("missing-backend"),y.getPuppetBackendRegistry().reportMissing(b,x=>{o.logger.warn("Puppet",x)}),()=>{e._setStatus("unmounted")};let w;try{w=k.mount(g,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:T,resolveSibling:x=>T(Zc(e.config.src,x)),warn:(x,O)=>{o.logger.warn("Puppet",x,O)}})}catch(x){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" threw while mounting "${e.config.src}"`,x),()=>{e._setStatus("unmounted")}}let A=!1;return e._attachInstance(w),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!A&&typeof w.ready=="function"?w.ready():void 0).then(()=>{A||e._setStatus("ready")}).catch(x=>{A||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" failed to load "${e.config.src}"`,x))}),()=>{A=!0,e._attachInstance(null),e._setStatus("unmounted");try{w.dispose()}catch(x){o.logger.error("Puppet",`Backend "${b}" threw while disposing`,x)}}},[]);let v=gs(r);el(()=>{let g=v.current;if(g.width===r.width&&g.height===r.height)return;v.current=r;let y=e._getInstance();if(!(!y||typeof y.resize!="function"))try{y.resize(r)}catch(b){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,b)}},[r]);function T(g){return P.isDataURI(g)?g:n.get(g)||g}return Yo.createElement(zt.Div,{"data-element-type":"puppet"},Yo.createElement(zt.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},c.map(([g,y])=>Yo.createElement("div",{key:y,ref:g,className:e.config.className},Yo.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function vs({state:o,displayable:e}){return Ai.createElement(Ai.Fragment,null,e.map(t=>{if(t instanceof An)return Ai.createElement(fs,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof N)return Ai.createElement(Jc,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Dt)return Ai.createElement(ys,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import Xo,{useEffect as yd}from"react";import{motion as vd}from"motion/react";function tl({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:c,stopLoop:l,updateStyleSync:u,deps:d}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return xt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:c,stopLoop:l,updateStyleSync:u},[...d]),yd(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),Xo.createElement(Xo.Fragment,null,Xo.createElement(vd.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([p,h])=>Xo.createElement("div",{className:"relative w-full h-full",ref:p,key:h},t))))}async function nl(o,e,t,n){let i=e.state.backgroundMusic,r=i&&o.audioManager.isManaged(i)?o.audioManager.stop(i,n):null;if(r&&t===i&&await r,t)try{await o.audioManager.playSoundToken(t,{end:t.state.volume,duration:n}),e.state.backgroundMusic=t}catch{e.state.backgroundMusic=null}else e.state.backgroundMusic=null;r&&await r}import Sd from"clsx";import{useEffect as Ss,useRef as Td}from"react";import Ts from"react";function bs({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=Td(null);return Ss(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),Ss(()=>n.events.depends([n.events.on(Ye.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),Ss(()=>(n.events.emit(Ye.EventTypes["event:scene.mount"]),o.events.emit(L.EventTypes["event:state.scene.mount"],n),o.logger.debug("Scene","Scene mounted",n.getId()),()=>{n.events.emit(Ye.EventTypes["event:scene.unmount"]),o.events.emit(L.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),xt(n,{setBackgroundMusic(s,a){return nl(o,n,s,a)}}),Ts.createElement("div",{className:Sd(e,"w-full h-full absolute"),ref:r,"data-element-type":"scene","data-scene-id":n.getId()},[...i.entries()].sort(([s],[a])=>s.state.zIndex-a.state.zIndex).map(([s,a])=>Ts.createElement(tl,{state:o,layer:s,key:s.getId()},Ts.createElement(vs,{state:o,displayable:a}))))}import{AnimatePresence as xd}from"motion/react";import{useEffect as wd,useReducer as kd,useRef as Ci}from"react";import bd from"clsx";import qt,{useCallback as As,useMemo as Ad,useRef as Cd}from"react";function Cs({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=R(),a=Cd([]),c=As(f=>(a.current.push(f),a.current.indexOf(f)),[]),l=As(f=>{let m=a.current.indexOf(f);m!==-1&&a.current.splice(m,1)},[]),u=As(f=>a.current.indexOf(f),[]),d=s.config.menu,p=Ad(()=>e.map(f=>({...f,words:f.prompt.evaluate(xe.getCtx({gameState:n}))})),[]);function h(f){t(f)}return qt.createElement(qt.Fragment,null,qt.createElement(Kr,{value:{evaluated:p,choose:h,gameState:n}},qt.createElement(jr,{value:{register:c,unregister:l,getIndex:u}},qt.createElement(Bt,{className:"absolute"},r&&o&&qt.createElement(fi,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),qt.createElement(zt.Div,{color:"green",border:"dashed",className:bd("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},qt.createElement(d,{items:p.map((f,m)=>m)})))))}function il({items:o}){return qt.createElement(bo,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>qt.createElement(Io,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Pd from"clsx";import xi from"react";var ol=120;function rl({sources:o,menuCount:e,presence:t,retained:n,lastActive:i,sceneId:r}){if(o.length===0){let c=n??(i.length>0?i.map(l=>({...l,active:!1})):null);return{items:c??[],retained:c,lastActive:i,retaining:c!==null,interactive:e>0}}let s=new Set(o.map(({slot:c})=>c));for(let[c,l]of Array.from(t.slotKeys))s.has(c)||(t.exitingKeys.add(l),t.slotKeys.delete(c));let a=o.map(({slot:c,...l})=>{let u=t.slotKeys.get(c);return(!u||t.exitingKeys.has(u))&&(u=`say-${r}-${t.nextKey++}`,t.slotKeys.set(c,u)),{...l,presenceKey:u,slot:c,active:!0}});return{items:a,retained:null,lastActive:a,retaining:!1,interactive:!0}}function xs({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=Ci(!1),a=Ci({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),c=Ci([]),l=Ci(null),u=Ci(null),[,d]=kd(T=>T+1,0),p=()=>{u.current&&(clearTimeout(u.current),u.current=null)},h=()=>{let T=l.current;if(!T)return;let g=a.current;T.forEach(({slot:y,presenceKey:b})=>{g.slotKeys.get(y)===b&&g.slotKeys.delete(y),g.exitingKeys.add(b)}),l.current=null,u.current=null,c.current=[],d()};wd(()=>()=>{p()},[]);let f=a.current,m=i.length>0?i.map(({action:T,onClick:g},y)=>({action:T,slot:y,useTypeEffect:!s.current,onFinished:b=>{b!==void 0&&(s.current=b),g(),o.events.emit(L.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((T,g)=>{if(!T.action.prompt||!T.action.words)return[];let y=f.menuPromptIds.get(T);return y||(y=`menu-prompt-${n.getId()}-${f.nextKey++}`,f.menuPromptIds.set(T,y)),[{action:{sentence:T.action.prompt,words:T.action.words,character:null,id:y},slot:g,useTypeEffect:!1}]}),v=rl({sources:m,menuCount:r.length,presence:f,retained:l.current,lastActive:c.current,sceneId:n.getId()});return l.current=v.retained,c.current=v.lastActive,v.retaining?u.current||(u.current=setTimeout(h,ol)):p(),xi.createElement("div",{className:Pd(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs",style:{pointerEvents:v.interactive?"auto":"none"}},xi.createElement(xd,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{a.current.exitingKeys.clear()}},v.items.map(({action:T,onFinished:g,presenceKey:y,active:b,useTypeEffect:k})=>xi.createElement(fi,{gameState:o,key:y,action:T,active:b,onFinished:g,useTypeEffect:k}))),r.map(({action:T,onClick:g},y)=>xi.createElement("div",{key:"menu-"+y,"data-element-type":"menu"},xi.createElement(Cs,{state:o,prompt:T.prompt,choices:T.choices,renderPrompt:!T.prompt,afterChoose:b=>{s.current=!1,g(b),o.stage.next()},words:T.words}))))}import hn,{useEffect as Ed,useRef as ws}from"react";import{motion as Dd}from"motion/react";function sl({state:o,camera:e,children:t}){let n=ws(null),i=ws(null),r=ws(null),{transformRef:s,transitionRefs:a,initDisplayable:c,applyTransition:l,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h,deps:f}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:Da},{ref:i,project:Pa},{ref:r,project:Ea}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return xt(e,{initDisplayable:c,applyTransition:l,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h},[...f]),Ed(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),hn.createElement(hn.Fragment,null,hn.createElement(Dd.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,v])=>hn.createElement("div",{className:"relative w-full h-full",ref:m,key:v},t))),hn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},hn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),hn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),hn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import Ld from"react";import{useEffect as ks,useRef as Rd}from"react";import{useCallback as al}from"react";function cl(o){let e=al(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=al(()=>{if(!o.current)return;let n=o.current;n.style.opacity="0",n.style.pointerEvents="none",n.style.visibility="hidden"},[o]);return{show:e,hide:t}}function Ps({gameState:o,video:e}){let t=Rd(null),{show:n,hide:i}=cl(t);ks(()=>o.events.depends([o.events.on(L.EventTypes["event:state.player.skip"],()=>{o.game.config.allowSkipVideo&&(r(),o.logger.log("NarraLeaf-React: Video","Skipped"))})]).cancel,[]),ks(()=>{i(),e.state.display&&n()},[]),ks(()=>{if(!t.current)return;let s=t.current,a=!1,c=new Set,l=()=>new E(`Failed to add event listener, ref is not available
63
+ To fix this issue, you can manually register the image using scene.preloadImage(YourImageSrc). `),s.current.push(A)),r.get(A)||A}let{transformRef:u,transitionRefs:d,transitionTask:p,initDisplayable:h,applyTransition:f,applyTransform:m,applyLoop:v,stopLoop:T,updateStyleSync:g,flush:y,deps:b}=jt({element:o,state:o.transformState,skipTransform:e.game.config.allowSkipImageTransform,skipTransition:e.game.config.allowSkipImageTransition,transitionsProps:A=>{if(c)return(A?A.task.resolve:[null]).map(U=>U&&typeof U=="function"?{style:ud}:{style:cd(o.state.darkness)});let x=A?A.transition._getCurrentSrc():ld(o);return[{style:{willChange:"filter",position:"absolute",transformOrigin:"center",backgroundColor:P.isColor(x)?P.colorToString(x):void 0,transform:"none",top:"auto",left:"auto",right:"auto",bottom:"auto",filter:`brightness(${1-o.state.darkness})`},src:P.isImageSrc(x)?P.srcToURL(x):N.DefaultImagePlaceholder},{style:{willChange:"filter",position:"absolute",transformOrigin:"center",transform:"translate(-50%, -50%)",top:"50%",left:"50%",right:"auto",bottom:"auto",maxWidth:"none",maxHeight:"none",filter:"brightness(1)"}}]},propOverwrite:A=>A.src?{...A,src:l(A.src)}:A});xt(o,{createWearable:A=>{i(x=>[...x,A])},disposeWearable:A=>{i(x=>x.filter(O=>O.getId()!==A.getId()))},initDisplayable:h,applyTransform:m,applyLoop:v,stopLoop:T,applyTransition:f,events:t,updateStyleSync:g,flush:y},[...b]);let k=qc((A,x)=>{a.current&&(t.emit("event:image.onLoad"),Object.assign(a.current.style,{width:`${A}px`,height:`${x}px`}))},[t]),w=qc(()=>{t.emit("event:image.onLoad")},[t]);return Mt.createElement(sd.div,{ref:u,className:"absolute w-max h-max","data-element-type":"image"},Mt.createElement("div",{className:"relative h-full w-full",ref:a,"data-image-id":o.getId()},c?d.map(([A,x],O)=>{let U=p?p.task.resolve[O]:null;if(U&&typeof U=="function")return Mt.createElement($o,{key:x,ref:A,autoFit:o.config.autoFit});let ue=U?U.key==="target"?p.transition._getTargetLayers():p.transition._getPrevLayers():c;return Mt.createElement(Qc,{key:x,ref:A,src:ue||c,autoFit:o.config.autoFit,resolveSrc:l,onSizeChanged:O===0?k:void 0,onLoad:O===0?w:void 0})}):d.map(([A,x],O)=>Mt.createElement($o,{key:x,ref:A,autoFit:o.config.autoFit,onSizeChanged:O===0?k:void 0,onLoad:O===0?w:void 0})),Mt.createElement("div",{className:Xc("w-full h-full top-0 left-0 absolute")},n.map(A=>Mt.createElement("div",{className:Xc("w-full h-full relative"),key:"wearable-"+A.getId()},Mt.createElement(_c,{image:A,state:e}))))))}var _c=Mt.memo(pd),Jc=_c;import Yo,{useEffect as el,useMemo as gd,useRef as gs}from"react";var dd=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:|\/)/,md=/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\/[^/]*\/?/;function Zc(o,e){if(typeof e!="string"||!e.length)return o;if(dd.test(e)||typeof o!="string"||o.startsWith("data:"))return e;let[t,n]=fd(o.replace(/\\/g,"/")),i=n.replace(/[?#].*$/,""),r=i.slice(0,i.lastIndexOf("/")+1);return t+hd(r+e.replace(/\\/g,"/"))}function fd(o){let e=md.exec(o);return e?[e[0],o.slice(e[0].length)]:o.startsWith("/")?["/",o.slice(1)]:["",o]}function hd(o){let e=o.split("/"),t=[];for(let n=0;n<e.length;n++){let i=e[n];if(!(i==="."||i===""&&n!==e.length-1)){if(i===".."){t.pop();continue}t.push(i)}}return t.join("/")}var qo=class{constructor(){this.backends=new Map;this.reportedMissing=new Set}register(e){if(!e||typeof e.name!="string"||!e.name.length)throw new Error("A puppet backend must have a non-empty name.");if(typeof e.mount!="function")throw new Error(`Puppet backend "${e.name}" must implement mount().`);return this.backends.set(e.name,e),this.reportedMissing.delete(e.name),this}get(e){return this.backends.get(e)||null}has(e){return this.backends.has(e)}list(){return Array.from(this.backends.keys())}unregister(e){return this.backends.delete(e)}reportMissing(e,t){return this.reportedMissing.has(e)?!1:(this.reportedMissing.add(e),t(`No puppet backend is registered under "${e}". The element keeps its place on the stage, its transform and its saved state, but draws nothing. Register one with game.registerPuppetBackend({name, mount}) before the game mounts.`),!0)}};function ys({state:o,puppet:e}){let[t]=se(),{cacheManager:n}=Kt(),i=gs(null),r=gd(()=>e._resolveSize({width:o.game.config.width,height:o.game.config.height}),[e,o.game.config.width,o.game.config.height]),s=gs(r);s.current=r;let{transformRef:a,transitionRefs:c,initDisplayable:l,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,deps:m}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipImageTransform,skipTransition:o.game.config.allowSkipImageTransition,transitionsProps:[{style:{position:"relative",width:`${r.width}px`,height:`${r.height}px`}}]});xt(e,{initDisplayable:l,applyTransform:u,applyLoop:d,stopLoop:p,applyTransition:h,updateStyleSync:f,flush:t},[...m]),el(()=>{let g=i.current;if(!g)return;let y=o.game,b=e.config.backend,k=y.getPuppetBackend(b);if(!k)return e._setStatus("missing-backend"),y.getPuppetBackendRegistry().reportMissing(b,x=>{o.logger.warn("Puppet",x)}),()=>{e._setStatus("unmounted")};let w;try{w=k.mount(g,{src:e.config.src,options:e.config.options,size:s.current,resolveSrc:T,resolveSibling:x=>T(Zc(e.config.src,x)),warn:(x,O)=>{o.logger.warn("Puppet",x,O)}})}catch(x){return e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" threw while mounting "${e.config.src}"`,x),()=>{e._setStatus("unmounted")}}let A=!1;return e._attachInstance(w),e._setStatus("loading"),Promise.resolve().then(()=>e._applyState()).then(()=>!A&&typeof w.ready=="function"?w.ready():void 0).then(()=>{A||e._setStatus("ready")}).catch(x=>{A||(e._setStatus("error"),o.logger.error("Puppet",`Backend "${b}" failed to load "${e.config.src}"`,x))}),()=>{A=!0,e._attachInstance(null),e._setStatus("unmounted");try{w.dispose()}catch(x){o.logger.error("Puppet",`Backend "${b}" threw while disposing`,x)}}},[]);let v=gs(r);el(()=>{let g=v.current;if(g.width===r.width&&g.height===r.height)return;v.current=r;let y=e._getInstance();if(!(!y||typeof y.resize!="function"))try{y.resize(r)}catch(b){o.logger.error("Puppet",`Backend "${e.config.backend}" threw while resizing`,b)}},[r]);function T(g){return P.isDataURI(g)?g:n.get(g)||g}return Yo.createElement(zt.Div,{"data-element-type":"puppet"},Yo.createElement(zt.mDiv,{tag:"puppet.container",color:"blue",border:"dashed",ref:a,className:"absolute"},c.map(([g,y])=>Yo.createElement("div",{key:y,ref:g,className:e.config.className},Yo.createElement("div",{ref:i,className:"w-full h-full","data-puppet-id":e.getId(),"data-puppet-backend":e.config.backend})))))}function vs({state:o,displayable:e}){return Ai.createElement(Ai.Fragment,null,e.map(t=>{if(t instanceof An)return Ai.createElement(fs,{state:o,text:t,key:"text-"+t.getId()});if(t instanceof N)return Ai.createElement(Jc,{state:o,image:t,key:"image-"+t.getId()});if(t instanceof Dt)return Ai.createElement(ys,{state:o,puppet:t,key:"puppet-"+t.getId()});throw new Error("Unsupported displayable type: "+(t?.constructor?.name||t))}))}import Xo,{useEffect as yd}from"react";import{motion as vd}from"motion/react";function tl({state:o,layer:e,children:t}){let{transformRef:n,transitionRefs:i,initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:c,stopLoop:l,updateStyleSync:u,deps:d}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center"}}]});return xt(e,{initDisplayable:r,applyTransition:s,applyTransform:a,applyLoop:c,stopLoop:l,updateStyleSync:u},[...d]),yd(()=>(o.logger.debug("Layer","Layer mounted",e.getId()),()=>{o.logger.debug("Layer","Layer unmounted",e.getId())}),[]),Xo.createElement(Xo.Fragment,null,Xo.createElement(vd.div,{className:"absolute w-full h-full",ref:n,"data-element-type":"layer","data-layer-id":e.getId(),key:`layer-${e.getId()}`},i.map(([p,h])=>Xo.createElement("div",{className:"relative w-full h-full",ref:p,key:h},t))))}async function nl(o,e,t,n){let i=e.state.backgroundMusic,r=i&&o.audioManager.isManaged(i)?o.audioManager.stop(i,n):null;if(r&&t===i&&await r,t)try{await o.audioManager.playSoundToken(t,{end:t.state.volume,duration:n}),e.state.backgroundMusic=t}catch{e.state.backgroundMusic=null}else e.state.backgroundMusic=null;r&&await r}import Sd from"clsx";import{useEffect as Ss,useRef as Td}from"react";import Ts from"react";function bs({state:o,className:e,elements:t}){let{scene:n,layers:i}=t,r=Td(null);return Ss(()=>(o.stageTransition.registerScene(n,r.current),()=>{o.stageTransition.registerScene(n,null)}),[]),Ss(()=>n.events.depends([n.events.on(Ye.EventTypes["event:scene.preUnmount"],()=>{if(n.state.backgroundMusic)return o.audioManager.stop(n.state.backgroundMusic,n.config.backgroundMusicFade)})]).cancel,[]),Ss(()=>(n.events.emit(Ye.EventTypes["event:scene.mount"]),o.events.emit(L.EventTypes["event:state.scene.mount"],n),o.logger.debug("Scene","Scene mounted",n.getId()),()=>{n.events.emit(Ye.EventTypes["event:scene.unmount"]),o.events.emit(L.EventTypes["event:state.scene.unmount"],n),o.logger.debug("Scene","Scene unmounted",n.getId())}),[]),xt(n,{setBackgroundMusic(s,a){return nl(o,n,s,a)}}),Ts.createElement("div",{className:Sd(e,"w-full h-full absolute"),ref:r,"data-element-type":"scene","data-scene-id":n.getId()},[...i.entries()].sort(([s],[a])=>s.state.zIndex-a.state.zIndex).map(([s,a])=>Ts.createElement(tl,{state:o,layer:s,key:s.getId()},Ts.createElement(vs,{state:o,displayable:a}))))}import{AnimatePresence as xd}from"motion/react";import{useEffect as wd,useReducer as kd,useRef as Ci}from"react";import bd from"clsx";import qt,{useCallback as As,useMemo as Ad,useRef as Cd}from"react";function Cs({prompt:o,choices:e,afterChoose:t,state:n,words:i,renderPrompt:r=!0}){let s=R(),a=Cd([]),c=As(f=>(a.current.push(f),a.current.indexOf(f)),[]),l=As(f=>{let m=a.current.indexOf(f);m!==-1&&a.current.splice(m,1)},[]),u=As(f=>a.current.indexOf(f),[]),d=s.config.menu,p=Ad(()=>e.map(f=>({...f,words:f.prompt.evaluate(xe.getCtx({gameState:n}))})),[e,n]);function h(f){t(f)}return qt.createElement(qt.Fragment,null,qt.createElement(Kr,{value:{evaluated:p,choose:h,gameState:n}},qt.createElement(jr,{value:{register:c,unregister:l,getIndex:u}},qt.createElement(Bt,{className:"absolute"},r&&o&&qt.createElement(fi,{gameState:n,action:{sentence:o,words:i,character:null},useTypeEffect:!1})),qt.createElement(zt.Div,{color:"green",border:"dashed",className:bd("absolute"),style:{width:`${s.config.width}px`,height:`${s.config.height}px`}},qt.createElement(d,{items:p.map((f,m)=>m)})))))}function il({items:o}){return qt.createElement(bo,{className:"absolute flex flex-col items-center justify-center min-w-full w-full h-full"},o.map(e=>qt.createElement(Io,{key:e,className:"bg-white text-black p-2 mt-2 w-1/2"})))}import Pd from"clsx";import xi from"react";var ol=120;function rl({sources:o,menuCount:e,presence:t,retained:n,lastActive:i,sceneId:r}){if(o.length===0){let c=n??(i.length>0?i.map(l=>({...l,active:!1})):null);return{items:c??[],retained:c,lastActive:i,retaining:c!==null,interactive:e>0}}let s=new Set(o.map(({slot:c})=>c));for(let[c,l]of Array.from(t.slotKeys))s.has(c)||(t.exitingKeys.add(l),t.slotKeys.delete(c));let a=o.map(({slot:c,...l})=>{let u=t.slotKeys.get(c);return(!u||t.exitingKeys.has(u))&&(u=`say-${r}-${t.nextKey++}`,t.slotKeys.set(c,u)),{...l,presenceKey:u,slot:c,active:!0}});return{items:a,retained:null,lastActive:a,retaining:!1,interactive:!0}}function xs({state:o,className:e,elements:t}){let{scene:n,texts:i,menus:r}=t,s=Ci(!1),a=Ci({slotKeys:new Map,exitingKeys:new Set,menuPromptIds:new WeakMap,nextKey:0}),c=Ci([]),l=Ci(null),u=Ci(null),[,d]=kd(T=>T+1,0),p=()=>{u.current&&(clearTimeout(u.current),u.current=null)},h=()=>{let T=l.current;if(!T)return;let g=a.current;T.forEach(({slot:y,presenceKey:b})=>{g.slotKeys.get(y)===b&&g.slotKeys.delete(y),g.exitingKeys.add(b)}),l.current=null,u.current=null,c.current=[],d()};wd(()=>()=>{p()},[]);let f=a.current,m=i.length>0?i.map(({action:T,onClick:g},y)=>({action:T,slot:y,useTypeEffect:!s.current,onFinished:b=>{b!==void 0&&(s.current=b),g(),o.events.emit(L.EventTypes["event:state.player.lineEnd"]),o.stage.next()}})):r.flatMap((T,g)=>{if(!T.action.prompt||!T.action.words)return[];let y=f.menuPromptIds.get(T);return y||(y=`menu-prompt-${n.getId()}-${f.nextKey++}`,f.menuPromptIds.set(T,y)),[{action:{sentence:T.action.prompt,words:T.action.words,character:null,id:y},slot:g,useTypeEffect:!1}]}),v=rl({sources:m,menuCount:r.length,presence:f,retained:l.current,lastActive:c.current,sceneId:n.getId()});return l.current=v.retained,c.current=v.lastActive,v.retaining?u.current||(u.current=setTimeout(h,ol)):p(),xi.createElement("div",{className:Pd(e,"w-full h-full absolute"),"data-element-type":"scene-dialogs",style:{pointerEvents:v.interactive?"auto":"none"}},xi.createElement(xd,{propagate:o.game.config.animationPropagate,onExitComplete:()=>{a.current.exitingKeys.clear()}},v.items.map(({action:T,onFinished:g,presenceKey:y,active:b,useTypeEffect:k})=>xi.createElement(fi,{gameState:o,key:y,action:T,active:b,onFinished:g,useTypeEffect:k}))),r.map(({action:T,onClick:g},y)=>xi.createElement("div",{key:"menu-"+y,"data-element-type":"menu"},xi.createElement(Cs,{state:o,prompt:T.prompt,choices:T.choices,renderPrompt:!T.prompt,afterChoose:b=>{s.current=!1,g(b),o.stage.next()},words:T.words}))))}import hn,{useEffect as Ed,useRef as ws}from"react";import{motion as Dd}from"motion/react";function sl({state:o,camera:e,children:t}){let n=ws(null),i=ws(null),r=ws(null),{transformRef:s,transitionRefs:a,initDisplayable:c,applyTransition:l,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h,deps:f}=jt({element:e,state:e.transformState,skipTransform:o.game.config.allowSkipLayersTransform,skipTransition:!1,companionRefs:[{ref:n,project:Da},{ref:i,project:Pa},{ref:r,project:Ea}],transitionsProps:[{style:{width:"100%",height:"100%",transformOrigin:"center",overflow:"hidden"}}]});return xt(e,{initDisplayable:c,applyTransition:l,applyTransform:u,applyLoop:d,stopLoop:p,updateStyleSync:h},[...f]),Ed(()=>(o.logger.debug("Camera","Camera mounted",e.getId()),()=>{o.logger.debug("Camera","Camera unmounted",e.getId())}),[]),hn.createElement(hn.Fragment,null,hn.createElement(Dd.div,{className:"absolute w-full h-full",ref:s,"data-element-type":"camera"},a.map(([m,v])=>hn.createElement("div",{className:"relative w-full h-full",ref:m,key:v},t))),hn.createElement("div",{className:"absolute w-full h-full","data-element-type":"camera-lens",style:{pointerEvents:"none"}},hn.createElement("div",{className:"absolute w-full h-full",ref:n,"data-element-type":"camera-lens-vignette"}),hn.createElement("div",{className:"absolute w-full h-full",ref:i,"data-element-type":"camera-lens-shutter-top"}),hn.createElement("div",{className:"absolute w-full h-full",ref:r,"data-element-type":"camera-lens-shutter-bottom"})))}import Ld from"react";import{useEffect as ks,useRef as Rd}from"react";import{useCallback as al}from"react";function cl(o){let e=al(()=>{if(!o.current)return;let n=o.current;n.style.opacity="1",n.style.pointerEvents="auto",n.style.visibility="visible"},[o]),t=al(()=>{if(!o.current)return;let n=o.current;n.style.opacity="0",n.style.pointerEvents="none",n.style.visibility="hidden"},[o]);return{show:e,hide:t}}function Ps({gameState:o,video:e}){let t=Rd(null),{show:n,hide:i}=cl(t);ks(()=>o.events.depends([o.events.on(L.EventTypes["event:state.player.skip"],()=>{o.game.config.allowSkipVideo&&(r(),o.logger.log("NarraLeaf-React: Video","Skipped"))})]).cancel,[]),ks(()=>{i(),e.state.display&&n()},[]),ks(()=>{if(!t.current)return;let s=t.current,a=!1,c=new Set,l=()=>new E(`Failed to add event listener, ref is not available
64
64
  at Video.tsx: useEffect`),u=h=>{a||(a=!0,o.mountState(e,{show:()=>{if(!t.current)throw l();n()},hide:()=>{if(!t.current)throw l();i()},play:()=>{if(!t.current)throw l();let f=t.current;return h||f.error?(o.logger.error("NarraLeaf-React: Video","Cannot play a video whose source failed to load: "+e.config.src),Promise.resolve()):(f.currentTime=0,new Promise(m=>{let v=!1,T=null,g=[],y=()=>{v||(v=!0,c.delete(y),T&&T(),g.forEach(b=>b()),m())};c.add(y),T=o.schedule(({retry:b})=>{if(v)return;if(f.readyState<3){let x=()=>{f.removeEventListener("loadeddata",x),b()};f.addEventListener("loadeddata",x),g.push(()=>f.removeEventListener("loadeddata",x));return}let k=()=>y(),w=()=>y(),A=()=>{o.logger.error("NarraLeaf-React: Video","Video playback error: "+e.config.src),y()};f.addEventListener("ended",k),f.addEventListener("stopped",w),f.addEventListener("error",A),g.push(()=>{f.removeEventListener("ended",k),f.removeEventListener("stopped",w),f.removeEventListener("error",A)}),f.play().catch(x=>{o.logger.error("Failed to play video: "+x),y()})},10)}))},pause:()=>{if(!t.current)throw l();t.current.pause()},resume:()=>{if(!t.current)throw l();return t.current.play().catch(f=>{o.logger.error("Failed to resume video: "+f)})},stop:()=>{if(!t.current)throw l();t.current.pause(),t.current.dispatchEvent(new Event("stopped"))},seek:f=>{if(!t.current)throw l();t.current.currentTime=f}}))},d=()=>u(!1),p=()=>{o.logger.error("NarraLeaf-React: Video",`Failed to load video source: ${e.config.src}`+(s.error?` (media error code ${s.error.code})`:"")),u(!0)};return s.addEventListener("canplay",d),s.addEventListener("error",p),s.readyState>=3?u(!1):s.error&&p(),()=>{s.removeEventListener("canplay",d),s.removeEventListener("error",p),c.forEach(h=>h()),s.currentTime>0&&s.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]);function r(){t.current&&(t.current.pause(),t.current.currentTime=0,t.current.dispatchEvent(new Event("stopped")))}return Ld.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,playsInline:!0,width:"100%",height:"100%",onContextMenu:s=>s.preventDefault()})}import Id,{useEffect as Md,useRef as Nd}from"react";var ll={linear:"linear",easeIn:"cubic-bezier(0.42, 0, 1, 1)",easeOut:"cubic-bezier(0, 0, 0.58, 1)",easeInOut:"cubic-bezier(0.42, 0, 0.58, 1)"};function Gd(o,e){return e===void 0?"linear":Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:typeof e=="string"&&ll[e]?ll[e]:(o.logger.debug("NarraLeaf-React: Vfx",'Easing has no CSS equivalent, falling back to "ease"',e),"ease")}function Es({gameState:o,vfx:e}){let t=Nd(null);return Md(()=>{let n=t.current;if(!n)return;let i=!1,r=!1,s=0,a=!1,c=new Set,l=new Set,u=[],d=b=>{n.style.transition="",n.style.opacity=String(b)},p=()=>{n.play().catch(b=>{o.logger.weakWarn("NarraLeaf-React: Vfx","Failed to play vfx video: "+b)})},h=()=>i||n.error?(o.logger.error("NarraLeaf-React: Vfx","Cannot wait for a vfx whose source failed to load: "+e.config.src),Promise.resolve()):n.readyState>=2?Promise.resolve():new Promise(b=>{let k=!1,w=()=>x(),A=()=>{o.logger.error("NarraLeaf-React: Vfx","Failed to load vfx source: "+e.config.src),x()},x=()=>{k||(k=!0,l.delete(x),n.removeEventListener("loadeddata",w),n.removeEventListener("error",A),b())};l.add(x),n.addEventListener("loadeddata",w),n.addEventListener("error",A),(n.readyState>=2||n.error)&&x()}),f=(b,k,w)=>{let A=k?.duration??0,x=++s;return w.instant||A<=0?(d(b),Promise.resolve()):new Promise(O=>{let U=!1,ue=null,Ne=()=>{U||(U=!0,l.delete(Ne),ue!==null&&clearTimeout(ue),s===x&&t.current&&d(b),O())};l.add(Ne),n.style.transition=`opacity ${A}ms ${Gd(o,k?.easing)}`,n.offsetWidth,n.style.opacity=String(b),ue=setTimeout(Ne,A)})},m=b=>{r||(r=!0,i=b,o.mountState(e,{show:async k=>{a=!0;let w={instant:!1};c.add(w);try{if(await h(),!t.current)return;n.playbackRate=k?.rate??e.config.playbackRate,e.state.paused||p(),await f(k?.opacity??e.config.opacity,k,w)}finally{c.delete(w)}},hide:async k=>{a=!0;let w={instant:!1};c.add(w);try{await f(0,k,w),t.current&&n.pause()}finally{c.delete(w)}},pause:()=>{n.pause()},resume:()=>{p()},setRate:k=>{n.playbackRate=k}}),e.state.display&&u.push(o.schedule(()=>{!a&&t.current&&d(e.config.opacity)},0)))},v=()=>m(!1),T=()=>{o.logger.error("NarraLeaf-React: Vfx",`Failed to load vfx source: ${e.config.src}`+(n.error?` (media error code ${n.error.code})`:"")),m(!0)},g=o.events.on(L.EventTypes["event:state.player.skip"],()=>{c.size===0&&l.size===0||(c.forEach(b=>{b.instant=!0}),[...l].forEach(b=>b()),o.logger.log("NarraLeaf-React: Vfx","Fade skipped"))}),y=()=>{document.visibilityState==="visible"&&e.state.display&&!e.state.paused&&t.current&&p()};return document.addEventListener("visibilitychange",y),n.style.opacity="0",n.playbackRate=e.config.playbackRate,e.config.muted||o.logger.weakWarn("NarraLeaf-React: Vfx","Vfx is not muted; autoplay may be rejected by the browser. (src: "+e.config.src+")"),e.state.display&&!e.state.paused&&p(),n.addEventListener("canplay",v),n.addEventListener("error",T),n.readyState>=3?m(!1):n.error&&T(),()=>{n.removeEventListener("canplay",v),n.removeEventListener("error",T),document.removeEventListener("visibilitychange",y),g.cancel(),u.forEach(b=>b()),[...l].forEach(b=>b()),n.pause(),o.isStateMounted(e)&&o.unMountState(e)}},[o,e]),Id.createElement("video",{ref:t,src:e.config.src,preload:"auto",muted:e.config.muted,loop:e.config.loop,playsInline:!0,onContextMenu:n=>n.preventDefault(),style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:e.config.fit,pointerEvents:"none"}})}import Fd from"clsx";import Od,{useCallback as Hd,useEffect as Qo,useRef as Vd}from"react";function Ds({children:o,className:e,gameState:t}){let{ratio:n}=he(),i=R(),[r]=se(),s=Vd(null),a=i.config.minWidth,c=i.config.minHeight,l=Hd(u=>{if(n.isLocked()){t.logger.weakWarn("AspectRatio","ratio is locked, skipping update");return}n.update(u.width,u.height,u.scale),n.updateMin(a,c),r()},[r,t.logger,c,a,n]);return Qo(()=>{n.setUpdate(()=>{s.current?.requestUpdate()})},[n]),Qo(()=>n.onRequestedUpdate(()=>{s.current?.requestUpdate()}),[n]),Qo(()=>{let u=requestAnimationFrame(()=>{s.current?.requestUpdate()});return()=>{cancelAnimationFrame(u)}},[i.config.aspectRatio,i.config.height,i.config.width,c,a]),Qo(()=>t.events.on(L.EventTypes["event:state.player.requestFlush"],r).cancel,[t,r]),Od.createElement(Rc,{ref:s,id:i.config.contentContainerId,aspectRatio:i.config.aspectRatio,baseWidth:i.config.width,minWidth:a,minHeight:c,debounceMs:i.config.ratioUpdateInterval,className:Fd(e),onUpdate:l},o)}import ul,{useEffect as Ud,useRef as Wd,useState as pl}from"react";function Ls({src:o,width:e,height:t}){let[n,i]=pl({x:0,y:0}),[r,s]=pl(!1),a=Wd(null),{ratio:c}=he();return Ud(()=>{let l=u=>{if(a.current){let d=a.current.getBoundingClientRect(),p=u.clientX-d.left,h=u.clientY-d.top;i({x:p,y:h}),r||s(!0)}};return window.addEventListener("mousemove",l),()=>{window.removeEventListener("mousemove",l)}},[r]),ul.createElement(Bt,{ref:a,className:"overflow-hidden absolute"},ul.createElement("img",{src:o,style:{position:"absolute",left:n.x,top:n.y,width:e,height:t,pointerEvents:"none",zIndex:1001,display:r?"block":"none",cursor:"none",transform:`scale(${c.state.scale})`},alt:""}))}import dl from"react";import tn from"react";function Rs({error:o,errorInfo:e}){return R().config.app.debug?tn.createElement("div",{className:"text-left"},tn.createElement("h1",null,"NarraLeaf-React cannot initialize the player correctly. (development mode)"),tn.createElement("p",{className:"text-red-700"},"Message: ",o.message),tn.createElement("pre",null,"Error Stack: ",o?.stack),tn.createElement("pre",null,"Component Stack: ",e?.componentStack),tn.createElement("pre",null,"Digest: ","digest"in e?String(e.digest):"")):tn.createElement("div",{className:"bg-white w-full h-full"},tn.createElement("h1",null,"NarraLeaf-React crashed due to an unknown error."),tn.createElement("p",null,"Please contact the game developer for further assistance."))}var _o=class extends dl.Component{constructor(){super(...arguments);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t,errorInfo:null}}componentDidCatch(t,n){this.setState({error:t,errorInfo:n}),this.props.onError?.(t,n),console.error(t,n)}render(){return this.state.hasError?dl.createElement(Rs,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children}};import hl from"clsx";import W,{useEffect as Nt,useReducer as gl,useState as Kn}from"react";import{flushSync as yl}from"react-dom";import{useRef as Bd}from"react";import{useEffect as zd}from"react";function ml({gameState:o}){let e=Bd(null);return zd(()=>(e.current=requestAnimationFrame(()=>{setTimeout(()=>{o.events.emit(L.EventTypes["event:state.onRender"])},0)}),()=>{e.current!==null&&cancelAnimationFrame(e.current)}),[o.deps]),null}import wi,{useEffect as Kd}from"react";function Is({gameState:o}){let[e]=se(),{ratio:t}=he(),n=o.notificationMgr;Kd(()=>n.onFlush(()=>{e()}).cancel,[]);let i=o.game.config.notification;return wi.createElement("div",{style:{transform:`scale(${t.state.scale})`,transformOrigin:"left top"},className:"absolute top-0 left-0 w-full h-full pointer-events-none","data-element-type":"notification"},wi.createElement(i,{notifications:n.toArray()}))}function fl({notifications:o}){return wi.createElement(No,{className:"absolute top-0 left-0 w-full h-full"},o.map(({id:e,message:t})=>wi.createElement("div",{key:e,className:"absolute top-0 left-0 w-[100px] h-[80px]"},wi.createElement("span",{className:"text-white text-2xl font-bold"},t))))}function vl({story:o=si.empty(),width:e,height:t,className:n,onReady:i,onPreloadComplete:r,onPreloadedReady:s,onFirstSceneReady:a,onEnd:c,onError:l,children:u,active:d=!0}){let[p,h]=gl(D=>D+1,0),[f,m]=gl(D=>D+1,0),[v,T]=Kn(0),g=R(),[y]=Kn(()=>new L(g,{update:h,forceUpdate:()=>{y.logger.weakWarn("Player","force update"),yl(()=>{h()})},forceRemount:()=>{y.logger.weakWarn("Player","force remount"),yl(()=>{T(D=>D+1),h()})},next:Ue})),b=W.createRef(),k=W.createRef(),[w,A]=Kn(!1),x=W.useRef(!1),O=W.useRef(null),U=W.useRef(null),{preloaded:ue}=Kt(),[Ne,_e]=Kn(!1),bt=W.useRef(!1),[At,gn]=Kn(!1),mt=W.useRef(!1),B=W.useRef(null),Ee=W.useRef(!1),[ft]=Kn(new Map);function rt(D){return{game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable(),scene:D}}function Ue(){let D=()=>{ft.forEach(M=>M.cancel())};if(y.rollLock.isLocked())return;D();let K=!1,ae=0;for(;!K;){if(ae++>g.config.maxStackModelLoop)throw new E("Max stack model loop reached");let M=g.getLiveGame().next();if(!M){if(g.getLiveGame().stackModel&&!g.getLiveGame().stackModel.isEmpty())continue;break}if(S.isAwaitable(M)){if(O.current===M)break;O.current=M,M.onSettled(()=>{M.isFailed()||(O.current===M&&(O.current=null),Ue())}),M.onFailed(ge=>{O.current===M&&(O.current=null),y.logger.error("Player",ge)}),K=!0;break}if(M instanceof En){if(U.current===M)break;U.current=M,M.nextUnlock().then(()=>{U.current===M&&(U.current=null),Ue()}),K=!0;break}if(Xe.isCalledActionResult(M)&&M.wait&&Xe.isStackModelsAwaiting(M.wait.type,M.wait.stackModels)){if(O.current===M)break;if(O.current=M,M.wait){let ge=Xe.executeStackModelGroup(M.wait.type,M.wait.stackModels);ge.then(()=>{O.current===M&&(O.current=null),Ue()}),ge.onFailed(De=>{O.current===M&&(O.current=null),y.logger.error("Player",De)})}K=!0;break}y.handle(M)}y.stage.update()}Nt(()=>{y.audioManager.initialize()},[]),Nt(()=>(g.getLiveGame().setGameState(y),o&&!g.getLiveGame().isPlaying()&&g.getLiveGame().loadStory(o),o?.entryScene&&!y.getPreloadingScene()&&!y.getLastScene()&&y.preloadScene(o.entryScene),y.playerCurrent=b.current,y.mainContentNode=k.current,()=>{g.getLiveGame().setGameState(void 0),y.playerCurrent=null}),[g,o]),Nt(()=>ct(()=>{A(!0);let D=y.getLastScene(),K=[];D?K.push(D.events.once("event:scene.mount",()=>{y.stage.next()}).cancel):y.stage.next();let ae=y.events.on(L.EventTypes["event:state.end"],()=>{c&&c({game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable()})});return y.stage.update(),()=>{D&&K.forEach(M=>M()),ae.cancel()}}),[]),Nt(()=>ct(()=>{w&&i&&!x.current&&(x.current=!0,y.stage.forceUpdate(),g.hooks.trigger("init",[]),i({game:g,gameState:y,liveGame:g.getLiveGame(),storable:g.getLiveGame().getStorable()}))}),[w]),Nt(()=>ct(()=>{if(Ne&&s&&!bt.current){bt.current=!0;let D=B.current||y.getLastScene()||y.getPreloadingScene(),K=rt(D);s(K)}}),[Ne]),Nt(()=>ct(()=>{if(At&&!mt.current){mt.current=!0;let D=B.current||y.getLastScene()||y.getPreloadingScene(),K=rt(D);g.markPreloadComplete(K)&&r&&r(K)}}),[At]),Nt(()=>y.events.on(L.EventTypes["event:state.scene.mount"],D=>{B.current||(B.current=D,m())}).cancel,[]),Nt(()=>{if(!At||!d||Ee.current||g.isFirstSceneReady())return;let D=B.current||y.getLastScene();if(!D)return;let K=null,ae=null,M=!1;Ee.current=!0;let ge=()=>{M=!0,Ee.current=!1;let De=rt(D);g.markFirstSceneReady(De)&&a&&a(De)};return typeof requestAnimationFrame=="function"?K=requestAnimationFrame(()=>{ae=setTimeout(ge,0)}):ae=setTimeout(ge,0),()=>{M||(Ee.current=!1,K!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(K),ae!==null&&clearTimeout(ae))}},[d,f,p,At]),Nt(()=>ue.events.depends([ue.events.on($e.EventTypes["event:preloaded.ready"],()=>{_e(!0),y.stage.update(),o&&g.getLiveGame().isPlaying()&&Ue()}),ue.events.on($e.EventTypes["event:preloaded.complete"],()=>{gn(!0)})]).cancel,[]),Nt(()=>{y.flushDep=p},[p]);let I=e||g.config.width,F=t||g.config.height;return W.createElement(_o,{onError:l},W.createElement("div",{style:{width:typeof I=="number"?`${I}px`:I,height:typeof F=="number"?`${F}px`:F},className:hl(n,"__narraleaf_content-player"),ref:b,tabIndex:0},W.createElement(Ds,{className:hl("flex-grow overflow-auto"),gameState:y},W.createElement(ls,{gameState:y}),W.createElement(ml,{gameState:y}),W.createElement(Bt,{className:"absolute",ref:k,style:{cursor:y.game.config.cursor?"none":"auto",overflow:y.game.config.showOverflow?"visible":"hidden",isolation:"isolate"}},g.config.cursor&&W.createElement(Ls,{src:g.config.cursor,width:g.config.cursorWidth,height:g.config.cursorHeight}),W.createElement($d,{show:Ne&&d,key:v},W.createElement(is,null,W.createElement(Oc,{state:y}),W.createElement(Bc,{state:y}),W.createElement(jd,{state:y},W.createElement("div",{className:"w-full h-full absolute",style:{isolation:"isolate"},"data-element-type":"scene-group"},y.getSceneElements().map(D=>W.createElement(bs,{key:"scene-"+D.scene.getId(),state:y,elements:D}))),W.createElement(qd,{state:y}),y.getVideos().map((D,K)=>W.createElement("div",{className:"w-full h-full absolute",key:"video-"+K,"data-element-type":"video"},W.createElement(Ps,{gameState:y,video:D}))),y.getVfx().map(D=>W.createElement("div",{className:"w-full h-full absolute",key:"vfx-"+D.getId(),"data-element-type":"vfx",style:{zIndex:D.config.zIndex,mixBlendMode:D.config.blendMode}},W.createElement(Es,{gameState:y,vfx:D})))),y.getSceneElements().map(D=>W.createElement(xs,{key:"scene-dialogs-"+D.scene.getId(),state:y,elements:D})),W.createElement(Yd,{NvlComponent:g.config.nvlDialog}))),W.createElement($c,{state:y}),W.createElement(wc,null,u),W.createElement(Is,{gameState:y})))))}function $d({children:o,show:e}){return W.createElement(W.Fragment,null,e?o:null)}function jd({state:o,children:e}){let t=o.getLiveGame().story?.camera??null;return t?W.createElement(sl,{state:o,camera:t},e):W.createElement(W.Fragment,null,e)}function qd({state:o}){let e=W.useRef(null);return Nt(()=>(o.stageTransition.registerOverlayHost(e.current),()=>{o.stageTransition.registerOverlayHost(null)}),[]),W.createElement("div",{className:"w-full h-full absolute pointer-events-none",ref:e,"data-element-type":"stage-transition-overlay-host"})}function Yd({NvlComponent:o}){let{dialogs:e,state:t}=$t(),i=R().getLiveGame().getGameState(),r=W.useMemo(()=>e.map((s,a)=>{let c=s.sentence.evaluate(xe.getCtx({gameState:i})),l=t.activeDialogId===s.id,u=l&&t.phase==="typing";return{entry:s,index:a,isActive:l,gameState:i,words:c,useTypeEffect:u}}),[e,i,t.activeDialogId,t.phase]);return W.createElement(o,{dialogs:r})}import"client-only";import $n from"react";function Sl({children:o,game:e}){return $n.createElement($n.Fragment,null,$n.createElement(Ka,null,$n.createElement(Va,{game:e},$n.createElement(bc,null,$n.createElement(za,null,o)))))}var Xd=(c=>(c.image="narraleaf:image",c.text="narraleaf:text",c.layer="narraleaf:layer",c.scene="narraleaf:scene",c.video="narraleaf:video",c.vfx="narraleaf:vfx",c.camera="narraleaf:camera",c.puppet="narraleaf:puppet",c))(Xd||{});import Qd from"clsx";import wt,{useEffect as bl,useRef as _d,useState as Jd}from"react";function Tl(o){return o?{className:"",ariaHidden:!1}:{className:"opacity-0",ariaHidden:!0}}import{motion as Zd,useIsPresent as em}from"motion/react";var tm={defaultColor:"#000",fontSize:16,fontWeight:400,fontWeightBold:700,fontFamily:"sans-serif"};function nm({children:o,initial:e,transition:t,...n}){let i=R(),r=Rt(),{ratio:s}=he(),[a]=mn(te.Preferences.showDialog),c=_d(null),[l]=xn("nextAction"),u=em(),[d,p]=Jd(null),h=Tl(a);function f(){a&&(r.config.gameState.isAdvanceSuspended()||r.requestComplete())}return bl(()=>{if(!window){console.warn(`Failed to add event listener, window is not available
65
65
  at Say.tsx: onElementClick`);return}let m=T=>{T.repeat||r.config.gameState.isAdvanceSuspended()||i.keyMap.match("nextAction",T.key)&&r.requestComplete()};window.addEventListener("keydown",m);let v=r.events.on(Me.Events.simulateClick,()=>{c.current&&c.current.click()});return()=>{window.removeEventListener("keydown",m),v.cancel()}},[r,l]),bl(()=>{let m=i.preference.onPreferenceChange(te.Preferences.autoForward,v=>{v&&r.isEnded()?r.tryScheduleAutoForward():r.cancelAutoForward()});return()=>{m.cancel()}},[r]),wt.createElement("div",{"data-element-type":"dialog",className:"absolute w-full h-full"},wt.createElement("div",{className:Qd("absolute bottom-0 w-full h-full",h.className),"aria-hidden":h.ariaHidden,onClick:f,style:{...$i(i.config.useAspectScale,{maxWidth:i.config.dialogWidth,maxHeight:i.config.dialogHeight,transform:`scale(${s.state.scale})`,transformOrigin:"bottom left",width:i.config.width,height:i.config.height})},ref:c},wt.createElement(as,{value:d},wt.createElement(Zd.div,{...n,initial:r.config.suppressInitialAnimation?!1:e,transition:r.config.suppressInitialAnimation&&u?{duration:0}:t},o)),wt.createElement("div",{"data-element-type":"dialog-overlay",className:"absolute inset-0 pointer-events-none",ref:p})))}function Al({children:o,...e}){let t=Rt();return!t.config.action.sentence||!t.config.action.words?null:wt.createElement(nm,{...e},o)}var Xp=Al;function Cl(){return wt.createElement(Al,null,wt.createElement("div",{className:"dialog-content",style:{display:"flex",alignItems:"flex-start",gap:16,width:"100%",height:"100%"}},wt.createElement(Xr,null),wt.createElement("div",{className:"dialog-text-content",style:{minWidth:0,flex:"1 1 auto"}},wt.createElement(en,null),wt.createElement(fn,{...tm}))))}var ki={say:Cl,menu:il,notification:fl,nvlDialog:ss};var Jo=class{constructor(e){this.game=e;this.plugins=[];this.registerAll()}use(e){return this.plugins.push(e),this}register(e){e.register(this.game)}registerAll(){this.plugins.forEach(e=>e.register(this.game))}unregisterAll(){this.plugins.forEach(e=>e.unregister(this.game))}has(e){return this.plugins.some(t=>t.name===e.name)}};var Pi=class{constructor(e={}){this.keyMap=e;this.events=new _}setKeyBinding(e,t){this.keyMap[e]=t,this.events.emit("event:keyMap.change",e,t)}getKeyBinding(e){return this.keyMap[e]??null}addKeyBinding(e,t){if(t===null)return;let n=this.getKeyBinding(e)??[],i=r=>Array.isArray(r)?r:[r];Array.isArray(n)?this.setKeyBinding(e,[...n,...i(t)]):this.setKeyBinding(e,[n,...i(t)])}getKeyBindings(){return this.keyMap}onKeyBindingChange(e,t){return this.events.on("event:keyMap.change",(n,i)=>{n===e&&t(i)})}importKeyBindings(e){for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.setKeyBinding(t,e[t])}exportKeyBindings(){return this.keyMap}match(e,t){let n=this.getKeyBinding(e);return n===null?!1:Array.isArray(n)?n.includes(t)||n.some(i=>i.toLowerCase()===t.toLowerCase()):n===t||n.toLowerCase()===t.toLowerCase()}};var xl=(e=>(e.game="game",e))(xl||{}),Qe=class Qe{constructor(e){this.hooks=new Wi;this.liveGame=null;this.sideEffect=[];this.freezeFields=[];this.preference=new di(Qe.DefaultPreference);this.audioBuses=new ti(()=>this.config.audioBuses??[],ga(this.preference));this.keyMap=new Pi({skipAction:["Control"],nextAction:[" "]});this.lifecycleEvents=new _;this.puppetBackends=new qo;this.preloadCompleteContext=null;this.firstSceneReadyContext=null;this.config=q(Qe.DefaultConfig,e),this.plugins=new Jo(this),this.router=new dn(this)}configure(e){let[t,n]=oa(e,this.freezeFields);return n.length>0&&console.warn(`NarraLeaf-React [Game] The following fields are not allowed to be configured: ${n.join(", ")}`),this.config=q(this.config,t),Object.prototype.hasOwnProperty.call(t,"audioBuses")&&this.audioBuses.invalidate(),this.getLiveGame().getGameState()?.events.emit(L.EventTypes["event:state.player.requestFlush"]),this}configureAndFreeze(e){return this.configure(e),this.freeze(Object.keys(e)),this}freeze(e){return this.freezeFields.push(...e),this}use(e){return this.plugins.has(e)||this.plugins.use(e).register(e),this}registerPuppetBackend(e){return this.puppetBackends.register(e),this}getPuppetBackend(e){return this.puppetBackends.get(e)}listPuppetBackends(){return this.puppetBackends.list()}getPuppetBackendRegistry(){return this.puppetBackends}onPreloadComplete(e){return this.lifecycleEvents.on(Qe.LifecycleEventTypes["event:game.preloadComplete"],e)}oncePreloadComplete(e){return this.lifecycleEvents.once(Qe.LifecycleEventTypes["event:game.preloadComplete"],e)}whenPreloadComplete(){return this.preloadCompleteContext?Promise.resolve(this.preloadCompleteContext):new Promise(e=>{this.oncePreloadComplete(e)})}isPreloadComplete(){return this.preloadCompleteContext!==null}onFirstSceneReady(e){return this.lifecycleEvents.on(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e)}onceFirstSceneReady(e){return this.lifecycleEvents.once(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e)}whenFirstSceneReady(){return this.firstSceneReadyContext?Promise.resolve(this.firstSceneReadyContext):new Promise(e=>{this.onceFirstSceneReady(e)})}isFirstSceneReady(){return this.firstSceneReadyContext!==null}markPreloadComplete(e){return this.preloadCompleteContext?!1:(this.preloadCompleteContext=e,this.lifecycleEvents.emit(Qe.LifecycleEventTypes["event:game.preloadComplete"],e),!0)}markFirstSceneReady(e){return this.firstSceneReadyContext?!1:(this.firstSceneReadyContext=e,this.lifecycleEvents.emit(Qe.LifecycleEventTypes["event:game.firstSceneReady"],e),!0)}getLiveGame(){if(!this.liveGame){let e=this.createLiveGame();return this.liveGame=e,e}return this.liveGame}dispose(){this.audioBuses.dispose(),this.plugins.unregisterAll(),this.liveGame?.dispose(),this.sideEffect.forEach(e=>e())}addSideEffect(e){this.sideEffect.push(e)}createLiveGame(){return new Ut(this)}};Qe.defaultSettings={volume:1},Qe.DefaultPreference={autoForward:!1,skip:!0,showDialog:!0,gameSpeed:1,cps:10,voiceVolume:1,voiceFadeDuration:0,voiceEndMode:"stop",bgmVolume:1,soundVolume:1,globalVolume:1,skipDelay:0,skipInterval:100},Qe.Preferences={autoForward:"autoForward",skip:"skip",showDialog:"showDialog",gameSpeed:"gameSpeed",cps:"cps",voiceVolume:"voiceVolume",voiceFadeDuration:"voiceFadeDuration",voiceEndMode:"voiceEndMode",bgmVolume:"bgmVolume",soundVolume:"soundVolume",globalVolume:"globalVolume",skipDelay:"skipDelay",skipInterval:"skipInterval"},Qe.DefaultConfig={app:{debug:!1,logger:{log:!1,info:!1,warn:!0,error:!0,debug:!1,trace:!1,verbose:!1},inspector:!1,guard:{invalidExposedStateUnmounting:!0,unexpectedTimelineStatusChange:!0}},contentContainerId:"__narraleaf_content",aspectRatio:16/9,minWidth:800,minHeight:450,width:1920,height:1080,useWindowListener:!0,ratioUpdateInterval:50,preloadDelay:100,preloadConcurrency:5,waitForPreload:!0,preloadAllImages:!0,forceClearCache:!1,maxPreloadActions:10,cursor:null,cursorHeight:30,cursorWidth:30,showOverflow:!1,maxRouterHistory:10,screenshotQuality:1,useAspectScale:!0,autoForwardDelay:3*1e3,autoForwardDefaultPause:1e3,allowSkipImageTransform:!0,allowSkipImageTransition:!0,allowSkipBackgroundTransform:!0,allowSkipSceneTransition:!0,allowSkipTextTransform:!0,allowSkipTextTransition:!0,allowSkipLayersTransform:!0,allowSkipVideo:!1,animationPropagate:!1,dialogWidth:1920,dialogHeight:1080*.2,notification:ki.notification,menu:ki.menu,dialog:ki.say,nvlDialog:ki.nvlDialog,onError:e=>{console.error(e)},disableTextScaling:!1,stage:null,maxStackModelLoop:1e3,maxActionHistory:100,maxSceneCallDepth:8,audioBuses:[]},Qe.GameSettingsNamespace=xl,Qe.LifecycleEventTypes={"event:game.preloadComplete":"event:game.preloadComplete","event:game.firstSceneReady":"event:game.firstSceneReady"};var te=Qe;var Zo=class Zo extends X{constructor(){super(...arguments);this._jumpTarget=null}setJumpTarget(t){return this._jumpTarget=t,this}getJumpTarget(){return this._jumpTarget}static executeActionsAsync(t,n){let i=t.game.getLiveGame().requestAsyncStackModel([{type:n.type,node:n.contentNode}]);return t.game.getLiveGame().executeAsyncStackModel(i)}checkActionChain(t){if(t.some(n=>!!n.contentNode.getChild()))throw new Error("Invalid action chain. Actions are chained unexpectedly.");return t}executeAction(t,n){let i=this.contentNode,[r]=i.getContent();if(this.type===oe.do)return r.length===0?{type:this.type,node:this.contentNode.getChild()}:[{type:this.type,node:this.contentNode.getChild()},{type:this.type,node:r[0].contentNode}];if(this.type===oe.doAsync){if(r.length===0)return super.executeAction(t,n);let s=Zo.executeActionsAsync(t,r[0]);return t.timelines.attachTimeline(s),super.executeAction(t,n)}else if(this.type===oe.any){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"any",stackModels:s}}}else if(this.type===oe.all){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().createStackModel([{type:a.type,node:a.contentNode}]));return{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:s}}}else if(this.type===oe.allAsync){if(r.length===0)return{type:this.type,node:this.contentNode.getChild()};let s=this.checkActionChain(r).map(a=>t.game.getLiveGame().requestAsyncStackModel([{type:a.type,node:a.contentNode}]));return t.timelines.attachTimeline(S.all(...s.map(a=>t.game.getLiveGame().executeAsyncStackModel(a)))),super.executeAction(t,n)}else if(this.type===oe.repeat){let[s,a]=this.contentNode.getContent();if(a<=0||s.length===0)return super.executeAction(t,n);let c=Xe.createCountLoop(t.game.getLiveGame(),a,this.checkActionChain(s));return t.logger.debug("ControlAction","repeat",s,a),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[c]}}}else if(this.type===oe.while){let[s,a]=this.contentNode.getContent();if(s.length===0)return super.executeAction(t,n);if(!a.evaluate({gameState:t}).value)return super.executeAction(t,n);let c=Xe.createConditionLoop(t.game.getLiveGame(),a,this.getId(),this.checkActionChain(s));return t.logger.debug("ControlAction","while",s),{type:this.type,node:this.contentNode.getChild(),wait:{type:"all",stackModels:[c]}}}else if(this.type===oe.break){if(!n.stackModel.isLoop())throw new Error("Control.breakLoop() can only be used inside a loop (repeat/while)");return n.stackModel.breakLoop(),{type:this.type,node:null}}else if(this.type===oe.sleep){let[,s]=this.contentNode.getContent();if(t.isFastForwarding())return{type:this.type,node:this.contentNode.getChild()};let a;typeof s=="number"?a=S.delay(s):S.isAwaitable(s)?a=s:a=S.fromPromise(s);let c=new S,l=new we(a);return t.timelines.attachTimeline(l),a.then(()=>{c.resolve({type:this.type,node:this.contentNode.getChild()})}),c.onSkipControllerRegister(u=>{u.onAbort(()=>{l.abort()})}),c}else if(this.type===oe.waitForClick){if(t.consumeStageClick())return{type:this.type,node:this.contentNode.getChild()};let s=new S,a=new S,c=new we(a);t.timelines.attachTimeline(c);let l=t.game.preference,u=l.getPreference(te.Preferences.autoForward),d=l.getPreference(te.Preferences.gameSpeed),p=u?t.game.config.autoForwardDelay/d:null,h=!1,f=null,m=null,v=null,T=()=>{m?.cancel(),v?.cancel(),f&&(clearTimeout(f),f=null)},g=()=>{h||(h=!0,T(),a.resolve())};return m=t.events.on(L.EventTypes["event:state.player.stageClick"],g),v=t.events.on(L.EventTypes["event:state.player.skip"],g),p!==null&&(f=setTimeout(g,p)),a.then(()=>{s.resolve({type:this.type,node:this.contentNode.getChild()})}),s.onSkipControllerRegister(y=>{y.onAbort(()=>{h||(h=!0,T(),c.abort())})}),s}else{if(this.type===oe.label)return super.executeAction(t,n);if(this.type===oe.jump){let s=this._jumpTarget;if(!s){let[l]=this.contentNode.getContent();throw new Ae(`Jump target label "${l}" was not resolved. This usually means the story was not constructed before playing.`)}let a=t.getLiveGame(),c=a.getStackModelForce().serialize();return t.actionHistory.push({action:this,stackModel:n.stackModel},l=>{let[u]=a.constructMaps();a.getStackModelForce().deserialize(l,u)},[c]),a.getStackModelForce().clearAboveCallFrame().push({type:this.type,node:s.contentNode}),null}}throw new Error("Unknown control action type: "+this.type)}getFutureActions(t,n){if(this.callee.config.allowFutureScene===!1&&n.allowFutureScene===!1)return[...super.getFutureActions(t,n)];if(this.type===oe.break||this.type===oe.waitForClick||this.type===oe.label||this.type===oe.jump)return super.getFutureActions(t,n);let i=this.contentNode.getContent()[0],r=super.getFutureActions(t,n);return[...i??[],...r]}stringify(t,n,i){if(this.type===oe.break)return super.stringifyWithContent("Control","break");if(this.type===oe.waitForClick)return super.stringifyWithContent("Control","waitForClick");if(this.type===oe.label||this.type===oe.jump){let[a]=this.contentNode.getContent(),c=this.type===oe.label?"label":"jump";return super.stringifyWithContent("Control",`${c}(${a})`)}let r=this.contentNode,[s]=r.getContent();return super.stringifyWithContent("Control",s.map(a=>a.stringify(t,n,i)).join(";"))}};Zo.ActionTypes=oe;var re=Zo;var Fe=class o extends ce{constructor(t={}){super();this.config=t}static do(t){return new o().do(t)}static doAsync(t){return new o().doAsync(t)}static any(t){return new o().any(t)}static all(t){return new o().all(t)}static allAsync(t){return new o().allAsync(t)}static repeat(t,n){return new o().repeat(t,n)}static whileLoop(t,n){return new o().whileLoop(t,n)}static breakLoop(){return new o().breakLoop()}static sleep(t){return new o().sleep(t)}static waitForClick(){return new o().waitForClick()}static label(t){return new o().label(t)}static jump(t){return new o().jump(t)}do(t){return this.push(re.ActionTypes.do,t)}doAsync(t){return this.push(re.ActionTypes.doAsync,t)}any(t){return this.pushUnchained(re.ActionTypes.any,t)}all(t){return this.pushUnchained(re.ActionTypes.all,t)}allAsync(t){return this.pushUnchained(re.ActionTypes.allAsync,t)}repeat(t,n){return this.pushUnchained(re.ActionTypes.repeat,n,t)}whileLoop(t,n){let i=Q.from(t);return this.pushWithLambda(re.ActionTypes.while,n,i)}breakLoop(){let t=new re(this.chain(),re.ActionTypes.break,new C().setContent([]));return this.chain(t)}sleep(t){return this.push(re.ActionTypes.sleep,[],t)}waitForClick(){let t=new re(this.chain(),re.ActionTypes.waitForClick,new C().setContent([]));return this.chain(t)}label(t){let n=new re(this.chain(),re.ActionTypes.label,new C().setContent([t]));return this.chain(n)}jump(t){let n=new re(this.chain(),re.ActionTypes.jump,new C().setContent([t]));return this.chain(n)}push(t,n,...i){let r=this.narrativeToActions(n),s=new re(this.chain(),t,new C().setContent([this.construct(r),...i]));return this.chain(s)}pushUnchained(t,n,...i){let r=this.narrativeToActions(n),s=new re(this.chain(),t,new C().setContent([r,...i]));return this.chain(s)}pushWithLambda(t,n,i){let r=this.narrativeToActions(n),s=new re(this.chain(),t,new C().setContent([r,i]));return this.chain(s)}narrativeToActions(t){return t.flatMap(n=>typeof n=="string"?_t.say(n).getActions():Be.toActions([n]))}};var j=class j extends Ke{static get DefaultUserConfig(){return j._defaultUserConfig??(j._defaultUserConfig=new $({name:"(anonymous)",autoInit:!0,src:j.DefaultImagePlaceholder,autoFit:!1,layer:void 0,...ne.DefaultTransformState.getDefaultConfig()},{position:e=>G.tryParsePosition(e)}))}static getInitialSrc(e){if(this.isLayeredDefinition(e.src)||this.isTagDefinition(e.src))return[...e.src.defaults];let t=e.src;return P.isStaticImageData(t)?P.srcToURL(t):P.isColor(t)?t:P.isImageSrc(t)?P.srcToURL(t):j.DefaultImagePlaceholder}static isTagSrc(e){return!!e.config.src}static isLayeredSrc(e){return!!e.config.src?.slots}static isSrcDefinitionObject(e){return typeof e=="object"&&e!==null&&!P.isImageSrc(e)&&!P.isColor(e)}static isLayeredDefinition(e){return this.isSrcDefinitionObject(e)&&"layers"in e}static isTagDefinition(e){return this.isSrcDefinitionObject(e)&&"resolve"in e}static isLayerVariants(e){return typeof e=="object"&&e!==null}static isStaticSrc(e){let t=e.userConfig.get().src;return!this.isTagSrc(e)&&(P.isImageSrc(t)||P.isColor(t))}static getSrcURL(e){return typeof e=="string"?e:j.isLayeredSrc(e)?null:j.isTagSrc(e)&&e.config.src.resolve?j.getSrcFromTags(e.state.currentSrc,e.config.src.resolve):j.isStaticSrc(e)?P.isStaticImageData(e.state.currentSrc)?P.srcToURL(e.state.currentSrc):P.isColor(e.state.currentSrc)?null:e.state.currentSrc:null}static getSrcFromTags(e,t){return t(...e)}static getSrcURLs(e,t){let n=e.config.src?.slots;if(!n)return[];let i=new Set(t??e.state.currentSrc);return n.map(r=>j.resolveLayerSlot(r,i))}static resolveLayerSlot(e,t){if(e===null||typeof e=="string")return e;if(typeof e=="function")return e(t);for(let[n,i]of Object.entries(e))if(t.has(n))return i;return null}static getAllLayerSrc(e){let t=e.config.src?.slots;if(!t)return[];let n=[];for(let i of t)if(typeof i=="string")n.push(i);else if(j.isLayerVariants(i))for(let r of Object.values(i))r!==null&&n.push(r);return n}static fromSrc(e){return new j({src:e})}constructor(e={}){super();let t=j.DefaultUserConfig.create(e),n=this.createImageConfig(t);this.userConfig=t,this.config=n.get(),this.state=this.getInitialState(),this.transformState=this.getInitialTransformState(t),this.checkConfig().registerSrc()}char(e,t){return this.combineActions(new Fe,n=>{if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new Error("Color src is not allowed for non-background image");return n.chain(this._setSrc(n,e,t))}else{let i=new ve(n,ve.ActionTypes.setAppearance,new C().setContent([e,t?.copy()]));return n.chain(i).chain(this._flush())}})}darken(e,t,n){return this.combineActions(new Fe,i=>i.chain(this._setDarkness(i,e,t,n)))}addWearable(e){let t=Array.isArray(e)?e:[e];for(let n of t){if(n===this)throw new J("Cannot add self as a wearable");this.config.wearables.push(n),Object.assign(n.config,{isWearable:!0})}return this}wear(e){return this.addWearable(e)}bindWearable(e){return e.addWearable([this])}asWearableOf(e){return this.bindWearable(e)}useLayer(e){return this.userConfig.get().layer=e||void 0,Object.assign(this.config,{layer:e||void 0}),this}toData(){return{state:j.StateSerializer.serialize(this.state),transformState:ne.TransformStateSerializer.serialize(this.transformState.get()),loop:this._serializeLoop()}}fromData(e){return this.state=j.StateSerializer.deserialize(e.state),this.transformState.resetTo(ne.deserialize(e.transformState).get()),this._deserializeLoop(e.loop),this}_applyTransition(e,t){return new Te(this.chain(),pe.applyTransition,new C().setContent([e,t]))}_init(e,t){return new Te(this.chain(),pe.init,new C().setContent([e,t||this.config.layer||null]))}_initWearable(e){return new ve(this.chain(),ve.ActionTypes.initWearable,new C().setContent([e]))}_flush(){return new ve(this.chain(),ve.ActionTypes.flush,new C)}reset(){return super.reset(),this.state=this.getInitialState(),this.transformState.resetTo(this.getInitialTransformState(this.userConfig).get()),this}resolveTags(e,t){if(!j.isTagSrc(this))throw new Error(`Tag not defined
66
66
  Tag must be defined in the image config`);let n=this.constructTagMap(this.config.src.groups),i=new Map,r=[];this.config.src.groups.forEach(a=>{i.set(a,null)});let s=a=>{a.forEach(c=>{let l=n.get(c);l&&i.set(l,c)})};return s(e),s(t),this.config.src.groups.forEach(a=>{let c=i.get(a);if(!c)throw new Error(`Invalid Tag Group. Tag group "${a.join(", ")}" is not resolved`);r.push(c)}),r}_setAppearanceSync(e){if(P.isImageSrc(e)||P.isColor(e)){if(P.isColor(e)&&!this.config.isBackground)throw new J("Color src is not allowed for non-background image");this.state.currentSrc=e;return}if(!j.isTagSrc(this))throw this._mixedSrcError();let t=this.state.currentSrc,n=this.resolveTags(t,e);this.state.currentSrc=n}_mixedSrcError(){throw new J(`Trying to mix src and tags
package/package.json CHANGED
@@ -1,115 +1,115 @@
1
- {
2
- "name": "narraleaf-react",
3
- "version": "0.40.0",
4
- "description": "A React visual novel player framework",
5
- "type": "module",
6
- "main": "./dist/main.js",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/main.js",
12
- "require": "./dist/main.js"
13
- },
14
- "./built-in": {
15
- "types": "./dist/built-in.d.ts",
16
- "import": "./dist/built-in.js",
17
- "require": "./dist/built-in.js"
18
- }
19
- },
20
- "scripts": {
21
- "prebuild": "rimraf dist",
22
- "build": "cross-env NODE_ENV=production node esbuild.config.js",
23
- "build:dev": "rimraf dist && cross-env NODE_ENV=development node esbuild.config.js && tsc --emitDeclarationOnly && tsc-alias -p tsconfig.json && node project/postbuild.js",
24
- "postbuild": "tsc --emitDeclarationOnly && tsc-alias -p tsconfig.json",
25
- "check:dts": "node project/check-dts.js",
26
- "lint": "eslint \"./src/**/*.{ts,tsx,js,jsx}\"",
27
- "lint:fix": "eslint --fix \"./src/**/*.{ts,tsx,js,jsx}\"",
28
- "prepublishOnly": "npm run lint && rimraf dist && cross-env NODE_ENV=production node esbuild.config.js && tsc --emitDeclarationOnly && tsc-alias -p tsconfig.json && node project/check-dts.js",
29
- "typedoc": "typedoc src/index.ts --out doc",
30
- "prepare": "husky",
31
- "test": "vitest"
32
- },
33
- "devDependencies": {
34
- "@eslint/eslintrc": "^3.1.0",
35
- "@eslint/js": "^9.10.0",
36
- "@tailwindcss/postcss": "^4.1.5",
37
- "@tailwindcss/postcss7-compat": "^2.2.17",
38
- "@types/fs-extra": "^11.0.4",
39
- "@types/lodash": "^4.17.7",
40
- "@types/node": "^22.15.3",
41
- "@types/react": ">=19",
42
- "@types/react-dom": ">=19",
43
- "@typescript-eslint/eslint-plugin": "^8.5.0",
44
- "@typescript-eslint/parser": "^8.5.0",
45
- "autoprefixer": "^10.4.21",
46
- "cross-env": "^7.0.3",
47
- "cssnano": "^7.0.6",
48
- "esbuild": "^0.25.3",
49
- "esbuild-css-modules-plugin": "^3.1.4",
50
- "esbuild-plugin-alias": "^0.2.1",
51
- "esbuild-plugin-postcss2": "^0.1.2",
52
- "esbuild-postcss": "^0.0.4",
53
- "eslint": "^9.10.0",
54
- "eslint-plugin-react": "^7.35.2",
55
- "fs-extra": "^11.3.0",
56
- "globals": "^15.9.0",
57
- "husky": "^9.1.6",
58
- "motion": ">=11 <12",
59
- "postcss": "^8.5.3",
60
- "postcss-cli": "^11.0.1",
61
- "postcss-import": "^16.1.0",
62
- "postcss-loader": "^8.1.1",
63
- "postcss-preset-env": "^10.1.6",
64
- "react": "^19.0.0",
65
- "react-dom": "^19.0.0",
66
- "rimraf": "^6.0.1",
67
- "tailwindcss": "^4.1.5",
68
- "tsc-alias": "^1.8.10",
69
- "typedoc": "^0.26.7",
70
- "typescript": "5.7.2",
71
- "vitest": "^3.2.4"
72
- },
73
- "peerDependencies": {
74
- "@emotion/is-prop-valid": "*",
75
- "motion": ">=11 <12",
76
- "react": ">=19",
77
- "react-dom": ">=19"
78
- },
79
- "peerDependenciesMeta": {
80
- "react": {
81
- "optional": false
82
- },
83
- "react-dom": {
84
- "optional": false
85
- },
86
- "motion": {
87
- "optional": false
88
- }
89
- },
90
- "files": [
91
- "dist",
92
- "!dist/**/*.test.d.ts",
93
- "!dist/**/*.map"
94
- ],
95
- "keywords": [
96
- "react",
97
- "visual-novel",
98
- "typescript",
99
- "component",
100
- "narraleaf",
101
- "nvl"
102
- ],
103
- "author": "helloyork@icloud.com",
104
- "license": "MPL-2.0",
105
- "dependencies": {
106
- "@narraleaf/sound": "0.1.0",
107
- "@types/howler": "^2.2.11",
108
- "client-only": "^0.0.1",
109
- "clsx": "^2.1.1",
110
- "howler": "^2.2.4",
111
- "html-to-image": "^1.11.11",
112
- "prop-types": "^15.8.1"
113
- },
114
- "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
115
- }
1
+ {
2
+ "name": "narraleaf-react",
3
+ "version": "0.41.0",
4
+ "description": "A React visual novel player framework",
5
+ "type": "module",
6
+ "main": "./dist/main.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/main.js",
12
+ "require": "./dist/main.js"
13
+ },
14
+ "./built-in": {
15
+ "types": "./dist/built-in.d.ts",
16
+ "import": "./dist/built-in.js",
17
+ "require": "./dist/built-in.js"
18
+ }
19
+ },
20
+ "scripts": {
21
+ "prebuild": "rimraf dist",
22
+ "build": "cross-env NODE_ENV=production node esbuild.config.js",
23
+ "build:dev": "rimraf dist && cross-env NODE_ENV=development node esbuild.config.js && tsc --emitDeclarationOnly && tsc-alias -p tsconfig.json && node project/postbuild.js",
24
+ "postbuild": "tsc --emitDeclarationOnly && tsc-alias -p tsconfig.json",
25
+ "check:dts": "node project/check-dts.js",
26
+ "lint": "eslint \"./src/**/*.{ts,tsx,js,jsx}\"",
27
+ "lint:fix": "eslint --fix \"./src/**/*.{ts,tsx,js,jsx}\"",
28
+ "prepublishOnly": "npm run lint && rimraf dist && cross-env NODE_ENV=production node esbuild.config.js && tsc --emitDeclarationOnly && tsc-alias -p tsconfig.json && node project/check-dts.js",
29
+ "typedoc": "typedoc src/index.ts --out doc",
30
+ "prepare": "husky",
31
+ "test": "vitest"
32
+ },
33
+ "devDependencies": {
34
+ "@eslint/eslintrc": "^3.1.0",
35
+ "@eslint/js": "^9.10.0",
36
+ "@tailwindcss/postcss": "^4.1.5",
37
+ "@tailwindcss/postcss7-compat": "^2.2.17",
38
+ "@types/fs-extra": "^11.0.4",
39
+ "@types/lodash": "^4.17.7",
40
+ "@types/node": "^22.15.3",
41
+ "@types/react": ">=19",
42
+ "@types/react-dom": ">=19",
43
+ "@typescript-eslint/eslint-plugin": "^8.5.0",
44
+ "@typescript-eslint/parser": "^8.5.0",
45
+ "autoprefixer": "^10.4.21",
46
+ "cross-env": "^7.0.3",
47
+ "cssnano": "^7.0.6",
48
+ "esbuild": "^0.25.3",
49
+ "esbuild-css-modules-plugin": "^3.1.4",
50
+ "esbuild-plugin-alias": "^0.2.1",
51
+ "esbuild-plugin-postcss2": "^0.1.2",
52
+ "esbuild-postcss": "^0.0.4",
53
+ "eslint": "^9.10.0",
54
+ "eslint-plugin-react": "^7.35.2",
55
+ "fs-extra": "^11.3.0",
56
+ "globals": "^15.9.0",
57
+ "husky": "^9.1.6",
58
+ "motion": ">=11 <12",
59
+ "postcss": "^8.5.3",
60
+ "postcss-cli": "^11.0.1",
61
+ "postcss-import": "^16.1.0",
62
+ "postcss-loader": "^8.1.1",
63
+ "postcss-preset-env": "^10.1.6",
64
+ "react": "^19.0.0",
65
+ "react-dom": "^19.0.0",
66
+ "rimraf": "^6.0.1",
67
+ "tailwindcss": "^4.1.5",
68
+ "tsc-alias": "^1.8.10",
69
+ "typedoc": "^0.26.7",
70
+ "typescript": "5.7.2",
71
+ "vitest": "^3.2.4"
72
+ },
73
+ "peerDependencies": {
74
+ "@emotion/is-prop-valid": "*",
75
+ "motion": ">=11 <12",
76
+ "react": ">=19",
77
+ "react-dom": ">=19"
78
+ },
79
+ "peerDependenciesMeta": {
80
+ "react": {
81
+ "optional": false
82
+ },
83
+ "react-dom": {
84
+ "optional": false
85
+ },
86
+ "motion": {
87
+ "optional": false
88
+ }
89
+ },
90
+ "files": [
91
+ "dist",
92
+ "!dist/**/*.test.d.ts",
93
+ "!dist/**/*.map"
94
+ ],
95
+ "keywords": [
96
+ "react",
97
+ "visual-novel",
98
+ "typescript",
99
+ "component",
100
+ "narraleaf",
101
+ "nvl"
102
+ ],
103
+ "author": "helloyork@icloud.com",
104
+ "license": "MPL-2.0",
105
+ "dependencies": {
106
+ "@narraleaf/sound": "0.1.0",
107
+ "@types/howler": "^2.2.11",
108
+ "client-only": "^0.0.1",
109
+ "clsx": "^2.1.1",
110
+ "howler": "^2.2.4",
111
+ "html-to-image": "^1.11.11",
112
+ "prop-types": "^15.8.1"
113
+ },
114
+ "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
115
+ }