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.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
  'use strict';
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
@@ -34,7 +34,7 @@ function styleInject(css, ref) {
34
34
  }
35
35
  }
36
36
 
37
- 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";
37
+ 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";
38
38
  styleInject(css_248z);
39
39
 
40
40
  const f=vue.ref([]),v=vue.ref(null),m=vue.ref(null),g=vue.ref(null),h=vue.reactive({current:""}),y=[],b=vue.ref(!1),k=vue.readonly(f),w=vue.readonly(v),M=vue.readonly(m),q=vue.readonly(g),x=vue.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;}};
@@ -101,6 +101,8 @@ const defaultConfig = {
101
101
  timeOnScreen: 3,
102
102
  },
103
103
  hudStats: {},
104
+ items: {},
105
+ quests: {},
104
106
  };
105
107
 
106
108
  function parserError(ctx, line, text) {
@@ -127,6 +129,19 @@ function getSkillConfig(id) {
127
129
  error(`Skill config for skill ${id} doesn't exist`);
128
130
  }
129
131
  return skill;
132
+ }
133
+ function getItemConfig(id) {
134
+ const item = config.items[id];
135
+ if (!item) {
136
+ error(`Item config for skill ${id} doesn't exist`);
137
+ }
138
+ return item;
139
+ }
140
+ function getQuestConfig(questId) {
141
+ return config.quests[questId];
142
+ }
143
+ function getObjectiveConfig(quest, objectiveId) {
144
+ return getQuestConfig(quest).objectives[objectiveId];
130
145
  }
131
146
 
132
147
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
@@ -3421,6 +3436,9 @@ const useAudio = pinia.defineStore('audio', {
3421
3436
  loadSaveData(data) {
3422
3437
  this.currentMusic = data.currentMusic;
3423
3438
  },
3439
+ reset() {
3440
+ this.stopMusic();
3441
+ },
3424
3442
  },
3425
3443
  });
3426
3444
 
@@ -3570,6 +3588,9 @@ const useDialogStore = pinia.defineStore('dialog', {
3570
3588
  clearDialog() {
3571
3589
  this.dialog.splice(0, this.dialog.length);
3572
3590
  },
3591
+ reset() {
3592
+ this.dialog = [];
3593
+ },
3573
3594
  },
3574
3595
  });
3575
3596
 
@@ -3763,6 +3784,64 @@ const useNotifications = pinia.defineStore('notifications', {
3763
3784
  },
3764
3785
  });
3765
3786
 
3787
+ // create a pinia store named inventory with a state containing items and actions to add and delete items
3788
+ // 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.
3789
+ const useInventory = pinia.defineStore('inventory', {
3790
+ state: () => ({
3791
+ items: {},
3792
+ }),
3793
+ actions: {
3794
+ generateSaveData() {
3795
+ return {
3796
+ items: this.items,
3797
+ };
3798
+ },
3799
+ loadSaveData(save) {
3800
+ this.items = { ...this.items, ...save.items };
3801
+ },
3802
+ setupItems(items) {
3803
+ Object.keys(items).forEach((key) => {
3804
+ this.items[key] = {
3805
+ amount: 0,
3806
+ id: key,
3807
+ };
3808
+ });
3809
+ },
3810
+ getExistingItem(id) {
3811
+ return this.items[id];
3812
+ },
3813
+ getItemAmount(id) {
3814
+ return this.getExistingItem(id)?.amount || 0;
3815
+ },
3816
+ add(item) {
3817
+ const existingItem = this.getExistingItem(item.id);
3818
+ if (existingItem) {
3819
+ existingItem.amount += item.amount;
3820
+ }
3821
+ else {
3822
+ this.items[item.id] = { ...item };
3823
+ }
3824
+ useNotifications().addNotification(`Received item: ${getItemConfig(item.id).name} x ${item.amount}`);
3825
+ },
3826
+ remove(item) {
3827
+ const existingItem = this.getExistingItem(item.id);
3828
+ if (existingItem) {
3829
+ existingItem.amount -= item.amount;
3830
+ useNotifications().addNotification(`Lost item: ${getItemConfig(item.id).name} x ${item.amount}`);
3831
+ if (existingItem.amount <= 0) {
3832
+ this.deleteItem(item.id);
3833
+ }
3834
+ }
3835
+ },
3836
+ deleteItem(id) {
3837
+ const existingItem = this.getExistingItem(id);
3838
+ if (existingItem) {
3839
+ this.items[id].amount = 0;
3840
+ }
3841
+ },
3842
+ },
3843
+ });
3844
+
3766
3845
  // Create a pinia store named skills with a state using the type Skills, with actions:
3767
3846
  // setupSkillCheck(skillCheck: SkillCheckState, id: string)
3768
3847
  // passSkillCheck(skillCheckId: string)
@@ -3850,6 +3929,101 @@ function getFile(url) {
3850
3929
  });
3851
3930
  }
3852
3931
 
3932
+ const everyObject = (object, predicate) => {
3933
+ for (const key in object) {
3934
+ if (!predicate(object[key])) {
3935
+ return false;
3936
+ }
3937
+ }
3938
+ return true;
3939
+ };
3940
+ const filterObject = (object, predicate) => {
3941
+ const result = {};
3942
+ for (const key in object) {
3943
+ if (predicate(object[key])) {
3944
+ result[key] = object[key];
3945
+ }
3946
+ }
3947
+ return result;
3948
+ };
3949
+
3950
+ const useQuests = pinia.defineStore('quests', {
3951
+ state: () => ({
3952
+ quests: {},
3953
+ }),
3954
+ actions: {
3955
+ getQuest(questId) {
3956
+ const quest = this.quests[questId];
3957
+ if (quest) {
3958
+ return quest;
3959
+ }
3960
+ error(`Quest ${questId} doesn't exist!`);
3961
+ },
3962
+ getObjective(quest, objectiveId) {
3963
+ const questObjective = this.getQuest(quest).objectives[objectiveId];
3964
+ if (questObjective) {
3965
+ return questObjective;
3966
+ }
3967
+ error(`Objective ${objectiveId} doesn't exist in quest ${quest}!`);
3968
+ },
3969
+ setupQuests(quests) {
3970
+ // iterate through quests to generate quest states to add to this.quests object
3971
+ for (const key of Object.keys(quests)) {
3972
+ const data = quests[key];
3973
+ this.quests[key] = {
3974
+ id: key,
3975
+ state: 'hidden',
3976
+ objectives: {},
3977
+ };
3978
+ // iterate through data.objectives to populate the objectives array of this.quests[key]
3979
+ for (const objectiveKey of Object.keys(data.objectives)) {
3980
+ const objective = data.objectives[objectiveKey];
3981
+ this.quests[key].objectives[objectiveKey] = {
3982
+ id: objectiveKey,
3983
+ state: objective.hidden ? 'hidden' : 'unlocked',
3984
+ };
3985
+ }
3986
+ }
3987
+ },
3988
+ startQuest(questId) {
3989
+ this.getQuest(questId).state = 'unlocked';
3990
+ useNotifications().addNotification(`Started quest: ${getQuestConfig(questId).title}`);
3991
+ },
3992
+ startObjective(questId, objectiveId) {
3993
+ this.getObjective(questId, objectiveId).state = 'unlocked';
3994
+ useNotifications().addNotification(`New quest objective: ${getObjectiveConfig(questId, objectiveId).description}`);
3995
+ },
3996
+ completeObjective(questId, objectiveId) {
3997
+ this.getObjective(questId, objectiveId).state = 'completed';
3998
+ useNotifications().addNotification(`Objective completed!`);
3999
+ },
4000
+ completeQuest(questId, ending) {
4001
+ this.getQuest(questId).state = 'completed';
4002
+ if (ending) {
4003
+ this.getQuest(questId).ending = ending;
4004
+ }
4005
+ useNotifications().addNotification(`Quest completed: ${getQuestConfig(questId).title}`);
4006
+ },
4007
+ isQuestCompleted(questId) {
4008
+ const quest = this.getQuest(questId);
4009
+ return everyObject(quest.objectives, (objective) => objective.state === 'completed');
4010
+ },
4011
+ removeQuest(id) {
4012
+ delete this.quests[id];
4013
+ },
4014
+ generateSaveData() {
4015
+ return {
4016
+ quests: {
4017
+ ...this.quests,
4018
+ },
4019
+ };
4020
+ },
4021
+ loadSaveData(data) {
4022
+ this.quests = data.quests;
4023
+ },
4024
+ },
4025
+ });
4026
+
3853
4027
  // Create a pinia store named screens with a state using the type ScreenState, with actions:
3854
4028
  // setScreen(screen: string): Sets the current screen to the given screen
3855
4029
  // setButtons(buttons: { [key: string]: ButtonConfig }): Adds buttons to the buttons state by using the values in the buttons config object
@@ -3917,10 +4091,13 @@ function getModifiableDataPinia() {
3917
4091
  const vm = useVM();
3918
4092
  const skills = useSkills();
3919
4093
  const screens = useScreens();
4094
+ const inventory = useInventory();
3920
4095
  return {
3921
4096
  data: vm.data,
3922
4097
  skills: skills.skills,
3923
4098
  buttons: screens.buttons,
4099
+ items: inventory.items,
4100
+ quests: useQuests().quests,
3924
4101
  };
3925
4102
  }
3926
4103
 
@@ -4428,11 +4605,16 @@ function runCondition(condition) {
4428
4605
  function conditionFunction(condition) {
4429
4606
  const skillStore = useSkills();
4430
4607
  const vm = useVM();
4608
+ const inventory = useInventory();
4431
4609
  const context = {
4432
4610
  data: vm.data,
4433
4611
  skills: skillStore.skills,
4434
4612
  skillChecks: skillStore.skillChecks,
4435
4613
  stats: useHud().hudStats,
4614
+ items: inventory.items,
4615
+ itemAmount: (id) => {
4616
+ return useInventory().getItemAmount(id);
4617
+ },
4436
4618
  roll: (checkId, skill, value) => {
4437
4619
  const skillCheckState = getSkillCheckState(checkId);
4438
4620
  if (skillCheckState) {
@@ -4637,6 +4819,10 @@ const useMain = pinia.defineStore('main', {
4637
4819
  skillsStore.setupSkills(config.skills);
4638
4820
  const hudStore = useHud();
4639
4821
  hudStore.setupHudStats(config.hudStats);
4822
+ const inventoryStore = useInventory();
4823
+ inventoryStore.setupItems(config.items);
4824
+ const questsStore = useQuests();
4825
+ questsStore.setupQuests(config.quests);
4640
4826
  },
4641
4827
  startMachine() {
4642
4828
  const vmStore = useVM();
@@ -4709,11 +4895,13 @@ const useMain = pinia.defineStore('main', {
4709
4895
  },
4710
4896
  reset() {
4711
4897
  this.ready = false;
4712
- this.playing = false;
4713
4898
  this.errors = [];
4714
- this.flowState = 'menu';
4715
4899
  this.modal = false;
4716
4900
  this.paused = false;
4901
+ useVM().reset();
4902
+ useAudio().reset();
4903
+ this.playing = false;
4904
+ this.ready = true;
4717
4905
  },
4718
4906
  generateSaveData() {
4719
4907
  return {
@@ -4731,6 +4919,7 @@ const useMain = pinia.defineStore('main', {
4731
4919
  const mainStore = useMain();
4732
4920
  const hudStore = useHud();
4733
4921
  const audioStore = useAudio();
4922
+ const inventoryStore = useInventory();
4734
4923
  const save = {
4735
4924
  version: '1.0.0',
4736
4925
  screen: screensStore.generateSaveData(),
@@ -4740,6 +4929,8 @@ const useMain = pinia.defineStore('main', {
4740
4929
  main: mainStore.generateSaveData(),
4741
4930
  hud: hudStore.generateSaveData(),
4742
4931
  audio: audioStore.generateSaveData(),
4932
+ inventory: inventoryStore.generateSaveData(),
4933
+ quests: useQuests().generateSaveData(),
4743
4934
  };
4744
4935
  localStorage.setItem(SAVE_FILE, JSON.stringify(save));
4745
4936
  },
@@ -4751,6 +4942,7 @@ const useMain = pinia.defineStore('main', {
4751
4942
  const mainStore = useMain();
4752
4943
  const hudStore = useHud();
4753
4944
  const audioStore = useAudio();
4945
+ const inventoryStore = useInventory();
4754
4946
  screensStore.loadSaveData(save.screen);
4755
4947
  skillsStore.loadSaveData(save.skills);
4756
4948
  dialogStore.loadSaveData(save.dialog);
@@ -4758,6 +4950,8 @@ const useMain = pinia.defineStore('main', {
4758
4950
  mainStore.loadSaveData(save.main);
4759
4951
  hudStore.loadSaveData(save.hud);
4760
4952
  audioStore.loadSaveData(save.audio);
4953
+ inventoryStore.loadSaveData(save.inventory);
4954
+ useQuests().loadSaveData(save.quests);
4761
4955
  },
4762
4956
  getAllStates() {
4763
4957
  return {
@@ -4770,6 +4964,8 @@ const useMain = pinia.defineStore('main', {
4770
4964
  audio: useAudio(),
4771
4965
  rendering: useRenderingStore(),
4772
4966
  notifications: useNotifications(),
4967
+ inventory: useInventory(),
4968
+ quests: useQuests(),
4773
4969
  };
4774
4970
  },
4775
4971
  overrideStates(override) {
@@ -7517,7 +7713,7 @@ function render$7(_ctx, _cache, $props, $setup, $data, $options) {
7517
7713
  class: "notification",
7518
7714
  key: id
7519
7715
  }, [
7520
- vue.createElementVNode("h2", null, vue.toDisplayString(notification.text), 1)
7716
+ vue.createElementVNode("h3", null, vue.toDisplayString(notification.text), 1)
7521
7717
  ]))
7522
7718
  }), 128))
7523
7719
  ]),
@@ -7525,7 +7721,7 @@ function render$7(_ctx, _cache, $props, $setup, $data, $options) {
7525
7721
  }))
7526
7722
  }
7527
7723
 
7528
- 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";
7724
+ 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";
7529
7725
  styleInject(css_248z$8);
7530
7726
 
7531
7727
  script$7.render = render$7;
@@ -7538,6 +7734,8 @@ function processText(text) {
7538
7734
  const searchableState = {
7539
7735
  data: vmStore.data,
7540
7736
  skills: skillStore.skills,
7737
+ items: useInventory().items,
7738
+ quests: useQuests().quests,
7541
7739
  };
7542
7740
  const [obj, newKey] = findDataHelper(searchableState, key);
7543
7741
  return obj[newKey];
@@ -7677,6 +7875,12 @@ var script$8 = vue.defineComponent({
7677
7875
  openSkills() {
7678
7876
  useMain().openModal('skills');
7679
7877
  },
7878
+ openInventory() {
7879
+ useMain().openModal('inventory');
7880
+ },
7881
+ openQuests() {
7882
+ useMain().openModal('quests');
7883
+ },
7680
7884
  closeMenu() {
7681
7885
  useMain().closeModal();
7682
7886
  },
@@ -7691,6 +7895,18 @@ var script$8 = vue.defineComponent({
7691
7895
  }
7692
7896
  return false;
7693
7897
  },
7898
+ showInventory() {
7899
+ if (Object.entries(getConfig().items).length > 0) {
7900
+ return true;
7901
+ }
7902
+ return false;
7903
+ },
7904
+ showQuests() {
7905
+ if (Object.entries(getConfig().quests).length > 0) {
7906
+ return true;
7907
+ }
7908
+ return false;
7909
+ },
7694
7910
  },
7695
7911
  });
7696
7912
 
@@ -7710,6 +7926,22 @@ function render$8(_ctx, _cache, $props, $setup, $data, $options) {
7710
7926
  id: "skills-menu-button",
7711
7927
  onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.openSkills && _ctx.openSkills(...args)))
7712
7928
  }, " Skills "))
7929
+ : vue.createCommentVNode("", true),
7930
+ (_ctx.showInventory)
7931
+ ? (vue.openBlock(), vue.createElementBlock("button", {
7932
+ key: 1,
7933
+ class: "button menu-toggle-button",
7934
+ id: "inventory-menu-button",
7935
+ onClick: _cache[2] || (_cache[2] = (...args) => (_ctx.openInventory && _ctx.openInventory(...args)))
7936
+ }, " Items "))
7937
+ : vue.createCommentVNode("", true),
7938
+ (_ctx.showQuests)
7939
+ ? (vue.openBlock(), vue.createElementBlock("button", {
7940
+ key: 2,
7941
+ class: "button menu-toggle-button",
7942
+ id: "quests-menu-button",
7943
+ onClick: _cache[3] || (_cache[3] = (...args) => (_ctx.openQuests && _ctx.openQuests(...args)))
7944
+ }, " Quests "))
7713
7945
  : vue.createCommentVNode("", true)
7714
7946
  ]))
7715
7947
  }
@@ -7933,11 +8165,284 @@ styleInject(css_248z$b);
7933
8165
  script$a.render = render$a;
7934
8166
 
7935
8167
  var script$b = vue.defineComponent({
8168
+ setup() {
8169
+ const store = useInventory();
8170
+ const items = vue.computed(() => store.items);
8171
+ return { items };
8172
+ },
8173
+ components: {
8174
+ Modal: script$2,
8175
+ },
8176
+ props: {
8177
+ close: (() => { }),
8178
+ },
8179
+ data() {
8180
+ return {
8181
+ chosenId: false,
8182
+ };
8183
+ },
8184
+ mounted() { },
8185
+ methods: {
8186
+ getItemStyle(item) {
8187
+ return {
8188
+ backgroundImage: `url(${this.itemConf[item].icon})`,
8189
+ };
8190
+ },
8191
+ getItemName(item) {
8192
+ return this.itemConf[item].name;
8193
+ },
8194
+ clickItem(item) {
8195
+ this.chosenId = item;
8196
+ },
8197
+ closeItem() {
8198
+ this.chosenId = false;
8199
+ },
8200
+ },
8201
+ computed: {
8202
+ itemsToDisplay() {
8203
+ const items = {};
8204
+ for (const key in this.items) {
8205
+ if (this.items[key].amount > 0) {
8206
+ items[key] = this.items[key];
8207
+ }
8208
+ }
8209
+ return items;
8210
+ },
8211
+ chosenItem() {
8212
+ if (this.chosenId) {
8213
+ return this.items[this.chosenId];
8214
+ }
8215
+ return null;
8216
+ },
8217
+ chosenItemConf() {
8218
+ if (this.chosenId) {
8219
+ return this.itemConf[this.chosenId];
8220
+ }
8221
+ return null;
8222
+ },
8223
+ itemConf() {
8224
+ return getConfig().items;
8225
+ },
8226
+ },
8227
+ });
8228
+
8229
+ const _hoisted_1$a = /*#__PURE__*/vue.createElementVNode("h3", { class: "title" }, "Inventory", -1);
8230
+ const _hoisted_2$8 = { class: "menu-content" };
8231
+ const _hoisted_3$5 = {
8232
+ key: 0,
8233
+ class: "inventory-container"
8234
+ };
8235
+ const _hoisted_4$4 = ["onClick"];
8236
+ const _hoisted_5$4 = { class: "item-title" };
8237
+ const _hoisted_6$4 = { class: "item-amount" };
8238
+ const _hoisted_7$3 = {
8239
+ key: 1,
8240
+ class: "flex flex-row item-description-container"
8241
+ };
8242
+ const _hoisted_8$2 = { class: "flex item-left" };
8243
+ const _hoisted_9$2 = { class: "flex item-right" };
8244
+ const _hoisted_10$2 = /*#__PURE__*/vue.createElementVNode("hr", { class: "hr-solid" }, null, -1);
8245
+ const _hoisted_11$2 = { key: 2 };
8246
+ const _hoisted_12$2 = /*#__PURE__*/vue.createElementVNode("h2", null, "The inventory is empty!", -1);
8247
+ const _hoisted_13$1 = [
8248
+ _hoisted_12$2
8249
+ ];
8250
+
8251
+ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8252
+ const _component_modal = vue.resolveComponent("modal");
8253
+
8254
+ return (vue.openBlock(), vue.createBlock(_component_modal, {
8255
+ class: "menu",
8256
+ onClose: _ctx.close,
8257
+ containerCssClass: "inventory-modal"
8258
+ }, {
8259
+ header: vue.withCtx(() => [
8260
+ _hoisted_1$a
8261
+ ]),
8262
+ body: vue.withCtx(() => [
8263
+ vue.createElementVNode("div", _hoisted_2$8, [
8264
+ (!_ctx.chosenItem && Object.keys(_ctx.itemsToDisplay).length > 0)
8265
+ ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$5, [
8266
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.itemsToDisplay, (item) => {
8267
+ return (vue.openBlock(), vue.createElementBlock("button", {
8268
+ onClick: () => _ctx.clickItem(item.id),
8269
+ class: "item-display",
8270
+ style: vue.normalizeStyle(_ctx.getItemStyle(item.id)),
8271
+ key: item.id
8272
+ }, [
8273
+ vue.createElementVNode("h3", _hoisted_5$4, vue.toDisplayString(_ctx.getItemName(item.id)), 1),
8274
+ vue.createElementVNode("h3", _hoisted_6$4, vue.toDisplayString(item.amount), 1)
8275
+ ], 12, _hoisted_4$4))
8276
+ }), 128))
8277
+ ]))
8278
+ : (typeof _ctx.chosenId === 'string')
8279
+ ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$3, [
8280
+ vue.createElementVNode("div", _hoisted_8$2, [
8281
+ vue.createElementVNode("button", {
8282
+ class: "button",
8283
+ onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.closeItem && _ctx.closeItem(...args)))
8284
+ }, "Back"),
8285
+ vue.createElementVNode("div", {
8286
+ class: "item-display",
8287
+ style: vue.normalizeStyle(_ctx.getItemStyle(_ctx.chosenId))
8288
+ }, null, 4)
8289
+ ]),
8290
+ vue.createElementVNode("div", _hoisted_9$2, [
8291
+ vue.createElementVNode("h2", null, vue.toDisplayString(_ctx.getItemName(_ctx.chosenId)), 1),
8292
+ _hoisted_10$2,
8293
+ vue.createElementVNode("h3", null, "Amount: " + vue.toDisplayString(_ctx.chosenItem.amount), 1),
8294
+ vue.createElementVNode("p", null, vue.toDisplayString(_ctx.chosenItemConf.description), 1)
8295
+ ])
8296
+ ]))
8297
+ : (vue.openBlock(), vue.createElementBlock("div", _hoisted_11$2, _hoisted_13$1))
8298
+ ])
8299
+ ]),
8300
+ _: 1
8301
+ }, 8, ["onClose"]))
8302
+ }
8303
+
8304
+ 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";
8305
+ styleInject(css_248z$c);
8306
+
8307
+ script$b.render = render$b;
8308
+
8309
+ var script$c = vue.defineComponent({
8310
+ setup() {
8311
+ const questsStore = useQuests();
8312
+ const quests = vue.computed(() => questsStore.quests);
8313
+ return { quests };
8314
+ },
8315
+ computed: {
8316
+ questsToDisplay() {
8317
+ return filterObject(this.quests, (quest) => quest.state !== 'hidden');
8318
+ },
8319
+ },
8320
+ props: {
8321
+ close: (() => { }),
8322
+ },
8323
+ methods: {
8324
+ getQuestData(questId) {
8325
+ return getQuestConfig(questId);
8326
+ },
8327
+ getObjectiveData(questId, objectiveId) {
8328
+ return getObjectiveConfig(questId, objectiveId);
8329
+ },
8330
+ getDisplayTextForQuestState(quest) {
8331
+ switch (quest.state) {
8332
+ case 'hidden':
8333
+ return ' Hidden';
8334
+ case 'unlocked':
8335
+ return '';
8336
+ case 'completed':
8337
+ return ' (Completed)';
8338
+ default:
8339
+ return ' Unknown';
8340
+ }
8341
+ },
8342
+ getQuestDescription(quest) {
8343
+ if (quest.ending) {
8344
+ return quest.ending;
8345
+ }
8346
+ return this.getQuestData(quest.id).description;
8347
+ },
8348
+ getAvailableObjectives(quest) {
8349
+ return filterObject(quest.objectives, (objective) => {
8350
+ return objective.state !== 'hidden';
8351
+ });
8352
+ },
8353
+ },
8354
+ components: {
8355
+ Modal: script$2,
8356
+ VolumeControls: script$4,
8357
+ },
8358
+ });
8359
+
8360
+ const _hoisted_1$b = /*#__PURE__*/vue.createElementVNode("h3", { class: "title" }, "Quests", -1);
8361
+ const _hoisted_2$9 = {
8362
+ key: 0,
8363
+ class: "quests-container"
8364
+ };
8365
+ const _hoisted_3$6 = { class: "quest-title" };
8366
+ const _hoisted_4$5 = { class: "quest-description" };
8367
+ const _hoisted_5$5 = {
8368
+ key: 0,
8369
+ class: "quest-objectives-container list-disc"
8370
+ };
8371
+ const _hoisted_6$5 = {
8372
+ key: 1,
8373
+ class: "menu-container"
8374
+ };
8375
+ const _hoisted_7$4 = /*#__PURE__*/vue.createElementVNode("h2", { class: "title" }, "There are no quests!", -1);
8376
+ const _hoisted_8$3 = [
8377
+ _hoisted_7$4
8378
+ ];
8379
+
8380
+ function render$c(_ctx, _cache, $props, $setup, $data, $options) {
8381
+ const _component_modal = vue.resolveComponent("modal");
8382
+
8383
+ return (vue.openBlock(), vue.createBlock(_component_modal, {
8384
+ class: "quests",
8385
+ onClose: _ctx.close,
8386
+ containerCssClass: "quests-modal"
8387
+ }, {
8388
+ header: vue.withCtx(() => [
8389
+ _hoisted_1$b
8390
+ ]),
8391
+ body: vue.withCtx(() => [
8392
+ (Object.keys(_ctx.questsToDisplay).length > 0)
8393
+ ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$9, [
8394
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.questsToDisplay, (quest) => {
8395
+ return (vue.openBlock(), vue.createElementBlock("div", {
8396
+ class: "quest-display",
8397
+ key: quest.id
8398
+ }, [
8399
+ vue.createElementVNode("div", {
8400
+ class: vue.normalizeClass(["quest-header",
8401
+ quest.state === 'completed'
8402
+ ? 'quest-completed'
8403
+ : 'quest-in-progress'
8404
+ ])
8405
+ }, [
8406
+ vue.createElementVNode("h3", _hoisted_3$6, vue.toDisplayString(_ctx.getQuestData(quest.id).title) + " " + vue.toDisplayString(_ctx.getDisplayTextForQuestState(quest)), 1)
8407
+ ], 2),
8408
+ vue.createElementVNode("p", _hoisted_4$5, vue.toDisplayString(_ctx.getQuestDescription(quest)), 1),
8409
+ (quest.state !== 'completed')
8410
+ ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_5$5, [
8411
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.getAvailableObjectives(quest), (objective) => {
8412
+ return (vue.openBlock(), vue.createElementBlock("li", {
8413
+ class: "quest-objective-display",
8414
+ key: objective.id
8415
+ }, [
8416
+ vue.createElementVNode("p", {
8417
+ class: vue.normalizeClass(["quest-objective-description",
8418
+ objective.state === 'completed'
8419
+ ? 'quest-objective-completed'
8420
+ : 'quest-objctive-in-progress'
8421
+ ])
8422
+ }, vue.toDisplayString(_ctx.getObjectiveData(quest.id, objective.id).description), 3)
8423
+ ]))
8424
+ }), 128))
8425
+ ]))
8426
+ : vue.createCommentVNode("", true)
8427
+ ]))
8428
+ }), 128))
8429
+ ]))
8430
+ : (vue.openBlock(), vue.createElementBlock("div", _hoisted_6$5, _hoisted_8$3))
8431
+ ]),
8432
+ _: 1
8433
+ }, 8, ["onClose"]))
8434
+ }
8435
+
8436
+ 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";
8437
+ styleInject(css_248z$d);
8438
+
8439
+ script$c.render = render$c;
8440
+
8441
+ var script$d = vue.defineComponent({
7936
8442
  setup() {
7937
8443
  const dialogStore = useDialogStore();
7938
8444
  const vmStore = useVM();
7939
8445
  const mainStore = useMain();
7940
- const renderingStore = useRenderingStore();
7941
8446
  return {
7942
8447
  dialog: vue.computed(() => dialogStore.dialog),
7943
8448
  stack: vue.computed(() => vmStore.stack),
@@ -7959,6 +8464,8 @@ var script$b = vue.defineComponent({
7959
8464
  Menu: script$8,
7960
8465
  MainMenu: script$9,
7961
8466
  Skills: script$a,
8467
+ Inventory: script$b,
8468
+ Quests: script$c,
7962
8469
  },
7963
8470
  data() {
7964
8471
  return {
@@ -8226,22 +8733,24 @@ var script$b = vue.defineComponent({
8226
8733
  },
8227
8734
  });
8228
8735
 
8229
- const _hoisted_1$a = ["width", "height"];
8230
- const _hoisted_2$8 = /*#__PURE__*/vue.createElementVNode("div", { class: "anchor" }, null, -1);
8231
- const _hoisted_3$5 = {
8736
+ const _hoisted_1$c = ["width", "height"];
8737
+ const _hoisted_2$a = /*#__PURE__*/vue.createElementVNode("div", { class: "anchor" }, null, -1);
8738
+ const _hoisted_3$7 = {
8232
8739
  key: 2,
8233
8740
  class: "flex flex-col",
8234
8741
  style: {"height":"100%","padding":"20px"}
8235
8742
  };
8236
- const _hoisted_4$4 = { id: "game-title-container" };
8237
- const _hoisted_5$4 = { id: "game-title-text" };
8238
- const _hoisted_6$4 = { class: "flex flex-col" };
8239
- const _hoisted_7$3 = { key: 3 };
8743
+ const _hoisted_4$6 = { id: "game-title-container" };
8744
+ const _hoisted_5$6 = { id: "game-title-text" };
8745
+ const _hoisted_6$6 = { class: "flex flex-col" };
8746
+ const _hoisted_7$5 = { key: 3 };
8240
8747
 
8241
- function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8748
+ function render$d(_ctx, _cache, $props, $setup, $data, $options) {
8242
8749
  const _component_Hud = vue.resolveComponent("Hud");
8243
8750
  const _component_Menu = vue.resolveComponent("Menu");
8244
8751
  const _component_Skills = vue.resolveComponent("Skills");
8752
+ const _component_Inventory = vue.resolveComponent("Inventory");
8753
+ const _component_Quests = vue.resolveComponent("Quests");
8245
8754
  const _component_MainMenu = vue.resolveComponent("MainMenu");
8246
8755
  const _component_DialogPicture = vue.resolveComponent("DialogPicture");
8247
8756
  const _component_DialogBox = vue.resolveComponent("DialogBox");
@@ -8269,9 +8778,21 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8269
8778
  onClose: _ctx.closeModal
8270
8779
  }, null, 8, ["onClose"]))
8271
8780
  : vue.createCommentVNode("", true),
8781
+ (_ctx.modal === 'inventory')
8782
+ ? (vue.openBlock(), vue.createBlock(_component_Inventory, {
8783
+ key: 1,
8784
+ onClose: _ctx.closeModal
8785
+ }, null, 8, ["onClose"]))
8786
+ : vue.createCommentVNode("", true),
8787
+ (_ctx.modal === 'quests')
8788
+ ? (vue.openBlock(), vue.createBlock(_component_Quests, {
8789
+ key: 2,
8790
+ onClose: _ctx.closeModal
8791
+ }, null, 8, ["onClose"]))
8792
+ : vue.createCommentVNode("", true),
8272
8793
  (_ctx.modal === 'menu')
8273
8794
  ? (vue.openBlock(), vue.createBlock(_component_MainMenu, {
8274
- key: 1,
8795
+ key: 3,
8275
8796
  onClose: _ctx.closeModal
8276
8797
  }, null, 8, ["onClose"]))
8277
8798
  : vue.createCommentVNode("", true),
@@ -8288,7 +8809,7 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8288
8809
  }),
8289
8810
  (_ctx.inGame)
8290
8811
  ? (vue.openBlock(), vue.createElementBlock("div", {
8291
- key: 2,
8812
+ key: 4,
8292
8813
  class: "background",
8293
8814
  style: vue.normalizeStyle(_ctx.backgroundStyle)
8294
8815
  }, [
@@ -8297,12 +8818,12 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8297
8818
  height: _ctx.layoutHeight,
8298
8819
  id: "background-canvas",
8299
8820
  class: "narrat-canvas"
8300
- }, null, 8, _hoisted_1$a)
8821
+ }, null, 8, _hoisted_1$c)
8301
8822
  ], 4))
8302
8823
  : vue.createCommentVNode("", true),
8303
8824
  (_ctx.inGame)
8304
8825
  ? (vue.openBlock(), vue.createElementBlock("div", {
8305
- key: 3,
8826
+ key: 5,
8306
8827
  class: "dialog override",
8307
8828
  ref: "dialog",
8308
8829
  style: vue.normalizeStyle(_ctx.dialogStyle)
@@ -8324,16 +8845,16 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8324
8845
  ]),
8325
8846
  _: 1
8326
8847
  }, 8, ["style"]),
8327
- _hoisted_2$8
8848
+ _hoisted_2$a
8328
8849
  ], 4))
8329
8850
  : vue.createCommentVNode("", true)
8330
8851
  ], 4))
8331
8852
  : (_ctx.gameLoaded)
8332
- ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$5, [
8333
- vue.createElementVNode("div", _hoisted_4$4, [
8334
- vue.createElementVNode("h1", _hoisted_5$4, vue.toDisplayString(_ctx.gameTitle), 1)
8853
+ ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$7, [
8854
+ vue.createElementVNode("div", _hoisted_4$6, [
8855
+ vue.createElementVNode("h1", _hoisted_5$6, vue.toDisplayString(_ctx.gameTitle), 1)
8335
8856
  ]),
8336
- vue.createElementVNode("div", _hoisted_6$4, [
8857
+ vue.createElementVNode("div", _hoisted_6$6, [
8337
8858
  vue.createElementVNode("button", {
8338
8859
  class: "button menu-button start-button override",
8339
8860
  onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.startGame && _ctx.startGame(...args)))
@@ -8347,7 +8868,7 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8347
8868
  : vue.createCommentVNode("", true)
8348
8869
  ])
8349
8870
  ]))
8350
- : (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$3, [
8871
+ : (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$5, [
8351
8872
  vue.createVNode(_component_LoadingBar, {
8352
8873
  percentage: _ctx.loadingPercentage,
8353
8874
  step: _ctx.loadingStep
@@ -8360,10 +8881,10 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
8360
8881
  ], 4))
8361
8882
  }
8362
8883
 
8363
- 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";
8364
- styleInject(css_248z$c);
8884
+ 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";
8885
+ styleInject(css_248z$e);
8365
8886
 
8366
- script$b.render = render$b;
8887
+ script$d.render = render$d;
8367
8888
 
8368
8889
  let canvas;
8369
8890
  let ctx;
@@ -8863,7 +9384,67 @@ const waitParser = (ctx) => {
8863
9384
  };
8864
9385
  const waitCommand = new CommandPlugin('wait', wait, waitParser);
8865
9386
 
9387
+ // Write a CommandPlugin for adding items to the inventory store
9388
+ const addItemPlugin = new CommandPlugin('add_item', async (cmd) => {
9389
+ const id = cmd.args[0];
9390
+ const amount = cmd.args[1];
9391
+ const inventory = useInventory();
9392
+ inventory.add({
9393
+ id,
9394
+ amount,
9395
+ });
9396
+ return useVM().nextLine();
9397
+ }, generateParser('add_item'));
9398
+
9399
+ // Write a CommandPlugin for removeing items to the inventory store
9400
+ const removeItemPlugin = new CommandPlugin('remove_item', async (cmd) => {
9401
+ const id = cmd.args[0];
9402
+ const amount = cmd.args[1];
9403
+ const inventory = useInventory();
9404
+ inventory.remove({
9405
+ id,
9406
+ amount,
9407
+ });
9408
+ return useVM().nextLine();
9409
+ }, generateParser('remove_item'));
9410
+
9411
+ // Write a CommandPlugin for starting a quest with the useQuests quests store
9412
+ const startQuestPlugin = new CommandPlugin('start_quest', async (cmd) => {
9413
+ const questId = cmd.args[0];
9414
+ const quests = useQuests();
9415
+ quests.startQuest(questId);
9416
+ return useVM().nextLine();
9417
+ }, generateParser('start_quest'));
9418
+ // Write a CommandPlugin for starting a quest objective with the cmd having arguments questId and objectiveId, using the useQuests store's startObjective method
9419
+ const startObjectivePlugin = new CommandPlugin('start_objective', async (cmd) => {
9420
+ const questId = cmd.args[0];
9421
+ const objectiveId = cmd.args[1];
9422
+ const quests = useQuests();
9423
+ quests.startObjective(questId, objectiveId);
9424
+ return useVM().nextLine();
9425
+ }, generateParser('start_objective'));
9426
+ // Write a CommandPlugin for completing a quest objective with the cmd having arguments questId and objectiveId, using the useQuests store's completeObjective method
9427
+ const completeObjectivePlugin = new CommandPlugin('complete_objective', async (cmd) => {
9428
+ const questId = cmd.args[0];
9429
+ const objectiveId = cmd.args[1];
9430
+ const quests = useQuests();
9431
+ quests.completeObjective(questId, objectiveId);
9432
+ return useVM().nextLine();
9433
+ }, generateParser('complete_objective'));
9434
+ // Write a CommandPlugin for completing a quest with the cmd having arguments questId, using the useQuests store's completeQuest method
9435
+ const completeQuestPlugin = new CommandPlugin('complete_quest', async (cmd) => {
9436
+ const questId = cmd.args[0];
9437
+ let ending;
9438
+ if (cmd.args.length > 1) {
9439
+ ending = cmd.args[1];
9440
+ }
9441
+ const quests = useQuests();
9442
+ quests.completeQuest(questId, ending);
9443
+ return useVM().nextLine();
9444
+ }, generateParser('complete_quest'));
9445
+
8866
9446
  function registerBaseCommands(vm) {
9447
+ vm.addCommand(addItemPlugin);
8867
9448
  vm.addCommand(addLevelPlugin);
8868
9449
  vm.addCommand(addStatPlugin);
8869
9450
  vm.addCommand(addXpPlugin);
@@ -8875,6 +9456,7 @@ function registerBaseCommands(vm) {
8875
9456
  vm.addCommand(notifyPlugin);
8876
9457
  vm.addCommand(pauseCommand);
8877
9458
  vm.addCommand(playCommand);
9459
+ vm.addCommand(removeItemPlugin);
8878
9460
  vm.addCommand(setButtonCommand);
8879
9461
  vm.addCommand(setScreenCommand);
8880
9462
  vm.addCommand(setStatCommand);
@@ -8883,6 +9465,11 @@ function registerBaseCommands(vm) {
8883
9465
  vm.addCommand(talkCommand);
8884
9466
  vm.addCommand(textCommandPlugin);
8885
9467
  vm.addCommand(waitCommand);
9468
+ // Quests
9469
+ vm.addCommand(startQuestPlugin);
9470
+ vm.addCommand(startObjectivePlugin);
9471
+ vm.addCommand(completeObjectivePlugin);
9472
+ vm.addCommand(completeQuestPlugin);
8886
9473
  }
8887
9474
 
8888
9475
  class NarratPlugin {
@@ -8908,7 +9495,7 @@ vm.callHook('onPageLoaded');
8908
9495
  async function startApp(config, options) {
8909
9496
  const configFile = await getFile('data/config.json');
8910
9497
  setConfig(JSON.parse(configFile));
8911
- app = vue.createApp(script$b, {
9498
+ app = vue.createApp(script$d, {
8912
9499
  config,
8913
9500
  options,
8914
9501
  });
@@ -8925,7 +9512,7 @@ async function startApp(config, options) {
8925
9512
  });
8926
9513
  registerBaseCommands(vm);
8927
9514
  logManager.setupDebugger(options.debug);
8928
- console.log('%c Narrat game engine – 1.0.0 - June 24, 2022 23:38:57', 'background: #222; color: #bada55');
9515
+ console.log('%c Narrat game engine – 1.2.1 - June 25, 2022 14:20:12', 'background: #222; color: #bada55');
8929
9516
  vm.callHook('onNarratSetup');
8930
9517
  app.mount('#game-holder');
8931
9518
  if (options.debug) {
@@ -8955,6 +9542,9 @@ exports.addCommand = addCommand;
8955
9542
  exports.aspectRatioFit = aspectRatioFit;
8956
9543
  exports.generateParser = generateParser;
8957
9544
  exports.getConfig = getConfig;
9545
+ exports.getItemConfig = getItemConfig;
9546
+ exports.getObjectiveConfig = getObjectiveConfig;
9547
+ exports.getQuestConfig = getQuestConfig;
8958
9548
  exports.getSkillConfig = getSkillConfig;
8959
9549
  exports.registerPlugin = registerPlugin;
8960
9550
  exports.setConfig = setConfig;