narrat 2.0.4 → 2.0.5

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.
@@ -171,7 +171,7 @@ return query;
171
171
  * pinia v2.0.14
172
172
  * (c) 2022 Eduardo San Martin Morote
173
173
  * @license MIT
174
- */let lA;const hd=t=>lA=t,cA=Symbol();function gg(t){return t&&typeof t=="object"&&Object.prototype.toString.call(t)==="[object Object]"&&typeof t.toJSON!="function"}var yc;(function(t){t.direct="direct",t.patchObject="patch object",t.patchFunction="patch function"})(yc||(yc={}));function xH(){const t=M.effectScope(!0),e=t.run(()=>M.ref({}));let n=[],r=[];const o=M.markRaw({install(i){hd(o),o._a=i,i.provide(cA,o),i.config.globalProperties.$pinia=o,r.forEach(a=>n.push(a)),r=[]},use(i){return!this._a&&!kH?r.push(i):n.push(i),this},_p:n,_a:null,_e:t,_s:new Map,state:e});return o}const uA=()=>{};function fA(t,e,n,r=uA){t.push(e);const o=()=>{const i=t.indexOf(e);i>-1&&(t.splice(i,1),r())};return!n&&M.getCurrentInstance()&&M.onUnmounted(o),o}function Qs(t,...e){t.slice().forEach(n=>{n(...e)})}function yg(t,e){for(const n in e){if(!e.hasOwnProperty(n))continue;const r=e[n],o=t[n];gg(o)&&gg(r)&&t.hasOwnProperty(n)&&!M.isRef(r)&&!M.isReactive(r)?t[n]=yg(o,r):t[n]=r}return t}const jH=Symbol();function _H(t){return!gg(t)||!t.hasOwnProperty(jH)}const{assign:Di}=Object;function SH(t){return!!(M.isRef(t)&&t.effect)}function CH(t,e,n,r){const{state:o,actions:i,getters:a}=e,s=n.state.value[t];let l;function c(){s||(n.state.value[t]=o?o():{});const f=M.toRefs(n.state.value[t]);return Di(f,i,Object.keys(a||{}).reduce((u,d)=>(u[d]=M.markRaw(M.computed(()=>{hd(n);const h=n._s.get(t);return a[d].call(h,h)})),u),{}))}return l=dA(t,c,e,n,r,!0),l.$reset=function(){const u=o?o():{};this.$patch(d=>{Di(d,u)})},l}function dA(t,e,n={},r,o,i){let a;const s=Di({actions:{}},n),l={deep:!0};let c,f,u=M.markRaw([]),d=M.markRaw([]),h;const p=r.state.value[t];!i&&!p&&(r.state.value[t]={}),M.ref({});let v;function g(A){let T;c=f=!1,typeof A=="function"?(A(r.state.value[t]),T={type:yc.patchFunction,storeId:t,events:h}):(yg(r.state.value[t],A),T={type:yc.patchObject,payload:A,storeId:t,events:h});const _=v=Symbol();M.nextTick().then(()=>{v===_&&(c=!0)}),f=!0,Qs(u,T,r.state.value[t])}const m=uA;function y(){a.stop(),u=[],d=[],r._s.delete(t)}function b(A,T){return function(){hd(r);const _=Array.from(arguments),P=[],$=[];function q(z){P.push(z)}function S(z){$.push(z)}Qs(d,{args:_,name:A,store:k,after:q,onError:S});let j;try{j=T.apply(this&&this.$id===t?this:k,_)}catch(z){throw Qs($,z),z}return j instanceof Promise?j.then(z=>(Qs(P,z),z)).catch(z=>(Qs($,z),Promise.reject(z))):(Qs(P,j),j)}}const w={_p:r,$id:t,$onAction:fA.bind(null,d),$patch:g,$reset:m,$subscribe(A,T={}){const _=fA(u,A,T.detached,()=>P()),P=a.run(()=>M.watch(()=>r.state.value[t],$=>{(T.flush==="sync"?f:c)&&A({storeId:t,type:yc.direct,events:h},$)},Di({},l,T)));return _},$dispose:y},k=M.reactive(Di({},w));r._s.set(t,k);const C=r._e.run(()=>(a=M.effectScope(),a.run(()=>e())));for(const A in C){const T=C[A];if(M.isRef(T)&&!SH(T)||M.isReactive(T))i||(p&&_H(T)&&(M.isRef(T)?T.value=p[A]:yg(T,p[A])),r.state.value[t][A]=T);else if(typeof T=="function"){const _=b(A,T);C[A]=_,s.actions[A]=T}}return Di(k,C),Di(M.toRaw(k),C),Object.defineProperty(k,"$state",{get:()=>r.state.value[t],set:A=>{g(T=>{Di(T,A)})}}),r._p.forEach(A=>{Di(k,a.run(()=>A({store:k,app:r._a,pinia:r,options:s})))}),p&&i&&n.hydrate&&n.hydrate(k.$state,p),c=!0,f=!0,k}function Vo(t,e,n){let r,o;const i=typeof e=="function";typeof t=="string"?(r=t,o=i?n:e):(o=t,r=t.id);function a(s,l){const c=M.getCurrentInstance();return s=s||c&&M.inject(cA),s&&hd(s),s=lA,s._s.has(r)||(i?dA(r,e,o,s):CH(r,o,s)),s._s.get(r)}return a.$id=r,a}function yi(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 o=t(this.$pinia),i=e[r];return typeof i=="function"?i.call(this,o):o[i]},n),{})}const ao=Vo("audio",{state:()=>({}),actions:{stopMusic(){this.currentMusic&&(vA(this.currentMusic),this.currentMusic=void 0)},setMusic(t,e){this.currentMusic=t,this.musicHowlId=e},generateSaveData(){return{currentMusic:this.currentMusic}},loadSaveData(t){this.currentMusic=t.currentMusic},reset(){this.stopMusic()}}}),hA={};ga.Howler.volume(.5);let bg={};async function $H(t){Co.log("Loading audio");const e=[];ga.Howler.volume(t.audioOptions.volume);for(const n in t.music){const r={loop:!0,...t.music[n]};t.audio[n]=r,console.warn("Music config is deprecated, instead you can now add musics to the `audio` config as they behave the same as other sounds!")}for(const n in t.sound)t.audio[n]=t.sound[n];for(const n in t.audio){const r=t.audio[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(OH(n,t.audio[n]))}return t.audioTriggers&&(bg=t.audioTriggers),Promise.all(e)}function bc(t){bg[t]&&pA(bg[t])}async function OH(t,e){return new Promise((n,r)=>{Co.log(`Loading audio ${e.src}`);const o=new ga.Howl({...e});o.load(),hA[t]=o,n()})}async function pd(t){const e=ao(),n=e.musicHowlId,r=Rt().audioOptions;if(e.currentMusic){const a=wc(e.currentMusic);n&&(a.fade(a.volume(),0,r.musicFadeOutTime*1e3,n),setTimeout(()=>{a.stop(n)},r.musicFadeOutTime*1e3))}let o,i;if(t){if(o=wc(t),!o)throw new Error(`Could not find music ${t}`);o.volume(0),i=o.play(),o.pause(),e.setMusic(t,i)}e.currentMusic&&await mg(r.musicFadeInDelay*1e3),o&&ao().musicHowlId===i&&(o.play(),o.fade(0,1,r.musicFadeInTime*1e3,i))}function pA(t){const e=wc(t);if(e)return e.play();hr(`Sound effect ${t} not found!`)}function wc(t){return hA[t]}function vA(t){if(t===ao().currentMusic)ao().stopMusic();else{const e=wc(t);e&&e.stop()}}function mA(t){const e=wc(t);e&&e.pause()}const gA="gameSave";function AH(t){localStorage.setItem(gA,JSON.stringify(t))}function EH(){return`${Date.now()-Math.floor(Math.random()*99999999)}`}function wg(t){return new Promise((e,n)=>{const r=new XMLHttpRequest;r.onload=function(){r.status>=200&&r.status<300?e(r.responseText):n(r.status)},r.open("GET",t),r.send()})}var MH=function(e){return PH(e)&&!TH(e)};function PH(t){return!!t&&typeof t=="object"}function TH(t){var e=Object.prototype.toString.call(t);return e==="[object RegExp]"||e==="[object Date]"||LH(t)}var IH=typeof Symbol=="function"&&Symbol.for,NH=IH?Symbol.for("react.element"):60103;function LH(t){return t.$$typeof===NH}function RH(t){return Array.isArray(t)?[]:{}}function kc(t,e){return e.clone!==!1&&e.isMergeableObject(t)?Ys(RH(t),t,e):t}function DH(t,e,n){return t.concat(e).map(function(r){return kc(r,n)})}function zH(t,e){if(!e.customMerge)return Ys;var n=e.customMerge(t);return typeof n=="function"?n:Ys}function BH(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(e){return t.propertyIsEnumerable(e)}):[]}function yA(t){return Object.keys(t).concat(BH(t))}function bA(t,e){try{return e in t}catch{return!1}}function qH(t,e){return bA(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))}function VH(t,e,n){var r={};return n.isMergeableObject(t)&&yA(t).forEach(function(o){r[o]=kc(t[o],n)}),yA(e).forEach(function(o){qH(t,o)||(bA(t,o)&&n.isMergeableObject(e[o])?r[o]=zH(o,n)(t[o],e[o],n):r[o]=kc(e[o],n))}),r}function Ys(t,e,n){n=n||{},n.arrayMerge=n.arrayMerge||DH,n.isMergeableObject=n.isMergeableObject||MH,n.cloneUnlessOtherwiseSpecified=kc;var r=Array.isArray(e),o=Array.isArray(t),i=r===o;return i?r?n.arrayMerge(t,e,n):VH(t,e,n):kc(e,n)}Ys.all=function(e,n){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce(function(r,o){return Ys(r,o,n)},{})};var FH=Ys,vd=FH;const zi=Vo("hud",{state:()=>({hudStats:{}}),actions:{setupHudStats(t){for(const e in t)this.hudStats[e]={value:t[e].startingValue}},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:this.hudStats}},loadSaveData(t){this.hudStats=vd(this.hudStats,t.hudStats)}}}),bi=Vo("notifications",{state:()=>({notifications:{}}),actions:{async addNotification(t){const e=`${Date.now()}-${Math.random()*1e4}`;this.notifications[e]={text:t},Rt().notifications.alsoPrintInDialogue&&TA(`[NOTIFICATION] ${t}`),await mg(Rt().notifications.timeOnScreen*1e3),this.deleteNotification(e)},deleteNotification(t){delete this.notifications[t]}}}),_r=Vo("inventory",{state:()=>({items:{},interactionTags:{}}),actions:{generateSaveData(){return{items:this.items,interactionTags: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}})},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},bi().addNotification(`Received item: ${sA(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=Rt().interactionTags;Object.keys(t).forEach(e=>{t[e].onlyInteractOutsideOfScripts&&this.disableInteraction(e)})},onScriptEnd(){const t=Rt().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,bi().addNotification(`Lost item: ${sA(t.id).name} x ${t.amount}`),e.amount<=0&&this.deleteItem(t.id))},deleteItem(t){this.getExistingItem(t)&&(this.items[t].amount=0)}}}),HH=(t,e)=>{for(const n in t)if(!e(t[n]))return!1;return!0},wA=(t,e)=>{const n={};for(const r in t)e(t[r])&&(n[r]=t[r]);return n},Rr=Vo("quests",{state:()=>({quests:{}}),actions:{getQuest(t){const e=this.quests[t];if(e)return e;{const n=`Quest ${t} doesn't exist!`;throw hr(n),new Error(n)}},getObjective(t,e){const n=this.getQuest(t);if(!n){const i=`Quest ${t} doesn't exist!`;throw hr(i),new Error(i)}const r=n.objectives[e];if(r)return r;const o=`Objective ${e} doesn't exist in quest ${t}!`;throw hr(o),new Error(o)},setupQuests(t){for(const e of Object.keys(t)){const n=t[e];this.quests[e]={id:e,state:"hidden",objectives:{}};for(const r of Object.keys(n.objectives)){const o=n.objectives[r];this.quests[e].objectives[r]={id:r,state:o.hidden?"hidden":"unlocked"}}}},startQuest(t){const e=this.getQuest(t);e?(e.state="unlocked",bi().addNotification(`Started quest: ${dd(t).title}`)):hr(`Quest ${t} doesn't exist!`)},startObjective(t,e){const n=this.getObjective(t,e);n?(n.state="unlocked",bi().addNotification(`New quest objective: ${vg(t,e).description}`)):hr(`Objective ${e} doesn't exist in quest ${t}!`)},completeObjective(t,e){const n=this.getObjective(t,e);n?(n.state="completed",bi().addNotification(`Completed quest objective: ${vg(t,e).description}`)):hr(`Objective ${e} doesn't exist in quest ${t}!`)},completeQuest(t,e){const n=this.getQuest(t);n?(n.state="completed",n.ending=e,bi().addNotification(`Completed quest: ${dd(t).title}`)):hr(`Quest ${t} doesn't exist!`)},isQuestCompleted(t){const e=this.getQuest(t);return e?HH(e.objectives,n=>n.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:{...this.quests}}},loadSaveData(t){this.quests=t.quests}}}),Bi=Vo("screens",{state:()=>({currentScreen:"default",buttons:{}}),actions:{setScreen(t){this.currentScreen=t},setButtons(t){for(const e in t)this.buttons[e]={enabled:t[e].enabled}},changeButton(t,e){this.buttons[t].enabled=e},generateSaveData(){return{currentScreen:this.currentScreen,buttons:this.buttons}},loadSaveData(t){this.currentScreen=t.currentScreen,this.buttons=vd(this.buttons,t.buttons)}}});function kg(t,e){const n=e.split(".");let r=t;const o=n.length-1;let i=n[0],a=0;for(a=0;a<o;a++)i=n[a],r[i]||(r[i]={}),r=r[i];return i=n[a],[r,i]}function WH(t,e){const n=e.split(".");let r=t;const o=n.length-1;let i=n[0],a=0;for(a=0;a<o;a++)i=n[a],r[i]||(r[i]={}),r=r[i];return i=n[a],typeof r[i]=="undefined"&&(r[i]=null),[r,i]}function kA(t,e,n){const[r,o]=kg(t,e);r[o]=n}function xA(t,e,n){const[r,o]=kg(t,e),i=r[o]||0;r[o]=n+i}function Xs(){const t=mt(),e=Sr(),n=Bi(),r=_r(),o=mt().currentScope,i={data:t.data,skills:e.skills,buttons:n.buttons,items:r.items,quests:Rr().quests,stats:zi().hudStats,scope:o};return new Proxy(i,{get:(s,l,c)=>{const f=mt().currentScope;return typeof f[l]!="undefined"?f[l]:Reflect.get(s,l,c)},set:(s,l,c,f)=>{const u=mt().currentScope;return typeof u[l]!="undefined"?(u[l]=c,u[l]):Reflect.set(s,l,c,f)}})}const jA=new Bg;jA.setupDebugger(!1);const xo=jA.logger;function UH(t,e,n){const r={fileName:n,currentLine:0,error:(a,s)=>t(r,a,s),processCommandsFunction:xg,indentSize:0};r.indentSize=tW(r,e);const o=XH(r,e);r.currentLine=0,xo.log(o);const i={};for(const a of o){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),c=l[0],f=l.slice(1);a.branch||r.error(a.line,"This line should have a branch but doesn't"),i[c]={branch:xg(r,a.branch,void 0),args:f}}return i}function xg(t,e,n){const r=t.currentLine,o={processCommandsFunction:xg,parserContext:t,lines:e,currentLine:0,line:e[0]},i=[];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(;o.currentLine<e.length;){const a=e[o.currentLine];o.line=a;const s=_A(t,a,a.expression),l=or.commands[s.command.operator];let c=l==null?void 0:l.parser;c||(c=or.commands.text.parser),xo.log(or.commands.text);const{newLine:f}=c(o,s);o.currentLine=f,t.currentLine=r+f,i.push(s)}return i}function _A(t,e,n){xo.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=>JH(t,e,a)),options:{}}},o=n[0];if(!or.commands[o]){const a=["else","success","failure"];!nW(o)&&!a.includes(o)&&t.error(e.line,`Unknown command ${o}`)}return r}function JH(t,e,n){return Array.isArray(n)?_A(t,e,n):n}function GH(t){return t==="true"?!0:t==="false"?!1:isNaN(Number(t))?t:Number(t)}function KH(t,e){e.charAt(e.length-1)===":"&&(e=e.substr(0,e.length-1));const n=QH(e),[r]=CA(t,n);return r}function QH(t){const e=/(["'])(?:\\\1|.)*?\1/g,n=[];let r;for(;(r=e.exec(t))!=null;)n.push(r);let o=0,i=[];for(const a of n){const s=a.index;if(s>o){const c=t.substr(o,s-o),f=SA(c);i=[...i,...f]}const l=a[0].replace(/\\/g,"");i.push(`$$"${l.substring(1,l.length-1)}`),o=s+a[0].length}return i=[...i,...SA(t.substr(o))],i.push(")"),i}function SA(t){t=t.replace(/: *$/g,"");let e=t.split(" ").filter(n=>n);return e=e.reduce((n,r)=>[...n,...r.split(/(\(|\))/g)].filter(o=>o&&o),[]),e.map(n=>GH(n))}function CA(t,e){xo.log("===============");let n=[],r=0,o=$A(e)+r,i=jg(e)+r;for(xo.log(`Parsing expression: ${e}`),xo.log(`Parenthesis start index: ${o} - end: ${i}`);o!==-1&&i>o;){n=[...n,...e.slice(r,o)];const l=e.slice(o+1);xo.log(`Found a sub expression. Before: ${n} - After: ${l}`),r=o;const[c,f]=CA(t,l),u=r+f;n.push(c),r=u+1;const d=e.slice(r);xo.log(`Sub expression came back: ${c} - rest of string: ${d}`),o=$A(d),o!==-1&&(o+=r),i=jg(d),i!==-1&&(i+=r)}i!==-1&&xo.log("Found parenthesis end before new opening parenthesis, close this expression");const a=jg(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 xo.log(`End of expression: ${a} - ${s}`),xo.log("==================="),n=[...n,...s],YH(t,n),[n,a+1]}function YH(t,e){e.length<1&&t.error(t.currentLine,"Expression is empty")}function $A(t){return t.findIndex(e=>e==="(")}function jg(t){return t.findIndex(e=>e===")")}function XH(t,e){const n=e.split(/\r?\n|$/).map(o=>{const i=o.search(/ *\/\//g);return i!==-1?o.substr(0,i):o});return OA(t,n,0,0).lines}function OA(t,e,n,r){let o=!0,i=n;const a=[];for(;o&&!(i>=e.length);){let s=e[i];if(s.search(/^\s*$/)!==-1)i++;else{const l=eW(t,s);if(s=s.substring(l*t.indentSize),ZH(t,l,i),l<r)o=!1;else if(l>r){(a.length===0||l-r!==1)&&t.error(i,"Wrong double indentation");const c=OA(t,e,i,l);a[a.length-1].branch=c.lines,i=c.endLine}else{const c=KH(t,s),f={code:s,indentation:l,line:i,expression:c};a.push(f),i++,t.currentLine=i}}}return{lines:a,endLine:i}}function ZH(t,e,n){e%1!==0&&t.error(n,`Indentation level of ${e} incorrect. Expected indentation of ${t.indentSize} spaces for this file.`)}function eW(t,e){return e.search(/[^ ]/)/t.indentSize}function tW(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):(xo.log(r),r[1].length)}const mt=Vo("vm",{state:()=>({stack:[],data:{},lastLabel:"main",script:{},labelStack:["main"],currentScope:{}}),actions:{generateSaveData(){return{lastLabel:this.lastLabel,data:this.data}},loadSaveData(t){this.lastLabel=t.lastLabel,this.data=t.data},resetScope(){this.currentScope={}},setReturnValue(t){this.currentStack.returnValue=t},removeFromScope(t){for(const e of t)delete this.currentScope[e]},addScopedVariable(t,e){this.currentScope[t]=e,this.currentStack&&(this.currentStack.scope[t]=e)},extendScope(t){Object.assign(this.currentScope,t)},async loadScripts(t){const e=[];for(const a of t)e.push(wg(a));const n=await Promise.all(e),r=Date.now();let o={};for(const a in n){const s=n[a];o={...o,...UH((l,c,f)=>hW(l,c,f),s,t[a])}}const i=Date.now();Co.log(`script parsed in ${i-r} ms`),this.setScript(o)},start(){this.setStack({currentIndex:0,branchData:{branch:this.script.main.branch},label:"main"}),this.setStack({currentIndex:0,branchData:{branch:this.script.main.branch},label:"main"})},setLastLabel(t){this.lastLabel=t},reset(){this.stack=[],this.data={},this.setStack({currentIndex:0,branchData:{branch:this.script.main.branch},label:"main"})},setScript(t){this.script=t},overrideData(t){this.data=t},setStack(t){this.resetScope(),this.stack=[];const e=this.stackOptionsToStack(t);this.lastLabel=t.label,this.stack.push(e)},stackOptionsToStack(t){const e={...t,scope:{},returnValue:null};if(t.scope&&(e.scope=t.scope),t.args&&t.branchData.args)for(const[n,r]of t.branchData.args.entries())t.args.length>n&&(e.scope[r]=t.args[n]);return this.extendScope(e.scope||{}),e},setData(t,e){const n=Xs();kA(n,t,e)},addInstruction(t,e){const n=Xs();xA(n,t,e)},addStack(t){t.label||(t.label=this.currentStack.label);const e=this.stackOptionsToStack(t);return this.stack.push(e),this.runLine()},async nextLine(){if(this.stack.length===0){this.finishGame();return}if(this.currentStack.currentIndex<this.currentStack.branchData.branch.length-1)this.currentStack.currentIndex++;else return this.previousStack();if(this.stack.length===0)this.finishGame();else return this.runLine();this.currentStack.currentIndex++},async previousStack(){const t=this.currentStack.scope;this.removeFromScope(Object.keys(t));const{returnValue:e,onComplete:n}=this.currentStack;if(this.stack.splice(this.stack.length-1,1),n)n(e);else return this.nextLine()},finishGame(){_r().onScriptEnd(),Sn().options.debug&&jo().addDialog({speaker:"game",text:"[DEBUG] Game Script is finished. This is the end of the game flow. This message only appears in debug mode."})},async runLine(){const t=this.currentLine;if(!t){hr("There is no line of script to run.");return}_r().onScriptStart(),await NA(t)},runLabelFunction(t,...e){return new Promise((n,r)=>{const o=this.script[t];o||console.error(`Label ${t} doesn't exist`);const i={currentIndex:0,branchData:o,label:t,args:e,onComplete:a=>{n(a)}};this.addStack(i)})},runCustomStack(t){this.addStack(t)},runLabel(t,...e){const n=this.script[t];n||console.error(`Label ${n} doesn't exist`),this.setLastLabel(t),this.setStack({currentIndex:0,branchData:n,args:e,label:t}),this.runLine()}},getters:{currentStack(t){return t.stack[t.stack.length-1]},currentLine(){const t=this.currentStack;if(this.currentStack)return t.branchData.branch[t.currentIndex]}}});function _g(t){return mt(),Sr(),t.replace(/%{[^}]*}/g,e=>{const n=e.substr(2,e.length-3),r=Xs(),[o,i]=kg(r,n);return o[i]})}const AA=/\$\$"/,nW=t=>typeof t=="string"&&t.search(AA)===0,jo=Vo("dialog",{state:()=>({dialog:[]}),actions:{generateSaveData(){return{dialog:this.dialog}},loadSaveData(t){this.dialog=t.dialog},addDialog(t){var e;this.dialog.push({...t,interactive:(e=t.interactive)!=null?e:!1,id:EH(),text:_g(t.text)})},clearDialog(){this.dialog.splice(0,this.dialog.length)},reset(){this.dialog=[]}},getters:{currentDialog(){return this.dialog[this.dialog.length-1]}}});function rW(t,e){return t-e*Rt().skillChecks.skillMultiplier}function EA(t,e){const n=rW(t,e),r=Rt().skillChecks;let o=!1,i=0,a=r.difficultyText[0][1];for(;!o;)r.difficultyText.length>i&&n>=r.difficultyText[i][0]?a=r.difficultyText[i][1]:o=!0,i++;return a}function oW({skill:t,skillCheckId:e,value:n}){const r=Sr(),o=r.getSkillCheck(e),i=aA(t),a=r.skills[t].level,s=EA(n,a);let l=!0,c=`<span class='skill-check'>[<span class='skill-check-name'>${i.name}</span> - `;return o.happened?o.succeeded?c="":(l=!1,c+=` <span class='skill-check-difficulty'>${s}</span> - <span class='skill-check-failed'>FAILED</span>]</span>`):c+=` <span class='skill-check-difficulty'>${s}</span>]</span>`,{difficultyText:c,allowed:l}}function iW(t,e){const n=Sr(),r=aA(e.skill),o=EA(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'>${o}</span> - ${t?'<span class="skill-check-success">Success</span>':'<span class="skill-check-failed">Failure</span>'}]</span>`}function aW(t){const{skillChecks:e}=Rt(),n=Sr(),r=Math.floor(Math.random()*e.rollRange),o=n.skills[t].level*e.skillMultiplier,i=r+o;return Co.log(`[SKILL CHECK] Roll: ${i}. (Base roll: ${r}, modifier: ${o} - Skill level: ${n.skills[t].level})`),{roll:i,unmodifiedRoll:r}}function sW(t){const{skills:e,skillChecks:n}=Rt();let r=!0;const{roll:o}=aW(t.skill);o<=n.failureChance-1&&(r=!1);const i=e[t.skill];return o<t.value&&(r=!1),Co.log(`[SKILL CHECK ${i.name}]: ${r?"\u2705":"\u274C"}`,`(${t.id}) - ${o}/${t.value}`),bc(r?"onSkillCheckSuccess":"onSkillCheckFailure"),r}function MA(t){const e=Sr(),n=e.getSkillCheck(t.id);if(n&&n.happened)return n;const r=sW(t);return TA(iW(r,t)),r?e.passSkillCheck(t.id,t.hideAfterRoll):e.failSkillCheck(t.id,t.hideAfterRoll),e.getSkillCheck(t.id)}function lW(t){const e=t.options,n=t.staticOptions,r=!!e.condition;if(Co.log(r),r)return n.success;if(!r&&n.failure)return n.failure}function PA(t){return typeof t=="object"}function TA(t){const e={speaker:"game",text:t,interactive:!1};jo().addDialog(e)}async function IA(t){jo().addDialog(t)}function cW(t,e){if(e<t.length)return t[e]}class uW{constructor(){ki(this,"plugins",[]);ki(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)}}const or=new uW;async function NA(t,e){const n=mt();try{return await Sg(t,e)}catch(r){console.error(r),console.error(t),hr(`Narrat script runtime error at <span class="error-filename">${t.fileName}:${t.line+1}</span>
174
+ */let lA;const hd=t=>lA=t,cA=Symbol();function gg(t){return t&&typeof t=="object"&&Object.prototype.toString.call(t)==="[object Object]"&&typeof t.toJSON!="function"}var yc;(function(t){t.direct="direct",t.patchObject="patch object",t.patchFunction="patch function"})(yc||(yc={}));function xH(){const t=M.effectScope(!0),e=t.run(()=>M.ref({}));let n=[],r=[];const o=M.markRaw({install(i){hd(o),o._a=i,i.provide(cA,o),i.config.globalProperties.$pinia=o,r.forEach(a=>n.push(a)),r=[]},use(i){return!this._a&&!kH?r.push(i):n.push(i),this},_p:n,_a:null,_e:t,_s:new Map,state:e});return o}const uA=()=>{};function fA(t,e,n,r=uA){t.push(e);const o=()=>{const i=t.indexOf(e);i>-1&&(t.splice(i,1),r())};return!n&&M.getCurrentInstance()&&M.onUnmounted(o),o}function Qs(t,...e){t.slice().forEach(n=>{n(...e)})}function yg(t,e){for(const n in e){if(!e.hasOwnProperty(n))continue;const r=e[n],o=t[n];gg(o)&&gg(r)&&t.hasOwnProperty(n)&&!M.isRef(r)&&!M.isReactive(r)?t[n]=yg(o,r):t[n]=r}return t}const jH=Symbol();function _H(t){return!gg(t)||!t.hasOwnProperty(jH)}const{assign:Di}=Object;function SH(t){return!!(M.isRef(t)&&t.effect)}function CH(t,e,n,r){const{state:o,actions:i,getters:a}=e,s=n.state.value[t];let l;function c(){s||(n.state.value[t]=o?o():{});const f=M.toRefs(n.state.value[t]);return Di(f,i,Object.keys(a||{}).reduce((u,d)=>(u[d]=M.markRaw(M.computed(()=>{hd(n);const h=n._s.get(t);return a[d].call(h,h)})),u),{}))}return l=dA(t,c,e,n,r,!0),l.$reset=function(){const u=o?o():{};this.$patch(d=>{Di(d,u)})},l}function dA(t,e,n={},r,o,i){let a;const s=Di({actions:{}},n),l={deep:!0};let c,f,u=M.markRaw([]),d=M.markRaw([]),h;const p=r.state.value[t];!i&&!p&&(r.state.value[t]={}),M.ref({});let v;function g(A){let T;c=f=!1,typeof A=="function"?(A(r.state.value[t]),T={type:yc.patchFunction,storeId:t,events:h}):(yg(r.state.value[t],A),T={type:yc.patchObject,payload:A,storeId:t,events:h});const _=v=Symbol();M.nextTick().then(()=>{v===_&&(c=!0)}),f=!0,Qs(u,T,r.state.value[t])}const m=uA;function y(){a.stop(),u=[],d=[],r._s.delete(t)}function b(A,T){return function(){hd(r);const _=Array.from(arguments),P=[],$=[];function q(z){P.push(z)}function S(z){$.push(z)}Qs(d,{args:_,name:A,store:k,after:q,onError:S});let j;try{j=T.apply(this&&this.$id===t?this:k,_)}catch(z){throw Qs($,z),z}return j instanceof Promise?j.then(z=>(Qs(P,z),z)).catch(z=>(Qs($,z),Promise.reject(z))):(Qs(P,j),j)}}const w={_p:r,$id:t,$onAction:fA.bind(null,d),$patch:g,$reset:m,$subscribe(A,T={}){const _=fA(u,A,T.detached,()=>P()),P=a.run(()=>M.watch(()=>r.state.value[t],$=>{(T.flush==="sync"?f:c)&&A({storeId:t,type:yc.direct,events:h},$)},Di({},l,T)));return _},$dispose:y},k=M.reactive(Di({},w));r._s.set(t,k);const C=r._e.run(()=>(a=M.effectScope(),a.run(()=>e())));for(const A in C){const T=C[A];if(M.isRef(T)&&!SH(T)||M.isReactive(T))i||(p&&_H(T)&&(M.isRef(T)?T.value=p[A]:yg(T,p[A])),r.state.value[t][A]=T);else if(typeof T=="function"){const _=b(A,T);C[A]=_,s.actions[A]=T}}return Di(k,C),Di(M.toRaw(k),C),Object.defineProperty(k,"$state",{get:()=>r.state.value[t],set:A=>{g(T=>{Di(T,A)})}}),r._p.forEach(A=>{Di(k,a.run(()=>A({store:k,app:r._a,pinia:r,options:s})))}),p&&i&&n.hydrate&&n.hydrate(k.$state,p),c=!0,f=!0,k}function Vo(t,e,n){let r,o;const i=typeof e=="function";typeof t=="string"?(r=t,o=i?n:e):(o=t,r=t.id);function a(s,l){const c=M.getCurrentInstance();return s=s||c&&M.inject(cA),s&&hd(s),s=lA,s._s.has(r)||(i?dA(r,e,o,s):CH(r,o,s)),s._s.get(r)}return a.$id=r,a}function yi(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 o=t(this.$pinia),i=e[r];return typeof i=="function"?i.call(this,o):o[i]},n),{})}const ao=Vo("audio",{state:()=>({}),actions:{stopMusic(){if(this.currentMusic){const t=this.currentMusic;this.currentMusic=void 0,vA(t)}},setMusic(t,e){this.currentMusic=t,this.musicHowlId=e},generateSaveData(){return{currentMusic:this.currentMusic}},loadSaveData(t){this.currentMusic=t.currentMusic},reset(){this.stopMusic()}}}),hA={};ga.Howler.volume(.5);let bg={};async function $H(t){Co.log("Loading audio");const e=[];ga.Howler.volume(t.audioOptions.volume);for(const n in t.music){const r={loop:!0,...t.music[n]};t.audio[n]=r,console.warn("Music config is deprecated, instead you can now add musics to the `audio` config as they behave the same as other sounds!")}for(const n in t.sound)t.audio[n]=t.sound[n];for(const n in t.audio){const r=t.audio[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(OH(n,t.audio[n]))}return t.audioTriggers&&(bg=t.audioTriggers),Promise.all(e)}function bc(t){bg[t]&&pA(bg[t])}async function OH(t,e){return new Promise((n,r)=>{Co.log(`Loading audio ${e.src}`);const o=new ga.Howl({...e});o.load(),hA[t]=o,n()})}async function pd(t){const e=ao(),n=e.musicHowlId,r=Rt().audioOptions;if(e.currentMusic){const a=wc(e.currentMusic);n&&(a.fade(a.volume(),0,r.musicFadeOutTime*1e3,n),setTimeout(()=>{a.stop(n)},r.musicFadeOutTime*1e3))}let o,i;if(t){if(o=wc(t),!o)throw new Error(`Could not find music ${t}`);o.volume(0),i=o.play(),o.pause(),e.setMusic(t,i)}e.currentMusic&&await mg(r.musicFadeInDelay*1e3),o&&ao().musicHowlId===i&&(o.play(),o.fade(0,1,r.musicFadeInTime*1e3,i))}function pA(t){const e=wc(t);if(e)return e.play();hr(`Sound effect ${t} not found!`)}function wc(t){return hA[t]}function vA(t){if(t===ao().currentMusic)ao().stopMusic();else{const e=wc(t);e&&e.stop()}}function mA(t){const e=wc(t);e&&e.pause()}const gA="gameSave";function AH(t){localStorage.setItem(gA,JSON.stringify(t))}function EH(){return`${Date.now()-Math.floor(Math.random()*99999999)}`}function wg(t){return new Promise((e,n)=>{const r=new XMLHttpRequest;r.onload=function(){r.status>=200&&r.status<300?e(r.responseText):n(r.status)},r.open("GET",t),r.send()})}var MH=function(e){return PH(e)&&!TH(e)};function PH(t){return!!t&&typeof t=="object"}function TH(t){var e=Object.prototype.toString.call(t);return e==="[object RegExp]"||e==="[object Date]"||LH(t)}var IH=typeof Symbol=="function"&&Symbol.for,NH=IH?Symbol.for("react.element"):60103;function LH(t){return t.$$typeof===NH}function RH(t){return Array.isArray(t)?[]:{}}function kc(t,e){return e.clone!==!1&&e.isMergeableObject(t)?Ys(RH(t),t,e):t}function DH(t,e,n){return t.concat(e).map(function(r){return kc(r,n)})}function zH(t,e){if(!e.customMerge)return Ys;var n=e.customMerge(t);return typeof n=="function"?n:Ys}function BH(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(e){return t.propertyIsEnumerable(e)}):[]}function yA(t){return Object.keys(t).concat(BH(t))}function bA(t,e){try{return e in t}catch{return!1}}function qH(t,e){return bA(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))}function VH(t,e,n){var r={};return n.isMergeableObject(t)&&yA(t).forEach(function(o){r[o]=kc(t[o],n)}),yA(e).forEach(function(o){qH(t,o)||(bA(t,o)&&n.isMergeableObject(e[o])?r[o]=zH(o,n)(t[o],e[o],n):r[o]=kc(e[o],n))}),r}function Ys(t,e,n){n=n||{},n.arrayMerge=n.arrayMerge||DH,n.isMergeableObject=n.isMergeableObject||MH,n.cloneUnlessOtherwiseSpecified=kc;var r=Array.isArray(e),o=Array.isArray(t),i=r===o;return i?r?n.arrayMerge(t,e,n):VH(t,e,n):kc(e,n)}Ys.all=function(e,n){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce(function(r,o){return Ys(r,o,n)},{})};var FH=Ys,vd=FH;const zi=Vo("hud",{state:()=>({hudStats:{}}),actions:{setupHudStats(t){for(const e in t)this.hudStats[e]={value:t[e].startingValue}},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:this.hudStats}},loadSaveData(t){this.hudStats=vd(this.hudStats,t.hudStats)}}}),bi=Vo("notifications",{state:()=>({notifications:{}}),actions:{async addNotification(t){const e=`${Date.now()}-${Math.random()*1e4}`;this.notifications[e]={text:t},Rt().notifications.alsoPrintInDialogue&&TA(`[NOTIFICATION] ${t}`),await mg(Rt().notifications.timeOnScreen*1e3),this.deleteNotification(e)},deleteNotification(t){delete this.notifications[t]}}}),_r=Vo("inventory",{state:()=>({items:{},interactionTags:{}}),actions:{generateSaveData(){return{items:this.items,interactionTags: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}})},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},bi().addNotification(`Received item: ${sA(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=Rt().interactionTags;Object.keys(t).forEach(e=>{t[e].onlyInteractOutsideOfScripts&&this.disableInteraction(e)})},onScriptEnd(){const t=Rt().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,bi().addNotification(`Lost item: ${sA(t.id).name} x ${t.amount}`),e.amount<=0&&this.deleteItem(t.id))},deleteItem(t){this.getExistingItem(t)&&(this.items[t].amount=0)}}}),HH=(t,e)=>{for(const n in t)if(!e(t[n]))return!1;return!0},wA=(t,e)=>{const n={};for(const r in t)e(t[r])&&(n[r]=t[r]);return n},Rr=Vo("quests",{state:()=>({quests:{}}),actions:{getQuest(t){const e=this.quests[t];if(e)return e;{const n=`Quest ${t} doesn't exist!`;throw hr(n),new Error(n)}},getObjective(t,e){const n=this.getQuest(t);if(!n){const i=`Quest ${t} doesn't exist!`;throw hr(i),new Error(i)}const r=n.objectives[e];if(r)return r;const o=`Objective ${e} doesn't exist in quest ${t}!`;throw hr(o),new Error(o)},setupQuests(t){for(const e of Object.keys(t)){const n=t[e];this.quests[e]={id:e,state:"hidden",objectives:{}};for(const r of Object.keys(n.objectives)){const o=n.objectives[r];this.quests[e].objectives[r]={id:r,state:o.hidden?"hidden":"unlocked"}}}},startQuest(t){const e=this.getQuest(t);e?(e.state="unlocked",bi().addNotification(`Started quest: ${dd(t).title}`)):hr(`Quest ${t} doesn't exist!`)},startObjective(t,e){const n=this.getObjective(t,e);n?(n.state="unlocked",bi().addNotification(`New quest objective: ${vg(t,e).description}`)):hr(`Objective ${e} doesn't exist in quest ${t}!`)},completeObjective(t,e){const n=this.getObjective(t,e);n?(n.state="completed",bi().addNotification(`Completed quest objective: ${vg(t,e).description}`)):hr(`Objective ${e} doesn't exist in quest ${t}!`)},completeQuest(t,e){const n=this.getQuest(t);n?(n.state="completed",n.ending=e,bi().addNotification(`Completed quest: ${dd(t).title}`)):hr(`Quest ${t} doesn't exist!`)},isQuestCompleted(t){const e=this.getQuest(t);return e?HH(e.objectives,n=>n.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:{...this.quests}}},loadSaveData(t){this.quests=t.quests}}}),Bi=Vo("screens",{state:()=>({currentScreen:"default",buttons:{}}),actions:{setScreen(t){this.currentScreen=t},setButtons(t){for(const e in t)this.buttons[e]={enabled:t[e].enabled}},changeButton(t,e){this.buttons[t].enabled=e},generateSaveData(){return{currentScreen:this.currentScreen,buttons:this.buttons}},loadSaveData(t){this.currentScreen=t.currentScreen,this.buttons=vd(this.buttons,t.buttons)}}});function kg(t,e){const n=e.split(".");let r=t;const o=n.length-1;let i=n[0],a=0;for(a=0;a<o;a++)i=n[a],r[i]||(r[i]={}),r=r[i];return i=n[a],[r,i]}function WH(t,e){const n=e.split(".");let r=t;const o=n.length-1;let i=n[0],a=0;for(a=0;a<o;a++)i=n[a],r[i]||(r[i]={}),r=r[i];return i=n[a],typeof r[i]=="undefined"&&(r[i]=null),[r,i]}function kA(t,e,n){const[r,o]=kg(t,e);r[o]=n}function xA(t,e,n){const[r,o]=kg(t,e),i=r[o]||0;r[o]=n+i}function Xs(){const t=mt(),e=Sr(),n=Bi(),r=_r(),o=mt().currentScope,i={data:t.data,skills:e.skills,buttons:n.buttons,items:r.items,quests:Rr().quests,stats:zi().hudStats,scope:o};return new Proxy(i,{get:(s,l,c)=>{const f=mt().currentScope;return typeof f[l]!="undefined"?f[l]:Reflect.get(s,l,c)},set:(s,l,c,f)=>{const u=mt().currentScope;return typeof u[l]!="undefined"?(u[l]=c,u[l]):Reflect.set(s,l,c,f)}})}const jA=new Bg;jA.setupDebugger(!1);const xo=jA.logger;function UH(t,e,n){const r={fileName:n,currentLine:0,error:(a,s)=>t(r,a,s),processCommandsFunction:xg,indentSize:0};r.indentSize=tW(r,e);const o=XH(r,e);r.currentLine=0,xo.log(o);const i={};for(const a of o){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),c=l[0],f=l.slice(1);a.branch||r.error(a.line,"This line should have a branch but doesn't"),i[c]={branch:xg(r,a.branch,void 0),args:f}}return i}function xg(t,e,n){const r=t.currentLine,o={processCommandsFunction:xg,parserContext:t,lines:e,currentLine:0,line:e[0]},i=[];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(;o.currentLine<e.length;){const a=e[o.currentLine];o.line=a;const s=_A(t,a,a.expression),l=or.commands[s.command.operator];let c=l==null?void 0:l.parser;c||(c=or.commands.text.parser),xo.log(or.commands.text);const{newLine:f}=c(o,s);o.currentLine=f,t.currentLine=r+f,i.push(s)}return i}function _A(t,e,n){xo.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=>JH(t,e,a)),options:{}}},o=n[0];if(!or.commands[o]){const a=["else","success","failure"];!nW(o)&&!a.includes(o)&&t.error(e.line,`Unknown command ${o}`)}return r}function JH(t,e,n){return Array.isArray(n)?_A(t,e,n):n}function GH(t){return t==="true"?!0:t==="false"?!1:isNaN(Number(t))?t:Number(t)}function KH(t,e){e.charAt(e.length-1)===":"&&(e=e.substr(0,e.length-1));const n=QH(e),[r]=CA(t,n);return r}function QH(t){const e=/(["'])(?:\\\1|.)*?\1/g,n=[];let r;for(;(r=e.exec(t))!=null;)n.push(r);let o=0,i=[];for(const a of n){const s=a.index;if(s>o){const c=t.substr(o,s-o),f=SA(c);i=[...i,...f]}const l=a[0].replace(/\\/g,"");i.push(`$$"${l.substring(1,l.length-1)}`),o=s+a[0].length}return i=[...i,...SA(t.substr(o))],i.push(")"),i}function SA(t){t=t.replace(/: *$/g,"");let e=t.split(" ").filter(n=>n);return e=e.reduce((n,r)=>[...n,...r.split(/(\(|\))/g)].filter(o=>o&&o),[]),e.map(n=>GH(n))}function CA(t,e){xo.log("===============");let n=[],r=0,o=$A(e)+r,i=jg(e)+r;for(xo.log(`Parsing expression: ${e}`),xo.log(`Parenthesis start index: ${o} - end: ${i}`);o!==-1&&i>o;){n=[...n,...e.slice(r,o)];const l=e.slice(o+1);xo.log(`Found a sub expression. Before: ${n} - After: ${l}`),r=o;const[c,f]=CA(t,l),u=r+f;n.push(c),r=u+1;const d=e.slice(r);xo.log(`Sub expression came back: ${c} - rest of string: ${d}`),o=$A(d),o!==-1&&(o+=r),i=jg(d),i!==-1&&(i+=r)}i!==-1&&xo.log("Found parenthesis end before new opening parenthesis, close this expression");const a=jg(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 xo.log(`End of expression: ${a} - ${s}`),xo.log("==================="),n=[...n,...s],YH(t,n),[n,a+1]}function YH(t,e){e.length<1&&t.error(t.currentLine,"Expression is empty")}function $A(t){return t.findIndex(e=>e==="(")}function jg(t){return t.findIndex(e=>e===")")}function XH(t,e){const n=e.split(/\r?\n|$/).map(o=>{const i=o.search(/ *\/\//g);return i!==-1?o.substr(0,i):o});return OA(t,n,0,0).lines}function OA(t,e,n,r){let o=!0,i=n;const a=[];for(;o&&!(i>=e.length);){let s=e[i];if(s.search(/^\s*$/)!==-1)i++;else{const l=eW(t,s);if(s=s.substring(l*t.indentSize),ZH(t,l,i),l<r)o=!1;else if(l>r){(a.length===0||l-r!==1)&&t.error(i,"Wrong double indentation");const c=OA(t,e,i,l);a[a.length-1].branch=c.lines,i=c.endLine}else{const c=KH(t,s),f={code:s,indentation:l,line:i,expression:c};a.push(f),i++,t.currentLine=i}}}return{lines:a,endLine:i}}function ZH(t,e,n){e%1!==0&&t.error(n,`Indentation level of ${e} incorrect. Expected indentation of ${t.indentSize} spaces for this file.`)}function eW(t,e){return e.search(/[^ ]/)/t.indentSize}function tW(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):(xo.log(r),r[1].length)}const mt=Vo("vm",{state:()=>({stack:[],data:{},lastLabel:"main",script:{},labelStack:["main"],currentScope:{}}),actions:{generateSaveData(){return{lastLabel:this.lastLabel,data:this.data}},loadSaveData(t){this.lastLabel=t.lastLabel,this.data=t.data},resetScope(){this.currentScope={}},setReturnValue(t){this.currentStack.returnValue=t},removeFromScope(t){for(const e of t)delete this.currentScope[e]},addScopedVariable(t,e){this.currentScope[t]=e,this.currentStack&&(this.currentStack.scope[t]=e)},extendScope(t){Object.assign(this.currentScope,t)},async loadScripts(t){const e=[];for(const a of t)e.push(wg(a));const n=await Promise.all(e),r=Date.now();let o={};for(const a in n){const s=n[a];o={...o,...UH((l,c,f)=>hW(l,c,f),s,t[a])}}const i=Date.now();Co.log(`script parsed in ${i-r} ms`),this.setScript(o)},start(){this.setStack({currentIndex:0,branchData:{branch:this.script.main.branch},label:"main"}),this.setStack({currentIndex:0,branchData:{branch:this.script.main.branch},label:"main"})},setLastLabel(t){this.lastLabel=t},reset(){this.stack=[],this.data={},this.setStack({currentIndex:0,branchData:{branch:this.script.main.branch},label:"main"})},setScript(t){this.script=t},overrideData(t){this.data=t},setStack(t){this.resetScope(),this.stack=[];const e=this.stackOptionsToStack(t);this.lastLabel=t.label,this.stack.push(e)},stackOptionsToStack(t){const e={...t,scope:{},returnValue:null};if(t.scope&&(e.scope=t.scope),t.args&&t.branchData.args)for(const[n,r]of t.branchData.args.entries())t.args.length>n&&(e.scope[r]=t.args[n]);return this.extendScope(e.scope||{}),e},setData(t,e){const n=Xs();kA(n,t,e)},addInstruction(t,e){const n=Xs();xA(n,t,e)},addStack(t){t.label||(t.label=this.currentStack.label);const e=this.stackOptionsToStack(t);return this.stack.push(e),this.runLine()},async nextLine(){if(this.stack.length===0){this.finishGame();return}if(this.currentStack.currentIndex<this.currentStack.branchData.branch.length-1)this.currentStack.currentIndex++;else return this.previousStack();if(this.stack.length===0)this.finishGame();else return this.runLine();this.currentStack.currentIndex++},async previousStack(){const t=this.currentStack.scope;this.removeFromScope(Object.keys(t));const{returnValue:e,onComplete:n}=this.currentStack;if(this.stack.splice(this.stack.length-1,1),n)n(e);else return this.nextLine()},finishGame(){_r().onScriptEnd(),Sn().options.debug&&jo().addDialog({speaker:"game",text:"[DEBUG] Game Script is finished. This is the end of the game flow. This message only appears in debug mode."})},async runLine(){const t=this.currentLine;if(!t){hr("There is no line of script to run.");return}_r().onScriptStart(),await NA(t)},runLabelFunction(t,...e){return new Promise((n,r)=>{const o=this.script[t];o||console.error(`Label ${t} doesn't exist`);const i={currentIndex:0,branchData:o,label:t,args:e,onComplete:a=>{n(a)}};this.addStack(i)})},runCustomStack(t){this.addStack(t)},runLabel(t,...e){const n=this.script[t];n||console.error(`Label ${n} doesn't exist`),this.setLastLabel(t),this.setStack({currentIndex:0,branchData:n,args:e,label:t}),this.runLine()}},getters:{currentStack(t){return t.stack[t.stack.length-1]},currentLine(){const t=this.currentStack;if(this.currentStack)return t.branchData.branch[t.currentIndex]}}});function _g(t){return mt(),Sr(),t.replace(/%{[^}]*}/g,e=>{const n=e.substr(2,e.length-3),r=Xs(),[o,i]=kg(r,n);return o[i]})}const AA=/\$\$"/,nW=t=>typeof t=="string"&&t.search(AA)===0,jo=Vo("dialog",{state:()=>({dialog:[]}),actions:{generateSaveData(){return{dialog:this.dialog}},loadSaveData(t){this.dialog=t.dialog},addDialog(t){var e;this.dialog.push({...t,interactive:(e=t.interactive)!=null?e:!1,id:EH(),text:_g(t.text)})},clearDialog(){this.dialog.splice(0,this.dialog.length)},reset(){this.dialog=[]}},getters:{currentDialog(){return this.dialog[this.dialog.length-1]}}});function rW(t,e){return t-e*Rt().skillChecks.skillMultiplier}function EA(t,e){const n=rW(t,e),r=Rt().skillChecks;let o=!1,i=0,a=r.difficultyText[0][1];for(;!o;)r.difficultyText.length>i&&n>=r.difficultyText[i][0]?a=r.difficultyText[i][1]:o=!0,i++;return a}function oW({skill:t,skillCheckId:e,value:n}){const r=Sr(),o=r.getSkillCheck(e),i=aA(t),a=r.skills[t].level,s=EA(n,a);let l=!0,c=`<span class='skill-check'>[<span class='skill-check-name'>${i.name}</span> - `;return o.happened?o.succeeded?c="":(l=!1,c+=` <span class='skill-check-difficulty'>${s}</span> - <span class='skill-check-failed'>FAILED</span>]</span>`):c+=` <span class='skill-check-difficulty'>${s}</span>]</span>`,{difficultyText:c,allowed:l}}function iW(t,e){const n=Sr(),r=aA(e.skill),o=EA(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'>${o}</span> - ${t?'<span class="skill-check-success">Success</span>':'<span class="skill-check-failed">Failure</span>'}]</span>`}function aW(t){const{skillChecks:e}=Rt(),n=Sr(),r=Math.floor(Math.random()*e.rollRange),o=n.skills[t].level*e.skillMultiplier,i=r+o;return Co.log(`[SKILL CHECK] Roll: ${i}. (Base roll: ${r}, modifier: ${o} - Skill level: ${n.skills[t].level})`),{roll:i,unmodifiedRoll:r}}function sW(t){const{skills:e,skillChecks:n}=Rt();let r=!0;const{roll:o}=aW(t.skill);o<=n.failureChance-1&&(r=!1);const i=e[t.skill];return o<t.value&&(r=!1),Co.log(`[SKILL CHECK ${i.name}]: ${r?"\u2705":"\u274C"}`,`(${t.id}) - ${o}/${t.value}`),bc(r?"onSkillCheckSuccess":"onSkillCheckFailure"),r}function MA(t){const e=Sr(),n=e.getSkillCheck(t.id);if(n&&n.happened)return n;const r=sW(t);return TA(iW(r,t)),r?e.passSkillCheck(t.id,t.hideAfterRoll):e.failSkillCheck(t.id,t.hideAfterRoll),e.getSkillCheck(t.id)}function lW(t){const e=t.options,n=t.staticOptions,r=!!e.condition;if(Co.log(r),r)return n.success;if(!r&&n.failure)return n.failure}function PA(t){return typeof t=="object"}function TA(t){const e={speaker:"game",text:t,interactive:!1};jo().addDialog(e)}async function IA(t){jo().addDialog(t)}function cW(t,e){if(e<t.length)return t[e]}class uW{constructor(){ki(this,"plugins",[]);ki(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)}}const or=new uW;async function NA(t,e){const n=mt();try{return await Sg(t,e)}catch(r){console.error(r),console.error(t),hr(`Narrat script runtime error at <span class="error-filename">${t.fileName}:${t.line+1}</span>
175
175
  <b>${r}</b>
176
176
  Script: ${t.code}
177
177
  Label: ${n.currentStack.label}`)}}async function fW(t,e){const n=t.command,r=or.commands[n.commandType];if(r){const o={args:[],options:{},operator:n.operator,staticOptions:n.staticOptions,code:t.code,commandType:n.commandType,fileName:t.fileName,line:t.line},i=r.argTypes;o.options={};for(const[a,s]of n.args.entries()){let l;if(PA(s))l=await Sg(s,e);else if(typeof s=="string")if(s.search(AA)===0)l=s.substring(3);else if(s.search(/\$/)===0){const c=Xs(),f=WH(c,s.substring(1));if(f){const[u,d]=f;l=u[d]}else l=s}else l=s;else l=s;if(o.args.push(l),Array.isArray(i)&&i.length>a){const c=i[a];l!==null&&(o.options[c.name]=l)}}return o}else throw new Error(`${n.commandType} is not a valid command`)}async function Sg(t,e){const n=await fW(t,e),r=or.commands[n.commandType];if(r)return await r.runner(n,e);throw new Error(`${n.commandType} is not a valid command`)}async function dW(t){bc("onPlayerAnswered");const e=mt(),n=e.lastChoiceCommand;e.lastChoiceCommand=void 0;const r=e.currentLine;try{if(n){const o=or.commands[n.commandType];if(o&&o.onPlayerAnswered)return await o.onPlayerAnswered(n,t)}return await e.nextLine()}catch(o){console.error(o),hr(`Error after player answer at ${r.fileName}:${r.line+1} (${r.code}<br /> - Error: ${o}`)}}const xc=Vo("rendering",{state:()=>({screenHeight:window.innerHeight,screenWidth:window.innerWidth,canvasWidth:window.innerWidth,canvasHeight:window.innerHeight,renderRatio:1,topOffset:0,leftOffset:0,layoutMode:"horizontal"}),actions:{updateScreenSize(t,e,n){this.screenHeight=e,this.screenWidth=t,this.renderRatio=1,this.topOffset=0,this.leftOffset=0,t<Rt().layout.verticalLayoutThreshold?this.layoutMode="vertical":this.layoutMode="horizontal"}}}),Sn=Vo("main",{state:()=>({ready:!1,playing:!1,errors:[],playTime:{start:0,previousPlaytime:0},options:{logging:!1,debug:!1},flowState:"menu",modal:!1,paused:!1}),actions:{async setup(t,e){e.audioOptions.defaultMusic&&pd(e.audioOptions.defaultMusic),await mt().loadScripts(t),Bi().setButtons(e.buttons),Sr().setupSkills(e.skills),zi().setupHudStats(e.hudStats),_r().setupItems(e.items),Rr().setupQuests(e.quests)},startMachine(){ao().stopMusic(),mt().start(),this.ready=!0,this.startPlaying(),or.callHook("onGameStart"),this.setFlowState("playing")},async startGame(){this.startMachine(),await mt().runLine(),await this.saveGame()},async loadGame(t){if(this.startMachine(),t){const e=JSON.parse(t);this.setLoadedData(e),e.audio.currentMusic&&pd(e.audio.currentMusic),mt().runLabel(e.vm.lastLabel)}},playerAnswered(t){dW(t)},menuReturn(){this.reset(),ao().stopMusic(),this.setFlowState("menu"),Rt().audioOptions.defaultMusic&&pd(Rt().audioOptions.defaultMusic)},createError(t){this.errors.push({text:t})},clearErrors(){this.errors=[]},setFlowState(t){this.flowState=t},openModal(t){this.modal=t},closeModal(){this.modal=!1},toggleMenu(){this.modal?this.modal=!1:this.modal="menu"},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.modal=!1,this.paused=!1,mt().reset(),ao().reset(),this.playing=!1,this.ready=!0},generateSaveData(){return{playTime:Cd(this.playTime.start,this.playTime.previousPlaytime)}},loadSaveData(t){this.playTime.previousPlaytime=t.playTime},saveGame(){const t=Bi(),e=Sr(),n=jo(),r=mt(),o=Sn(),i=zi(),a=ao(),s=_r(),l={version:"1.0.0",screen:t.generateSaveData(),skills:e.generateSaveData(),dialog:n.generateSaveData(),vm:r.generateSaveData(),main:o.generateSaveData(),hud:i.generateSaveData(),audio:a.generateSaveData(),inventory:s.generateSaveData(),quests:Rr().generateSaveData()};AH(l)},setLoadedData(t){const e=Bi(),n=Sr(),r=jo(),o=mt(),i=Sn(),a=zi(),s=ao(),l=_r();e.loadSaveData(t.screen),n.loadSaveData(t.skills),r.loadSaveData(t.dialog),o.loadSaveData(t.vm),i.loadSaveData(t.main),a.loadSaveData(t.hud),s.loadSaveData(t.audio),l.loadSaveData(t.inventory),Rr().loadSaveData(t.quests)},getAllStates(){return{main:this,screens:Bi(),skills:Sr(),dialog:jo(),vm:mt(),hud:zi(),audio:ao(),rendering:xc(),notifications:bi(),inventory:_r(),quests:Rr()}},overrideStates(t){const e=this.getAllStates();for(const n in t){const r=t[n];Object.assign(e[n],r)}}}});function hW(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>`;hr(r)}function hr(t){const e=Sn();console.error(t),t=t.replace(/[\r\n]/g,`