narrat 1.0.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- // Version: 1.0.0 - June 24, 2022 23:38:57
1
+ // Version: 1.2.1 - June 25, 2022 14:20:12
2
2
  import 'es6-promise/auto';
3
3
  import { ref, reactive, readonly, defineComponent, openBlock, createElementBlock, normalizeStyle, createElementVNode, createCommentVNode, Fragment, renderList, normalizeClass, createBlock, Transition, withCtx, renderSlot, createTextVNode, computed, resolveComponent, withDirectives, vModelText, toDisplayString, TransitionGroup, createVNode, createApp } from 'vue';
4
4
  import { defineStore, mapState, createPinia } from 'pinia';
@@ -30,7 +30,7 @@ function styleInject(css, ref) {
30
30
  }
31
31
  }
32
32
 
33
- var css_248z = "/*! @import */\n\n/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n font-family:\n\t\tsystem-ui,\n\t\t-apple-system, /* Firefox supports this but not yet `system-ui` */\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'] {\n -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nbutton {\n background-color: transparent;\n background-image: none;\n}\n\n/**\n * Work around a Firefox/IE bug where the transparent `button` background\n * results in a loss of the default `button` focus styles.\n */\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nol,\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n/**\n * 1. Use the user's configured `sans` font-family (with Tailwind's default\n * sans-serif font stack as a fallback) as a sane default.\n * 2. Use Tailwind's default \"normal\" line-height so the user isn't forced\n * to override it to ensure consistency even when using the default theme.\n */\n\nhtml {\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n/**\n * Inherit font-family and line-height from `html` so users can set them as\n * a class directly on the `html` element.\n */\n\nbody {\n font-family: inherit;\n line-height: inherit;\n}\n\n/**\n * 1. Prevent padding and border from affecting element width.\n *\n * We used to set this in the html element and inherit from\n * the parent element for everything else. This caused issues\n * in shadow-dom-enhanced elements like <details> where the content\n * is wrapped by a div with box-sizing set to `content-box`.\n *\n * https://github.com/mozdevs/cssremedy/issues/4\n *\n *\n * 2. Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it's border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\nhr {\n border-top-width: 1px;\n}\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\nimg {\n border-style: solid;\n}\n\ntextarea {\n resize: vertical;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n color: #9ca3af;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n color: #9ca3af;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n color: #9ca3af;\n}\n\nbutton {\n cursor: pointer;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don't inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured 'mono' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * 'mono' font family.\n */\n\npre,\ncode,\nkbd,\nsamp {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n/**\n * Make replaced elements `display: block` by default as that's\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their instrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n\n.bg-gray-800 {\n --tw-bg-opacity: 1;\n background-color: rgba(31, 41, 55, var(--tw-bg-opacity));\n}\n\n.border {\n border-width: 1px;\n}\n\n.flex {\n display: flex;\n}\n\n.table {\n display: table;\n}\n\n.grid {\n display: grid;\n}\n\n.hidden {\n display: none;\n}\n\n.flex-row {\n flex-direction: row;\n}\n\n.flex-col {\n flex-direction: column;\n}\n\n.flex-grow {\n flex-grow: 1;\n}\n\n.flex-shrink {\n flex-shrink: 1;\n}\n\n.list-disc {\n list-style-type: disc;\n}\n\n.absolute {\n position: absolute;\n}\n\n.resize {\n resize: both;\n}\n\n* {\n --tw-shadow: 0 0 #0000;\n}\n\n* {\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n}\n\n.table-auto {\n table-layout: auto;\n}\n\n.line-through {\n text-decoration: line-through;\n}\n\n.w-full {\n width: 100%;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n\n.transform {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.transition {\n transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n@-webkit-keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n@keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n@-webkit-keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n\n@keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n\n@-webkit-keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);\n animation-timing-function: cubic-bezier(0.8,0,1,1);\n }\n\n 50% {\n transform: none;\n -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);\n animation-timing-function: cubic-bezier(0,0,0.2,1);\n }\n}\n\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);\n animation-timing-function: cubic-bezier(0.8,0,1,1);\n }\n\n 50% {\n transform: none;\n -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);\n animation-timing-function: cubic-bezier(0,0,0.2,1);\n }\n}\n\n:root {\n --bg-color: #131720;\n --text-color: #d9e1f2;\n --primary: hsl(255, 30%, 55%);\n --focus: hsl(210, 90%, 50%);\n --secondary: #42b983;\n --border-color: hsla(0, 0%, 100%, 0.2);\n --light-1: hsl(210, 30%, 40%);\n --light-2: hsl(255, 30%, 50%);\n --light-background: linear-gradient(to right, var(--light-1), var(--light-2));\n --shadow-1: hsla(236, 50%, 50%, 0.3);\n --shadow-2: hsla(236, 50%, 50%, 0.4);\n --hud-background: rgba(0, 0, 0, 0.4);\n --hud-text-color: var(--text-color);\n --notifications-bg: darkslateblue;\n --skills-text-background: rgba(0, 0, 0, 0.5);\n --skills-text-color: var(--text-color);\n --skills-level-background: rgba(0, 0, 0, 0.5);\n --skills-level-color: orange;\n --skills-xp-bar-height: 40px;\n --skill-check-name-color: orange;\n --skill-check-difficulty: orange;\n --skill-check-success: green;\n --skill-check-failed: red;\n --skill-check-color: orange;\n --dialog-choice-color: orange;\n --dialog-choice-hover-color: var(--text-color);\n}\n\n.list-item {\n display: inline-block;\n margin-right: 10px;\n}\n\n.list-enter-active,\r\n.list-leave-active {\n transition: all 0.3s ease;\n}\n\n/* .list-move {\r\n transition: transform 0.3s ease;\r\n} */\n\n.list-enter-from,\r\n.list-leave-to {\n opacity: 0;\n transform: translateX(300px);\n}\n\n.notification-item {\n display: inline-block;\n margin-right: 10px;\n}\n\n.notification-enter-active,\r\n.notification-leave-active {\n transition: all 0.3s ease;\n}\n\n/* .notification-move {\r\n transition: transform 0.3s ease;\r\n} */\n\n.notification-enter-from,\r\n.notification-leave-to {\n opacity: 0;\n transform: translateY(-300px);\n}\n\n.fade-enter-active,\r\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\r\n.fade-leave-to {\n opacity: 0;\n}\n\n.fade-in-enter-active {\n transition: opacity 0.1s ease;\n}\n\n.fade-in-enter-from {\n opacity: 0;\n}\n\nbody {\n padding: 0;\n margin: 0;\n font-family: Arial, sans-serif;\n background-color: black;\n}\n\n.select {\n background: var(--light-background);\n padding: 10px;\n}\n\n.option {\n background-color: var(--light-2);\n padding: 5px;\n color: var(--text-color);\n}\n\n.button {\n background: var(--light-background);\n color: var(--text-color);\n box-shadow: 0.4rem 0.4rem 2.4rem 0.2rem var(--shadow-1);\n border-radius: 100px;\n padding: 10px;\n font-weight: 800;\n font-size: 16px;\n margin: 10px;\n transition: 0.2s;\n}\n\n.button:focus,\r\n.button:hover {\n transform: translateY(-0.2rem);\n box-shadow: 0 0 2.4rem 0.2rem var(--shadow-2);\n}\n\n.input {\n background: var(--light-background);\n color: var(--text-color);\n box-shadow: 0.4rem 0.4rem 2.4rem 0.2rem var(--shadow-1);\n border-radius: 100px;\n padding: 10px;\n font-weight: 800;\n font-size: 16px;\n margin: 10px;\n transition: 0.2s;\n}\n\n.input:focus,\r\n.input:hover {\n transform: translateY(-0.2rem);\n box-shadow: 0 0 2.4rem 0.2rem var(--shadow-2);\n}\n\na {\n color: pink;\n text-decoration: underline;\n}\n\nth,\r\ntd {\n padding: 4px;\n border: 1px solid var(--text-color);\n text-align: center;\n}\n\n#game-holder {\n width: 100vw;\n height: 100vh;\n padding: 0;\n margin: 0;\n top: 0;\n left: 0;\n background-color: black;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: -webkit-fill-available;\n}\n\n.title {\n font-size: 30px;\n font-weight: 700;\n text-align: center;\n}\n\n.container {\n padding: 20px;\n}\n\nh1,\r\nh2,\r\nh3,\r\nh4 {\n font-weight: 700;\n}\n\nh1 {\n font-size: 30px;\n}\n\nh2 {\n font-size: 26px;\n}\n\nh3 {\n font-size: 24px;\n}\n\nhr.solid {\n border: 1px solid var(--text-color);\n margin-top: 30px;\n margin-bottom: 30px;\n}\n\n.card-1 {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);\n transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\n}\n\n.card-1:hover {\n box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);\n}\n\n.card-2 {\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);\n}\n\n.card-3 {\n box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);\n}\n\n.card-4 {\n box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);\n}\n\n.card-5 {\n box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22);\n}\n\n.dialog-choice {\n transition: 0.2s;\n}\n\n.dialog-choice:hover {\n transform: scale(1.05, 1.05);\n transform-origin: center;\n}\n\n/* Somewhat arcane CSS to force the hover color to override the child style.\r\nOtherwise hovering choices doesn't change the color of skill check prompts. */\n\n.dialog-choice:not(:hover) > .skill-check-name,\r\n.passive-skill-check > .skill-check-name {\n color: var(--skill-check-name-color);\n}\n\n.dialog-choice:not(:hover) > .skill-check-difficulty,\r\n.passive-skill-check > .skill-check-difficulty {\n color: var(--skill-check-difficulty);\n}\n\n.skill-check-difficulty {\n font-weight: 700;\n}\n\n.dialog-choice:not(:hover) > .skill-check-success,\r\n.passive-skill-check > .skill-check-success {\n color: var(--skill-check-success);\n}\n\n.dialog-choice:not(:hover) > .skill-check-failed,\r\n.passive-skill-check > .skill-check-failed {\n color: var(--skill-check-failed);\n}\n\n.dialog-choice:not(:hover) > .skill-check,\r\n.passive-skill-check.skill-check {\n color: var(--skill-check-color);\n}\n\n.narrat-canvas {\n position: absolute;\n height: 100%;\n top: 0;\n left: 0;\n}\n\n/* Looks ugly */\n\n/* @keyframes strike-anim {\r\n 0% {\r\n width: 0;\r\n }\r\n 100% {\r\n width: 100%;\r\n }\r\n}\r\n.strike-anim {\r\n position: relative;\r\n}\r\n.strike-anim::after {\r\n content: ' ';\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n width: 100%;\r\n height: 1px;\r\n background: var(--text-color);\r\n animation-name: strike-anim;\r\n animation-duration: 0.5s;\r\n animation-timing-function: linear;\r\n animation-iteration-count: 1;\r\n animation-fill-mode: forwards;\r\n} */\n\n#touchTrigger {\n pointer-events: none;\n}\n\n@media (min-width: 640px) {\n}\n\n@media (min-width: 768px) {\n}\n\n@media (min-width: 1024px) {\n}\n\n@media (min-width: 1280px) {\n}\n\n@media (min-width: 1536px) {\n}\r\n";
33
+ var css_248z = "/*! @import */\n\n/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n font-family:\n\t\tsystem-ui,\n\t\t-apple-system, /* Firefox supports this but not yet `system-ui` */\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'] {\n -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nbutton {\n background-color: transparent;\n background-image: none;\n}\n\n/**\n * Work around a Firefox/IE bug where the transparent `button` background\n * results in a loss of the default `button` focus styles.\n */\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nol,\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n/**\n * 1. Use the user's configured `sans` font-family (with Tailwind's default\n * sans-serif font stack as a fallback) as a sane default.\n * 2. Use Tailwind's default \"normal\" line-height so the user isn't forced\n * to override it to ensure consistency even when using the default theme.\n */\n\nhtml {\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n/**\n * Inherit font-family and line-height from `html` so users can set them as\n * a class directly on the `html` element.\n */\n\nbody {\n font-family: inherit;\n line-height: inherit;\n}\n\n/**\n * 1. Prevent padding and border from affecting element width.\n *\n * We used to set this in the html element and inherit from\n * the parent element for everything else. This caused issues\n * in shadow-dom-enhanced elements like <details> where the content\n * is wrapped by a div with box-sizing set to `content-box`.\n *\n * https://github.com/mozdevs/cssremedy/issues/4\n *\n *\n * 2. Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it's border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\nhr {\n border-top-width: 1px;\n}\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\nimg {\n border-style: solid;\n}\n\ntextarea {\n resize: vertical;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n color: #9ca3af;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n color: #9ca3af;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n color: #9ca3af;\n}\n\nbutton {\n cursor: pointer;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don't inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured 'mono' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * 'mono' font family.\n */\n\npre,\ncode,\nkbd,\nsamp {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n/**\n * Make replaced elements `display: block` by default as that's\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their instrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n\n.bg-gray-800 {\n --tw-bg-opacity: 1;\n background-color: rgba(31, 41, 55, var(--tw-bg-opacity));\n}\n\n.border {\n border-width: 1px;\n}\n\n.flex {\n display: flex;\n}\n\n.table {\n display: table;\n}\n\n.grid {\n display: grid;\n}\n\n.hidden {\n display: none;\n}\n\n.flex-row {\n flex-direction: row;\n}\n\n.flex-col {\n flex-direction: column;\n}\n\n.flex-grow {\n flex-grow: 1;\n}\n\n.flex-shrink {\n flex-shrink: 1;\n}\n\n.list-disc {\n list-style-type: disc;\n}\n\n.absolute {\n position: absolute;\n}\n\n.resize {\n resize: both;\n}\n\n* {\n --tw-shadow: 0 0 #0000;\n}\n\n* {\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n}\n\n.table-auto {\n table-layout: auto;\n}\n\n.line-through {\n text-decoration: line-through;\n}\n\n.w-full {\n width: 100%;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n\n.transform {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.transition {\n transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n@-webkit-keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n@keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n@-webkit-keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n\n@keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n\n@-webkit-keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);\n animation-timing-function: cubic-bezier(0.8,0,1,1);\n }\n\n 50% {\n transform: none;\n -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);\n animation-timing-function: cubic-bezier(0,0,0.2,1);\n }\n}\n\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);\n animation-timing-function: cubic-bezier(0.8,0,1,1);\n }\n\n 50% {\n transform: none;\n -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);\n animation-timing-function: cubic-bezier(0,0,0.2,1);\n }\n}\n\n:root {\n --bg-color: #131720;\n --text-color: #d9e1f2;\n --primary: hsl(255, 30%, 55%);\n --focus: hsl(210, 90%, 50%);\n --secondary: #42b983;\n --border-color: hsla(0, 0%, 100%, 0.2);\n --light-1: hsl(210, 30%, 40%);\n --light-2: hsl(255, 30%, 50%);\n --light-background: linear-gradient(to right, var(--light-1), var(--light-2));\n --shadow-1: hsla(236, 50%, 50%, 0.3);\n --shadow-2: hsla(236, 50%, 50%, 0.4);\n --hud-background: rgba(0, 0, 0, 0.4);\n --hud-text-color: var(--text-color);\n --notifications-bg: darkslateblue;\n --skills-text-background: rgba(0, 0, 0, 0.5);\n --skills-text-color: var(--text-color);\n --skills-level-background: rgba(0, 0, 0, 0.5);\n --skills-level-color: orange;\n --skills-xp-bar-height: 40px;\n --skill-check-name-color: orange;\n --skill-check-difficulty: orange;\n --skill-check-success: green;\n --skill-check-failed: red;\n --skill-check-color: orange;\n --dialog-choice-color: orange;\n --dialog-choice-hover-color: var(--text-color);\n --inventory-text-background: rgba(0, 0, 0, 0.5);\n --inventory-text-color: var(--text-color);\n --inventory-amount-background: rgba(0, 0, 0, 0.5);\n --inventory-amount-color: orange;\n --quest-title-color: yellow;\n --completed-quest-title-color: grey;\n --objective-in-progress-color: white;\n --objective-completed-color: grey;\n}\n\n.list-item {\n display: inline-block;\n margin-right: 10px;\n}\n\n.list-enter-active,\r\n.list-leave-active {\n transition: all 0.3s ease;\n}\n\n/* .list-move {\r\n transition: transform 0.3s ease;\r\n} */\n\n.list-enter-from,\r\n.list-leave-to {\n opacity: 0;\n transform: translateX(300px);\n}\n\n.notification-item {\n display: inline-block;\n margin-right: 10px;\n}\n\n.notification-enter-active,\r\n.notification-leave-active {\n transition: all 0.3s ease;\n}\n\n/* .notification-move {\r\n transition: transform 0.3s ease;\r\n} */\n\n.notification-enter-from,\r\n.notification-leave-to {\n opacity: 0;\n transform: translateY(-300px);\n}\n\n.fade-enter-active,\r\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\r\n.fade-leave-to {\n opacity: 0;\n}\n\n.fade-in-enter-active {\n transition: opacity 0.1s ease;\n}\n\n.fade-in-enter-from {\n opacity: 0;\n}\n\nbody {\n padding: 0;\n margin: 0;\n font-family: Arial, sans-serif;\n background-color: black;\n}\n\n.select {\n background: var(--light-background);\n padding: 10px;\n}\n\n.option {\n background-color: var(--light-2);\n padding: 5px;\n color: var(--text-color);\n}\n\n.button {\n background: var(--light-background);\n color: var(--text-color);\n box-shadow: 0.4rem 0.4rem 2.4rem 0.2rem var(--shadow-1);\n border-radius: 100px;\n padding: 10px;\n font-weight: 800;\n font-size: 16px;\n margin: 10px;\n transition: 0.2s;\n}\n\n.button:focus,\r\n.button:hover {\n transform: translateY(-0.2rem);\n box-shadow: 0 0 2.4rem 0.2rem var(--shadow-2);\n}\n\n.input {\n background: var(--light-background);\n color: var(--text-color);\n box-shadow: 0.4rem 0.4rem 2.4rem 0.2rem var(--shadow-1);\n border-radius: 100px;\n padding: 10px;\n font-weight: 800;\n font-size: 16px;\n margin: 10px;\n transition: 0.2s;\n}\n\n.input:focus,\r\n.input:hover {\n transform: translateY(-0.2rem);\n box-shadow: 0 0 2.4rem 0.2rem var(--shadow-2);\n}\n\na {\n color: pink;\n text-decoration: underline;\n}\n\nth,\r\ntd {\n padding: 4px;\n border: 1px solid var(--text-color);\n text-align: center;\n}\n\n#game-holder {\n width: 100vw;\n height: 100vh;\n padding: 0;\n margin: 0;\n top: 0;\n left: 0;\n background-color: black;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: -webkit-fill-available;\n}\n\n.title {\n font-size: 30px;\n font-weight: 700;\n text-align: center;\n}\n\n.container {\n padding: 20px;\n}\n\nh1,\r\nh2,\r\nh3,\r\nh4 {\n font-weight: 700;\n}\n\nh1 {\n font-size: 30px;\n}\n\nh2 {\n font-size: 26px;\n}\n\nh3 {\n font-size: 24px;\n}\n\nhr.solid {\n border: 1px solid var(--text-color);\n margin-top: 30px;\n margin-bottom: 30px;\n}\n\n.card-1 {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);\n transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\n}\n\n.card-1:hover {\n box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);\n}\n\n.card-2 {\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);\n}\n\n.card-3 {\n box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);\n}\n\n.card-4 {\n box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);\n}\n\n.card-5 {\n box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22);\n}\n\n.dialog-choice {\n transition: 0.2s;\n}\n\n.dialog-choice:hover {\n transform: scale(1.05, 1.05);\n transform-origin: center;\n}\n\n/* Somewhat arcane CSS to force the hover color to override the child style.\r\nOtherwise hovering choices doesn't change the color of skill check prompts. */\n\n.dialog-choice:not(:hover) > .skill-check-name,\r\n.passive-skill-check > .skill-check-name {\n color: var(--skill-check-name-color);\n}\n\n.dialog-choice:not(:hover) > .skill-check-difficulty,\r\n.passive-skill-check > .skill-check-difficulty {\n color: var(--skill-check-difficulty);\n}\n\n.skill-check-difficulty {\n font-weight: 700;\n}\n\n.dialog-choice:not(:hover) > .skill-check-success,\r\n.passive-skill-check > .skill-check-success {\n color: var(--skill-check-success);\n}\n\n.dialog-choice:not(:hover) > .skill-check-failed,\r\n.passive-skill-check > .skill-check-failed {\n color: var(--skill-check-failed);\n}\n\n.dialog-choice:not(:hover) > .skill-check,\r\n.passive-skill-check.skill-check {\n color: var(--skill-check-color);\n}\n\n.narrat-canvas {\n position: absolute;\n height: 100%;\n top: 0;\n left: 0;\n}\n\n/* Looks ugly */\n\n/* @keyframes strike-anim {\r\n 0% {\r\n width: 0;\r\n }\r\n 100% {\r\n width: 100%;\r\n }\r\n}\r\n.strike-anim {\r\n position: relative;\r\n}\r\n.strike-anim::after {\r\n content: ' ';\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n width: 100%;\r\n height: 1px;\r\n background: var(--text-color);\r\n animation-name: strike-anim;\r\n animation-duration: 0.5s;\r\n animation-timing-function: linear;\r\n animation-iteration-count: 1;\r\n animation-fill-mode: forwards;\r\n} */\n\n#touchTrigger {\n pointer-events: none;\n}\n\n@media (min-width: 640px) {\n}\n\n@media (min-width: 768px) {\n}\n\n@media (min-width: 1024px) {\n}\n\n@media (min-width: 1280px) {\n}\n\n@media (min-width: 1536px) {\n}\r\n";
34
34
  styleInject(css_248z);
35
35
 
36
36
  const f=ref([]),v=ref(null),m=ref(null),g=ref(null),h=reactive({current:""}),y=[],b=ref(!1),k=readonly(f),w=readonly(v),M=readonly(m),q=readonly(g),x=readonly(h),$=(e=w.value)=>{h.current=e;const t=k.value.findIndex((t=>t.name===e)),n=k.value.map((e=>e.name));for(let a=0;a<n.length;a++){if(a>0&&a<n.length-1){const e=n[a]+"Minus",r=n[a]+"Plus";h[e]=t<=a,h[r]=t>=a;}h[n[a]]=n[a]===e;}},V=(e=M.value)=>{h.orientation=e,h.isLandscape="landscape"===e,h.isPortrait="portrait"===e;},O=(e=q.value||"light")=>{h.theme=e,h.isDark="dark"===e,h.isLight="light"===e;};function j(e,t){if("undefined"==typeof window||!window.matchMedia)return !1;if("undefined"!=typeof window&&!window.matchMedia)return console.error("Vue3 Mq: No MatchMedia support detected in this browser. Responsive breakpoints not available."),!1;{b.value=!0;const n=window.matchMedia(e),a=({matches:e})=>{e&&t();};y.push({mql:n,cb:a});n.addEventListener&&"function"==typeof n.addEventListener?n.addEventListener("change",a):n.addListener(a),a(n);}}var L=Object.freeze({__proto__:null,[Symbol.toStringTag]:"Module",bootstrap5:{xs:0,sm:576,md:768,lg:992,xl:1200,xxl:1400},bootstrap4:{xs:0,sm:576,md:768,lg:992,xl:1200},bootstrap3:{xs:0,sm:768,md:992,lg:1200},vuetify:{xs:0,sm:600,md:960,lg:1264,xl:1904},tailwind:{xs:0,sm:640,md:768,lg:1024,xl:1280,xxl:1536},devices:{phone:0,tablet:768,laptop:1370,desktop:1906}});const T=e=>{if(!e||"object"!=typeof e)return !1;const t=[];for(let n in e){const a=parseFloat(e[n]);n&&"string"==typeof n?/^[^a-z]/i.test(n)||/[^a-zA-Z0-9_]/.test(n)?console.warn(`Vue3 Mq: "${n}" is an invalid breakpoint key. Breakpoint keys must start with a letter and contain only alphanumeric characters and underscores. Skipping.`):!a&&0!==a||isNaN(a)||a<0?console.warn(`Vue3 Mq: "${n}: ${e[n]}" is not a valid breakpoint. Breakpoints should be a number of zero or above. Skipping.`):t.push({name:n,min:a}):console.warn(`Vue3 Mq: Invalid or missing breakpoint key (${JSON.stringify(n)}). Skipping.`);}t.some((e=>0===e.min))||console.warn("Vue3 Mq: You have not declared a breakpoint with a minimum value of 0. There may be screen sizes to which Vue3Mq does not respond.");return new Set(t.map((e=>e.min))).size<t.length&&console.warn("Vue3 Mq: Your breakpoint configuration contains duplicate values. Behaviour may be unpredictable."),0!==t.length&&t.sort(((e,t)=>e.min-t.min))};function R({breakpoints:e,preset:t}){const n=(e=>{if("string"==typeof e&&L[e])return L[e];{const t=Object.keys(L);return console.error(`Vue3 Mq: "${e}" is not a valid preset. Available options are: ${t.join(", ")}`),!1}})(t),a=T(e);if(!1===n&&!a)throw new TypeError("Vue3 Mq: You must provide a valid preset, or valid breakpoint settings.");var r;r=a||T(n),f.value=r,function(){for(;y.length>0;){const e=y.shift();if(e&&"object"==typeof e){const{mql:t,cb:n}=e;t.addEventListener&&"function"==typeof t.addEventListener?t.removeEventListener("change",n):t.removeListener(n);}}}(),(()=>{const e=Object.keys(h);for(let t of e)delete h[t];$(),V(),O();})();const o=k.value.reduce(((e,t,n,a)=>{const r=`(min-width: ${t.min}px)`,o=n<a.length-1?`(max-width: ${a[n+1].min-1}px)`:null,i=r+(o?" and "+o:"");return Object.assign(e,{[t.name]:i})}),{});for(const i in o){j(o[i],(()=>{$(i);}));}["portrait","landscape"].forEach((e=>{j(`(orientation: ${e})`,(()=>{V(e);}));})),["light","dark"].forEach((e=>{j(`(prefers-color-scheme: ${e})`,(()=>{O(e);}));}));}var N={install:(e,{preset:t="bootstrap5",breakpoints:n,defaultBreakpoint:a,defaultOrientation:r="landscape",defaultTheme:o}={})=>{try{const l=!1===["landscape","portrait"].includes(s=r)?(console.error(`Vue3 Mq: "${s}" is not a valid default orientation. Reverting to unset value.`),null):s,u=((e=null)=>!1===["dark","light"].includes(e)&&null!==e?(console.error(`Vue3 Mq: "${e}" is not a valid default theme. Reverting to unset value.`),null):e)(o);i=a,v.value=i,(e=>{m.value=e;})(l),(e=>{g.value=e;})(u),e.provide("mq",x),e.provide("updateBreakpoints",R),R({breakpoints:n,preset:t});}catch(l){console.error(l);}var i,s;}};
@@ -97,6 +97,8 @@ const defaultConfig = {
97
97
  timeOnScreen: 3,
98
98
  },
99
99
  hudStats: {},
100
+ items: {},
101
+ quests: {},
100
102
  };
101
103
 
102
104
  function parserError(ctx, line, text) {
@@ -123,6 +125,19 @@ function getSkillConfig(id) {
123
125
  error(`Skill config for skill ${id} doesn't exist`);
124
126
  }
125
127
  return skill;
128
+ }
129
+ function getItemConfig(id) {
130
+ const item = config.items[id];
131
+ if (!item) {
132
+ error(`Item config for skill ${id} doesn't exist`);
133
+ }
134
+ return item;
135
+ }
136
+ function getQuestConfig(questId) {
137
+ return config.quests[questId];
138
+ }
139
+ function getObjectiveConfig(quest, objectiveId) {
140
+ return getQuestConfig(quest).objectives[objectiveId];
126
141
  }
127
142
 
128
143
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
@@ -3417,6 +3432,9 @@ const useAudio = defineStore('audio', {
3417
3432
  loadSaveData(data) {
3418
3433
  this.currentMusic = data.currentMusic;
3419
3434
  },
3435
+ reset() {
3436
+ this.stopMusic();
3437
+ },
3420
3438
  },
3421
3439
  });
3422
3440
 
@@ -3566,6 +3584,9 @@ const useDialogStore = defineStore('dialog', {
3566
3584
  clearDialog() {
3567
3585
  this.dialog.splice(0, this.dialog.length);
3568
3586
  },
3587
+ reset() {
3588
+ this.dialog = [];
3589
+ },
3569
3590
  },
3570
3591
  });
3571
3592
 
@@ -3759,6 +3780,64 @@ const useNotifications = defineStore('notifications', {
3759
3780
  },
3760
3781
  });
3761
3782
 
3783
+ // create a pinia store named inventory with a state containing items and actions to add and delete items
3784
+ // create a pinia store named inventory with a state of type ItemState and actions to add and delete items. Adding items should increase the amount of any existing item that matches the id.
3785
+ const useInventory = defineStore('inventory', {
3786
+ state: () => ({
3787
+ items: {},
3788
+ }),
3789
+ actions: {
3790
+ generateSaveData() {
3791
+ return {
3792
+ items: this.items,
3793
+ };
3794
+ },
3795
+ loadSaveData(save) {
3796
+ this.items = { ...this.items, ...save.items };
3797
+ },
3798
+ setupItems(items) {
3799
+ Object.keys(items).forEach((key) => {
3800
+ this.items[key] = {
3801
+ amount: 0,
3802
+ id: key,
3803
+ };
3804
+ });
3805
+ },
3806
+ getExistingItem(id) {
3807
+ return this.items[id];
3808
+ },
3809
+ getItemAmount(id) {
3810
+ return this.getExistingItem(id)?.amount || 0;
3811
+ },
3812
+ add(item) {
3813
+ const existingItem = this.getExistingItem(item.id);
3814
+ if (existingItem) {
3815
+ existingItem.amount += item.amount;
3816
+ }
3817
+ else {
3818
+ this.items[item.id] = { ...item };
3819
+ }
3820
+ useNotifications().addNotification(`Received item: ${getItemConfig(item.id).name} x ${item.amount}`);
3821
+ },
3822
+ remove(item) {
3823
+ const existingItem = this.getExistingItem(item.id);
3824
+ if (existingItem) {
3825
+ existingItem.amount -= item.amount;
3826
+ useNotifications().addNotification(`Lost item: ${getItemConfig(item.id).name} x ${item.amount}`);
3827
+ if (existingItem.amount <= 0) {
3828
+ this.deleteItem(item.id);
3829
+ }
3830
+ }
3831
+ },
3832
+ deleteItem(id) {
3833
+ const existingItem = this.getExistingItem(id);
3834
+ if (existingItem) {
3835
+ this.items[id].amount = 0;
3836
+ }
3837
+ },
3838
+ },
3839
+ });
3840
+
3762
3841
  // Create a pinia store named skills with a state using the type Skills, with actions:
3763
3842
  // setupSkillCheck(skillCheck: SkillCheckState, id: string)
3764
3843
  // passSkillCheck(skillCheckId: string)
@@ -3846,6 +3925,101 @@ function getFile(url) {
3846
3925
  });
3847
3926
  }
3848
3927
 
3928
+ const everyObject = (object, predicate) => {
3929
+ for (const key in object) {
3930
+ if (!predicate(object[key])) {
3931
+ return false;
3932
+ }
3933
+ }
3934
+ return true;
3935
+ };
3936
+ const filterObject = (object, predicate) => {
3937
+ const result = {};
3938
+ for (const key in object) {
3939
+ if (predicate(object[key])) {
3940
+ result[key] = object[key];
3941
+ }
3942
+ }
3943
+ return result;
3944
+ };
3945
+
3946
+ const useQuests = defineStore('quests', {
3947
+ state: () => ({
3948
+ quests: {},
3949
+ }),
3950
+ actions: {
3951
+ getQuest(questId) {
3952
+ const quest = this.quests[questId];
3953
+ if (quest) {
3954
+ return quest;
3955
+ }
3956
+ error(`Quest ${questId} doesn't exist!`);
3957
+ },
3958
+ getObjective(quest, objectiveId) {
3959
+ const questObjective = this.getQuest(quest).objectives[objectiveId];
3960
+ if (questObjective) {
3961
+ return questObjective;
3962
+ }
3963
+ error(`Objective ${objectiveId} doesn't exist in quest ${quest}!`);
3964
+ },
3965
+ setupQuests(quests) {
3966
+ // iterate through quests to generate quest states to add to this.quests object
3967
+ for (const key of Object.keys(quests)) {
3968
+ const data = quests[key];
3969
+ this.quests[key] = {
3970
+ id: key,
3971
+ state: 'hidden',
3972
+ objectives: {},
3973
+ };
3974
+ // iterate through data.objectives to populate the objectives array of this.quests[key]
3975
+ for (const objectiveKey of Object.keys(data.objectives)) {
3976
+ const objective = data.objectives[objectiveKey];
3977
+ this.quests[key].objectives[objectiveKey] = {
3978
+ id: objectiveKey,
3979
+ state: objective.hidden ? 'hidden' : 'unlocked',
3980
+ };
3981
+ }
3982
+ }
3983
+ },
3984
+ startQuest(questId) {
3985
+ this.getQuest(questId).state = 'unlocked';
3986
+ useNotifications().addNotification(`Started quest: ${getQuestConfig(questId).title}`);
3987
+ },
3988
+ startObjective(questId, objectiveId) {
3989
+ this.getObjective(questId, objectiveId).state = 'unlocked';
3990
+ useNotifications().addNotification(`New quest objective: ${getObjectiveConfig(questId, objectiveId).description}`);
3991
+ },
3992
+ completeObjective(questId, objectiveId) {
3993
+ this.getObjective(questId, objectiveId).state = 'completed';
3994
+ useNotifications().addNotification(`Objective completed!`);
3995
+ },
3996
+ completeQuest(questId, ending) {
3997
+ this.getQuest(questId).state = 'completed';
3998
+ if (ending) {
3999
+ this.getQuest(questId).ending = ending;
4000
+ }
4001
+ useNotifications().addNotification(`Quest completed: ${getQuestConfig(questId).title}`);
4002
+ },
4003
+ isQuestCompleted(questId) {
4004
+ const quest = this.getQuest(questId);
4005
+ return everyObject(quest.objectives, (objective) => objective.state === 'completed');
4006
+ },
4007
+ removeQuest(id) {
4008
+ delete this.quests[id];
4009
+ },
4010
+ generateSaveData() {
4011
+ return {
4012
+ quests: {
4013
+ ...this.quests,
4014
+ },
4015
+ };
4016
+ },
4017
+ loadSaveData(data) {
4018
+ this.quests = data.quests;
4019
+ },
4020
+ },
4021
+ });
4022
+
3849
4023
  // Create a pinia store named screens with a state using the type ScreenState, with actions:
3850
4024
  // setScreen(screen: string): Sets the current screen to the given screen
3851
4025
  // setButtons(buttons: { [key: string]: ButtonConfig }): Adds buttons to the buttons state by using the values in the buttons config object
@@ -3913,10 +4087,13 @@ function getModifiableDataPinia() {
3913
4087
  const vm = useVM();
3914
4088
  const skills = useSkills();
3915
4089
  const screens = useScreens();
4090
+ const inventory = useInventory();
3916
4091
  return {
3917
4092
  data: vm.data,
3918
4093
  skills: skills.skills,
3919
4094
  buttons: screens.buttons,
4095
+ items: inventory.items,
4096
+ quests: useQuests().quests,
3920
4097
  };
3921
4098
  }
3922
4099
 
@@ -4424,11 +4601,16 @@ function runCondition(condition) {
4424
4601
  function conditionFunction(condition) {
4425
4602
  const skillStore = useSkills();
4426
4603
  const vm = useVM();
4604
+ const inventory = useInventory();
4427
4605
  const context = {
4428
4606
  data: vm.data,
4429
4607
  skills: skillStore.skills,
4430
4608
  skillChecks: skillStore.skillChecks,
4431
4609
  stats: useHud().hudStats,
4610
+ items: inventory.items,
4611
+ itemAmount: (id) => {
4612
+ return useInventory().getItemAmount(id);
4613
+ },
4432
4614
  roll: (checkId, skill, value) => {
4433
4615
  const skillCheckState = getSkillCheckState(checkId);
4434
4616
  if (skillCheckState) {
@@ -4633,6 +4815,10 @@ const useMain = defineStore('main', {
4633
4815
  skillsStore.setupSkills(config.skills);
4634
4816
  const hudStore = useHud();
4635
4817
  hudStore.setupHudStats(config.hudStats);
4818
+ const inventoryStore = useInventory();
4819
+ inventoryStore.setupItems(config.items);
4820
+ const questsStore = useQuests();
4821
+ questsStore.setupQuests(config.quests);
4636
4822
  },
4637
4823
  startMachine() {
4638
4824
  const vmStore = useVM();
@@ -4705,11 +4891,13 @@ const useMain = defineStore('main', {
4705
4891
  },
4706
4892
  reset() {
4707
4893
  this.ready = false;
4708
- this.playing = false;
4709
4894
  this.errors = [];
4710
- this.flowState = 'menu';
4711
4895
  this.modal = false;
4712
4896
  this.paused = false;
4897
+ useVM().reset();
4898
+ useAudio().reset();
4899
+ this.playing = false;
4900
+ this.ready = true;
4713
4901
  },
4714
4902
  generateSaveData() {
4715
4903
  return {
@@ -4727,6 +4915,7 @@ const useMain = defineStore('main', {
4727
4915
  const mainStore = useMain();
4728
4916
  const hudStore = useHud();
4729
4917
  const audioStore = useAudio();
4918
+ const inventoryStore = useInventory();
4730
4919
  const save = {
4731
4920
  version: '1.0.0',
4732
4921
  screen: screensStore.generateSaveData(),
@@ -4736,6 +4925,8 @@ const useMain = defineStore('main', {
4736
4925
  main: mainStore.generateSaveData(),
4737
4926
  hud: hudStore.generateSaveData(),
4738
4927
  audio: audioStore.generateSaveData(),
4928
+ inventory: inventoryStore.generateSaveData(),
4929
+ quests: useQuests().generateSaveData(),
4739
4930
  };
4740
4931
  localStorage.setItem(SAVE_FILE, JSON.stringify(save));
4741
4932
  },
@@ -4747,6 +4938,7 @@ const useMain = defineStore('main', {
4747
4938
  const mainStore = useMain();
4748
4939
  const hudStore = useHud();
4749
4940
  const audioStore = useAudio();
4941
+ const inventoryStore = useInventory();
4750
4942
  screensStore.loadSaveData(save.screen);
4751
4943
  skillsStore.loadSaveData(save.skills);
4752
4944
  dialogStore.loadSaveData(save.dialog);
@@ -4754,6 +4946,8 @@ const useMain = defineStore('main', {
4754
4946
  mainStore.loadSaveData(save.main);
4755
4947
  hudStore.loadSaveData(save.hud);
4756
4948
  audioStore.loadSaveData(save.audio);
4949
+ inventoryStore.loadSaveData(save.inventory);
4950
+ useQuests().loadSaveData(save.quests);
4757
4951
  },
4758
4952
  getAllStates() {
4759
4953
  return {
@@ -4766,6 +4960,8 @@ const useMain = defineStore('main', {
4766
4960
  audio: useAudio(),
4767
4961
  rendering: useRenderingStore(),
4768
4962
  notifications: useNotifications(),
4963
+ inventory: useInventory(),
4964
+ quests: useQuests(),
4769
4965
  };
4770
4966
  },
4771
4967
  overrideStates(override) {
@@ -7513,7 +7709,7 @@ function render$7(_ctx, _cache, $props, $setup, $data, $options) {
7513
7709
  class: "notification",
7514
7710
  key: id
7515
7711
  }, [
7516
- createElementVNode("h2", null, toDisplayString(notification.text), 1)
7712
+ createElementVNode("h3", null, toDisplayString(notification.text), 1)
7517
7713
  ]))
7518
7714
  }), 128))
7519
7715
  ]),
@@ -7521,7 +7717,7 @@ function render$7(_ctx, _cache, $props, $setup, $data, $options) {
7521
7717
  }))
7522
7718
  }
7523
7719
 
7524
- var css_248z$8 = ".notifications-holder {\n position: fixed;\n top: 0;\n left: 0;\n padding: 10px;\n display: flex;\n flex-direction: column-reverse;\n align-items: center;\n pointer-events: none;\n}\n\n.notification {\n margin-top: 10px;\n margin-bottom: 10px;\n border-radius: 10px;\n padding: 15px;\n background: var(--notifications-bg);\n width: 40vh;\n text-align: center;\n}\r\n";
7720
+ var css_248z$8 = ".notifications-holder {\n position: fixed;\n top: 0;\n right: 0;\n padding: 10px;\n display: flex;\n flex-direction: column-reverse;\n align-items: center;\n pointer-events: none;\n}\n\n.notification {\n margin-top: 10px;\n margin-bottom: 10px;\n border-radius: 10px;\n padding: 15px;\n background: var(--notifications-bg);\n width: 40vh;\n text-align: center;\n}\r\n";
7525
7721
  styleInject(css_248z$8);
7526
7722
 
7527
7723
  script$7.render = render$7;
@@ -7534,6 +7730,8 @@ function processText(text) {
7534
7730
  const searchableState = {
7535
7731
  data: vmStore.data,
7536
7732
  skills: skillStore.skills,
7733
+ items: useInventory().items,
7734
+ quests: useQuests().quests,
7537
7735
  };
7538
7736
  const [obj, newKey] = findDataHelper(searchableState, key);
7539
7737
  return obj[newKey];
@@ -7673,6 +7871,12 @@ var script$8 = defineComponent({
7673
7871
  openSkills() {
7674
7872
  useMain().openModal('skills');
7675
7873
  },
7874
+ openInventory() {
7875
+ useMain().openModal('inventory');
7876
+ },
7877
+ openQuests() {
7878
+ useMain().openModal('quests');
7879
+ },
7676
7880
  closeMenu() {
7677
7881
  useMain().closeModal();
7678
7882
  },
@@ -7687,6 +7891,18 @@ var script$8 = defineComponent({
7687
7891
  }
7688
7892
  return false;
7689
7893
  },
7894
+ showInventory() {
7895
+ if (Object.entries(getConfig().items).length > 0) {
7896
+ return true;
7897
+ }
7898
+ return false;
7899
+ },
7900
+ showQuests() {
7901
+ if (Object.entries(getConfig().quests).length > 0) {
7902
+ return true;
7903
+ }
7904
+ return false;
7905
+ },
7690
7906
  },
7691
7907
  });
7692
7908
 
@@ -7706,6 +7922,22 @@ function render$8(_ctx, _cache, $props, $setup, $data, $options) {
7706
7922
  id: "skills-menu-button",
7707
7923
  onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.openSkills && _ctx.openSkills(...args)))
7708
7924
  }, " Skills "))
7925
+ : createCommentVNode("", true),
7926
+ (_ctx.showInventory)
7927
+ ? (openBlock(), createElementBlock("button", {
7928
+ key: 1,
7929
+ class: "button menu-toggle-button",
7930
+ id: "inventory-menu-button",
7931
+ onClick: _cache[2] || (_cache[2] = (...args) => (_ctx.openInventory && _ctx.openInventory(...args)))
7932
+ }, " Items "))
7933
+ : createCommentVNode("", true),
7934
+ (_ctx.showQuests)
7935
+ ? (openBlock(), createElementBlock("button", {
7936
+ key: 2,
7937
+ class: "button menu-toggle-button",
7938
+ id: "quests-menu-button",
7939
+ onClick: _cache[3] || (_cache[3] = (...args) => (_ctx.openQuests && _ctx.openQuests(...args)))
7940
+ }, " Quests "))
7709
7941
  : createCommentVNode("", true)
7710
7942
  ]))
7711
7943
  }
@@ -7929,11 +8161,284 @@ styleInject(css_248z$b);
7929
8161
  script$a.render = render$a;
7930
8162
 
7931
8163
  var script$b = defineComponent({
8164
+ setup() {
8165
+ const store = useInventory();
8166
+ const items = computed(() => store.items);
8167
+ return { items };
8168
+ },
8169
+ components: {
8170
+ Modal: script$2,
8171
+ },
8172
+ props: {
8173
+ close: (() => { }),
8174
+ },
8175
+ data() {
8176
+ return {
8177
+ chosenId: false,
8178
+ };
8179
+ },
8180
+ mounted() { },
8181
+ methods: {
8182
+ getItemStyle(item) {
8183
+ return {
8184
+ backgroundImage: `url(${this.itemConf[item].icon})`,
8185
+ };
8186
+ },
8187
+ getItemName(item) {
8188
+ return this.itemConf[item].name;
8189
+ },
8190
+ clickItem(item) {
8191
+ this.chosenId = item;
8192
+ },
8193
+ closeItem() {
8194
+ this.chosenId = false;
8195
+ },
8196
+ },
8197
+ computed: {
8198
+ itemsToDisplay() {
8199
+ const items = {};
8200
+ for (const key in this.items) {
8201
+ if (this.items[key].amount > 0) {
8202
+ items[key] = this.items[key];
8203
+ }
8204
+ }
8205
+ return items;
8206
+ },
8207
+ chosenItem() {
8208
+ if (this.chosenId) {
8209
+ return this.items[this.chosenId];
8210
+ }
8211
+ return null;
8212
+ },
8213
+ chosenItemConf() {
8214
+ if (this.chosenId) {
8215
+ return this.itemConf[this.chosenId];
8216
+ }
8217
+ return null;
8218
+ },
8219
+ itemConf() {
8220
+ return getConfig().items;
8221
+ },
8222
+ },
8223
+ });
8224
+
8225
+ const _hoisted_1$a = /*#__PURE__*/createElementVNode("h3", { class: "title" }, "Inventory", -1);
8226
+ const _hoisted_2$8 = { class: "menu-content" };
8227
+ const _hoisted_3$5 = {
8228
+ key: 0,
8229
+ class: "inventory-container"
8230
+ };
8231
+ const _hoisted_4$4 = ["onClick"];
8232
+ const _hoisted_5$4 = { class: "item-title" };
8233
+ const _hoisted_6$4 = { class: "item-amount" };
8234
+ const _hoisted_7$3 = {
8235
+ key: 1,
8236
+ class: "flex flex-row item-description-container"
8237
+ };
8238
+ const _hoisted_8$2 = { class: "flex item-left" };
8239
+ const _hoisted_9$2 = { class: "flex item-right" };
8240
+ const _hoisted_10$2 = /*#__PURE__*/createElementVNode("hr", { class: "hr-solid" }, null, -1);
8241
+ const _hoisted_11$2 = { key: 2 };
8242
+ const _hoisted_12$2 = /*#__PURE__*/createElementVNode("h2", null, "The inventory is empty!", -1);
8243
+ const _hoisted_13$1 = [
8244
+ _hoisted_12$2
8245
+ ];
8246
+
8247
+ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8248
+ const _component_modal = resolveComponent("modal");
8249
+
8250
+ return (openBlock(), createBlock(_component_modal, {
8251
+ class: "menu",
8252
+ onClose: _ctx.close,
8253
+ containerCssClass: "inventory-modal"
8254
+ }, {
8255
+ header: withCtx(() => [
8256
+ _hoisted_1$a
8257
+ ]),
8258
+ body: withCtx(() => [
8259
+ createElementVNode("div", _hoisted_2$8, [
8260
+ (!_ctx.chosenItem && Object.keys(_ctx.itemsToDisplay).length > 0)
8261
+ ? (openBlock(), createElementBlock("div", _hoisted_3$5, [
8262
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.itemsToDisplay, (item) => {
8263
+ return (openBlock(), createElementBlock("button", {
8264
+ onClick: () => _ctx.clickItem(item.id),
8265
+ class: "item-display",
8266
+ style: normalizeStyle(_ctx.getItemStyle(item.id)),
8267
+ key: item.id
8268
+ }, [
8269
+ createElementVNode("h3", _hoisted_5$4, toDisplayString(_ctx.getItemName(item.id)), 1),
8270
+ createElementVNode("h3", _hoisted_6$4, toDisplayString(item.amount), 1)
8271
+ ], 12, _hoisted_4$4))
8272
+ }), 128))
8273
+ ]))
8274
+ : (typeof _ctx.chosenId === 'string')
8275
+ ? (openBlock(), createElementBlock("div", _hoisted_7$3, [
8276
+ createElementVNode("div", _hoisted_8$2, [
8277
+ createElementVNode("button", {
8278
+ class: "button",
8279
+ onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.closeItem && _ctx.closeItem(...args)))
8280
+ }, "Back"),
8281
+ createElementVNode("div", {
8282
+ class: "item-display",
8283
+ style: normalizeStyle(_ctx.getItemStyle(_ctx.chosenId))
8284
+ }, null, 4)
8285
+ ]),
8286
+ createElementVNode("div", _hoisted_9$2, [
8287
+ createElementVNode("h2", null, toDisplayString(_ctx.getItemName(_ctx.chosenId)), 1),
8288
+ _hoisted_10$2,
8289
+ createElementVNode("h3", null, "Amount: " + toDisplayString(_ctx.chosenItem.amount), 1),
8290
+ createElementVNode("p", null, toDisplayString(_ctx.chosenItemConf.description), 1)
8291
+ ])
8292
+ ]))
8293
+ : (openBlock(), createElementBlock("div", _hoisted_11$2, _hoisted_13$1))
8294
+ ])
8295
+ ]),
8296
+ _: 1
8297
+ }, 8, ["onClose"]))
8298
+ }
8299
+
8300
+ var css_248z$c = ".inventory-modal {\n width: 800px;\n min-height: 50%;\n}\n\n.inventory-container {\n display: grid;\n grid-auto-rows: auto;\n grid-template-columns: repeat(3, 1fr);\n grid-gap: 20px 20px;\n}\n\n.item-display {\n width: 200px;\n height: 300px;\n position: relative;\n background-repeat: no-repeat;\n background-size: contain;\n}\n\n.item-title {\n position: absolute;\n bottom: 0px;\n text-align: center;\n width: 100%;\n color: var(--inventory-text-color);\n background: var(--inventory-text-background);\n}\n\n.item-amount {\n position: absolute;\n top: 0;\n right: 0;\n font-weight: 700;\n font-size: 25px;\n color: var(--inventory-amount-color);\n width: 40px;\n height: 40px;\n background-color: var(--inventory-amount-background);\n}\n\n.item-description-container {\n justify-content: space-between;\n align-items: center;\n}\n\n.item-left {\n flex-direction: column;\n}\n\n.item-right {\n flex-direction: column;\n align-items: baseline;\n}\r\n";
8301
+ styleInject(css_248z$c);
8302
+
8303
+ script$b.render = render$b;
8304
+
8305
+ var script$c = defineComponent({
8306
+ setup() {
8307
+ const questsStore = useQuests();
8308
+ const quests = computed(() => questsStore.quests);
8309
+ return { quests };
8310
+ },
8311
+ computed: {
8312
+ questsToDisplay() {
8313
+ return filterObject(this.quests, (quest) => quest.state !== 'hidden');
8314
+ },
8315
+ },
8316
+ props: {
8317
+ close: (() => { }),
8318
+ },
8319
+ methods: {
8320
+ getQuestData(questId) {
8321
+ return getQuestConfig(questId);
8322
+ },
8323
+ getObjectiveData(questId, objectiveId) {
8324
+ return getObjectiveConfig(questId, objectiveId);
8325
+ },
8326
+ getDisplayTextForQuestState(quest) {
8327
+ switch (quest.state) {
8328
+ case 'hidden':
8329
+ return ' Hidden';
8330
+ case 'unlocked':
8331
+ return '';
8332
+ case 'completed':
8333
+ return ' (Completed)';
8334
+ default:
8335
+ return ' Unknown';
8336
+ }
8337
+ },
8338
+ getQuestDescription(quest) {
8339
+ if (quest.ending) {
8340
+ return quest.ending;
8341
+ }
8342
+ return this.getQuestData(quest.id).description;
8343
+ },
8344
+ getAvailableObjectives(quest) {
8345
+ return filterObject(quest.objectives, (objective) => {
8346
+ return objective.state !== 'hidden';
8347
+ });
8348
+ },
8349
+ },
8350
+ components: {
8351
+ Modal: script$2,
8352
+ VolumeControls: script$4,
8353
+ },
8354
+ });
8355
+
8356
+ const _hoisted_1$b = /*#__PURE__*/createElementVNode("h3", { class: "title" }, "Quests", -1);
8357
+ const _hoisted_2$9 = {
8358
+ key: 0,
8359
+ class: "quests-container"
8360
+ };
8361
+ const _hoisted_3$6 = { class: "quest-title" };
8362
+ const _hoisted_4$5 = { class: "quest-description" };
8363
+ const _hoisted_5$5 = {
8364
+ key: 0,
8365
+ class: "quest-objectives-container list-disc"
8366
+ };
8367
+ const _hoisted_6$5 = {
8368
+ key: 1,
8369
+ class: "menu-container"
8370
+ };
8371
+ const _hoisted_7$4 = /*#__PURE__*/createElementVNode("h2", { class: "title" }, "There are no quests!", -1);
8372
+ const _hoisted_8$3 = [
8373
+ _hoisted_7$4
8374
+ ];
8375
+
8376
+ function render$c(_ctx, _cache, $props, $setup, $data, $options) {
8377
+ const _component_modal = resolveComponent("modal");
8378
+
8379
+ return (openBlock(), createBlock(_component_modal, {
8380
+ class: "quests",
8381
+ onClose: _ctx.close,
8382
+ containerCssClass: "quests-modal"
8383
+ }, {
8384
+ header: withCtx(() => [
8385
+ _hoisted_1$b
8386
+ ]),
8387
+ body: withCtx(() => [
8388
+ (Object.keys(_ctx.questsToDisplay).length > 0)
8389
+ ? (openBlock(), createElementBlock("div", _hoisted_2$9, [
8390
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.questsToDisplay, (quest) => {
8391
+ return (openBlock(), createElementBlock("div", {
8392
+ class: "quest-display",
8393
+ key: quest.id
8394
+ }, [
8395
+ createElementVNode("div", {
8396
+ class: normalizeClass(["quest-header",
8397
+ quest.state === 'completed'
8398
+ ? 'quest-completed'
8399
+ : 'quest-in-progress'
8400
+ ])
8401
+ }, [
8402
+ createElementVNode("h3", _hoisted_3$6, toDisplayString(_ctx.getQuestData(quest.id).title) + " " + toDisplayString(_ctx.getDisplayTextForQuestState(quest)), 1)
8403
+ ], 2),
8404
+ createElementVNode("p", _hoisted_4$5, toDisplayString(_ctx.getQuestDescription(quest)), 1),
8405
+ (quest.state !== 'completed')
8406
+ ? (openBlock(), createElementBlock("ul", _hoisted_5$5, [
8407
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.getAvailableObjectives(quest), (objective) => {
8408
+ return (openBlock(), createElementBlock("li", {
8409
+ class: "quest-objective-display",
8410
+ key: objective.id
8411
+ }, [
8412
+ createElementVNode("p", {
8413
+ class: normalizeClass(["quest-objective-description",
8414
+ objective.state === 'completed'
8415
+ ? 'quest-objective-completed'
8416
+ : 'quest-objctive-in-progress'
8417
+ ])
8418
+ }, toDisplayString(_ctx.getObjectiveData(quest.id, objective.id).description), 3)
8419
+ ]))
8420
+ }), 128))
8421
+ ]))
8422
+ : createCommentVNode("", true)
8423
+ ]))
8424
+ }), 128))
8425
+ ]))
8426
+ : (openBlock(), createElementBlock("div", _hoisted_6$5, _hoisted_8$3))
8427
+ ]),
8428
+ _: 1
8429
+ }, 8, ["onClose"]))
8430
+ }
8431
+
8432
+ var css_248z$d = "/* Write CSS for this vue component */\n\n.quests-modal {\n width: 100%;\n min-height: 50%;\n}\n\n/* CSS for .quest-header with row flex */\n\n.quest-header {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.quest-display {\n}\n\n.quest-title {\n font-size: 1.5rem;\n font-weight: bold;\n margin-bottom: 0.5rem;\n}\n\n.quest-completed {\n color: var(--completed-quest-title-color);\n}\n\n.quest-in-progress {\n color: var(--quest-title-color);\n}\n\n.quest-state {\n font-size: 1.25rem;\n font-weight: bold;\n margin-bottom: 0.5rem;\n}\n\n.quest-description {\n font-size: 1.1rem;\n text-align: justify;\n font-style: italic;\n margin-bottom: 0.5rem;\n}\n\n.quest-objectives-container {\n margin-left: 10px;\n}\n\n.quest-objective-completed {\n color: var(--objective-completed-color);\n text-decoration: line-through;\n}\n\n.quest-objective-in-progress {\n color: var(--objective-in-progress-color);\n}\n\n.quest-objective-description {\n font-size: 1rem;\n margin-bottom: 0.5rem;\n}\r\n";
8433
+ styleInject(css_248z$d);
8434
+
8435
+ script$c.render = render$c;
8436
+
8437
+ var script$d = defineComponent({
7932
8438
  setup() {
7933
8439
  const dialogStore = useDialogStore();
7934
8440
  const vmStore = useVM();
7935
8441
  const mainStore = useMain();
7936
- const renderingStore = useRenderingStore();
7937
8442
  return {
7938
8443
  dialog: computed(() => dialogStore.dialog),
7939
8444
  stack: computed(() => vmStore.stack),
@@ -7955,6 +8460,8 @@ var script$b = defineComponent({
7955
8460
  Menu: script$8,
7956
8461
  MainMenu: script$9,
7957
8462
  Skills: script$a,
8463
+ Inventory: script$b,
8464
+ Quests: script$c,
7958
8465
  },
7959
8466
  data() {
7960
8467
  return {
@@ -8222,22 +8729,24 @@ var script$b = defineComponent({
8222
8729
  },
8223
8730
  });
8224
8731
 
8225
- const _hoisted_1$a = ["width", "height"];
8226
- const _hoisted_2$8 = /*#__PURE__*/createElementVNode("div", { class: "anchor" }, null, -1);
8227
- const _hoisted_3$5 = {
8732
+ const _hoisted_1$c = ["width", "height"];
8733
+ const _hoisted_2$a = /*#__PURE__*/createElementVNode("div", { class: "anchor" }, null, -1);
8734
+ const _hoisted_3$7 = {
8228
8735
  key: 2,
8229
8736
  class: "flex flex-col",
8230
8737
  style: {"height":"100%","padding":"20px"}
8231
8738
  };
8232
- const _hoisted_4$4 = { id: "game-title-container" };
8233
- const _hoisted_5$4 = { id: "game-title-text" };
8234
- const _hoisted_6$4 = { class: "flex flex-col" };
8235
- const _hoisted_7$3 = { key: 3 };
8739
+ const _hoisted_4$6 = { id: "game-title-container" };
8740
+ const _hoisted_5$6 = { id: "game-title-text" };
8741
+ const _hoisted_6$6 = { class: "flex flex-col" };
8742
+ const _hoisted_7$5 = { key: 3 };
8236
8743
 
8237
- function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8744
+ function render$d(_ctx, _cache, $props, $setup, $data, $options) {
8238
8745
  const _component_Hud = resolveComponent("Hud");
8239
8746
  const _component_Menu = resolveComponent("Menu");
8240
8747
  const _component_Skills = resolveComponent("Skills");
8748
+ const _component_Inventory = resolveComponent("Inventory");
8749
+ const _component_Quests = resolveComponent("Quests");
8241
8750
  const _component_MainMenu = resolveComponent("MainMenu");
8242
8751
  const _component_DialogPicture = resolveComponent("DialogPicture");
8243
8752
  const _component_DialogBox = resolveComponent("DialogBox");
@@ -8265,9 +8774,21 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8265
8774
  onClose: _ctx.closeModal
8266
8775
  }, null, 8, ["onClose"]))
8267
8776
  : createCommentVNode("", true),
8777
+ (_ctx.modal === 'inventory')
8778
+ ? (openBlock(), createBlock(_component_Inventory, {
8779
+ key: 1,
8780
+ onClose: _ctx.closeModal
8781
+ }, null, 8, ["onClose"]))
8782
+ : createCommentVNode("", true),
8783
+ (_ctx.modal === 'quests')
8784
+ ? (openBlock(), createBlock(_component_Quests, {
8785
+ key: 2,
8786
+ onClose: _ctx.closeModal
8787
+ }, null, 8, ["onClose"]))
8788
+ : createCommentVNode("", true),
8268
8789
  (_ctx.modal === 'menu')
8269
8790
  ? (openBlock(), createBlock(_component_MainMenu, {
8270
- key: 1,
8791
+ key: 3,
8271
8792
  onClose: _ctx.closeModal
8272
8793
  }, null, 8, ["onClose"]))
8273
8794
  : createCommentVNode("", true),
@@ -8284,7 +8805,7 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8284
8805
  }),
8285
8806
  (_ctx.inGame)
8286
8807
  ? (openBlock(), createElementBlock("div", {
8287
- key: 2,
8808
+ key: 4,
8288
8809
  class: "background",
8289
8810
  style: normalizeStyle(_ctx.backgroundStyle)
8290
8811
  }, [
@@ -8293,12 +8814,12 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8293
8814
  height: _ctx.layoutHeight,
8294
8815
  id: "background-canvas",
8295
8816
  class: "narrat-canvas"
8296
- }, null, 8, _hoisted_1$a)
8817
+ }, null, 8, _hoisted_1$c)
8297
8818
  ], 4))
8298
8819
  : createCommentVNode("", true),
8299
8820
  (_ctx.inGame)
8300
8821
  ? (openBlock(), createElementBlock("div", {
8301
- key: 3,
8822
+ key: 5,
8302
8823
  class: "dialog override",
8303
8824
  ref: "dialog",
8304
8825
  style: normalizeStyle(_ctx.dialogStyle)
@@ -8320,16 +8841,16 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8320
8841
  ]),
8321
8842
  _: 1
8322
8843
  }, 8, ["style"]),
8323
- _hoisted_2$8
8844
+ _hoisted_2$a
8324
8845
  ], 4))
8325
8846
  : createCommentVNode("", true)
8326
8847
  ], 4))
8327
8848
  : (_ctx.gameLoaded)
8328
- ? (openBlock(), createElementBlock("div", _hoisted_3$5, [
8329
- createElementVNode("div", _hoisted_4$4, [
8330
- createElementVNode("h1", _hoisted_5$4, toDisplayString(_ctx.gameTitle), 1)
8849
+ ? (openBlock(), createElementBlock("div", _hoisted_3$7, [
8850
+ createElementVNode("div", _hoisted_4$6, [
8851
+ createElementVNode("h1", _hoisted_5$6, toDisplayString(_ctx.gameTitle), 1)
8331
8852
  ]),
8332
- createElementVNode("div", _hoisted_6$4, [
8853
+ createElementVNode("div", _hoisted_6$6, [
8333
8854
  createElementVNode("button", {
8334
8855
  class: "button menu-button start-button override",
8335
8856
  onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.startGame && _ctx.startGame(...args)))
@@ -8343,7 +8864,7 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8343
8864
  : createCommentVNode("", true)
8344
8865
  ])
8345
8866
  ]))
8346
- : (openBlock(), createElementBlock("div", _hoisted_7$3, [
8867
+ : (openBlock(), createElementBlock("div", _hoisted_7$5, [
8347
8868
  createVNode(_component_LoadingBar, {
8348
8869
  percentage: _ctx.loadingPercentage,
8349
8870
  step: _ctx.loadingStep
@@ -8356,10 +8877,10 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8356
8877
  ], 4))
8357
8878
  }
8358
8879
 
8359
- var css_248z$c = "#app {\n background-color: var(--bg-color);\n width: 100%;\n height: 100%;\n position: absolute;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n color: var(--text-color);\n box-sizing: border-box;\n overflow: hidden;\n transform-origin: center center;\n}\n\n.game {\n background-color: var(--bg-color);\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n.interact-button {\n height: 50px;\n border: 1px solid black;\n font-weight: bold;\n font-size: 20px;\n text-align: center;\n flex-grow: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n}\n\n.interact-button:not(:last-child) {\n margin-right: 10px;\n}\n\n.dialog-container {\n flex-shrink: 2;\n /* padding: 20px; */\n min-height: 100%;\n width: 100%;\n background-color: (var(--bg-color));\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: center;\n overflow-x: hidden;\n}\n\n.dialog {\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n}\n\n.dialog::-webkit-scrollbar {\n display: none; /* webkit */\n}\n\n.dialog * {\n overflow-anchor: none;\n}\n\n.background {\n margin: 0;\n}\n\n#background-canvas {\n height: 100%;\n}\n\n.anchor {\n overflow-anchor: auto;\n height: 1px;\n}\n\n.menu-toggle {\n position: fixed;\n bottom: 0px;\n right: 15%;\n z-index: 2;\n}\n\n#game-title-container {\n margin-bottom: 50px;\n}\n\n#game-title-text {\n text-align: center;\n font-size: 50px;\n}\n\n.menu-button {\n font-size: 25px;\n}\r\n";
8360
- styleInject(css_248z$c);
8880
+ var css_248z$e = "#app {\n background-color: var(--bg-color);\n width: 100%;\n height: 100%;\n position: absolute;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n color: var(--text-color);\n box-sizing: border-box;\n overflow: hidden;\n transform-origin: center center;\n}\n\n.game {\n background-color: var(--bg-color);\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n.interact-button {\n height: 50px;\n border: 1px solid black;\n font-weight: bold;\n font-size: 20px;\n text-align: center;\n flex-grow: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n}\n\n.interact-button:not(:last-child) {\n margin-right: 10px;\n}\n\n.dialog-container {\n flex-shrink: 2;\n /* padding: 20px; */\n min-height: 100%;\n width: 100%;\n background-color: (var(--bg-color));\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: center;\n overflow-x: hidden;\n}\n\n.dialog {\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n}\n\n.dialog::-webkit-scrollbar {\n display: none; /* webkit */\n}\n\n.dialog * {\n overflow-anchor: none;\n}\n\n.background {\n margin: 0;\n}\n\n#background-canvas {\n height: 100%;\n}\n\n.anchor {\n overflow-anchor: auto;\n height: 1px;\n}\n\n.menu-toggle {\n position: fixed;\n bottom: 0px;\n right: 15%;\n z-index: 2;\n}\n\n#game-title-container {\n margin-bottom: 50px;\n}\n\n#game-title-text {\n text-align: center;\n font-size: 50px;\n}\n\n.menu-button {\n font-size: 25px;\n}\r\n";
8881
+ styleInject(css_248z$e);
8361
8882
 
8362
- script$b.render = render$b;
8883
+ script$d.render = render$d;
8363
8884
 
8364
8885
  let canvas;
8365
8886
  let ctx;
@@ -8859,7 +9380,67 @@ const waitParser = (ctx) => {
8859
9380
  };
8860
9381
  const waitCommand = new CommandPlugin('wait', wait, waitParser);
8861
9382
 
9383
+ // Write a CommandPlugin for adding items to the inventory store
9384
+ const addItemPlugin = new CommandPlugin('add_item', async (cmd) => {
9385
+ const id = cmd.args[0];
9386
+ const amount = cmd.args[1];
9387
+ const inventory = useInventory();
9388
+ inventory.add({
9389
+ id,
9390
+ amount,
9391
+ });
9392
+ return useVM().nextLine();
9393
+ }, generateParser('add_item'));
9394
+
9395
+ // Write a CommandPlugin for removeing items to the inventory store
9396
+ const removeItemPlugin = new CommandPlugin('remove_item', async (cmd) => {
9397
+ const id = cmd.args[0];
9398
+ const amount = cmd.args[1];
9399
+ const inventory = useInventory();
9400
+ inventory.remove({
9401
+ id,
9402
+ amount,
9403
+ });
9404
+ return useVM().nextLine();
9405
+ }, generateParser('remove_item'));
9406
+
9407
+ // Write a CommandPlugin for starting a quest with the useQuests quests store
9408
+ const startQuestPlugin = new CommandPlugin('start_quest', async (cmd) => {
9409
+ const questId = cmd.args[0];
9410
+ const quests = useQuests();
9411
+ quests.startQuest(questId);
9412
+ return useVM().nextLine();
9413
+ }, generateParser('start_quest'));
9414
+ // Write a CommandPlugin for starting a quest objective with the cmd having arguments questId and objectiveId, using the useQuests store's startObjective method
9415
+ const startObjectivePlugin = new CommandPlugin('start_objective', async (cmd) => {
9416
+ const questId = cmd.args[0];
9417
+ const objectiveId = cmd.args[1];
9418
+ const quests = useQuests();
9419
+ quests.startObjective(questId, objectiveId);
9420
+ return useVM().nextLine();
9421
+ }, generateParser('start_objective'));
9422
+ // Write a CommandPlugin for completing a quest objective with the cmd having arguments questId and objectiveId, using the useQuests store's completeObjective method
9423
+ const completeObjectivePlugin = new CommandPlugin('complete_objective', async (cmd) => {
9424
+ const questId = cmd.args[0];
9425
+ const objectiveId = cmd.args[1];
9426
+ const quests = useQuests();
9427
+ quests.completeObjective(questId, objectiveId);
9428
+ return useVM().nextLine();
9429
+ }, generateParser('complete_objective'));
9430
+ // Write a CommandPlugin for completing a quest with the cmd having arguments questId, using the useQuests store's completeQuest method
9431
+ const completeQuestPlugin = new CommandPlugin('complete_quest', async (cmd) => {
9432
+ const questId = cmd.args[0];
9433
+ let ending;
9434
+ if (cmd.args.length > 1) {
9435
+ ending = cmd.args[1];
9436
+ }
9437
+ const quests = useQuests();
9438
+ quests.completeQuest(questId, ending);
9439
+ return useVM().nextLine();
9440
+ }, generateParser('complete_quest'));
9441
+
8862
9442
  function registerBaseCommands(vm) {
9443
+ vm.addCommand(addItemPlugin);
8863
9444
  vm.addCommand(addLevelPlugin);
8864
9445
  vm.addCommand(addStatPlugin);
8865
9446
  vm.addCommand(addXpPlugin);
@@ -8871,6 +9452,7 @@ function registerBaseCommands(vm) {
8871
9452
  vm.addCommand(notifyPlugin);
8872
9453
  vm.addCommand(pauseCommand);
8873
9454
  vm.addCommand(playCommand);
9455
+ vm.addCommand(removeItemPlugin);
8874
9456
  vm.addCommand(setButtonCommand);
8875
9457
  vm.addCommand(setScreenCommand);
8876
9458
  vm.addCommand(setStatCommand);
@@ -8879,6 +9461,11 @@ function registerBaseCommands(vm) {
8879
9461
  vm.addCommand(talkCommand);
8880
9462
  vm.addCommand(textCommandPlugin);
8881
9463
  vm.addCommand(waitCommand);
9464
+ // Quests
9465
+ vm.addCommand(startQuestPlugin);
9466
+ vm.addCommand(startObjectivePlugin);
9467
+ vm.addCommand(completeObjectivePlugin);
9468
+ vm.addCommand(completeQuestPlugin);
8882
9469
  }
8883
9470
 
8884
9471
  class NarratPlugin {
@@ -8904,7 +9491,7 @@ vm.callHook('onPageLoaded');
8904
9491
  async function startApp(config, options) {
8905
9492
  const configFile = await getFile('data/config.json');
8906
9493
  setConfig(JSON.parse(configFile));
8907
- app = createApp(script$b, {
9494
+ app = createApp(script$d, {
8908
9495
  config,
8909
9496
  options,
8910
9497
  });
@@ -8921,7 +9508,7 @@ async function startApp(config, options) {
8921
9508
  });
8922
9509
  registerBaseCommands(vm);
8923
9510
  logManager.setupDebugger(options.debug);
8924
- console.log('%c Narrat game engine – 1.0.0 - June 24, 2022 23:38:57', 'background: #222; color: #bada55');
9511
+ console.log('%c Narrat game engine – 1.2.1 - June 25, 2022 14:20:12', 'background: #222; color: #bada55');
8925
9512
  vm.callHook('onNarratSetup');
8926
9513
  app.mount('#game-holder');
8927
9514
  if (options.debug) {
@@ -8945,5 +9532,5 @@ async function startApp(config, options) {
8945
9532
  startGameLoop();
8946
9533
  }
8947
9534
 
8948
- export { CommandPlugin, NarratPlugin, addCommand, aspectRatioFit, generateParser, getConfig, getSkillConfig, registerPlugin, setConfig, startApp };
9535
+ export { CommandPlugin, NarratPlugin, addCommand, aspectRatioFit, generateParser, getConfig, getItemConfig, getObjectiveConfig, getQuestConfig, getSkillConfig, registerPlugin, setConfig, startApp };
8949
9536
  //# sourceMappingURL=index.esm.js.map