narrat 2.12.1 → 2.13.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.
@@ -177,7 +177,7 @@ Found in store "${C.$id}".`),p&&o&&n.hydrate&&n.hydrate(C.$state,p),u=!0,f=!0,C}
177
177
  app.use(pinia)
178
178
  This will fail in production.`);s=Nf,s._s.has(r)||(o?lb(r,e,i,s):t7(r,i,s),process.env.NODE_ENV!=="production"&&(a._pinia=s));const f=s._s.get(r);if(process.env.NODE_ENV!=="production"&&l){const c="__hot:"+r,d=o?lb(c,e,i,s,!0):t7(c,jo({},i),s,!0);l._hotUpdate(d),delete s.state.value[c],s._s.delete(c)}if(process.env.NODE_ENV!=="production"&&sm&&u&&u.proxy&&!l){const c=u.proxy,d="_pStores"in c?c._pStores:c._pStores={};d[r]=f}return f}return a.$id=r,a}function Ls(t,e){return Array.isArray(e)?e.reduce((n,r)=>(n[r]=function(){return t(this.$pinia)[r]},n),{}):Object.keys(e).reduce((n,r)=>(n[r]=function(){const i=t(this.$pinia),o=e[r];return typeof o=="function"?o.call(this,i):i[o]},n),{})}const n7=["music","ambiant","sound"],r7=wZ(n7),Yr=qr("audio",{state:()=>{const t=new Map;for(const e in r7)t.set(e,{channels:[],options:{volume:1}});return{modes:t,masterVolume:1}},actions:{stopAll(){this.modes.forEach(t=>{t.channels.forEach((e,n)=>{e&&(this.actuallyStopChannel(e),t.channels[n]=null)})})},async stopChannel(t,e){const n=this.getAudioChannel(t,e);if(!!n){if(this.setAudioChannel(t,e,null),Ma().options.musicFadeOutTime){const r=Vu(n.audio);r&&r.fade(r.volume(n.howlerId),0,Ma().options.musicFadeOutTime*1e3,n.howlerId),await xo(Ma().options.musicFadeOutTime*1e3)}this.actuallyStopChannel(n)}},async pauseChannel(t,e){const n=this.getAudioChannel(t,e);if(!n)return;const r=Vu(n.audio);if(!r){Ut(`Could not find audio ${n.audio}`);return}r.pause(n.howlerId)},async playChannel(t,e,n){if(Ya.Howler.ctx.state==="suspended"){console.warn("Audio context not started yet, skipping audio");return}const r=this.getAudioChannel(t,n);if(t==="sound")return this.actuallyPlayChannel(t,n,e);r&&r.audio!==e?await this.changeChannel(t,e,n):r&&r.audio===e||await this.actuallyPlayChannel(t,n,e)},async changeChannel(t,e,n){this.getAudioChannel(t,n)&&t!=="sound"&&await this.stopChannel(t,n),await this.actuallyPlayChannel(t,n,e)},actuallyStopChannel(t){XZ(t.audio,t.howlerId)},getAudioChannel(t,e){return this.modes.get(t).channels[e]||null},setAudioChannel(t,e,n){this.modes.get(t).channels[e]=n},async actuallyPlayChannel(t,e,n){const r=Vu(n);if(!r){Ut(`Could not find audio ${n}`);return}if(t!=="sound"){const i=r.play();r.volume(0,i),r.pause(i),this.setAudioChannel(t,e,{audio:n,howlerId:i}),await xo(Ma().options.musicFadeInDelay*1e3);const o=this.getAudioChannel(t,e);o!==null&&o.audio===n&&(r.play(i),r.fade(0,this.modeVolume(t)*r.volume(),Ma().options.musicFadeInTime*1e3,i))}else if(t==="sound"){const i=r.play();r.volume(this.modeVolume(t)*r.volume(),i),this.setAudioChannel(t,e,{audio:n,howlerId:i})}},reloadAudio(t){for(const e in t.modes){if(e==="sound")continue;const n=e;this.modes.get(n).options=Dr(t.modes[n].options);for(const r in t.modes[n].channels){const i=t.modes[n].channels[r];i&&i.audio&&this.actuallyPlayChannel(n,Number(r),i.audio)}}},stopSound(t){const e=Vu(t);e&&e.stop()},generateSaveData(){const t={};for(const e in r7){const n=this.modes.get(e);t[e]={options:Dr(n.options),channels:Dr(n.channels).map(r=>r?{audio:r.audio}:{audio:null})}}return{modes:t,masterVolume:this.masterVolume}},loadSaveData(t){this.masterVolume=t.masterVolume},reset(){this.stopAll()},setModeVolume(t,e){const n=this.modes.get(t);n.options.volume=e;for(const r in n.channels){const i=n.channels[r];if(i){const o=Vu(i.audio);o&&o.volume(this.modeVolume(t),i.howlerId)}}},setMasterVolume(t){this.masterVolume=t,Ya.Howler.volume(t)},modeVolume(t){return this.masterVolume*this.modes.get(t).options.volume}}}),i7={};Ya.Howler.volume(.5);let ub={};async function QZ(t){ea.log("Loading audio");const e=[];Ya.Howler.volume(t.options.volume);for(const n in t.files){const r=t.files[n];r.src||(r.src=r.path,r.path||console.error(`Audio config for ${n} doesn't have any \`src\` value to find the file`),console.warn("Using `path` for audio and musics is deprecated. Please replace `path` with `src` in your config file!")),e.push(YZ(n,t.files[n]))}return t.audioTriggers&&(ub=t.audioTriggers),Promise.all(e)}function Tl(t){ub[t]&&Yr().playChannel("sound",ub[t],0)}async function YZ(t,e){return new Promise((n,r)=>{ea.log(`Loading audio ${e.src}`);const i=new Ya.Howl({...e,src:Eo(e.src)});i.load(),i7[t]=i,n()})}function XZ(t,e){const n=Vu(t);if(!n){Ml(`Could not find music ${t}`);return}n.stop(e)}function Vu(t){return i7[t]}const qu={};async function ZZ(t){return qu[t]?qu[t]:o7(t,t)}async function eee(t){ea.log("Loading images");let e=0,n=0;const r=[],i=async(a,s)=>{n++;const l=await o7(a,s);return e++,console.log(`Loaded ${e} / ${n} images`),l},o=(a,s)=>{r.push(i(a,s))};for(const a in t.images){const s=t.images[a];o(a,s)}for(const a in t.screens.screens){const s=t.screens.screens[a];if(s.background&&!t.images[s.background]&&o(s.background,s.background),s.buttons)for(const l in s.buttons){const u=s.buttons[l];typeof u=="object"&&u.background&&!t.images[u.background]&&o(u.background,u.background)}}return Promise.all(r)}async function o7(t,e){if(qu[t])return qu[t];const n=new Promise((r,i)=>{ea.log(`Loading image ${t} at ${e}`);const o=new Image;o.onload=()=>{qu[t]=o,ea.log(`Loaded image ${t} successfully`),r(o)},o.onerror=a=>{Ut(`Failed to load image ${t} at ${e}`,a),i(a)},o.src=Eo(e)});return qu[t]=n,n}function Hu(){return`${Date.now()}-${Math.floor(Math.random()*1e11)}-${Math.floor(Math.random()*1e11)}`}const cb="1.5.0";function fb(){return`NARRAT_SAVE_${pt().saveFileName}`}const tee="gameSave";let Or;function Za(){if(Or)return Or;if(!Or){let t=null;try{let e=localStorage.getItem(fb());e||(e=localStorage.getItem(tee)),e&&(localStorage.setItem(`${fb()}_BACKUP`,e),t=JSON.parse(e)),t&&typeof t=="object"&&t.slots&&t.slots[0]&&t.slots[0].id||(t=null,localStorage.clear())}catch(e){Ml(`Save file deleted because it was either broken or an outdated format: ${e}`)}t?Or=t:Or=s7()}return ree(Or),l7(Or),Lf(),Or}function nee(){Or=s7(),Lf()}function a7(){return{achievements:{achievements:{}},data:{}}}function ree(t){t.version==="1.4.0"&&(t.globalSave=a7(),t.version=cb)}function s7(){const t={version:cb,slots:[],globalSave:a7()};return l7(t),t}function l7(t){var n;const e=(n=pt().saves.slots)!=null?n:10;t.slots.length<1&&(t.slots[0]={slotType:"auto",id:Hu(),saveData:null,slotNumber:0}),t.slots[0].slotType="auto";for(let r=1;r<e+1;r++)t.slots.length<=r&&(t.slots[r]={slotNumber:r,slotType:pt().saves.mode==="manual"?"manual":"auto",id:Hu(),saveData:null})}function u7(t,e,n){const r=aee(n);if(Or.slots[r])Or.slots[r].saveData=t;else{Ut(`Tried to save to slot ${n} but it doesn't exist`);return}Or.globalSave=e,Lf()}function iee(t){Or.lastSaveSlot=t}function Lf(){localStorage.setItem(fb(),JSON.stringify(Or))}function oee(){const t=Or.slots.find(e=>!e.saveData);return t?t.id:!1}function aee(t){return Or.slots.findIndex(e=>e.id===t)}function Rf(t){return Or.slots.find(e=>e.id===t)}function db(){return Or.slots.find(t=>t.slotType==="auto")}function see(t){const e=Or.slots.findIndex(n=>n.id===t);Or.slots[e].saveData=null,Lf()}function lee(t,e){const n=Rf(t);n&&n.saveData&&(n.saveData.metadata.name=e),Lf()}function uee(){return{saveDate:new Date().toISOString(),name:"New Save"}}const dm=qr("tooltips",{state:()=>({tooltip:null}),actions:{addCustomTooltip(t){t.title&&(t.title=es(t.title)),t.text=es(t.text),this.tooltip=t},addTooltip(t,e){var r,i;const n=sR(t);n&&this.addCustomTooltip({title:n.title,text:n.description,x:(r=e==null?void 0:e.x)!=null?r:window.screenX,y:(i=e==null?void 0:e.y)!=null?i:window.screenY,width:od().options.width})},deleteTooltip(){this.tooltip=null}}});function hb(){return window}function cee(t){const e=od().options.keywordsPrefix,n=new RegExp(`${e}(\\w*)`,"gi");return t=t.replace(n,fee),t}hb().onTooltipEnter=(t,e)=>{const n={x:t.clientX,y:t.clientY-20};dm().addTooltip(e,n)},hb().onTooltipLeave=()=>{dm().deleteTooltip()};function fee(t,e){const n=e.toLowerCase();return sR(n)?`<span class='highlighted-tooltip-keyword'
179
179
  onmouseenter="onTooltipEnter(event, '${n}')"
180
- onmouseleave="onTooltipLeave()">${e}</span>`:n}function es(t){const e=t.replace(/%{[^}]*}/g,n=>{const r=n.substr(2,n.length-3);return c7(r)});return cee(e)}function c7(t){const e=ac(),[n,r]=Gm(e,t);return n[r]}const f7=/\$\$"/,dee=t=>typeof t=="string"&&t.search(f7)===0;function hee(t){let e=null;const n=[],r=/<[^>]*>/g;do e=r.exec(t),e&&n.push(e);while(e);return n}const Fn=qr("dialog",{state:()=>({dialog:[],playMode:"normal"}),actions:{generateSaveData(){return{dialog:Dr(this.dialog)}},loadSaveData(t){this.dialog=t.dialog},addDialog(t){var e;this.dialog.push({...t,interactive:(e=t.interactive)!=null?e:!1,id:Hu(),text:es(t.text)}),this.dialog.length>200&&this.dialog.shift()},toggleAutoPlay(){this.playMode=this.playMode==="auto"?"normal":"auto"},toggleSkip(){this.playMode=this.playMode==="skip"?"normal":"skip"},clearDialog(){this.dialog.splice(0,this.dialog.length)},reset(){this.dialog=[],this.playMode="normal"}},getters:{currentDialog(){return this.dialog[this.dialog.length-1]}}});function pee(t,e){return t-e*$o().skillChecks.skillMultiplier}function d7(t,e){const n=pee(t,e),r=$o().skillChecks;let i=!1,o=0,a=r.difficultyText[0][1];for(;!i;)r.difficultyText.length>o&&n>=r.difficultyText[o][0]?a=r.difficultyText[o][1]:i=!0,o++;return a}function mee({skill:t,skillCheckId:e,value:n}){const r=_r(),i=r.getSkillCheck(e),o=Ik(t),a=r.skills[t].level,s=d7(n,a);let l=!0,u=`<span class='skill-check'>[<span class='skill-check-name'>${o.name}</span> - `;return i.happened?i.succeeded?u="":(l=!1,u+=` <span class='skill-check-difficulty'>${s}</span> - <span class='skill-check-failed'>FAILED</span>]</span>`):u+=` <span class='skill-check-difficulty'>${s}</span>]</span>`,{difficultyText:u,allowed:l}}function vee(t,e){const n=_r(),r=Ik(e.skill),i=d7(e.value,n.skills[e.skill].level);return`<span class='passive-skill-check skill-check'>[<span class='skill-check-name'>${r.name}</span> - <span class='skill-check-difficulty'>${i}</span> - ${t?'<span class="skill-check-success">Success</span>':'<span class="skill-check-failed">Failure</span>'}]</span>`}function gee(t){const{skillChecks:e}=$o(),n=_r(),r=Math.floor(Math.random()*e.rollRange),i=n.skills[t].level*e.skillMultiplier,o=r+i;return ea.log(`[SKILL CHECK] Roll: ${o}. (Base roll: ${r}, modifier: ${i} - Skill level: ${n.skills[t].level})`),{roll:o,unmodifiedRoll:r}}function yee(t){const{skills:e,skillChecks:n}=$o();let r=!0;const{roll:i}=gee(t.skill);i<=n.failureChance-1&&(r=!1);const o=e[t.skill];return i<t.value&&(r=!1),ea.log(`[SKILL CHECK ${o.name}]: ${r?"\u2705":"\u274C"}`,`(${t.id}) - ${i}/${t.value}`),Tl(r?"onSkillCheckSuccess":"onSkillCheckFailure"),r}function h7(t){const e=_r(),n=e.getSkillCheck(t.id);if(n&&n.happened&&(n.succeeded||!t.repeatable))return n;const r=yee(t);return v7(vee(r,t)),r?e.passSkillCheck(t.id,t.hideAfterRoll):e.failSkillCheck(t.id,t.hideAfterRoll),e.getSkillCheck(t.id)}function bee(t){const e=t.options,n=t.staticOptions,r=!!e.condition;if(r)return n.success;if(!r&&n.failure)return n.failure}function p7(t){return typeof t=="object"}function m7(t){return typeof t=="string"&&t.search(/\$/)===0}function v7(t){const e={speaker:"game",text:t,interactive:!1};Fn().addDialog(e)}async function pb(t){Fn().addDialog(t)}function kee(t,e){if(e<t.length)return t[e]}const hm="###_--_~=:;_JUMP",mb="###_--_~=:;_RETURN",wee="###_--_~=:;_OK",pm="###_--_~=:;_STOP";function _ee(t){return t===hm||t===mb||t===wee||t===pm}const xee="2.12.1",jee=new Date("2023-04-12T18:43:31.982Z"),See=400,vb=20;/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */function g7(t){return typeof t>"u"||t===null}function Cee(t){return typeof t=="object"&&t!==null}function $ee(t){return Array.isArray(t)?t:g7(t)?[]:[t]}function Eee(t,e){var n,r,i,o;if(e)for(o=Object.keys(e),n=0,r=o.length;n<r;n+=1)i=o[n],t[i]=e[i];return t}function Oee(t,e){var n="",r;for(r=0;r<e;r+=1)n+=t;return n}function Tee(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}var Aee=g7,Mee=Cee,Pee=$ee,Nee=Oee,Iee=Tee,Dee=Eee,Nr={isNothing:Aee,isObject:Mee,toArray:Pee,repeat:Nee,isNegativeZero:Iee,extend:Dee};function y7(t,e){var n="",r=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(n+='in "'+t.mark.name+'" '),n+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(n+=`
180
+ onmouseleave="onTooltipLeave()">${e}</span>`:n}function es(t){const e=t.replace(/%{[^}]*}/g,n=>{const r=n.substr(2,n.length-3);return c7(r)});return cee(e)}function c7(t){const e=ac(),[n,r]=Gm(e,t);return n[r]}const f7=/\$\$"/,dee=t=>typeof t=="string"&&t.search(f7)===0;function hee(t){let e=null;const n=[],r=/<[^>]*>/g;do e=r.exec(t),e&&n.push(e);while(e);return n}const Fn=qr("dialog",{state:()=>({dialog:[],playMode:"normal"}),actions:{generateSaveData(){return{dialog:Dr(this.dialog)}},loadSaveData(t){this.dialog=t.dialog},addDialog(t){var e;this.dialog.push({...t,interactive:(e=t.interactive)!=null?e:!1,id:Hu(),text:es(t.text)}),this.dialog.length>200&&this.dialog.shift()},toggleAutoPlay(){this.playMode=this.playMode==="auto"?"normal":"auto"},toggleSkip(){this.playMode=this.playMode==="skip"?"normal":"skip"},clearDialog(){this.dialog.splice(0,this.dialog.length)},reset(){this.dialog=[],this.playMode="normal"}},getters:{currentDialog(){return this.dialog[this.dialog.length-1]}}});function pee(t,e){return t-e*$o().skillChecks.skillMultiplier}function d7(t,e){const n=pee(t,e),r=$o().skillChecks;let i=!1,o=0,a=r.difficultyText[0][1];for(;!i;)r.difficultyText.length>o&&n>=r.difficultyText[o][0]?a=r.difficultyText[o][1]:i=!0,o++;return a}function mee({skill:t,skillCheckId:e,value:n}){const r=_r(),i=r.getSkillCheck(e),o=Ik(t),a=r.skills[t].level,s=d7(n,a);let l=!0,u=`<span class='skill-check'>[<span class='skill-check-name'>${o.name}</span> - `;return i.happened?i.succeeded?u="":(l=!1,u+=` <span class='skill-check-difficulty'>${s}</span> - <span class='skill-check-failed'>FAILED</span>]</span>`):u+=` <span class='skill-check-difficulty'>${s}</span>]</span>`,{difficultyText:u,allowed:l}}function vee(t,e){const n=_r(),r=Ik(e.skill),i=d7(e.value,n.skills[e.skill].level);return`<span class='passive-skill-check skill-check'>[<span class='skill-check-name'>${r.name}</span> - <span class='skill-check-difficulty'>${i}</span> - ${t?'<span class="skill-check-success">Success</span>':'<span class="skill-check-failed">Failure</span>'}]</span>`}function gee(t){const{skillChecks:e}=$o(),n=_r(),r=Math.floor(Math.random()*e.rollRange),i=n.skills[t].level*e.skillMultiplier,o=r+i;return ea.log(`[SKILL CHECK] Roll: ${o}. (Base roll: ${r}, modifier: ${i} - Skill level: ${n.skills[t].level})`),{roll:o,unmodifiedRoll:r}}function yee(t){const{skills:e,skillChecks:n}=$o();let r=!0;const{roll:i}=gee(t.skill);i<=n.failureChance-1&&(r=!1);const o=e[t.skill];return i<t.value&&(r=!1),ea.log(`[SKILL CHECK ${o.name}]: ${r?"\u2705":"\u274C"}`,`(${t.id}) - ${i}/${t.value}`),Tl(r?"onSkillCheckSuccess":"onSkillCheckFailure"),r}function h7(t){const e=_r(),n=e.getSkillCheck(t.id);if(n&&n.happened&&(n.succeeded||!t.repeatable))return n;const r=yee(t);return v7(vee(r,t)),r?e.passSkillCheck(t.id,t.hideAfterRoll):e.failSkillCheck(t.id,t.hideAfterRoll),e.getSkillCheck(t.id)}function bee(t){const e=t.options,n=t.staticOptions,r=!!e.condition;if(r)return n.success;if(!r&&n.failure)return n.failure}function p7(t){return typeof t=="object"}function m7(t){return typeof t=="string"&&t.search(/\$/)===0}function v7(t){const e={speaker:"game",text:t,interactive:!1};Fn().addDialog(e)}async function pb(t){Fn().addDialog(t)}function kee(t,e){if(e<t.length)return t[e]}const hm="###_--_~=:;_JUMP",mb="###_--_~=:;_RETURN",wee="###_--_~=:;_OK",pm="###_--_~=:;_STOP";function _ee(t){return t===hm||t===mb||t===wee||t===pm}const xee="2.13.0",jee=new Date("2023-04-13T20:55:02.163Z"),See=400,vb=20;/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */function g7(t){return typeof t>"u"||t===null}function Cee(t){return typeof t=="object"&&t!==null}function $ee(t){return Array.isArray(t)?t:g7(t)?[]:[t]}function Eee(t,e){var n,r,i,o;if(e)for(o=Object.keys(e),n=0,r=o.length;n<r;n+=1)i=o[n],t[i]=e[i];return t}function Oee(t,e){var n="",r;for(r=0;r<e;r+=1)n+=t;return n}function Tee(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}var Aee=g7,Mee=Cee,Pee=$ee,Nee=Oee,Iee=Tee,Dee=Eee,Nr={isNothing:Aee,isObject:Mee,toArray:Pee,repeat:Nee,isNegativeZero:Iee,extend:Dee};function y7(t,e){var n="",r=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(n+='in "'+t.mark.name+'" '),n+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(n+=`
181
181
 
182
182
  `+t.mark.snippet),r+" "+n):r}function Bf(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=y7(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Bf.prototype=Object.create(Error.prototype),Bf.prototype.constructor=Bf,Bf.prototype.toString=function(e){return this.name+": "+y7(this,e)};var Mi=Bf;function gb(t,e,n,r,i){var o="",a="",s=Math.floor(i/2)-1;return r-e>s&&(o=" ... ",e=r-s+o.length),n-r>s&&(a=" ...",n=r+s-a.length),{str:o+t.slice(e,n).replace(/\t/g,"\u2192")+a,pos:r-e+o.length}}function yb(t,e){return Nr.repeat(" ",e-t.length)+t}function Lee(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var n=/\r?\n|\r|\0/g,r=[0],i=[],o,a=-1;o=n.exec(t.buffer);)i.push(o.index),r.push(o.index+o[0].length),t.position<=o.index&&a<0&&(a=r.length-2);a<0&&(a=r.length-1);var s="",l,u,f=Math.min(t.line+e.linesAfter,i.length).toString().length,c=e.maxLength-(e.indent+f+3);for(l=1;l<=e.linesBefore&&!(a-l<0);l++)u=gb(t.buffer,r[a-l],i[a-l],t.position-(r[a]-r[a-l]),c),s=Nr.repeat(" ",e.indent)+yb((t.line-l+1).toString(),f)+" | "+u.str+`
183
183
  `+s;for(u=gb(t.buffer,r[a],i[a],t.position,c),s+=Nr.repeat(" ",e.indent)+yb((t.line+1).toString(),f)+" | "+u.str+`
@@ -211,7 +211,7 @@ This will fail in production.`);s=Nf,s._s.has(r)||(o?lb(r,e,i,s):t7(r,i,s),proce
211
211
  `:""}var One=Ene,Tne={dump:One};function Tb(t,e){return function(){throw new Error("Function yaml."+t+" is removed in js-yaml 4. Use yaml."+e+" instead, which is now safe by default.")}}var Ane=Xr,Mne=k7,Pne=j7,Nne=O7,Ine=T7,Dne=wb,Lne=Z7.load,Rne=Z7.loadAll,Bne=Tne.dump,zne=Mi,Fne={binary:I7,float:E7,map:x7,null:S7,pairs:L7,set:R7,timestamp:P7,bool:C7,int:$7,merge:N7,omap:D7,seq:_7,str:w7},Vne=Tb("safeLoad","load"),qne=Tb("safeLoadAll","loadAll"),Hne=Tb("safeDump","dump"),Une={Type:Ane,Schema:Mne,FAILSAFE_SCHEMA:Pne,JSON_SCHEMA:Nne,CORE_SCHEMA:Ine,DEFAULT_SCHEMA:Dne,load:Lne,loadAll:Rne,dump:Bne,YAMLException:zne,types:Fne,safeLoad:Vne,safeLoadAll:qne,safeDump:Hne};function Ab(t){return new Promise((e,n)=>{const r=new XMLHttpRequest;r.onload=function(){r.status>=200&&r.status<300?e(r.responseText):(Ut(`Failed to load file ${t}`,r.status),n(r.status))},r.open("GET",t),r.send()})}async function wm(t){try{const e=await Ab(t);let n;if(t.endsWith(".json"))n=JSON.parse(e);else if(t.endsWith(".yaml"))n=Une.load(e);else{const r=`Unsupported file type for data file ${t} (must be .json or .yaml)`;throw new Error(r)}if(!n)throw new Error(`Data loaded from ${t} is empty`);return n}catch(e){throw console.error(`Failed to load data file ${t}: ${e}`),e}}const Wne=(t,e)=>{const n={};for(const r in t)n[r]=e(t[r]);return n},bD=(t,e)=>{for(const n in t){const r=t[n];e(r,n,t),typeof r=="object"&&r!==null&&bD(r,e)}},kD=new ev;kD.setupDebugger(!1);const So=kD.logger;function Kne(t,e,n){const r={fileName:n,currentLine:0,error:(a,s)=>t(r,a,s),processCommandsFunction:Mb,indentSize:0};r.indentSize=nre(r,e);const i=Zne(r,e);r.currentLine=0,So.log(i);const o={};for(const a of i){a.code.search(":")===-1&&r.error(a.line,"First indentation level should only be used to specify labels");const l=a.code.replace(":","").split(/ +/g),u=l[0],f=l.slice(1);a.branch||r.error(a.line,"This line should have a branch but doesn't"),o[u]={branch:Mb(r,a.branch,void 0),args:f}}return o}function Mb(t,e,n){const r=t.currentLine,i={processCommandsFunction:Mb,parserContext:t,lines:e,currentLine:0,line:e[0]},o=[];if(!e){let a=0;return n&&(a=n.line),t.error(a,"Processing of command failed because the current branch has no lines inside"),[]}for(;i.currentLine<e.length;){const a=e[i.currentLine];i.line=a;const s=wD(t,a,a.expression),l=vn.commands[s.command.operator];let u=l==null?void 0:l.parser;u||(u=vn.commands.text.parser),So.log(vn.commands.text);const{newLine:f}=u(i,s);i.currentLine=f,t.currentLine=r+f,o.push(s)}return o}function wD(t,e,n){So.log(n),typeof n[0]!="string"&&t.error(e.line,"Expression operator should be a string");const r={code:e.code,fileName:t.fileName,line:e.line,command:{staticOptions:{},commandType:n[0],operator:n[0],args:n.slice(1).map(a=>Gne(t,e,a)),options:{}}},i=n[0];if(!vn.commands[i]){const a=["else","success","failure"];!dee(i)&&!a.includes(i)&&t.error(e.line,`Unknown command ${i}`)}return r}function Gne(t,e,n){return Array.isArray(n)?wD(t,e,n):n}function Jne(t){return t==="true"?!0:t==="false"?!1:t==="undefined"?void 0:t===null?null:isNaN(Number(t))?t:Number(t)}function Qne(t,e){e.charAt(e.length-1)===":"&&(e=e.substr(0,e.length-1));const n=Yne(e),[r]=xD(t,n);return r}function Yne(t){const e=/(["'])(?:\\\1|.)*?\1/g,n=[];let r;for(;(r=e.exec(t))!=null;)n.push(r);let i=0,o=[];for(const a of n){const s=a.index;if(s>i){const u=t.substr(i,s-i),f=_D(u);o=[...o,...f]}const l=a[0].replace(/\\/g,"");o.push(`$$"${l.substring(1,l.length-1)}`),i=s+a[0].length}return o=[...o,..._D(t.substr(i))],o.push(")"),o}function _D(t){t=t.replace(/: *$/g,"");let e=t.split(" ").filter(n=>n);return e=e.reduce((n,r)=>[...n,...r.split(/(\(|\))/g)].filter(i=>i&&i),[]),e.map(n=>Jne(n))}function xD(t,e){So.log("===============");let n=[],r=0,i=jD(e)+r,o=Pb(e)+r;for(So.log(`Parsing expression: ${e}`),So.log(`Parenthesis start index: ${i} - end: ${o}`);i!==-1&&o>i;){n=[...n,...e.slice(r,i)];const l=e.slice(i+1);So.log(`Found a sub expression. Before: ${n} - After: ${l}`),r=i;const[u,f]=xD(t,l),c=r+f;n.push(u),r=c+1;const d=e.slice(r);So.log(`Sub expression came back: ${u} - rest of string: ${d}`),i=jD(d),i!==-1&&(i+=r),o=Pb(d),o!==-1&&(o+=r)}o!==-1&&So.log("Found parenthesis end before new opening parenthesis, close this expression");const a=Pb(e.slice(r))+r;if(a===-1)return t.error(t.currentLine,'Expression is not closed (missing ")" closing parenthesis)'),[n,a];const s=e.slice(r,a);return So.log(`End of expression: ${a} - ${s}`),So.log("==================="),n=[...n,...s],Xne(t,n),[n,a+1]}function Xne(t,e){e.length<1&&t.error(t.currentLine,"Expression is empty")}function jD(t){return t.findIndex(e=>e==="(")}function Pb(t){return t.findIndex(e=>e===")")}function Zne(t,e){const n=e.split(/\r?\n|$/).map(i=>{const o=i.search(/ *\/\//g);return o!==-1?i.substr(0,o):i});return SD(t,n,0,0).lines}function SD(t,e,n,r){let i=!0,o=n;const a=[];for(;i&&!(o>=e.length);){let s=e[o];if(s.search(/^\s*$/)!==-1)o++;else{const l=tre(t,s);if(s=s.substring(l*t.indentSize),ere(t,l,o),l<r)i=!1;else if(l>r){(a.length===0||l-r!==1)&&t.error(o,"Wrong double indentation");const u=SD(t,e,o,l);a[a.length-1].branch=u.lines,o=u.endLine}else{const u=Qne(t,s),f={code:s,indentation:l,line:o,expression:u};a.push(f),o++,t.currentLine=o}}}return{lines:a,endLine:o}}function ere(t,e,n){e%1!==0&&t.error(n,`Indentation level of ${e} incorrect. Expected indentation of ${t.indentSize} spaces for this file.`)}function tre(t,e){return e.search(/[^ ]/)/t.indentSize}function nre(t,e){const n=/\n( *)/,r=e.match(n);return!r||r.length<2?(t.error(0,"Can't detect indentation level. Make sure you indent with at least 2 spaces and consistently"),0):(So.log(r),r[1].length)}function CD(t){if(!Kt().inScript)return!0;const e=Pk().clickableDuringScriptsByDefault;if(e)return t.scriptClickable!==!1;if(!e)return t.scriptClickable===!0}const rre=["screenObject","sprite"];function $D(t){return typeof t=="object"&&t!==null&&rre.includes(t._entityType)}function ire(t){return typeof t=="object"&&t!==null&&t._entityType==="sprite"}function ore(t){if(t.includes(" ")){const e=t.split(" ");return{label:e[0],args:e.slice(1)}}else return{label:t}}const oo=qr("screenObjects",{state:()=>({tree:[],objectsList:{}}),actions:{addObject(t){t.parent?t.parent.children.push(t):this.tree.push(t),this.objectsList[t.id]=t},createObject(t){const e={_entityType:"screenObject",id:Hu(),name:"Screen Object",tags:[],x:0,y:0,anchor:{x:0,y:0},width:1,height:1,opacity:1,scale:1,layer:0,children:[],...t};return this.addObject(e),e},destroyObject(t){let e=t;typeof e=="string"&&(e=this.getObject(e));for(const n of e.children)this.destroyObject(n);if(e.parent){const n=e.parent,r=n.children.indexOf(e);r!==-1?n.children.splice(r,1):Ml(`Could not find object ${e.id} in parent's children`)}else{const n=this.tree.indexOf(e);n!==-1?this.tree.splice(n,1):Ml(`Object to destroy not found in store (${e.id})`)}delete this.objectsList[e.id]},createSprite(t){const e=this.createObject(t);return e._entityType="sprite",ZZ(t.image).then(n=>{const r=this.getObject(e.id);r.width===1&&r.height===1&&(r.width=n.width,r.height=n.height)}),e},getObject(t){return this.objectsList[t]},clickObject(t){var e,n,r;if(!!CD(t)&&t.onClick){console.log("click",Date.now()),Tl("onSpriteClicked");let i;if(typeof t.onClick=="string"){const o=ore(t.onClick);i={label:o.label,args:o.args}}else i=t.onClick;i.method=(n=(e=i.method)!=null?e:t.clickMethod)!=null?n:"jump",i.args=(r=i.args)!=null?r:[],i.method==="run"?bn().runThenGoBackToPreviousDialog(i.label,...i.args):i.method==="jump"?bn().jumpToLabel(i.label,...i.args):Ut(`Unknown sprite click method ${t.clickMethod}`)}},generateSaveData(){return{tree:Dr(this.tree.map(t=>t.id)),objectsList:Dr(Wne(this.objectsList,t=>this.screenObjectToSave(t)))}},loadSaveData(t){this.objectsList=this.loadAllObjects(t.objectsList),this.tree=t.tree.map(e=>this.objectsList[e])},reset(){this.$reset()},screenObjectToSave(t){return{...t,children:t.children.map(e=>e.id),parent:t.parent?t.parent.id:void 0}},loadAllObjects(t){for(const e of Object.values(t)){const n=e;n.parent=n.parent?t[n.parent]:void 0,n.children=n.children.map(r=>t[r])}return t}}}),bn=qr("vm",{state:()=>({stack:[],data:{},globalData:{},lastLabel:"main",script:{},labelStack:["main"],commandsWaitingForPlayerAnswer:[],hasJumped:!1}),actions:{generateSaveData(){return{vmSave:{lastLabel:this.lastLabel,data:Rk(this.data,t=>$D(t)?{_entityType:t._entityType,id:t.id}:t)},globalData:Dr(this.globalData)}},loadSaveData(t,e){this.lastLabel=t.lastLabel,this.data=t.data,this.findEntitiesInData(this.data)},findEntitiesInData(t){bD(this.data,(e,n,r)=>{if($D(e)){const i=oo().getObject(e.id);i?r[n]=i:Ml(`Trying to reload sprite ${n} (${JSON.stringify(e)} - ${e.id}) but it does not exist.`)}})},setReturnValue(t){this.currentFrame.returnValue=t},waitForPlayerAnswer(t){this.commandsWaitingForPlayerAnswer.push(t)},popAnswerQueue(){return this.commandsWaitingForPlayerAnswer.pop()},addScopedVariable(t,e){this.currentFrame&&(this.currentFrame.scope[t]=e)},async loadScripts(t){this.readGlobalData();const e=[];for(const a of t)e.push(Ab(Dk(a)));const n=await Promise.all(e),r=Date.now();let i={};for(const a in n){const s=n[a];i={...i,...Kne((l,u,f)=>Sre(l,u,f),s,t[a])}}const o=Date.now();ea.log(`script parsed in ${o-r} ms`),vn.script=i},start(){this.setStack({currentIndex:0,branchData:{branch:vn.script.main.branch},label:"main"}),this.setStack({currentIndex:0,branchData:{branch:vn.script.main.branch},label:"main"})},setLastLabel(t){this.lastLabel=t},reset(){this.$reset(),this.stack=[],this.data={},this.hasJumped=!0,this.setStack({currentIndex:0,branchData:{branch:vn.script.main.branch},label:"main"})},readGlobalData(){this.globalData=Za().globalSave.data},setScript(t){vn.script=t},overrideData(t){this.data=t},setStack(t){this.stack=[];const e=this.frameOptionsToFrame(t);this.lastLabel=t.label,this.stack.push(e)},frameOptionsToFrame(t){const e=t.branchData,n={...t,blocks:[],scope:{},returnValue:null};if(this.addBlock(n,{branchData:e,currentIndex:t.currentIndex}),t.scope&&(n.scope=t.scope),t.args&&t.branchData.args)for(const[r,i]of t.branchData.args.entries())t.args.length>r&&(n.scope[i]=t.args[r]);return n},addBlock(t,e){t.blocks.push(e)},async addAndRunBlock(t){const e=this.currentFrame;if(!e)throw new Error("No frame to add block to");return this.addBlock(e,t),await this.runBlock()},setData(t,e){const n=ac();fR(n,t,e)},addInstruction(t,e){const n=ac();dR(n,t,e)},addFrame(t){if(!t.label)if(this.currentFrame)t.label=this.currentFrame.label;else throw new Error("Tried to add a new frame but no label was passed and there is no current frame label");const e=this.frameOptionsToFrame(t);this.stack.push(e)},async addAndRunFrame(t){return await this.addFrame(t),await this.runFrame()},async runFrame(){if(!this.currentFrame)throw new Error("Tried to run a frame but there is no current frame");let e;for(;this.currentBlock;){const n=await this.runBlock();if(n===hm||n===pm)return this.cleanFrame(),n;if(n===mb)return this.cleanFrame()}return this.cleanFrame(),e},cleanFrame(){const t=this.currentFrame,{returnValue:e}=t;return this.stack.splice(this.stack.length-1,1),e},async runBlock(){const t=this.currentBlock;if(!t)throw new Error("Tried to run a block but there is no current block");let e;for(;this.currentLine;){if(e=await this.runLineOnly(),_ee(e))return this.cleanBlock(),e;t.currentIndex++}return this.cleanBlock(),e},cleanBlock(){if(!this.currentFrame){Ut("Tried to clean a block but there is no current frame");return}if(!this.currentFrame.blocks){Ut("Tried to clean a block but there is no current block");return}this.currentFrame.blocks.splice(this.currentFrame.blocks.length-1,1)},async runGame(){let t=await this.runFrame();for(;t===hm;){const e=this.jumpTarget;if(!e){Ut("Tried to jump but no target was set");return}this.hasJumped=!0,this.setStack(e),await Kt().autoSaveGame({}),t=await this.runFrame()}t!==pm&&this.stack.length===0&&this.reachedEndOfScript()},async nextLineOnly(){return this.stack.length===0||this.isBlockFinished()?!1:(this.currentBlock.currentIndex++,!0)},isBlockFinished(){return!this.currentBlock||this.currentBlock&&this.currentBlock.currentIndex>=this.currentBlock.branchData.branch.length},reachedEndOfScript(){if(pt().gameFlow.labelToJumpOnScriptEnd&&this.lastLabel!==pt().gameFlow.labelToJumpOnScriptEnd){this.jumpToLabel(pt().gameFlow.labelToJumpOnScriptEnd);return}Kt().endingScript(),Kt().options.debug&&pt().debugging.showScriptFinishedMessage},async runLineOnly(){const t=this.currentLine;if(!t){Ut("There is no line of script to run.");return}return Kt().startingScript(),await ED(t)},async runLabelFunction(t,...e){const n=vn.script[t];if(!n){Ut(`Tried to run a label that doesn't exist: ${t}`);return}const r={currentIndex:0,branchData:n,label:t,args:e};return this.addAndRunFrame(r)},runCustomFrame(t){this.addAndRunFrame(t)},async jumpToLabel(t,...e){const n=vn.script[t];if(!n){Ut(`Label ${t} doesn't exist. Is the file with this label added in the list of script files to load in the config?`);return}t!==this.lastLabel&&(this.hasJumped=!0),this.setLastLabel(t),this.setStack({currentIndex:0,branchData:n,args:e,label:t}),this.runGame()},async runThenGoBackToPreviousDialog(t,...e){const n=Fn(),r=n.dialog[n.dialog.length-1],i=Kt().inScript,o=await this.runLabelFunction(t,...e);return i?n.dialog.push(r):Kt().endingScript(),o}},getters:{currentFrame(t){return t.stack[t.stack.length-1]},scope(){var t,e;return(e=(t=this.currentFrame)==null?void 0:t.scope)!=null?e:{}},currentBlock(){const t=this.currentFrame;return t?t.blocks[t.blocks.length-1]:void 0},currentLine(){const t=this.currentBlock;if(t&&t.branchData.branch.length>t.currentIndex)return t.branchData.branch[t.currentIndex]},commandWaitingForAnswer(){if(this.commandsWaitingForPlayerAnswer.length>0)return this.commandsWaitingForPlayerAnswer[0]}}});class are{constructor(){Ur(this,"plugins",[]);Ur(this,"pinia");Ur(this,"script",{});Ur(this,"commands",{})}addCommand(e){this.commands[e.keyword]=e}addPlugin(e){if(this.plugins.push(e),e.customCommands)for(const n of e.customCommands)this.addCommand(n)}callHook(e,...n){for(const r of this.plugins)typeof r[e]=="function"&&r[e](...n)}customStores(){const e=[];for(const n of this.plugins)if(n.customStores)for(const r in n.customStores)e.push([r,n.customStores[r](this.pinia)]);return e}}const vn=new are;async function ED(t,e){var r;const n=bn();try{return await Nb(t,e)}catch(i){console.error(i),console.error(t),Ut(`Narrat script runtime error at <span class="error-filename">${t.fileName}:${t.line+1}</span>
212
212
  <b>${i}</b>
213
213
  Script: ${t.code}
214
- Label: ${((r=n.currentFrame)==null?void 0:r.label)||"none"}`)}}async function sre(t,e){const n=t.command,r=vn.commands[n.commandType];if(r){const i={args:[],options:{},operator:n.operator,staticOptions:n.staticOptions,code:t.code,commandType:n.commandType,fileName:t.fileName,line:t.line},o=r.argTypes;i.options={};for(const[a,s]of n.args.entries()){let l;if(p7(s))l=await Nb(s,e);else if(typeof s=="string")if(s.search(f7)===0)l=es(s.substring(3));else if(m7(s)){const u=ac(),f=kse(u,s);if(f){const[c,d]=f;l=c[d]}else l=s}else l=s;else l=s;if(i.args.push(l),Array.isArray(o)&&o.length>a){const u=o[a];l!==null&&(i.options[u.name]=l)}}return i}else throw new Error(`${n.commandType} is not a valid command`)}async function Nb(t,e){const n=await sre(t,e),r=vn.commands[n.commandType];if(r)return await r.run(n,e);throw new Error(`${n.commandType} is not a valid command`)}async function lre(t){Tl("onPlayerAnswered");const e=bn(),n=e.popAnswerQueue(),r=e.currentLine;try{if(n){const i=vn.commands[n.commandType];if(i)return await i.processPlayerAnswer(n,t)}}catch(i){console.error(i),Ut(`Error after player answer at ${r.fileName}:${r.line+1} (${r.code}<br /> - Error: ${i}`)}}var ure=function(e){return cre(e)&&!fre(e)};function cre(t){return!!t&&typeof t=="object"}function fre(t){var e=Object.prototype.toString.call(t);return e==="[object RegExp]"||e==="[object Date]"||pre(t)}var dre=typeof Symbol=="function"&&Symbol.for,hre=dre?Symbol.for("react.element"):60103;function pre(t){return t.$$typeof===hre}function mre(t){return Array.isArray(t)?[]:{}}function Hf(t,e){return e.clone!==!1&&e.isMergeableObject(t)?Qu(mre(t),t,e):t}function vre(t,e,n){return t.concat(e).map(function(r){return Hf(r,n)})}function gre(t,e){if(!e.customMerge)return Qu;var n=e.customMerge(t);return typeof n=="function"?n:Qu}function yre(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(e){return t.propertyIsEnumerable(e)}):[]}function OD(t){return Object.keys(t).concat(yre(t))}function TD(t,e){try{return e in t}catch{return!1}}function bre(t,e){return TD(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))}function kre(t,e,n){var r={};return n.isMergeableObject(t)&&OD(t).forEach(function(i){r[i]=Hf(t[i],n)}),OD(e).forEach(function(i){bre(t,i)||(TD(t,i)&&n.isMergeableObject(e[i])?r[i]=gre(i,n)(t[i],e[i],n):r[i]=Hf(e[i],n))}),r}function Qu(t,e,n){n=n||{},n.arrayMerge=n.arrayMerge||vre,n.isMergeableObject=n.isMergeableObject||ure,n.cloneUnlessOtherwiseSpecified=Hf;var r=Array.isArray(e),i=Array.isArray(t),o=r===i;return o?r?n.arrayMerge(t,e,n):kre(t,e,n):Hf(e,n)}Qu.all=function(e,n){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce(function(r,i){return Qu(r,i,n)},{})};var wre=Qu,_m=wre;const Ea=qr("hud",{state:()=>({hudStats:{}}),actions:{setupHudStats(t){for(const e in t)this.hudStats[e]={value:t[e].startingValue}},reset(t){this.$reset(),this.setupHudStats(t)},setStat(t,e){this.hudStats[t].value=e},addStat(t,e){this.hudStats[t].value+=e},getStat(t){return this.hudStats[t]},getStatValue(t){return this.hudStats[t].value},generateSaveData(){return{hudStats:Dr(this.hudStats)}},loadSaveData(t){this.hudStats=_m(this.hudStats,t.hudStats)}}}),Fi=qr("notifications",{state:()=>({notifications:{},enabled:!0}),actions:{async addNotification(t,e,n){if(!this.enabled)return;t=es(t);const r=`${Date.now()}-${Math.random()*1e4}`;this.notifications[r]={text:t,description:e,icon:n},pt().notifications.alsoPrintInDialogue&&v7(`[NOTIFICATION] ${t}`),await xo(pt().notifications.timeOnScreen*1e3)},deleteNotification(t){delete this.notifications[t]},disableNotifications(){this.enabled=!1;for(const t in this.notifications)this.deleteNotification(t)},enableNotifications(){this.enabled=!0}}}),Ir=qr("inventory",{state:()=>({items:{},interactionTags:{}}),actions:{generateSaveData(){return{items:Dr(this.items),interactionTags:Dr(this.interactionTags)}},loadSaveData(t){this.items={...this.items,...t.items},this.interactionTags={...t.interactionTags}},setupItems(t){Object.keys(t).forEach(e=>{this.items[e]={amount:0,id:e}})},reset(t){this.$reset(),this.setupItems(t)},hasItem(t,e){var n;return e||(e=1),((n=this.items[t])==null?void 0:n.amount)>=e},getExistingItem(t){return this.items[t]},getItemAmount(t){var e;return((e=this.getExistingItem(t))==null?void 0:e.amount)||0},add(t){const e=this.getExistingItem(t.id);e?e.amount+=t.amount:this.items[t.id]={...t},Fi().addNotification(`Received item: ${is(t.id).name} x ${t.amount}`)},enableInteraction(t){t||(t="default"),this.interactionTags[t]={blockedInteraction:!1}},disableInteraction(t){t||(t="default"),this.interactionTags[t]={blockedInteraction:!0}},onScriptStart(){const t=pt().interactionTags;Object.keys(t).forEach(e=>{t[e].onlyInteractOutsideOfScripts&&this.disableInteraction(e)})},onScriptEnd(){const t=pt().interactionTags;Object.keys(t).forEach(e=>{t[e].onlyInteractOutsideOfScripts&&this.enableInteraction(e)})},isInteractionTagBlocked(t){return t||(t="default"),this.interactionTags[t]?this.interactionTags[t].blockedInteraction:!1},remove(t){const e=this.getExistingItem(t.id);e&&(e.amount-=t.amount,Fi().addNotification(`Lost item: ${is(t.id).name} x ${t.amount}`),e.amount<=0&&this.deleteItem(t.id))},deleteItem(t){this.getExistingItem(t)&&(this.items[t].amount=0)},canUseItem(t){var n;const e=is(t.id);return!!(e&&e.onUse&&!this.isInteractionTagBlocked(e.tag)&&!((n=Fn().currentDialog)!=null&&n.choices))}}}),hi=qr("quests",{state:()=>({quests:{}}),actions:{getQuest(t){const e=this.quests[t];if(e)return e;{const n=`Quest ${t} doesn't exist!`;throw Ut(n),new Error(n)}},getObjective(t,e){const n=this.getQuest(t);if(!n){const o=`Quest ${t} doesn't exist!`;throw Ut(o),new Error(o)}const r=n.objectives[e];if(r)return r;const i=`Objective ${e} doesn't exist in quest ${t}!`;throw Ut(i),new Error(i)},setupQuests(t){const e=t.quests;for(const n of Object.keys(e)){const r=e[n];this.quests[n]={id:n,state:"hidden",objectives:{}};for(const i of Object.keys(r.objectives)){const o=r.objectives[i];this.quests[n].objectives[i]={id:i,state:o.hidden?"hidden":"unlocked"}}}},reset(t){this.$reset(),this.setupQuests(t)},startQuest(t){const e=this.getQuest(t);e?(e.state="unlocked",Fi().addNotification(`Started quest: ${zl(t).title}`)):Ut(`Quest ${t} doesn't exist!`)},startObjective(t,e){const n=this.getObjective(t,e);n?(n.state="unlocked",Fi().addNotification(`New quest objective: ${Wm(t,e).description}`)):Ut(`Objective ${e} doesn't exist in quest ${t}!`)},completeObjective(t,e){const n=this.getObjective(t,e);n?(n.state="completed",Fi().addNotification(`Completed quest objective: ${Wm(t,e).description}`)):Ut(`Objective ${e} doesn't exist in quest ${t}!`)},completeQuest(t,e){const n=this.getQuest(t);n?(n.state="completed",n.ending=e,Fi().addNotification(`Completed quest: ${zl(t).title}`)):Ut(`Quest ${t} doesn't exist!`)},isQuestCompleted(t){const e=this.getQuest(t);return e?e.state==="completed":!1},isObjectiveCompleted(t,e){const n=this.getObjective(t,e);return n?n.state==="completed":!1},isQuestStarted(t){const e=this.getQuest(t);return e&&e.state==="unlocked"},isObjectiveStarted(t,e){return this.getObjective(t,e).state==="unlocked"},removeQuest(t){delete this.quests[t]},generateSaveData(){return{quests:Dr(this.quests)}},loadSaveData(t){this.quests=t.quests}}});function AD(t,e,n,r){const i=t/n,o=e/r;return Math.min(i,o)}const ao=qr("rendering",{state:()=>({screenHeight:window.innerHeight,screenWidth:window.innerWidth,layoutMode:"horizontal"}),actions:{updateScreenSize(t,e){this.screenHeight=e,this.screenWidth=t,t<pt().layout.verticalLayoutThreshold?(this.layoutMode="vertical",document.querySelector("html").style.fontSize="40px"):(this.layoutMode="horizontal",document.querySelector("html").style.fontSize="16px")}},getters:{gameScaleRatio(t){return AD(this.screenWidth,this.screenHeight,this.gameWidth,this.gameHeight)},overlayMode(t){return!!(pt().dialogPanel.overlayMode&&t.layoutMode==="horizontal")},gameWidth(){const t=pt();return this.layoutMode==="vertical"||this.overlayMode?t.layout.backgrounds.width:t.layout.backgrounds.width+Km()},gameHeight(){const t=pt();return this.layoutMode==="vertical",t.layout.backgrounds.height},dialogWidth(){return this.layoutMode==="vertical"?this.viewportWidth:Km()},dialogHeight(){var t;return this.layoutMode==="vertical"?this.actualGameHeight-this.gameHeight:(t=pt().dialogPanel.height)!=null?t:this.gameHeight},actualGameHeight(){let t=this.gameHeight;return this.layoutMode==="vertical"&&(t=this.screenHeight/this.gameScaleRatio),t},viewportRatio(t){if(this.layoutMode==="vertical"){const e=pt().layout.backgrounds;return t.screenWidth/e.width}return 1},viewportHeight(t){return pt().layout.backgrounds.height*this.viewportRatio},viewportWidth(t){return pt().layout.backgrounds.width*this.viewportRatio},showDialog(t){const e=Kt().inScript;return!this.overlayMode||this.layoutMode==="vertical"?!0:e}}}),xm={};function _re(t){var e;return(e=xm[t])!=null?e:{}}function MD(t,e,n){var s,l,u,f;const r=_re(t.transition),i=(l=(s=t.duration)!=null?s:r.duration)!=null?l:500,o=(f=(u=t.delay)!=null?u:r.delay)!=null?f:0;return{...t,resolve:n,duration:i,delay:o,oldScreen:e}}const Wo=qr("screens",{state:()=>({layers:[{screen:"default"}],buttons:{}}),actions:{setScreen(t,e,n){return new Promise(r=>{var s;const i=this.layers[e||0];let o;const a=(s=i==null?void 0:i.screen)!=null?s:null;if(a===t){r();return}n&&(o=MD(n,a,r)),this.layers[e||0]={screen:t,transition:o},o||r()})},finishTransition(t){const e=this.layers[t];if(!e)Ut(`Tried to finish transition on layer ${t} but it doesn't exist`);else if(e.transition){const n=e.transition.resolve;delete e.transition,n()}},transitionScreen(t,e,n){return this.setScreen(t,n!=null?n:0,e)},emptyLayer(t,e){return new Promise(n=>{const r=this.layers[t];if(!r){Ml(`Tried to empty layer ${t} but it doesn't exist`);return}if(e){const i=r.screen,o=MD(e,i,n);r.transition=o}r.screen=null,e||n()})},setButtons(t){const e=t.screens.screens,n=t.buttons.buttons;for(const r in n)this.buttons[r]={state:n[r].enabled};for(const r in e){const i=e[r];if(i.buttons)for(const[o,a]of i.buttons.entries())typeof a=="object"&&(n[a.id]=a,i.buttons[o]=a.id,this.buttons[a.id]={state:a.enabled})}},reset(t){this.$reset(),this.setButtons(t)},changeButton(t,e){if(!this.buttons[t]){Ut(`Tried to change button ${t} but it doesn't exist`);return}this.buttons[t].state=e},generateSaveData(){return{layers:Dr(this.layers).filter(t=>t).map(t=>{var e;return(e=t.screen)!=null?e:null}),buttons:Dr(this.buttons)}},loadSaveData(t){this.layers=t.layers.map(e=>(e!==null&&typeof e!="string"&&(e=null),{screen:e})),this.buttons=_m(this.buttons,t.buttons)}},getters:{nonEmptyLayers(t){return t.layers.filter(e=>e)}}});class Ib{constructor(){Ur(this,"listeners",{})}on(e,n){return this.listeners[e]||this.addEventToMap(e),this.listeners[e].add(n),n}off(e,n){return this.listeners[e]&&this.listeners[e].delete(n),n}once(e,n){const r=(...i)=>{this.off(e,r),n(...i)};return this.on(e,r)}emit(e,...n){this.listeners[e]&&this.listeners[e].forEach(r=>r(...n))}clear(){Object.keys(this.listeners).forEach(e=>{delete this.listeners[e]})}addEventToMap(e){this.listeners[e]=new Set}}const so=qr("menu",{state:()=>({menus:{},activeMenu:!1}),getters:{showSkills(){return Object.entries($o().skills).length>0},showInventory(){return Object.entries(Hm().items).length>0},showQuests(){return Object.entries(id().quests).length>0},showAchievements(){return Object.entries(oc().achievements).length>0},menuTabsToShow(t){return t.menus.menu.tabs.map(e=>{const n=pt().menuButtons[e.id]||{};return{...e,...n}}).filter(e=>e.condition?e.condition():!0)},menu(t){return t.activeMenu?t.menus[t.activeMenu]:void 0},tab(){if(this.menu)return this.menu.tabs[this.menu.activeTab]}},actions:{setup(){},addMenu(t,e){this.menus[t]={...e,id:t}},addMenuOption(t,e){this.menus[t]||(this.menus[t]={id:t,label:t,tabs:[],activeTab:0}),this.menus[t].tabs.push(e)},setActiveTab(t){this.menu&&(this.menu.activeTab=t)},openMenu(t){this.activeMenu=t},closeMenu(){this.activeMenu=!1},toggleMenu(){this.activeMenu?this.activeMenu=!1:this.activeMenu="menu"}}}),zs=qr("achievements",{state:()=>({achievements:{}}),actions:{generateSaveData(){return{achievements:Dr(this.achievements)}},loadSaveData(t){this.achievements={...this.achievements,...Dr(t.achievements)}},setupAchievements(t){Object.keys(t).forEach(e=>{this.achievements[e]={id:e,unlocked:!1}})},reset(t){this.$reset(),this.setupAchievements(t)},hasAchievement(t){var e,n;return(n=(e=this.achievements[t])==null?void 0:e.unlocked)!=null?n:!1},getExistingAchievement(t){return this.achievements[t]},unlock(t){const e=this.getExistingAchievement(t);if(e){const n=new Date().toISOString();e.unlocked=!0,e.unlockTime=n}else Ut(`Tried to unlock achievement ${t} but it doesn't exist`);if(oc().notifyNewAchievements){const n=Lk(t);Fi().addNotification(`New Achievement: ${n.name}`,n.description,n.icon)}}}});function xre(){return{baseAssetsPath:"",baseDataPath:"",configPath:"data/config.json",logging:!1,debug:!1}}class jre extends Ib{}const Kt=qr("main",{state:()=>({ready:!1,playing:!1,errors:[],playTime:{start:0,previousPlaytime:0},saveSlot:"",flowState:"engine-splash",paused:!1,debugMode:!0,options:{baseAssetsPath:"",baseDataPath:"",configPath:"data/config.json",logging:!1,debug:!1},loading:{step:"Loading",percentage:.1,loaded:!1},alerts:[],saving:null,listener:new jre,inScript:!1}),actions:{async setup(){var n;const e=pt().scripts;Yr().setMasterVolume((n=Ma().options.volume)!=null?n:1),await bn().loadScripts(e),so().setup();for(const[,r]of vn.customStores())if(r.setup){const i=r.setup();_Z(i)&&await i}this.resetAllStores()},async engineLoading(){const t=eee(pt()),e=QZ(Ma());if(vn.plugins){const n=[];for(const r of vn.plugins)r.loadingPromises&&n.push(Promise.all(r.loadingPromises));n.length>0&&(this.loading.step="Plugins",this.loading.percentage=.3,await Promise.all(n))}this.loading.step="Images",await t,this.loading.percentage=.7,this.loading.step="Audio",await e,vn.callHook("onAssetsLoaded"),this.loading.percentage=.95,this.loading.step="Starting...",await this.setup(),vn.callHook("onGameSetup"),this.loading.loaded=!0,this.listener.emit("gameLoaded")},async alert(t,e){return new Promise(n=>{this.alerts.push({title:t,text:e,resolver:n,id:Hu()})})},closeAlert(t){const e=this.alerts.findIndex(n=>n.id===t);e!==-1&&(this.alerts[e].resolver(),this.alerts.splice(e,1))},startingScript(){Ir().onScriptStart(),this.inScript=!0},endingScript(){Ir().onScriptEnd(),this.inScript=!1},startMachine(){Yr().stopAll(),Tl("onPressStart"),bn().start(),this.ready=!0,this.startPlaying(),vn.callHook("onGameStart"),this.setFlowState("playing")},setSaveSlot(t){this.saveSlot=t,iee(t)},async startGame(t){if(pt().saves.mode==="manual"){const e=db();e&&(t=e.id)}this.setSaveSlot(t),this.loadGlobalData(),this.startMachine(),bn().runGame()},async loadGame(t,e){if(pt().saves.mode==="manual"){const n=db();n&&(e=n.id)}this.setSaveSlot(e),this.startMachine(),t.saveData&&(this.setLoadedData(t.saveData),Yr().reloadAudio(t.saveData.audio),bn().jumpToLabel(t.saveData.vm.lastLabel))},manualSave({saveName:t,withPrompt:e}){return new Promise(n=>{bn().hasJumped?this.saving={name:t,withPrompt:e,resolver:n}:n()})},resetGlobalSave(){bn().globalData={},Za().globalSave.data={},this.autoSaveGame({})},finishManualSave(t,e){var n,r;if(!this.saving){Ut("Trying to save but there is no saving request!");return}if(!e||!t){this.saving.resolver(),this.saving=null;return}if(this.saveData){const i=this.saveData.saveSlot;u7({...i,main:{...i.main,playTime:Vl(this.playTime.start,this.playTime.previousPlaytime)},metadata:{...i.metadata,name:(r=(n=this.saving)==null?void 0:n.name)!=null?r:"Manual Save",saveDate:new Date().toISOString()}},this.saveData.global,t.slotId),this.alert("Success","Game saved!")}else Ut("There was no data to save!");this.saving.resolver(),this.saving=null},playerAnswered(t){lre(t)},menuReturn(){this.reset(),this.setFlowState("menu"),Ma().options.defaultMusic&&Yr().playChannel("music",Ma().options.defaultMusic,0)},createError(t){this.errors.push({text:t,type:"error"})},createWarning(t){this.errors.push({text:t,type:"warning"})},clearErrors(){this.errors=[]},setFlowState(t){this.flowState=t},pause(){this.paused=!0},unpause(){this.paused=!1},setOptions(t){this.options=t},startPlaying(){this.playing=!0,this.playTime.start=Date.now()},reset(){this.ready=!1,this.errors=[],this.paused=!1,bn().reset(),Yr().reset(),this.resetAllStores(),this.playing=!1,this.ready=!0,vn.plugins.forEach(t=>{t.reset&&t.reset()})},resetAllStores(){const t=Wo(),e=pt();oo().reset(),t.reset(e),_r().reset($o()),Ea().setupHudStats(e.hudStats),Ir().reset(Hm().items),zs().reset(oc().achievements),hi().reset(id()),Fn().reset(),vn.customStores().forEach(([s,l])=>{l.reset&&l.reset()})},generateSaveData(){return{playTime:Vl(this.playTime.start,this.playTime.previousPlaytime)}},loadSaveData(t){this.playTime.previousPlaytime=t.playTime},autoSaveGame({slotId:t,name:e}){const n=t!=null?t:this.saveSlot,r=Rf(n),i=uee();r&&r.saveData?i.name=r.saveData.metadata.name:i.name=e!=null?e:"Auto Save",pt().saves.mode==="manual"&&(i.name="Auto Save");const o=Wo(),a=_r(),s=Fn(),l=bn(),u=Kt(),f=Ea(),c=Yr(),d=Ir(),h=l.generateSaveData(),p=zs(),m={version:cb,screen:o.generateSaveData(),skills:a.generateSaveData(),dialog:s.generateSaveData(),vm:h.vmSave,main:u.generateSaveData(),hud:f.generateSaveData(),audio:c.generateSaveData(),inventory:d.generateSaveData(),quests:hi().generateSaveData(),metadata:i,screenObjects:oo().generateSaveData()};vn.plugins.forEach(v=>{v.save&&(m[v.pluginId]=v.save())}),vn.customStores().forEach(([v,y])=>{if(y.save){const k=y.save();k&&(m[v]=k)}});const g=Za().globalSave;g.data=h.globalData,g.achievements=p.generateSaveData(),this.saveData={saveSlot:m,global:g},u7(m,g,this.saveSlot)},loadGlobalData(){const t=Za().globalSave;zs().loadSaveData(t.achievements)},setLoadedData(t){const e=Wo(),n=_r(),r=Fn(),i=bn(),o=Kt(),a=Ea(),s=Yr(),l=Ir();this.loadGlobalData(),oo().loadSaveData(t.screenObjects),e.loadSaveData(t.screen),n.loadSaveData(t.skills),r.loadSaveData(t.dialog),i.loadSaveData(t.vm,Za().globalSave),o.loadSaveData(t.main),a.loadSaveData(t.hud),s.loadSaveData(t.audio),l.loadSaveData(t.inventory),hi().loadSaveData(t.quests),vn.plugins.forEach(u=>{u.load&&t[u.pluginId]&&u.load(t[u.pluginId])}),vn.customStores().forEach(([u,f])=>{f.load&&f.load(t[u])})},getAllStates(){return{main:this,screens:Wo(),skills:_r(),dialog:Fn(),vm:bn(),hud:Ea(),audio:Yr(),rendering:ao(),notifications:Fi(),inventory:Ir(),quests:hi(),sprites:oo()}},overrideStates(t){const e=this.getAllStates();for(const n in t){const r=t[n];Object.assign(e[n],r)}}},getters:{isInGame(t){return t.flowState==="playing"},totalPlayTime(t){return Vl(t.playTime.start,t.playTime.previousPlaytime)},sessionPlayTime(t){return Vl(t.playTime.start,0)}}});function Sre(t,e,n){console.error(`Parser error: ${t.fileName}:${t.currentLine}`,n);const r=`[Parser Error] in <span class="error-filename">${t.fileName}:${e+1}</span> - <b>${n}</b>`;Ut(r)}function Ut(t,...e){const n=Kt();console.error(t,...e),t=t.replace(/[\r\n]/g,`
214
+ Label: ${((r=n.currentFrame)==null?void 0:r.label)||"none"}`)}}async function sre(t,e){const n=t.command,r=vn.commands[n.commandType];if(r){const i={args:[],options:{},operator:n.operator,staticOptions:n.staticOptions,code:t.code,commandType:n.commandType,fileName:t.fileName,line:t.line},o=r.argTypes;i.options={};for(const[a,s]of n.args.entries()){let l;if(p7(s))l=await Nb(s,e);else if(typeof s=="string")if(s.search(f7)===0)l=es(s.substring(3));else if(m7(s)){const u=ac(),f=kse(u,s);if(f){const[c,d]=f;l=c[d]}else l=s}else l=s;else l=s;if(i.args.push(l),Array.isArray(o)&&o.length>a){const u=o[a];l!==null&&(i.options[u.name]=l)}}return i}else throw new Error(`${n.commandType} is not a valid command`)}async function Nb(t,e){const n=await sre(t,e),r=vn.commands[n.commandType];if(r)return await r.run(n,e);throw new Error(`${n.commandType} is not a valid command`)}async function lre(t){Tl("onPlayerAnswered");const e=bn(),n=e.popAnswerQueue(),r=e.currentLine;try{if(n){const i=vn.commands[n.commandType];if(i)return await i.processPlayerAnswer(n,t)}}catch(i){console.error(i),Ut(`Error after player answer at ${r.fileName}:${r.line+1} (${r.code}<br /> - Error: ${i}`)}}var ure=function(e){return cre(e)&&!fre(e)};function cre(t){return!!t&&typeof t=="object"}function fre(t){var e=Object.prototype.toString.call(t);return e==="[object RegExp]"||e==="[object Date]"||pre(t)}var dre=typeof Symbol=="function"&&Symbol.for,hre=dre?Symbol.for("react.element"):60103;function pre(t){return t.$$typeof===hre}function mre(t){return Array.isArray(t)?[]:{}}function Hf(t,e){return e.clone!==!1&&e.isMergeableObject(t)?Qu(mre(t),t,e):t}function vre(t,e,n){return t.concat(e).map(function(r){return Hf(r,n)})}function gre(t,e){if(!e.customMerge)return Qu;var n=e.customMerge(t);return typeof n=="function"?n:Qu}function yre(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(e){return t.propertyIsEnumerable(e)}):[]}function OD(t){return Object.keys(t).concat(yre(t))}function TD(t,e){try{return e in t}catch{return!1}}function bre(t,e){return TD(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))}function kre(t,e,n){var r={};return n.isMergeableObject(t)&&OD(t).forEach(function(i){r[i]=Hf(t[i],n)}),OD(e).forEach(function(i){bre(t,i)||(TD(t,i)&&n.isMergeableObject(e[i])?r[i]=gre(i,n)(t[i],e[i],n):r[i]=Hf(e[i],n))}),r}function Qu(t,e,n){n=n||{},n.arrayMerge=n.arrayMerge||vre,n.isMergeableObject=n.isMergeableObject||ure,n.cloneUnlessOtherwiseSpecified=Hf;var r=Array.isArray(e),i=Array.isArray(t),o=r===i;return o?r?n.arrayMerge(t,e,n):kre(t,e,n):Hf(e,n)}Qu.all=function(e,n){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce(function(r,i){return Qu(r,i,n)},{})};var wre=Qu,_m=wre;const Ea=qr("hud",{state:()=>({hudStats:{}}),actions:{setupHudStats(t){for(const e in t)this.hudStats[e]={value:t[e].startingValue}},reset(t){this.$reset(),this.setupHudStats(t)},setStat(t,e){this.hudStats[t].value=e},addStat(t,e){this.hudStats[t].value+=e},getStat(t){return this.hudStats[t]},getStatValue(t){return this.hudStats[t].value},generateSaveData(){return{hudStats:Dr(this.hudStats)}},loadSaveData(t){this.hudStats=_m(this.hudStats,t.hudStats)}}}),Fi=qr("notifications",{state:()=>({notifications:[],enabled:!0}),actions:{async addNotification(t,e,n){if(!this.enabled)return;t=es(t);const r=`${Date.now()}-${Math.random()*1e4}`;this.notifications.push({id:r,text:t,description:e,icon:n}),pt().notifications.alsoPrintInDialogue&&v7(`[NOTIFICATION] ${t}`),await xo(pt().notifications.timeOnScreen*1e3),this.deleteNotification(r)},deleteNotification(t){const e=this.findNotifications(t);e&&this.notifications.splice(this.notifications.indexOf(e),1)},findNotifications(t){return this.notifications.find(e=>e.id===t)},disableNotifications(){this.enabled=!1;for(const t in this.notifications)this.deleteNotification(t)},enableNotifications(){this.enabled=!0}}}),Ir=qr("inventory",{state:()=>({items:{},interactionTags:{}}),actions:{generateSaveData(){return{items:Dr(this.items),interactionTags:Dr(this.interactionTags)}},loadSaveData(t){this.items={...this.items,...t.items},this.interactionTags={...t.interactionTags}},setupItems(t){Object.keys(t).forEach(e=>{this.items[e]={amount:0,id:e}})},reset(t){this.$reset(),this.setupItems(t)},hasItem(t,e){var n;return e||(e=1),((n=this.items[t])==null?void 0:n.amount)>=e},getExistingItem(t){return this.items[t]},getItemAmount(t){var e;return((e=this.getExistingItem(t))==null?void 0:e.amount)||0},add(t){const e=this.getExistingItem(t.id);e?e.amount+=t.amount:this.items[t.id]={...t},Fi().addNotification(`Received item: ${is(t.id).name} x ${t.amount}`)},enableInteraction(t){t||(t="default"),this.interactionTags[t]={blockedInteraction:!1}},disableInteraction(t){t||(t="default"),this.interactionTags[t]={blockedInteraction:!0}},onScriptStart(){const t=pt().interactionTags;Object.keys(t).forEach(e=>{t[e].onlyInteractOutsideOfScripts&&this.disableInteraction(e)})},onScriptEnd(){const t=pt().interactionTags;Object.keys(t).forEach(e=>{t[e].onlyInteractOutsideOfScripts&&this.enableInteraction(e)})},isInteractionTagBlocked(t){return t||(t="default"),this.interactionTags[t]?this.interactionTags[t].blockedInteraction:!1},remove(t){const e=this.getExistingItem(t.id);e&&(e.amount-=t.amount,Fi().addNotification(`Lost item: ${is(t.id).name} x ${t.amount}`),e.amount<=0&&this.deleteItem(t.id))},deleteItem(t){this.getExistingItem(t)&&(this.items[t].amount=0)},canUseItem(t){var n;const e=is(t.id);return!!(e&&e.onUse&&!this.isInteractionTagBlocked(e.tag)&&!((n=Fn().currentDialog)!=null&&n.choices))}}}),hi=qr("quests",{state:()=>({quests:{}}),actions:{getQuest(t){const e=this.quests[t];if(e)return e;{const n=`Quest ${t} doesn't exist!`;throw Ut(n),new Error(n)}},getObjective(t,e){const n=this.getQuest(t);if(!n){const o=`Quest ${t} doesn't exist!`;throw Ut(o),new Error(o)}const r=n.objectives[e];if(r)return r;const i=`Objective ${e} doesn't exist in quest ${t}!`;throw Ut(i),new Error(i)},setupQuests(t){const e=t.quests;for(const n of Object.keys(e)){const r=e[n];this.quests[n]={id:n,state:"hidden",objectives:{}};for(const i of Object.keys(r.objectives)){const o=r.objectives[i];this.quests[n].objectives[i]={id:i,state:o.hidden?"hidden":"unlocked"}}}},reset(t){this.$reset(),this.setupQuests(t)},startQuest(t){const e=this.getQuest(t);e?(e.state="unlocked",Fi().addNotification(`Started quest: ${zl(t).title}`)):Ut(`Quest ${t} doesn't exist!`)},startObjective(t,e){const n=this.getObjective(t,e);n?(n.state="unlocked",Fi().addNotification(`New quest objective: ${Wm(t,e).description}`)):Ut(`Objective ${e} doesn't exist in quest ${t}!`)},completeObjective(t,e){const n=this.getObjective(t,e);n?(n.state="completed",Fi().addNotification(`Completed quest objective: ${Wm(t,e).description}`)):Ut(`Objective ${e} doesn't exist in quest ${t}!`)},completeQuest(t,e){const n=this.getQuest(t);n?(n.state="completed",n.ending=e,Fi().addNotification(`Completed quest: ${zl(t).title}`)):Ut(`Quest ${t} doesn't exist!`)},isQuestCompleted(t){const e=this.getQuest(t);return e?e.state==="completed":!1},isObjectiveCompleted(t,e){const n=this.getObjective(t,e);return n?n.state==="completed":!1},isQuestStarted(t){const e=this.getQuest(t);return e&&e.state==="unlocked"},isObjectiveStarted(t,e){return this.getObjective(t,e).state==="unlocked"},removeQuest(t){delete this.quests[t]},generateSaveData(){return{quests:Dr(this.quests)}},loadSaveData(t){this.quests=t.quests}}});function AD(t,e,n,r){const i=t/n,o=e/r;return Math.min(i,o)}const ao=qr("rendering",{state:()=>({screenHeight:window.innerHeight,screenWidth:window.innerWidth,layoutMode:"horizontal"}),actions:{updateScreenSize(t,e){this.screenHeight=e,this.screenWidth=t,t<pt().layout.verticalLayoutThreshold?(this.layoutMode="vertical",document.querySelector("html").style.fontSize="40px"):(this.layoutMode="horizontal",document.querySelector("html").style.fontSize="16px")}},getters:{gameScaleRatio(t){return AD(this.screenWidth,this.screenHeight,this.gameWidth,this.gameHeight)},overlayMode(t){return!!(pt().dialogPanel.overlayMode&&t.layoutMode==="horizontal")},gameWidth(){const t=pt();return this.layoutMode==="vertical"||this.overlayMode?t.layout.backgrounds.width:t.layout.backgrounds.width+Km()},gameHeight(){const t=pt();return this.layoutMode==="vertical",t.layout.backgrounds.height},dialogWidth(){return this.layoutMode==="vertical"?this.viewportWidth:Km()},dialogHeight(){var t;return this.layoutMode==="vertical"?this.actualGameHeight-this.gameHeight:(t=pt().dialogPanel.height)!=null?t:this.gameHeight},actualGameHeight(){let t=this.gameHeight;return this.layoutMode==="vertical"&&(t=this.screenHeight/this.gameScaleRatio),t},viewportRatio(t){if(this.layoutMode==="vertical"){const e=pt().layout.backgrounds;return t.screenWidth/e.width}return 1},viewportHeight(t){return pt().layout.backgrounds.height*this.viewportRatio},viewportWidth(t){return pt().layout.backgrounds.width*this.viewportRatio},showDialog(t){const e=Kt().inScript;return!this.overlayMode||this.layoutMode==="vertical"?!0:e}}}),xm={};function _re(t){var e;return(e=xm[t])!=null?e:{}}function MD(t,e,n){var s,l,u,f;const r=_re(t.transition),i=(l=(s=t.duration)!=null?s:r.duration)!=null?l:500,o=(f=(u=t.delay)!=null?u:r.delay)!=null?f:0;return{...t,resolve:n,duration:i,delay:o,oldScreen:e}}const Wo=qr("screens",{state:()=>({layers:[{screen:"default"}],buttons:{}}),actions:{setScreen(t,e,n){return new Promise(r=>{var s;const i=this.layers[e||0];let o;const a=(s=i==null?void 0:i.screen)!=null?s:null;if(a===t){r();return}n&&(o=MD(n,a,r)),this.layers[e||0]={screen:t,transition:o},o||r()})},finishTransition(t){const e=this.layers[t];if(!e)Ut(`Tried to finish transition on layer ${t} but it doesn't exist`);else if(e.transition){const n=e.transition.resolve;delete e.transition,n()}},transitionScreen(t,e,n){return this.setScreen(t,n!=null?n:0,e)},emptyLayer(t,e){return new Promise(n=>{const r=this.layers[t];if(!r){Ml(`Tried to empty layer ${t} but it doesn't exist`);return}if(e){const i=r.screen,o=MD(e,i,n);r.transition=o}r.screen=null,e||n()})},setButtons(t){const e=t.screens.screens,n=t.buttons.buttons;for(const r in n)this.buttons[r]={state:n[r].enabled};for(const r in e){const i=e[r];if(i.buttons)for(const[o,a]of i.buttons.entries())typeof a=="object"&&(n[a.id]=a,i.buttons[o]=a.id,this.buttons[a.id]={state:a.enabled})}},reset(t){this.$reset(),this.setButtons(t)},changeButton(t,e){if(!this.buttons[t]){Ut(`Tried to change button ${t} but it doesn't exist`);return}this.buttons[t].state=e},generateSaveData(){return{layers:Dr(this.layers).filter(t=>t).map(t=>{var e;return(e=t.screen)!=null?e:null}),buttons:Dr(this.buttons)}},loadSaveData(t){this.layers=t.layers.map(e=>(e!==null&&typeof e!="string"&&(e=null),{screen:e})),this.buttons=_m(this.buttons,t.buttons)}},getters:{nonEmptyLayers(t){return t.layers.filter(e=>e)}}});class Ib{constructor(){Ur(this,"listeners",{})}on(e,n){return this.listeners[e]||this.addEventToMap(e),this.listeners[e].add(n),n}off(e,n){return this.listeners[e]&&this.listeners[e].delete(n),n}once(e,n){const r=(...i)=>{this.off(e,r),n(...i)};return this.on(e,r)}emit(e,...n){this.listeners[e]&&this.listeners[e].forEach(r=>r(...n))}clear(){Object.keys(this.listeners).forEach(e=>{delete this.listeners[e]})}addEventToMap(e){this.listeners[e]=new Set}}const so=qr("menu",{state:()=>({menus:{},activeMenu:!1}),getters:{showSkills(){return Object.entries($o().skills).length>0},showInventory(){return Object.entries(Hm().items).length>0},showQuests(){return Object.entries(id().quests).length>0},showAchievements(){return Object.entries(oc().achievements).length>0},menuTabsToShow(t){return t.menus.menu.tabs.map(e=>{const n=pt().menuButtons[e.id]||{};return{...e,...n}}).filter(e=>e.condition?e.condition():!0)},menu(t){return t.activeMenu?t.menus[t.activeMenu]:void 0},tab(){if(this.menu)return this.menu.tabs[this.menu.activeTab]}},actions:{setup(){},addMenu(t,e){this.menus[t]={...e,id:t}},addMenuOption(t,e){this.menus[t]||(this.menus[t]={id:t,label:t,tabs:[],activeTab:0}),this.menus[t].tabs.push(e)},setActiveTab(t){this.menu&&(this.menu.activeTab=t)},openMenu(t){this.activeMenu=t},closeMenu(){this.activeMenu=!1},toggleMenu(){this.activeMenu?this.activeMenu=!1:this.activeMenu="menu"}}}),zs=qr("achievements",{state:()=>({achievements:{}}),actions:{generateSaveData(){return{achievements:Dr(this.achievements)}},loadSaveData(t){this.achievements={...this.achievements,...Dr(t.achievements)}},setupAchievements(t){Object.keys(t).forEach(e=>{this.achievements[e]={id:e,unlocked:!1}})},reset(t){this.$reset(),this.setupAchievements(t)},hasAchievement(t){var e,n;return(n=(e=this.achievements[t])==null?void 0:e.unlocked)!=null?n:!1},getExistingAchievement(t){return this.achievements[t]},unlock(t){const e=this.getExistingAchievement(t);if(!e){Ut(`Tried to unlock achievement ${t} but it doesn't exist`);return}if(!e.unlocked){const n=new Date().toISOString();e.unlocked=!0,e.unlockTime=n}if(oc().notifyNewAchievements){const n=Lk(t);Fi().addNotification(`New Achievement: ${n.name}`,n.description,n.icon)}}}});function xre(){return{baseAssetsPath:"",baseDataPath:"",configPath:"data/config.json",logging:!1,debug:!1}}class jre extends Ib{}const Kt=qr("main",{state:()=>({ready:!1,playing:!1,errors:[],playTime:{start:0,previousPlaytime:0},saveSlot:"",flowState:"engine-splash",paused:!1,debugMode:!0,options:{baseAssetsPath:"",baseDataPath:"",configPath:"data/config.json",logging:!1,debug:!1},loading:{step:"Loading",percentage:.1,loaded:!1},alerts:[],saving:null,listener:new jre,inScript:!1}),actions:{async setup(){var n;const e=pt().scripts;Yr().setMasterVolume((n=Ma().options.volume)!=null?n:1),await bn().loadScripts(e),so().setup();for(const[,r]of vn.customStores())if(r.setup){const i=r.setup();_Z(i)&&await i}this.resetAllStores()},async engineLoading(){const t=eee(pt()),e=QZ(Ma());if(vn.plugins){const n=[];for(const r of vn.plugins)r.loadingPromises&&n.push(Promise.all(r.loadingPromises));n.length>0&&(this.loading.step="Plugins",this.loading.percentage=.3,await Promise.all(n))}this.loading.step="Images",await t,this.loading.percentage=.7,this.loading.step="Audio",await e,vn.callHook("onAssetsLoaded"),this.loading.percentage=.95,this.loading.step="Starting...",await this.setup(),vn.callHook("onGameSetup"),this.loading.loaded=!0,this.listener.emit("gameLoaded")},async alert(t,e){return new Promise(n=>{this.alerts.push({title:t,text:e,resolver:n,id:Hu()})})},closeAlert(t){const e=this.alerts.findIndex(n=>n.id===t);e!==-1&&(this.alerts[e].resolver(),this.alerts.splice(e,1))},startingScript(){Ir().onScriptStart(),this.inScript=!0},endingScript(){Ir().onScriptEnd(),this.inScript=!1},startMachine(){Yr().stopAll(),Tl("onPressStart"),bn().start(),this.ready=!0,this.startPlaying(),vn.callHook("onGameStart"),this.setFlowState("playing")},setSaveSlot(t){this.saveSlot=t,iee(t)},async startGame(t){if(pt().saves.mode==="manual"){const e=db();e&&(t=e.id)}this.setSaveSlot(t),this.loadGlobalData(),this.startMachine(),bn().runGame()},async loadGame(t,e){if(pt().saves.mode==="manual"){const n=db();n&&(e=n.id)}this.setSaveSlot(e),this.startMachine(),t.saveData&&(this.setLoadedData(t.saveData),Yr().reloadAudio(t.saveData.audio),bn().jumpToLabel(t.saveData.vm.lastLabel))},manualSave({saveName:t,withPrompt:e}){return new Promise(n=>{bn().hasJumped?this.saving={name:t,withPrompt:e,resolver:n}:n()})},resetGlobalSave(){bn().globalData={},Za().globalSave.data={},this.autoSaveGame({})},finishManualSave(t,e){var n,r;if(!this.saving){Ut("Trying to save but there is no saving request!");return}if(!e||!t){this.saving.resolver(),this.saving=null;return}if(this.saveData){const i=this.saveData.saveSlot;u7({...i,main:{...i.main,playTime:Vl(this.playTime.start,this.playTime.previousPlaytime)},metadata:{...i.metadata,name:(r=(n=this.saving)==null?void 0:n.name)!=null?r:"Manual Save",saveDate:new Date().toISOString()}},this.saveData.global,t.slotId),this.alert("Success","Game saved!")}else Ut("There was no data to save!");this.saving.resolver(),this.saving=null},playerAnswered(t){lre(t)},menuReturn(){this.reset(),this.setFlowState("menu"),Ma().options.defaultMusic&&Yr().playChannel("music",Ma().options.defaultMusic,0)},createError(t){this.errors.push({text:t,type:"error"})},createWarning(t){this.errors.push({text:t,type:"warning"})},clearErrors(){this.errors=[]},setFlowState(t){this.flowState=t},pause(){this.paused=!0},unpause(){this.paused=!1},setOptions(t){this.options=t},startPlaying(){this.playing=!0,this.playTime.start=Date.now()},reset(){this.ready=!1,this.errors=[],this.paused=!1,bn().reset(),Yr().reset(),this.resetAllStores(),this.playing=!1,this.ready=!0,vn.plugins.forEach(t=>{t.reset&&t.reset()})},resetAllStores(){const t=Wo(),e=pt();oo().reset(),t.reset(e),_r().reset($o()),Ea().setupHudStats(e.hudStats),Ir().reset(Hm().items),zs().reset(oc().achievements),hi().reset(id()),Fn().reset(),vn.customStores().forEach(([s,l])=>{l.reset&&l.reset()})},generateSaveData(){return{playTime:Vl(this.playTime.start,this.playTime.previousPlaytime)}},loadSaveData(t){this.playTime.previousPlaytime=t.playTime},autoSaveGame({slotId:t,name:e}){const n=t!=null?t:this.saveSlot,r=Rf(n),i=uee();r&&r.saveData?i.name=r.saveData.metadata.name:i.name=e!=null?e:"Auto Save",pt().saves.mode==="manual"&&(i.name="Auto Save");const o=Wo(),a=_r(),s=Fn(),l=bn(),u=Kt(),f=Ea(),c=Yr(),d=Ir(),h=l.generateSaveData(),p=zs(),m={version:cb,screen:o.generateSaveData(),skills:a.generateSaveData(),dialog:s.generateSaveData(),vm:h.vmSave,main:u.generateSaveData(),hud:f.generateSaveData(),audio:c.generateSaveData(),inventory:d.generateSaveData(),quests:hi().generateSaveData(),metadata:i,screenObjects:oo().generateSaveData()};vn.plugins.forEach(v=>{v.save&&(m[v.pluginId]=v.save())}),vn.customStores().forEach(([v,y])=>{if(y.save){const k=y.save();k&&(m[v]=k)}});const g=Za().globalSave;g.data=h.globalData,g.achievements=p.generateSaveData(),this.saveData={saveSlot:m,global:g},u7(m,g,this.saveSlot)},loadGlobalData(){const t=Za().globalSave;zs().loadSaveData(t.achievements)},setLoadedData(t){const e=Wo(),n=_r(),r=Fn(),i=bn(),o=Kt(),a=Ea(),s=Yr(),l=Ir();this.loadGlobalData(),oo().loadSaveData(t.screenObjects),e.loadSaveData(t.screen),n.loadSaveData(t.skills),r.loadSaveData(t.dialog),i.loadSaveData(t.vm,Za().globalSave),o.loadSaveData(t.main),a.loadSaveData(t.hud),s.loadSaveData(t.audio),l.loadSaveData(t.inventory),hi().loadSaveData(t.quests),vn.plugins.forEach(u=>{u.load&&t[u.pluginId]&&u.load(t[u.pluginId])}),vn.customStores().forEach(([u,f])=>{f.load&&f.load(t[u])})},getAllStates(){return{main:this,screens:Wo(),skills:_r(),dialog:Fn(),vm:bn(),hud:Ea(),audio:Yr(),rendering:ao(),notifications:Fi(),inventory:Ir(),quests:hi(),sprites:oo()}},overrideStates(t){const e=this.getAllStates();for(const n in t){const r=t[n];Object.assign(e[n],r)}}},getters:{isInGame(t){return t.flowState==="playing"},totalPlayTime(t){return Vl(t.playTime.start,t.playTime.previousPlaytime)},sessionPlayTime(t){return Vl(t.playTime.start,0)}}});function Sre(t,e,n){console.error(`Parser error: ${t.fileName}:${t.currentLine}`,n);const r=`[Parser Error] in <span class="error-filename">${t.fileName}:${e+1}</span> - <b>${n}</b>`;Ut(r)}function Ut(t,...e){const n=Kt();console.error(t,...e),t=t.replace(/[\r\n]/g,`
215
215
  <br />`),n.createError(`\u274C ${t}`)}function Ml(t,...e){const n=Kt();console.warn(t,...e),t=t.replace(/[\r\n]/g,`
216
216
  <br />`),n.createWarning(`\u26A0\uFE0F ${t}`)}var J={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.Type=t.TypeBuilder=t.Modifier=t.Hint=t.Kind=void 0,t.Kind=Symbol.for("TypeBox.Kind"),t.Hint=Symbol.for("TypeBox.Hint"),t.Modifier=Symbol.for("TypeBox.Modifier");let e=0;class n{ReadonlyOptional(i){return{[t.Modifier]:"ReadonlyOptional",...i}}Readonly(i){return{[t.Modifier]:"Readonly",...i}}Optional(i){return{[t.Modifier]:"Optional",...i}}Any(i={}){return this.Create({...i,[t.Kind]:"Any"})}Array(i,o={}){return this.Create({...o,[t.Kind]:"Array",type:"array",items:i})}Boolean(i={}){return this.Create({...i,[t.Kind]:"Boolean",type:"boolean"})}ConstructorParameters(i,o={}){return this.Tuple([...i.parameters],{...o})}Constructor(i,o,a={}){if(i[t.Kind]==="Tuple"){const s=i.items===void 0?[]:i.items;return this.Create({...a,[t.Kind]:"Constructor",type:"constructor",parameters:s,returns:o})}else{if(globalThis.Array.isArray(i))return this.Create({...a,[t.Kind]:"Constructor",type:"constructor",parameters:i,returns:o});throw new Error("TypeBuilder.Constructor: Invalid parameters")}}Enum(i,o={}){const s=Object.keys(i).filter(l=>isNaN(l)).map(l=>i[l]).map(l=>typeof l=="string"?{[t.Kind]:"Literal",type:"string",const:l}:{[t.Kind]:"Literal",type:"number",const:l});return this.Create({...o,[t.Kind]:"Union",[t.Hint]:"Enum",anyOf:s})}Function(i,o,a={}){if(i[t.Kind]==="Tuple"){const s=i.items===void 0?[]:i.items;return this.Create({...a,[t.Kind]:"Function",type:"function",parameters:s,returns:o})}else{if(globalThis.Array.isArray(i))return this.Create({...a,[t.Kind]:"Function",type:"function",parameters:i,returns:o});throw new Error("TypeBuilder.Function: Invalid parameters")}}InstanceType(i,o={}){return{...o,...this.Clone(i.returns)}}Integer(i={}){return this.Create({...i,[t.Kind]:"Integer",type:"integer"})}Intersect(i,o={}){const a=f=>f[t.Modifier]&&f[t.Modifier]==="Optional"||f[t.Modifier]==="ReadonlyOptional",[s,l]=[new Set,new Set];for(const f of i)for(const[c,d]of Object.entries(f.properties))a(d)&&l.add(c);for(const f of i)for(const c of Object.keys(f.properties))l.has(c)||s.add(c);const u={};for(const f of i)for(const[c,d]of Object.entries(f.properties))u[c]=u[c]===void 0?d:{[t.Kind]:"Union",anyOf:[u[c],{...d}]};return s.size>0?this.Create({...o,[t.Kind]:"Object",type:"object",properties:u,required:[...s]}):this.Create({...o,[t.Kind]:"Object",type:"object",properties:u})}KeyOf(i,o={}){const a=Object.keys(i.properties).map(s=>this.Create({...o,[t.Kind]:"Literal",type:"string",const:s}));return this.Create({...o,[t.Kind]:"Union",[t.Hint]:"KeyOf",anyOf:a})}Literal(i,o={}){return this.Create({...o,[t.Kind]:"Literal",const:i,type:typeof i})}Null(i={}){return this.Create({...i,[t.Kind]:"Null",type:"null"})}Number(i={}){return this.Create({...i,[t.Kind]:"Number",type:"number"})}Object(i,o={}){const a=Object.keys(i),s=a.filter(u=>{const c=i[u][t.Modifier];return c&&(c==="Optional"||c==="ReadonlyOptional")}),l=a.filter(u=>!s.includes(u));return l.length>0?this.Create({...o,[t.Kind]:"Object",type:"object",properties:i,required:l}):this.Create({...o,[t.Kind]:"Object",type:"object",properties:i})}Omit(i,o,a={}){const s=o[t.Kind]==="Union"?o.anyOf.map(u=>u.const):o,l={...this.Clone(i),...a,[t.Hint]:"Omit"};l.required=l.required?l.required.filter(u=>!s.includes(u)):void 0;for(const u of Object.keys(l.properties))s.includes(u)&&delete l.properties[u];return this.Create(l)}Parameters(i,o={}){return t.Type.Tuple(i.parameters,{...o})}Partial(i,o={}){const a={...this.Clone(i),...o,[t.Hint]:"Partial"};delete a.required;for(const s of Object.keys(a.properties)){const l=a.properties[s];switch(l[t.Modifier]){case"ReadonlyOptional":l[t.Modifier]="ReadonlyOptional";break;case"Readonly":l[t.Modifier]="ReadonlyOptional";break;case"Optional":l[t.Modifier]="Optional";break;default:l[t.Modifier]="Optional";break}}return this.Create(a)}Pick(i,o,a={}){const s=o[t.Kind]==="Union"?o.anyOf.map(u=>u.const):o,l={...this.Clone(i),...a,[t.Hint]:"Pick"};l.required=l.required?l.required.filter(u=>s.includes(u)):void 0;for(const u of Object.keys(l.properties))s.includes(u)||delete l.properties[u];return this.Create(l)}Promise(i,o={}){return this.Create({...o,[t.Kind]:"Promise",type:"promise",item:i})}Record(i,o,a={}){if(i[t.Kind]==="Union")return this.Object(i.anyOf.reduce((l,u)=>({...l,[u.const]:o}),{}),{...a,[t.Hint]:"Record"});const s=i[t.Kind]==="Number"?"^(0|[1-9][0-9]*)$":i[t.Kind]==="String"&&i.pattern?i.pattern:"^.*$";return this.Create({...a,[t.Kind]:"Record",type:"object",patternProperties:{[s]:o},additionalProperties:!1})}Recursive(i,o={}){o.$id===void 0&&(o.$id=`type-${e++}`);const a=i({[t.Kind]:"Self",$ref:`${o.$id}`});return a.$id=o.$id,this.Create({...o,...a})}Ref(i,o={}){if(i.$id===void 0)throw Error("TypeBuilder.Ref: Referenced schema must specify an $id");return this.Create({...o,[t.Kind]:"Ref",$ref:i.$id})}RegEx(i,o={}){return this.Create({...o,[t.Kind]:"String",type:"string",pattern:i.source})}Required(i,o={}){const a={...this.Clone(i),...o,[t.Hint]:"Required"};a.required=Object.keys(a.properties);for(const s of Object.keys(a.properties)){const l=a.properties[s];switch(l[t.Modifier]){case"ReadonlyOptional":l[t.Modifier]="Readonly";break;case"Readonly":l[t.Modifier]="Readonly";break;case"Optional":delete l[t.Modifier];break;default:delete l[t.Modifier];break}}return this.Create(a)}ReturnType(i,o={}){return{...o,...this.Clone(i.returns)}}Strict(i){return JSON.parse(JSON.stringify(i))}String(i={}){return this.Create({...i,[t.Kind]:"String",type:"string"})}Tuple(i,o={}){const s=i.length,l=i.length,u=i.length>0?{...o,[t.Kind]:"Tuple",type:"array",items:i,additionalItems:!1,minItems:s,maxItems:l}:{...o,[t.Kind]:"Tuple",type:"array",minItems:s,maxItems:l};return this.Create(u)}Undefined(i={}){return this.Create({...i,[t.Kind]:"Undefined",type:"object",specialized:"Undefined"})}Union(i,o={}){return this.Create({...o,[t.Kind]:"Union",anyOf:i})}Uint8Array(i={}){return this.Create({...i,[t.Kind]:"Uint8Array",type:"object",specialized:"Uint8Array"})}Unknown(i={}){return this.Create({...i,[t.Kind]:"Unknown"})}Unsafe(i={}){return this.Create({...i,[t.Kind]:i[t.Kind]||"Unsafe"})}Void(i={}){return this.Create({...i,[t.Kind]:"Void",type:"null"})}Create(i){return i}Clone(i){const o=s=>typeof s=="object"&&s!==null&&!Array.isArray(s),a=s=>typeof s=="object"&&s!==null&&Array.isArray(s);return o(i)?Object.keys(i).reduce((s,l)=>({...s,[l]:this.Clone(i[l])}),Object.getOwnPropertySymbols(i).reduce((s,l)=>({...s,[l]:this.Clone(i[l])}),{})):a(i)?i.map(s=>this.Clone(s)):i}}t.TypeBuilder=n,t.Type=new n})(J);const Cre=J.Type.Object({src:J.Type.String(),path:J.Type.Optional(J.Type.String()),volume:J.Type.Optional(J.Type.Number()),rate:J.Type.Optional(J.Type.Number()),html5:J.Type.Optional(J.Type.Boolean())}),$re=J.Type.Record(J.Type.String(),Cre),Ere=J.Type.Object({volume:J.Type.Optional(J.Type.Number()),defaultMusic:J.Type.Optional(J.Type.String()),musicFadeInTime:J.Type.Optional(J.Type.Number()),musicFadeOutTime:J.Type.Optional(J.Type.Number()),musicFadeInDelay:J.Type.Optional(J.Type.Number())}),Ore=J.Type.Record(J.Type.String(),J.Type.String()),PD=J.Type.Object({files:$re,audioTriggers:Ore,options:Ere}),ND={files:{},audioTriggers:{},options:{volume:1,musicFadeInTime:.5,musicFadeInDelay:.5,musicFadeOutTime:.5}},Tre=J.Type.Object({name:J.Type.String(),description:J.Type.String(),icon:J.Type.String(),onUse:J.Type.Optional(J.Type.Object({action:J.Type.String(),label:J.Type.String()})),tag:J.Type.Optional(J.Type.String()),category:J.Type.Optional(J.Type.String()),showIfEmpty:J.Type.Optional(J.Type.Boolean())}),ID=J.Type.Object({id:J.Type.String(),title:J.Type.String()}),DD=J.Type.Record(J.Type.String(),Tre);J.Type.Object({categories:J.Type.Array(ID),items:DD});const LD=J.Type.Object({categories:J.Type.Optional(J.Type.Array(ID)),items:J.Type.Optional(DD)}),RD={categories:[{id:"default",title:"Items"}],items:{}},Are=J.Type.Object({description:J.Type.String(),hidden:J.Type.Optional(J.Type.Boolean())}),Mre=J.Type.Object({title:J.Type.String(),description:J.Type.String(),objectives:J.Type.Record(J.Type.String(),Are),category:J.Type.Optional(J.Type.String())}),Pre=J.Type.Object({id:J.Type.String(),title:J.Type.String()}),Nre=J.Type.Record(J.Type.String(),Mre),BD=J.Type.Object({quests:Nre,categories:J.Type.Array(Pre)}),zD={quests:{},categories:[{id:"default",title:"Quests"}]},FD=J.Type.Object({enabled:J.Type.Boolean(),background:J.Type.Optional(J.Type.String()),text:J.Type.Optional(J.Type.String()),cssClass:J.Type.Optional(J.Type.String()),position:J.Type.Object({left:J.Type.Number(),top:J.Type.Number(),width:J.Type.Optional(J.Type.Number()),height:J.Type.Optional(J.Type.Number())}),anchor:J.Type.Optional(J.Type.Object({x:J.Type.Number(),y:J.Type.Number()})),action:J.Type.Optional(J.Type.String()),actionType:J.Type.Optional(J.Type.String()),scriptClickable:J.Type.Optional(J.Type.Boolean()),tag:J.Type.Optional(J.Type.String())}),Ire=J.Type.Record(J.Type.String(),FD),VD=J.Type.Object({buttons:Ire,clickableDuringScriptsByDefault:J.Type.Optional(J.Type.Boolean())}),qD={buttons:{},clickableDuringScriptsByDefault:!1},Dre=J.Type.Intersect([FD,J.Type.Object({id:J.Type.String()})]),Lre=J.Type.Object({background:J.Type.String(),buttons:J.Type.Optional(J.Type.Array(J.Type.Union([J.Type.String(),Dre])))}),HD=J.Type.Record(J.Type.String(),Lre);J.Type.Object({screens:HD});const UD=J.Type.Object({screens:J.Type.Optional(HD)}),WD={screens:{}},Rre=J.Type.Object({name:J.Type.String(),description:J.Type.String(),startingLevel:J.Type.Number(),hidden:J.Type.Optional(J.Type.Boolean()),icon:J.Type.String()}),KD=J.Type.Record(J.Type.String(),Rre),GD=J.Type.Object({xpPerLevel:J.Type.Number(),notifyLevelUp:J.Type.Boolean()}),JD=J.Type.Object({rollRange:J.Type.Number(),skillMultiplier:J.Type.Number(),failureChance:J.Type.Number(),difficultyText:J.Type.Array(J.Type.Tuple([J.Type.Number(),J.Type.String()]))});J.Type.Object({skills:KD,skillChecks:JD,skillOptions:GD});const QD=J.Type.Object({skills:J.Type.Optional(KD),skillChecks:J.Type.Optional(JD),skillOptions:J.Type.Optional(GD)}),YD={skills:{},skillChecks:{rollRange:100,skillMultiplier:10,failureChance:1,difficultyText:[[0,"Very Easy"],[10,"Easy"],[30,"Medium"],[50,"Hard"],[70,"Very Hard"],[80,"Extremely Hard"],[90,"Near Impossible"]]},skillOptions:{xpPerLevel:10,notifyLevelUp:!0}},Bre=J.Type.Object({color:J.Type.Optional(J.Type.String()),boxCss:J.Type.Optional(J.Type.Record(J.Type.String(),J.Type.Any())),nameCss:J.Type.Optional(J.Type.Record(J.Type.String(),J.Type.Any())),textCss:J.Type.Optional(J.Type.Record(J.Type.String(),J.Type.Any()))}),zre=J.Type.Object({sprites:J.Type.Optional(J.Type.Record(J.Type.String(),J.Type.String())),name:J.Type.String(),style:J.Type.Optional(Bre)}),XD=J.Type.Object({config:J.Type.Object({imagesPath:J.Type.String()}),characters:J.Type.Record(J.Type.String(),zre)}),ZD={config:{imagesPath:""},characters:{}},Fre=J.Type.Object({backgrounds:J.Type.Object({width:J.Type.Number(),height:J.Type.Number()}),dialogBottomPadding:J.Type.Union([J.Type.Number(),J.Type.String()]),minTextWidth:J.Type.Optional(J.Type.Number()),verticalLayoutThreshold:J.Type.Number(),portraits:J.Type.Object({width:J.Type.Number(),height:J.Type.Number(),offset:J.Type.Optional(J.Type.Object({landscape:J.Type.Optional(J.Type.Object({right:J.Type.Number(),bottom:J.Type.Number()})),portrait:J.Type.Optional(J.Type.Object({right:J.Type.Number(),bottom:J.Type.Number()}))}))})}),Vre={backgrounds:{width:880,height:720},dialogBottomPadding:70,verticalLayoutThreshold:600,portraits:{width:100,height:100}},eL=J.Type.Object({options:J.Type.Object({delay:J.Type.Optional(J.Type.Number()),width:J.Type.Number(),keywordsPrefix:J.Type.String(),screenEdgesMinimumMargin:J.Type.Optional(J.Type.Number())}),tooltips:J.Type.Array(J.Type.Object({keywords:J.Type.Array(J.Type.String()),title:J.Type.String(),description:J.Type.String()}))}),tL={options:{delay:0,width:350,keywordsPrefix:"@@"},tooltips:[]},qre=J.Type.Object({name:J.Type.String(),description:J.Type.String(),icon:J.Type.String(),secret:J.Type.Optional(J.Type.Boolean()),category:J.Type.Optional(J.Type.String())}),nL=J.Type.Object({id:J.Type.String(),title:J.Type.String()}),rL=J.Type.Record(J.Type.String(),qre);J.Type.Object({defaultAchievementIcon:J.Type.String(),categories:J.Type.Array(nL),achievements:rL,notifyNewAchievements:J.Type.Boolean(),secretAchievements:J.Type.Optional(J.Type.Object({censorDescription:J.Type.Optional(J.Type.Boolean()),censorName:J.Type.Optional(J.Type.Boolean()),hideUntilObtained:J.Type.Optional(J.Type.Boolean())}))});const Hre=J.Type.Object({categories:J.Type.Optional(J.Type.Array(nL)),achievements:J.Type.Optional(rL)}),iL={categories:[{id:"default",title:"Achievements"}],achievements:{},notifyNewAchievements:!0,defaultAchievementIcon:"img/achievements/trophy.png"},Pl={baseAssetsPath:"",baseDataPath:"",gameTitle:"Narrat Game",saveFileName:"narrat save",images:{},layout:Vre,gameFlow:{},dialogPanel:{overlayMode:!0,rightOffset:100,bottomOffset:50,width:475,height:680,textSpeed:vb,animateText:!0,timeBetweenLines:100},splashScreens:{},screens:WD,buttons:qD,skills:YD,scripts:[],audio:ND,notifications:{timeOnScreen:2.5,alsoPrintInDialogue:!1},tooltips:tL,hudStats:{},achievements:iL,items:RD,interactionTags:{default:{onlyInteractOutsideOfScripts:!0}},quests:zD,transitions:{},menuButtons:{},debugging:{showScriptFinishedMessage:!1},saves:{mode:"manual",slots:10},characters:ZD},Db=qr("config",{state:()=>({config:Pl}),actions:{async setConfig(t){this.config=t}}}),Ure=J.Type.Optional(J.Type.Object({animateText:J.Type.Optional(J.Type.Boolean()),textSpeed:J.Type.Optional(J.Type.Number()),timeBetweenLines:J.Type.Optional(J.Type.Number()),overlayMode:J.Type.Optional(J.Type.Boolean()),rightOffset:J.Type.Optional(J.Type.Number()),bottomOffset:J.Type.Optional(J.Type.Number()),width:J.Type.Optional(J.Type.Number()),height:J.Type.Optional(J.Type.Number())})),Wre=J.Type.Object({engineSplashScreen:J.Type.Optional(J.Type.Object({skip:J.Type.Optional(J.Type.Boolean()),fadeDuration:J.Type.Optional(J.Type.Number()),timeBeforeFadeout:J.Type.Optional(J.Type.Number()),overrideText:J.Type.Optional(J.Type.String()),overrideLogo:J.Type.Optional(J.Type.String())})),gameSplashScreen:J.Type.Optional(J.Type.Object({startButtonText:J.Type.Optional(J.Type.String())}))}),Kre=J.Type.Object({timeOnScreen:J.Type.Number(),alsoPrintInDialogue:J.Type.Optional(J.Type.Boolean())}),Gre=J.Type.Object({name:J.Type.String(),icon:J.Type.String(),startingValue:J.Type.Number(),maxValue:J.Type.Optional(J.Type.Number()),minValue:J.Type.Optional(J.Type.Number())}),Jre=J.Type.Record(J.Type.String(),Gre),Qre=J.Type.Record(J.Type.String(),J.Type.Object({onlyInteractOutsideOfScripts:J.Type.Optional(J.Type.Boolean())})),Yre=J.Type.Object({delay:J.Type.Optional(J.Type.Number()),duration:J.Type.Optional(J.Type.Number())}),Xre=J.Type.Record(J.Type.String(),Yre),Zre=J.Type.Object({text:J.Type.String()}),eie=J.Type.Record(J.Type.String(),Zre),tie=J.Type.Object({showScriptFinishedMessage:J.Type.Optional(J.Type.Boolean())}),nie=J.Type.Object({mode:J.Type.String(),slots:J.Type.Number()}),oL=J.Type.Array(J.Type.String()),rie=[],iie=J.Type.Object({baseAssetsPath:J.Type.Optional(J.Type.String()),baseDataPath:J.Type.Optional(J.Type.String()),gameTitle:J.Type.String(),saveFileName:J.Type.String(),images:J.Type.Optional(J.Type.Record(J.Type.String(),J.Type.String())),layout:Fre,gameFlow:J.Type.Optional(J.Type.Object({labelToJumpOnScriptEnd:J.Type.Optional(J.Type.String())})),dialogPanel:J.Type.Optional(Ure),splashScreens:J.Type.Optional(Wre),screens:J.Type.Union([J.Type.String(),UD]),buttons:J.Type.Optional(J.Type.Union([J.Type.String(),VD])),skills:J.Type.Optional(J.Type.Union([J.Type.String(),QD])),scripts:J.Type.Union([J.Type.String(),oL]),audio:J.Type.Union([J.Type.String(),PD]),notifications:J.Type.Optional(Kre),tooltips:J.Type.Optional(J.Type.Union([J.Type.String(),eL])),hudStats:Jre,items:J.Type.Optional(J.Type.Union([J.Type.String(),LD])),achievements:J.Type.Optional(J.Type.String()),interactionTags:J.Type.Optional(Qre),quests:J.Type.Optional(J.Type.Union([J.Type.String(),BD])),transitions:J.Type.Optional(Xre),menuButtons:J.Type.Optional(eie),debugging:J.Type.Optional(tie),saves:J.Type.Optional(nie),characters:J.Type.Union([J.Type.String(),XD])});var Lb={exports:{}},aL={},Ko={},Yu={},Uf={},Sn={},Wf={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.regexpCode=t.getEsmExportName=t.getProperty=t.safeStringify=t.stringify=t.strConcat=t.addCodeArg=t.str=t._=t.nil=t._Code=t.Name=t.IDENTIFIER=t._CodeOrName=void 0;class e{}t._CodeOrName=e,t.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;class n extends e{constructor(y){if(super(),!t.IDENTIFIER.test(y))throw new Error("CodeGen: name must be a valid identifier");this.str=y}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}}t.Name=n;class r extends e{constructor(y){super(),this._items=typeof y=="string"?[y]:y}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;const y=this._items[0];return y===""||y==='""'}get str(){var y;return(y=this._str)!==null&&y!==void 0?y:this._str=this._items.reduce((k,w)=>`${k}${w}`,"")}get names(){var y;return(y=this._names)!==null&&y!==void 0?y:this._names=this._items.reduce((k,w)=>(w instanceof n&&(k[w.str]=(k[w.str]||0)+1),k),{})}}t._Code=r,t.nil=new r("");function i(v,...y){const k=[v[0]];let w=0;for(;w<y.length;)s(k,y[w]),k.push(v[++w]);return new r(k)}t._=i;const o=new r("+");function a(v,...y){const k=[h(v[0])];let w=0;for(;w<y.length;)k.push(o),s(k,y[w]),k.push(o,h(v[++w]));return l(k),new r(k)}t.str=a;function s(v,y){y instanceof r?v.push(...y._items):y instanceof n?v.push(y):v.push(c(y))}t.addCodeArg=s;function l(v){let y=1;for(;y<v.length-1;){if(v[y]===o){const k=u(v[y-1],v[y+1]);if(k!==void 0){v.splice(y-1,3,k);continue}v[y++]="+"}y++}}function u(v,y){if(y==='""')return v;if(v==='""')return y;if(typeof v=="string")return y instanceof n||v[v.length-1]!=='"'?void 0:typeof y!="string"?`${v.slice(0,-1)}${y}"`:y[0]==='"'?v.slice(0,-1)+y.slice(1):void 0;if(typeof y=="string"&&y[0]==='"'&&!(v instanceof n))return`"${v}${y.slice(1)}`}function f(v,y){return y.emptyStr()?v:v.emptyStr()?y:a`${v}${y}`}t.strConcat=f;function c(v){return typeof v=="number"||typeof v=="boolean"||v===null?v:h(Array.isArray(v)?v.join(","):v)}function d(v){return new r(h(v))}t.stringify=d;function h(v){return JSON.stringify(v).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}t.safeStringify=h;function p(v){return typeof v=="string"&&t.IDENTIFIER.test(v)?new r(`.${v}`):i`[${v}]`}t.getProperty=p;function m(v){if(typeof v=="string"&&t.IDENTIFIER.test(v))return new r(`${v}`);throw new Error(`CodeGen: invalid export name: ${v}, use explicit $id name mapping`)}t.getEsmExportName=m;function g(v){return new r(v.toString())}t.regexpCode=g})(Wf);var Rb={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.ValueScope=t.ValueScopeName=t.Scope=t.varKinds=t.UsedValueState=void 0;const e=Wf;class n extends Error{constructor(u){super(`CodeGen: "code" for ${u} not defined`),this.value=u.value}}var r;(function(l){l[l.Started=0]="Started",l[l.Completed=1]="Completed"})(r=t.UsedValueState||(t.UsedValueState={})),t.varKinds={const:new e.Name("const"),let:new e.Name("let"),var:new e.Name("var")};class i{constructor({prefixes:u,parent:f}={}){this._names={},this._prefixes=u,this._parent=f}toName(u){return u instanceof e.Name?u:this.name(u)}name(u){return new e.Name(this._newName(u))}_newName(u){const f=this._names[u]||this._nameGroup(u);return`${u}${f.index++}`}_nameGroup(u){var f,c;if(((c=(f=this._parent)===null||f===void 0?void 0:f._prefixes)===null||c===void 0?void 0:c.has(u))||this._prefixes&&!this._prefixes.has(u))throw new Error(`CodeGen: prefix "${u}" is not allowed in this scope`);return this._names[u]={prefix:u,index:0}}}t.Scope=i;class o extends e.Name{constructor(u,f){super(f),this.prefix=u}setValue(u,{property:f,itemIndex:c}){this.value=u,this.scopePath=(0,e._)`.${new e.Name(f)}[${c}]`}}t.ValueScopeName=o;const a=(0,e._)`\n`;class s extends i{constructor(u){super(u),this._values={},this._scope=u.scope,this.opts={...u,_n:u.lines?a:e.nil}}get(){return this._scope}name(u){return new o(u,this._newName(u))}value(u,f){var c;if(f.ref===void 0)throw new Error("CodeGen: ref must be passed in value");const d=this.toName(u),{prefix:h}=d,p=(c=f.key)!==null&&c!==void 0?c:f.ref;let m=this._values[h];if(m){const y=m.get(p);if(y)return y}else m=this._values[h]=new Map;m.set(p,d);const g=this._scope[h]||(this._scope[h]=[]),v=g.length;return g[v]=f.ref,d.setValue(f,{property:h,itemIndex:v}),d}getValue(u,f){const c=this._values[u];if(!!c)return c.get(f)}scopeRefs(u,f=this._values){return this._reduceValues(f,c=>{if(c.scopePath===void 0)throw new Error(`CodeGen: name "${c}" has no value`);return(0,e._)`${u}${c.scopePath}`})}scopeCode(u=this._values,f,c){return this._reduceValues(u,d=>{if(d.value===void 0)throw new Error(`CodeGen: name "${d}" has no value`);return d.value.code},f,c)}_reduceValues(u,f,c={},d){let h=e.nil;for(const p in u){const m=u[p];if(!m)continue;const g=c[p]=c[p]||new Map;m.forEach(v=>{if(g.has(v))return;g.set(v,r.Started);let y=f(v);if(y){const k=this.opts.es5?t.varKinds.var:t.varKinds.const;h=(0,e._)`${h}${k} ${v} = ${y};${this.opts._n}`}else if(y=d==null?void 0:d(v))h=(0,e._)`${h}${y}${this.opts._n}`;else throw new n(v);g.set(v,r.Completed)})}return h}}t.ValueScope=s})(Rb),function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.or=t.and=t.not=t.CodeGen=t.operators=t.varKinds=t.ValueScopeName=t.ValueScope=t.Scope=t.Name=t.regexpCode=t.stringify=t.getProperty=t.nil=t.strConcat=t.str=t._=void 0;const e=Wf,n=Rb;var r=Wf;Object.defineProperty(t,"_",{enumerable:!0,get:function(){return r._}}),Object.defineProperty(t,"str",{enumerable:!0,get:function(){return r.str}}),Object.defineProperty(t,"strConcat",{enumerable:!0,get:function(){return r.strConcat}}),Object.defineProperty(t,"nil",{enumerable:!0,get:function(){return r.nil}}),Object.defineProperty(t,"getProperty",{enumerable:!0,get:function(){return r.getProperty}}),Object.defineProperty(t,"stringify",{enumerable:!0,get:function(){return r.stringify}}),Object.defineProperty(t,"regexpCode",{enumerable:!0,get:function(){return r.regexpCode}}),Object.defineProperty(t,"Name",{enumerable:!0,get:function(){return r.Name}});var i=Rb;Object.defineProperty(t,"Scope",{enumerable:!0,get:function(){return i.Scope}}),Object.defineProperty(t,"ValueScope",{enumerable:!0,get:function(){return i.ValueScope}}),Object.defineProperty(t,"ValueScopeName",{enumerable:!0,get:function(){return i.ValueScopeName}}),Object.defineProperty(t,"varKinds",{enumerable:!0,get:function(){return i.varKinds}}),t.operators={GT:new e._Code(">"),GTE:new e._Code(">="),LT:new e._Code("<"),LTE:new e._Code("<="),EQ:new e._Code("==="),NEQ:new e._Code("!=="),NOT:new e._Code("!"),OR:new e._Code("||"),AND:new e._Code("&&"),ADD:new e._Code("+")};class o{optimizeNodes(){return this}optimizeNames(x,j){return this}}class a extends o{constructor(x,j,T){super(),this.varKind=x,this.name=j,this.rhs=T}render({es5:x,_n:j}){const T=x?n.varKinds.var:this.varKind,q=this.rhs===void 0?"":` = ${this.rhs}`;return`${T} ${this.name}${q};`+j}optimizeNames(x,j){if(!!x[this.name.str])return this.rhs&&(this.rhs=M(this.rhs,x,j)),this}get names(){return this.rhs instanceof e._CodeOrName?this.rhs.names:{}}}class s extends o{constructor(x,j,T){super(),this.lhs=x,this.rhs=j,this.sideEffects=T}render({_n:x}){return`${this.lhs} = ${this.rhs};`+x}optimizeNames(x,j){if(!(this.lhs instanceof e.Name&&!x[this.lhs.str]&&!this.sideEffects))return this.rhs=M(this.rhs,x,j),this}get names(){const x=this.lhs instanceof e.Name?{}:{...this.lhs.names};return P(x,this.rhs)}}class l extends s{constructor(x,j,T,q){super(x,T,q),this.op=j}render({_n:x}){return`${this.lhs} ${this.op}= ${this.rhs};`+x}}class u extends o{constructor(x){super(),this.label=x,this.names={}}render({_n:x}){return`${this.label}:`+x}}class f extends o{constructor(x){super(),this.label=x,this.names={}}render({_n:x}){return`break${this.label?` ${this.label}`:""};`+x}}class c extends o{constructor(x){super(),this.error=x}render({_n:x}){return`throw ${this.error};`+x}get names(){return this.error.names}}class d extends o{constructor(x){super(),this.code=x}render({_n:x}){return`${this.code};`+x}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(x,j){return this.code=M(this.code,x,j),this}get names(){return this.code instanceof e._CodeOrName?this.code.names:{}}}class h extends o{constructor(x=[]){super(),this.nodes=x}render(x){return this.nodes.reduce((j,T)=>j+T.render(x),"")}optimizeNodes(){const{nodes:x}=this;let j=x.length;for(;j--;){const T=x[j].optimizeNodes();Array.isArray(T)?x.splice(j,1,...T):T?x[j]=T:x.splice(j,1)}return x.length>0?this:void 0}optimizeNames(x,j){const{nodes:T}=this;let q=T.length;for(;q--;){const Y=T[q];Y.optimizeNames(x,j)||(H(x,Y.names),T.splice(q,1))}return T.length>0?this:void 0}get names(){return this.nodes.reduce((x,j)=>z(x,j.names),{})}}class p extends h{render(x){return"{"+x._n+super.render(x)+"}"+x._n}}class m extends h{}class g extends p{}g.kind="else";class v extends p{constructor(x,j){super(j),this.condition=x}render(x){let j=`if(${this.condition})`+super.render(x);return this.else&&(j+="else "+this.else.render(x)),j}optimizeNodes(){super.optimizeNodes();const x=this.condition;if(x===!0)return this.nodes;let j=this.else;if(j){const T=j.optimizeNodes();j=this.else=Array.isArray(T)?new g(T):T}if(j)return x===!1?j instanceof v?j:j.nodes:this.nodes.length?this:new v(Q(x),j instanceof v?[j]:j.nodes);if(!(x===!1||!this.nodes.length))return this}optimizeNames(x,j){var T;if(this.else=(T=this.else)===null||T===void 0?void 0:T.optimizeNames(x,j),!!(super.optimizeNames(x,j)||this.else))return this.condition=M(this.condition,x,j),this}get names(){const x=super.names;return P(x,this.condition),this.else&&z(x,this.else.names),x}}v.kind="if";class y extends p{}y.kind="for";class k extends y{constructor(x){super(),this.iteration=x}render(x){return`for(${this.iteration})`+super.render(x)}optimizeNames(x,j){if(!!super.optimizeNames(x,j))return this.iteration=M(this.iteration,x,j),this}get names(){return z(super.names,this.iteration.names)}}class w extends y{constructor(x,j,T,q){super(),this.varKind=x,this.name=j,this.from=T,this.to=q}render(x){const j=x.es5?n.varKinds.var:this.varKind,{name:T,from:q,to:Y}=this;return`for(${j} ${T}=${q}; ${T}<${Y}; ${T}++)`+super.render(x)}get names(){const x=P(super.names,this.from);return P(x,this.to)}}class _ extends y{constructor(x,j,T,q){super(),this.loop=x,this.varKind=j,this.name=T,this.iterable=q}render(x){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(x)}optimizeNames(x,j){if(!!super.optimizeNames(x,j))return this.iterable=M(this.iterable,x,j),this}get names(){return z(super.names,this.iterable.names)}}class S extends p{constructor(x,j,T){super(),this.name=x,this.args=j,this.async=T}render(x){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(x)}}S.kind="func";class C extends h{render(x){return"return "+super.render(x)}}C.kind="return";class A extends p{render(x){let j="try"+super.render(x);return this.catch&&(j+=this.catch.render(x)),this.finally&&(j+=this.finally.render(x)),j}optimizeNodes(){var x,j;return super.optimizeNodes(),(x=this.catch)===null||x===void 0||x.optimizeNodes(),(j=this.finally)===null||j===void 0||j.optimizeNodes(),this}optimizeNames(x,j){var T,q;return super.optimizeNames(x,j),(T=this.catch)===null||T===void 0||T.optimizeNames(x,j),(q=this.finally)===null||q===void 0||q.optimizeNames(x,j),this}get names(){const x=super.names;return this.catch&&z(x,this.catch.names),this.finally&&z(x,this.finally.names),x}}class $ extends p{constructor(x){super(),this.error=x}render(x){return`catch(${this.error})`+super.render(x)}}$.kind="catch";class E extends p{render(x){return"finally"+super.render(x)}}E.kind="finally";class O{constructor(x,j={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...j,_n:j.lines?`
217
217
  `:""},this._extScope=x,this._scope=new n.Scope({parent:x}),this._nodes=[new m]}toString(){return this._root.render(this.opts)}name(x){return this._scope.name(x)}scopeName(x){return this._extScope.name(x)}scopeValue(x,j){const T=this._extScope.value(x,j);return(this._values[T.prefix]||(this._values[T.prefix]=new Set)).add(T),T}getScopeValue(x,j){return this._extScope.getValue(x,j)}scopeRefs(x){return this._extScope.scopeRefs(x,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(x,j,T,q){const Y=this._scope.toName(j);return T!==void 0&&q&&(this._constants[Y.str]=T),this._leafNode(new a(x,Y,T)),Y}const(x,j,T){return this._def(n.varKinds.const,x,j,T)}let(x,j,T){return this._def(n.varKinds.let,x,j,T)}var(x,j,T){return this._def(n.varKinds.var,x,j,T)}assign(x,j,T){return this._leafNode(new s(x,j,T))}add(x,j){return this._leafNode(new l(x,t.operators.ADD,j))}code(x){return typeof x=="function"?x():x!==e.nil&&this._leafNode(new d(x)),this}object(...x){const j=["{"];for(const[T,q]of x)j.length>1&&j.push(","),j.push(T),(T!==q||this.opts.es5)&&(j.push(":"),(0,e.addCodeArg)(j,q));return j.push("}"),new e._Code(j)}if(x,j,T){if(this._blockNode(new v(x)),j&&T)this.code(j).else().code(T).endIf();else if(j)this.code(j).endIf();else if(T)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(x){return this._elseNode(new v(x))}else(){return this._elseNode(new g)}endIf(){return this._endBlockNode(v,g)}_for(x,j){return this._blockNode(x),j&&this.code(j).endFor(),this}for(x,j){return this._for(new k(x),j)}forRange(x,j,T,q,Y=this.opts.es5?n.varKinds.var:n.varKinds.let){const me=this._scope.toName(x);return this._for(new w(Y,me,j,T),()=>q(me))}forOf(x,j,T,q=n.varKinds.const){const Y=this._scope.toName(x);if(this.opts.es5){const me=j instanceof e.Name?j:this.var("_arr",j);return this.forRange("_i",0,(0,e._)`${me}.length`,ve=>{this.var(Y,(0,e._)`${me}[${ve}]`),T(Y)})}return this._for(new _("of",q,Y,j),()=>T(Y))}forIn(x,j,T,q=this.opts.es5?n.varKinds.var:n.varKinds.const){if(this.opts.ownProperties)return this.forOf(x,(0,e._)`Object.keys(${j})`,T);const Y=this._scope.toName(x);return this._for(new _("in",q,Y,j),()=>T(Y))}endFor(){return this._endBlockNode(y)}label(x){return this._leafNode(new u(x))}break(x){return this._leafNode(new f(x))}return(x){const j=new C;if(this._blockNode(j),this.code(x),j.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(C)}try(x,j,T){if(!j&&!T)throw new Error('CodeGen: "try" without "catch" and "finally"');const q=new A;if(this._blockNode(q),this.code(x),j){const Y=this.name("e");this._currNode=q.catch=new $(Y),j(Y)}return T&&(this._currNode=q.finally=new E,this.code(T)),this._endBlockNode($,E)}throw(x){return this._leafNode(new c(x))}block(x,j){return this._blockStarts.push(this._nodes.length),x&&this.code(x).endBlock(j),this}endBlock(x){const j=this._blockStarts.pop();if(j===void 0)throw new Error("CodeGen: not in self-balancing block");const T=this._nodes.length-j;if(T<0||x!==void 0&&T!==x)throw new Error(`CodeGen: wrong number of nodes: ${T} vs ${x} expected`);return this._nodes.length=j,this}func(x,j=e.nil,T,q){return this._blockNode(new S(x,j,T)),q&&this.code(q).endFunc(),this}endFunc(){return this._endBlockNode(S)}optimize(x=1){for(;x-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(x){return this._currNode.nodes.push(x),this}_blockNode(x){this._currNode.nodes.push(x),this._nodes.push(x)}_endBlockNode(x,j){const T=this._currNode;if(T instanceof x||j&&T instanceof j)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${j?`${x.kind}/${j.kind}`:x.kind}"`)}_elseNode(x){const j=this._currNode;if(!(j instanceof v))throw new Error('CodeGen: "else" without "if"');return this._currNode=j.else=x,this}get _root(){return this._nodes[0]}get _currNode(){const x=this._nodes;return x[x.length-1]}set _currNode(x){const j=this._nodes;j[j.length-1]=x}}t.CodeGen=O;function z(N,x){for(const j in x)N[j]=(N[j]||0)+(x[j]||0);return N}function P(N,x){return x instanceof e._CodeOrName?z(N,x.names):N}function M(N,x,j){if(N instanceof e.Name)return T(N);if(!q(N))return N;return new e._Code(N._items.reduce((Y,me)=>(me instanceof e.Name&&(me=T(me)),me instanceof e._Code?Y.push(...me._items):Y.push(me),Y),[]));function T(Y){const me=j[Y.str];return me===void 0||x[Y.str]!==1?Y:(delete x[Y.str],me)}function q(Y){return Y instanceof e._Code&&Y._items.some(me=>me instanceof e.Name&&x[me.str]===1&&j[me.str]!==void 0)}}function H(N,x){for(const j in x)N[j]=(N[j]||0)-(x[j]||0)}function Q(N){return typeof N=="boolean"||typeof N=="number"||N===null?!N:(0,e._)`!${B(N)}`}t.not=Q;const V=D(t.operators.AND);function G(...N){return N.reduce(V)}t.and=G;const F=D(t.operators.OR);function I(...N){return N.reduce(F)}t.or=I;function D(N){return(x,j)=>x===e.nil?j:j===e.nil?x:(0,e._)`${B(x)} ${N} ${B(j)}`}function B(N){return N instanceof e.Name?N:(0,e._)`(${N})`}}(Sn);var Dn={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.checkStrictMode=t.getErrorPath=t.Type=t.useFunc=t.setEvaluated=t.evaluatedPropsToName=t.mergeEvaluated=t.eachItem=t.unescapeJsonPointer=t.escapeJsonPointer=t.escapeFragment=t.unescapeFragment=t.schemaRefOrVal=t.schemaHasRulesButRef=t.schemaHasRules=t.checkUnknownRules=t.alwaysValidSchema=t.toHash=void 0;const e=Sn,n=Wf;function r(S){const C={};for(const A of S)C[A]=!0;return C}t.toHash=r;function i(S,C){return typeof C=="boolean"?C:Object.keys(C).length===0?!0:(o(S,C),!a(C,S.self.RULES.all))}t.alwaysValidSchema=i;function o(S,C=S.schema){const{opts:A,self:$}=S;if(!A.strictSchema||typeof C=="boolean")return;const E=$.RULES.keywords;for(const O in C)E[O]||_(S,`unknown keyword: "${O}"`)}t.checkUnknownRules=o;function a(S,C){if(typeof S=="boolean")return!S;for(const A in S)if(C[A])return!0;return!1}t.schemaHasRules=a;function s(S,C){if(typeof S=="boolean")return!S;for(const A in S)if(A!=="$ref"&&C.all[A])return!0;return!1}t.schemaHasRulesButRef=s;function l({topSchemaRef:S,schemaPath:C},A,$,E){if(!E){if(typeof A=="number"||typeof A=="boolean")return A;if(typeof A=="string")return(0,e._)`${A}`}return(0,e._)`${S}${C}${(0,e.getProperty)($)}`}t.schemaRefOrVal=l;function u(S){return d(decodeURIComponent(S))}t.unescapeFragment=u;function f(S){return encodeURIComponent(c(S))}t.escapeFragment=f;function c(S){return typeof S=="number"?`${S}`:S.replace(/~/g,"~0").replace(/\//g,"~1")}t.escapeJsonPointer=c;function d(S){return S.replace(/~1/g,"/").replace(/~0/g,"~")}t.unescapeJsonPointer=d;function h(S,C){if(Array.isArray(S))for(const A of S)C(A);else C(S)}t.eachItem=h;function p({mergeNames:S,mergeToName:C,mergeValues:A,resultToName:$}){return(E,O,z,P)=>{const M=z===void 0?O:z instanceof e.Name?(O instanceof e.Name?S(E,O,z):C(E,O,z),z):O instanceof e.Name?(C(E,z,O),O):A(O,z);return P===e.Name&&!(M instanceof e.Name)?$(E,M):M}}t.mergeEvaluated={props:p({mergeNames:(S,C,A)=>S.if((0,e._)`${A} !== true && ${C} !== undefined`,()=>{S.if((0,e._)`${C} === true`,()=>S.assign(A,!0),()=>S.assign(A,(0,e._)`${A} || {}`).code((0,e._)`Object.assign(${A}, ${C})`))}),mergeToName:(S,C,A)=>S.if((0,e._)`${A} !== true`,()=>{C===!0?S.assign(A,!0):(S.assign(A,(0,e._)`${A} || {}`),g(S,A,C))}),mergeValues:(S,C)=>S===!0?!0:{...S,...C},resultToName:m}),items:p({mergeNames:(S,C,A)=>S.if((0,e._)`${A} !== true && ${C} !== undefined`,()=>S.assign(A,(0,e._)`${C} === true ? true : ${A} > ${C} ? ${A} : ${C}`)),mergeToName:(S,C,A)=>S.if((0,e._)`${A} !== true`,()=>S.assign(A,C===!0?!0:(0,e._)`${A} > ${C} ? ${A} : ${C}`)),mergeValues:(S,C)=>S===!0?!0:Math.max(S,C),resultToName:(S,C)=>S.var("items",C)})};function m(S,C){if(C===!0)return S.var("props",!0);const A=S.var("props",(0,e._)`{}`);return C!==void 0&&g(S,A,C),A}t.evaluatedPropsToName=m;function g(S,C,A){Object.keys(A).forEach($=>S.assign((0,e._)`${C}${(0,e.getProperty)($)}`,!0))}t.setEvaluated=g;const v={};function y(S,C){return S.scopeValue("func",{ref:C,code:v[C.code]||(v[C.code]=new n._Code(C.code))})}t.useFunc=y;var k;(function(S){S[S.Num=0]="Num",S[S.Str=1]="Str"})(k=t.Type||(t.Type={}));function w(S,C,A){if(S instanceof e.Name){const $=C===k.Num;return A?$?(0,e._)`"[" + ${S} + "]"`:(0,e._)`"['" + ${S} + "']"`:$?(0,e._)`"/" + ${S}`:(0,e._)`"/" + ${S}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return A?(0,e.getProperty)(S).toString():"/"+c(S)}t.getErrorPath=w;function _(S,C,A=S.opts.strictSchema){if(!!A){if(C=`strict mode: ${C}`,A===!0)throw new Error(C);S.self.logger.warn(C)}}t.checkStrictMode=_})(Dn);var Oa={};Object.defineProperty(Oa,"__esModule",{value:!0});const pi=Sn,oie={data:new pi.Name("data"),valCxt:new pi.Name("valCxt"),instancePath:new pi.Name("instancePath"),parentData:new pi.Name("parentData"),parentDataProperty:new pi.Name("parentDataProperty"),rootData:new pi.Name("rootData"),dynamicAnchors:new pi.Name("dynamicAnchors"),vErrors:new pi.Name("vErrors"),errors:new pi.Name("errors"),this:new pi.Name("this"),self:new pi.Name("self"),scope:new pi.Name("scope"),json:new pi.Name("json"),jsonPos:new pi.Name("jsonPos"),jsonLen:new pi.Name("jsonLen"),jsonPart:new pi.Name("jsonPart")};Oa.default=oie,function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.extendErrors=t.resetErrorsCount=t.reportExtraError=t.reportError=t.keyword$DataError=t.keywordError=void 0;const e=Sn,n=Dn,r=Oa;t.keywordError={message:({keyword:g})=>(0,e.str)`must pass "${g}" keyword validation`},t.keyword$DataError={message:({keyword:g,schemaType:v})=>v?(0,e.str)`"${g}" keyword must be ${v} ($data)`:(0,e.str)`"${g}" keyword is invalid ($data)`};function i(g,v=t.keywordError,y,k){const{it:w}=g,{gen:_,compositeRule:S,allErrors:C}=w,A=c(g,v,y);(k!=null?k:S||C)?l(_,A):u(w,(0,e._)`[${A}]`)}t.reportError=i;function o(g,v=t.keywordError,y){const{it:k}=g,{gen:w,compositeRule:_,allErrors:S}=k,C=c(g,v,y);l(w,C),_||S||u(k,r.default.vErrors)}t.reportExtraError=o;function a(g,v){g.assign(r.default.errors,v),g.if((0,e._)`${r.default.vErrors} !== null`,()=>g.if(v,()=>g.assign((0,e._)`${r.default.vErrors}.length`,v),()=>g.assign(r.default.vErrors,null)))}t.resetErrorsCount=a;function s({gen:g,keyword:v,schemaValue:y,data:k,errsCount:w,it:_}){if(w===void 0)throw new Error("ajv implementation error");const S=g.name("err");g.forRange("i",w,r.default.errors,C=>{g.const(S,(0,e._)`${r.default.vErrors}[${C}]`),g.if((0,e._)`${S}.instancePath === undefined`,()=>g.assign((0,e._)`${S}.instancePath`,(0,e.strConcat)(r.default.instancePath,_.errorPath))),g.assign((0,e._)`${S}.schemaPath`,(0,e.str)`${_.errSchemaPath}/${v}`),_.opts.verbose&&(g.assign((0,e._)`${S}.schema`,y),g.assign((0,e._)`${S}.data`,k))})}t.extendErrors=s;function l(g,v){const y=g.const("err",v);g.if((0,e._)`${r.default.vErrors} === null`,()=>g.assign(r.default.vErrors,(0,e._)`[${y}]`),(0,e._)`${r.default.vErrors}.push(${y})`),g.code((0,e._)`${r.default.errors}++`)}function u(g,v){const{gen:y,validateName:k,schemaEnv:w}=g;w.$async?y.throw((0,e._)`new ${g.ValidationError}(${v})`):(y.assign((0,e._)`${k}.errors`,v),y.return(!1))}const f={keyword:new e.Name("keyword"),schemaPath:new e.Name("schemaPath"),params:new e.Name("params"),propertyName:new e.Name("propertyName"),message:new e.Name("message"),schema:new e.Name("schema"),parentSchema:new e.Name("parentSchema")};function c(g,v,y){const{createErrors:k}=g.it;return k===!1?(0,e._)`{}`:d(g,v,y)}function d(g,v,y={}){const{gen:k,it:w}=g,_=[h(w,y),p(g,y)];return m(g,v,_),k.object(..._)}function h({errorPath:g},{instancePath:v}){const y=v?(0,e.str)`${g}${(0,n.getErrorPath)(v,n.Type.Str)}`:g;return[r.default.instancePath,(0,e.strConcat)(r.default.instancePath,y)]}function p({keyword:g,it:{errSchemaPath:v}},{schemaPath:y,parentSchema:k}){let w=k?v:(0,e.str)`${v}/${g}`;return y&&(w=(0,e.str)`${w}${(0,n.getErrorPath)(y,n.Type.Str)}`),[f.schemaPath,w]}function m(g,{params:v,message:y},k){const{keyword:w,data:_,schemaValue:S,it:C}=g,{opts:A,propertyName:$,topSchemaRef:E,schemaPath:O}=C;k.push([f.keyword,w],[f.params,typeof v=="function"?v(g):v||(0,e._)`{}`]),A.messages&&k.push([f.message,typeof y=="function"?y(g):y]),A.verbose&&k.push([f.schema,S],[f.parentSchema,(0,e._)`${E}${O}`],[r.default.data,_]),$&&k.push([f.propertyName,$])}}(Uf),Object.defineProperty(Yu,"__esModule",{value:!0}),Yu.boolOrEmptySchema=Yu.topBoolOrEmptySchema=void 0;const aie=Uf,sie=Sn,lie=Oa,uie={message:"boolean schema is false"};function cie(t){const{gen:e,schema:n,validateName:r}=t;n===!1?sL(t,!1):typeof n=="object"&&n.$async===!0?e.return(lie.default.data):(e.assign((0,sie._)`${r}.errors`,null),e.return(!0))}Yu.topBoolOrEmptySchema=cie;function fie(t,e){const{gen:n,schema:r}=t;r===!1?(n.var(e,!1),sL(t)):n.var(e,!0)}Yu.boolOrEmptySchema=fie;function sL(t,e){const{gen:n,data:r}=t,i={gen:n,keyword:"false schema",data:r,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:t};(0,aie.reportError)(i,uie,void 0,e)}var Kf={},Nl={};Object.defineProperty(Nl,"__esModule",{value:!0}),Nl.getRules=Nl.isJSONType=void 0;const die=["string","number","integer","boolean","null","object","array"],hie=new Set(die);function pie(t){return typeof t=="string"&&hie.has(t)}Nl.isJSONType=pie;function mie(){const t={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:{...t,integer:!0,boolean:!0,null:!0},rules:[{rules:[]},t.number,t.string,t.array,t.object],post:{rules:[]},all:{},keywords:{}}}Nl.getRules=mie;var ns={};Object.defineProperty(ns,"__esModule",{value:!0}),ns.shouldUseRule=ns.shouldUseGroup=ns.schemaHasRulesForType=void 0;function vie({schema:t,self:e},n){const r=e.RULES.types[n];return r&&r!==!0&&lL(t,r)}ns.schemaHasRulesForType=vie;function lL(t,e){return e.rules.some(n=>uL(t,n))}ns.shouldUseGroup=lL;function uL(t,e){var n;return t[e.keyword]!==void 0||((n=e.definition.implements)===null||n===void 0?void 0:n.some(r=>t[r]!==void 0))}ns.shouldUseRule=uL,function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.reportTypeError=t.checkDataTypes=t.checkDataType=t.coerceAndCheckDataType=t.getJSONTypes=t.getSchemaTypes=t.DataType=void 0;const e=Nl,n=ns,r=Uf,i=Sn,o=Dn;var a;(function(k){k[k.Correct=0]="Correct",k[k.Wrong=1]="Wrong"})(a=t.DataType||(t.DataType={}));function s(k){const w=l(k.type);if(w.includes("null")){if(k.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!w.length&&k.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');k.nullable===!0&&w.push("null")}return w}t.getSchemaTypes=s;function l(k){const w=Array.isArray(k)?k:k?[k]:[];if(w.every(e.isJSONType))return w;throw new Error("type must be JSONType or JSONType[]: "+w.join(","))}t.getJSONTypes=l;function u(k,w){const{gen:_,data:S,opts:C}=k,A=c(w,C.coerceTypes),$=w.length>0&&!(A.length===0&&w.length===1&&(0,n.schemaHasRulesForType)(k,w[0]));if($){const E=m(w,S,C.strictNumbers,a.Wrong);_.if(E,()=>{A.length?d(k,w,A):v(k)})}return $}t.coerceAndCheckDataType=u;const f=new Set(["string","number","integer","boolean","null"]);function c(k,w){return w?k.filter(_=>f.has(_)||w==="array"&&_==="array"):[]}function d(k,w,_){const{gen:S,data:C,opts:A}=k,$=S.let("dataType",(0,i._)`typeof ${C}`),E=S.let("coerced",(0,i._)`undefined`);A.coerceTypes==="array"&&S.if((0,i._)`${$} == 'object' && Array.isArray(${C}) && ${C}.length == 1`,()=>S.assign(C,(0,i._)`${C}[0]`).assign($,(0,i._)`typeof ${C}`).if(m(w,C,A.strictNumbers),()=>S.assign(E,C))),S.if((0,i._)`${E} !== undefined`);for(const z of _)(f.has(z)||z==="array"&&A.coerceTypes==="array")&&O(z);S.else(),v(k),S.endIf(),S.if((0,i._)`${E} !== undefined`,()=>{S.assign(C,E),h(k,E)});function O(z){switch(z){case"string":S.elseIf((0,i._)`${$} == "number" || ${$} == "boolean"`).assign(E,(0,i._)`"" + ${C}`).elseIf((0,i._)`${C} === null`).assign(E,(0,i._)`""`);return;case"number":S.elseIf((0,i._)`${$} == "boolean" || ${C} === null