narrat 1.2.0 → 1.3.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/components/MainMenu.vue.d.ts +6 -9
- package/lib/components/Skills.vue.d.ts +3 -5
- package/lib/components/inventory.vue.d.ts +8 -5
- package/lib/components/quests.vue.d.ts +3 -5
- package/lib/config.d.ts +10 -0
- package/lib/index.esm.js +564 -416
- package/lib/index.js +564 -416
- package/lib/stores/audio-store.d.ts +1 -0
- package/lib/stores/dialog-store.d.ts +4 -1
- package/lib/stores/inventory-store.d.ts +10 -0
- package/lib/stores/main-store.d.ts +12 -2
- package/lib/stores/vm-store.d.ts +2 -1
- package/lib/vm/commands/inventory-commands.d.ts +5 -0
- package/lib/vm/commands/run.d.ts +2 -0
- package/package.json +1 -1
package/lib/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Version: 1.
|
|
1
|
+
// Version: 1.3.1 - June 25, 2022 22:52:46
|
|
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 --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";
|
|
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.disabled {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n pointer-events: none;\n}\n\n.button.disabled {\n box-shadow: unset;\n color: grey;\n background: var(--border-color);\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;}};
|
|
@@ -98,6 +98,11 @@ const defaultConfig = {
|
|
|
98
98
|
},
|
|
99
99
|
hudStats: {},
|
|
100
100
|
items: {},
|
|
101
|
+
interactionTags: {
|
|
102
|
+
default: {
|
|
103
|
+
onlyInteractOutsideOfScripts: true,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
101
106
|
quests: {},
|
|
102
107
|
};
|
|
103
108
|
|
|
@@ -3432,6 +3437,9 @@ const useAudio = defineStore('audio', {
|
|
|
3432
3437
|
loadSaveData(data) {
|
|
3433
3438
|
this.currentMusic = data.currentMusic;
|
|
3434
3439
|
},
|
|
3440
|
+
reset() {
|
|
3441
|
+
this.stopMusic();
|
|
3442
|
+
},
|
|
3435
3443
|
},
|
|
3436
3444
|
});
|
|
3437
3445
|
|
|
@@ -3557,200 +3565,6 @@ function randomId() {
|
|
|
3557
3565
|
return `${Date.now() - Math.floor(Math.random() * 99999999)}`;
|
|
3558
3566
|
}
|
|
3559
3567
|
|
|
3560
|
-
// Create a pinia store named dialog with a state using the type DialogState, with actions addDialog and clearDialog
|
|
3561
|
-
const useDialogStore = defineStore('dialog', {
|
|
3562
|
-
state: () => ({
|
|
3563
|
-
dialog: [],
|
|
3564
|
-
}),
|
|
3565
|
-
actions: {
|
|
3566
|
-
generateSaveData() {
|
|
3567
|
-
return {
|
|
3568
|
-
dialog: this.dialog,
|
|
3569
|
-
};
|
|
3570
|
-
},
|
|
3571
|
-
loadSaveData(data) {
|
|
3572
|
-
this.dialog = data.dialog;
|
|
3573
|
-
},
|
|
3574
|
-
addDialog(dialog) {
|
|
3575
|
-
this.dialog.push({
|
|
3576
|
-
...dialog,
|
|
3577
|
-
interactive: dialog.interactive ?? false,
|
|
3578
|
-
id: randomId(),
|
|
3579
|
-
});
|
|
3580
|
-
},
|
|
3581
|
-
clearDialog() {
|
|
3582
|
-
this.dialog.splice(0, this.dialog.length);
|
|
3583
|
-
},
|
|
3584
|
-
},
|
|
3585
|
-
});
|
|
3586
|
-
|
|
3587
|
-
var isMergeableObject = function isMergeableObject(value) {
|
|
3588
|
-
return isNonNullObject(value)
|
|
3589
|
-
&& !isSpecial(value)
|
|
3590
|
-
};
|
|
3591
|
-
|
|
3592
|
-
function isNonNullObject(value) {
|
|
3593
|
-
return !!value && typeof value === 'object'
|
|
3594
|
-
}
|
|
3595
|
-
|
|
3596
|
-
function isSpecial(value) {
|
|
3597
|
-
var stringValue = Object.prototype.toString.call(value);
|
|
3598
|
-
|
|
3599
|
-
return stringValue === '[object RegExp]'
|
|
3600
|
-
|| stringValue === '[object Date]'
|
|
3601
|
-
|| isReactElement(value)
|
|
3602
|
-
}
|
|
3603
|
-
|
|
3604
|
-
// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25
|
|
3605
|
-
var canUseSymbol = typeof Symbol === 'function' && Symbol.for;
|
|
3606
|
-
var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;
|
|
3607
|
-
|
|
3608
|
-
function isReactElement(value) {
|
|
3609
|
-
return value.$$typeof === REACT_ELEMENT_TYPE
|
|
3610
|
-
}
|
|
3611
|
-
|
|
3612
|
-
function emptyTarget(val) {
|
|
3613
|
-
return Array.isArray(val) ? [] : {}
|
|
3614
|
-
}
|
|
3615
|
-
|
|
3616
|
-
function cloneUnlessOtherwiseSpecified(value, options) {
|
|
3617
|
-
return (options.clone !== false && options.isMergeableObject(value))
|
|
3618
|
-
? deepmerge(emptyTarget(value), value, options)
|
|
3619
|
-
: value
|
|
3620
|
-
}
|
|
3621
|
-
|
|
3622
|
-
function defaultArrayMerge(target, source, options) {
|
|
3623
|
-
return target.concat(source).map(function(element) {
|
|
3624
|
-
return cloneUnlessOtherwiseSpecified(element, options)
|
|
3625
|
-
})
|
|
3626
|
-
}
|
|
3627
|
-
|
|
3628
|
-
function getMergeFunction(key, options) {
|
|
3629
|
-
if (!options.customMerge) {
|
|
3630
|
-
return deepmerge
|
|
3631
|
-
}
|
|
3632
|
-
var customMerge = options.customMerge(key);
|
|
3633
|
-
return typeof customMerge === 'function' ? customMerge : deepmerge
|
|
3634
|
-
}
|
|
3635
|
-
|
|
3636
|
-
function getEnumerableOwnPropertySymbols(target) {
|
|
3637
|
-
return Object.getOwnPropertySymbols
|
|
3638
|
-
? Object.getOwnPropertySymbols(target).filter(function(symbol) {
|
|
3639
|
-
return target.propertyIsEnumerable(symbol)
|
|
3640
|
-
})
|
|
3641
|
-
: []
|
|
3642
|
-
}
|
|
3643
|
-
|
|
3644
|
-
function getKeys(target) {
|
|
3645
|
-
return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))
|
|
3646
|
-
}
|
|
3647
|
-
|
|
3648
|
-
function propertyIsOnObject(object, property) {
|
|
3649
|
-
try {
|
|
3650
|
-
return property in object
|
|
3651
|
-
} catch(_) {
|
|
3652
|
-
return false
|
|
3653
|
-
}
|
|
3654
|
-
}
|
|
3655
|
-
|
|
3656
|
-
// Protects from prototype poisoning and unexpected merging up the prototype chain.
|
|
3657
|
-
function propertyIsUnsafe(target, key) {
|
|
3658
|
-
return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,
|
|
3659
|
-
&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,
|
|
3660
|
-
&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.
|
|
3661
|
-
}
|
|
3662
|
-
|
|
3663
|
-
function mergeObject(target, source, options) {
|
|
3664
|
-
var destination = {};
|
|
3665
|
-
if (options.isMergeableObject(target)) {
|
|
3666
|
-
getKeys(target).forEach(function(key) {
|
|
3667
|
-
destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);
|
|
3668
|
-
});
|
|
3669
|
-
}
|
|
3670
|
-
getKeys(source).forEach(function(key) {
|
|
3671
|
-
if (propertyIsUnsafe(target, key)) {
|
|
3672
|
-
return
|
|
3673
|
-
}
|
|
3674
|
-
|
|
3675
|
-
if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {
|
|
3676
|
-
destination[key] = getMergeFunction(key, options)(target[key], source[key], options);
|
|
3677
|
-
} else {
|
|
3678
|
-
destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);
|
|
3679
|
-
}
|
|
3680
|
-
});
|
|
3681
|
-
return destination
|
|
3682
|
-
}
|
|
3683
|
-
|
|
3684
|
-
function deepmerge(target, source, options) {
|
|
3685
|
-
options = options || {};
|
|
3686
|
-
options.arrayMerge = options.arrayMerge || defaultArrayMerge;
|
|
3687
|
-
options.isMergeableObject = options.isMergeableObject || isMergeableObject;
|
|
3688
|
-
// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()
|
|
3689
|
-
// implementations can use it. The caller may not replace it.
|
|
3690
|
-
options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;
|
|
3691
|
-
|
|
3692
|
-
var sourceIsArray = Array.isArray(source);
|
|
3693
|
-
var targetIsArray = Array.isArray(target);
|
|
3694
|
-
var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
|
|
3695
|
-
|
|
3696
|
-
if (!sourceAndTargetTypesMatch) {
|
|
3697
|
-
return cloneUnlessOtherwiseSpecified(source, options)
|
|
3698
|
-
} else if (sourceIsArray) {
|
|
3699
|
-
return options.arrayMerge(target, source, options)
|
|
3700
|
-
} else {
|
|
3701
|
-
return mergeObject(target, source, options)
|
|
3702
|
-
}
|
|
3703
|
-
}
|
|
3704
|
-
|
|
3705
|
-
deepmerge.all = function deepmergeAll(array, options) {
|
|
3706
|
-
if (!Array.isArray(array)) {
|
|
3707
|
-
throw new Error('first argument should be an array')
|
|
3708
|
-
}
|
|
3709
|
-
|
|
3710
|
-
return array.reduce(function(prev, next) {
|
|
3711
|
-
return deepmerge(prev, next, options)
|
|
3712
|
-
}, {})
|
|
3713
|
-
};
|
|
3714
|
-
|
|
3715
|
-
var deepmerge_1 = deepmerge;
|
|
3716
|
-
|
|
3717
|
-
var cjs = deepmerge_1;
|
|
3718
|
-
|
|
3719
|
-
// Create a pinia store named hud with a state using the type HudState, and save type HudSave, with actions:
|
|
3720
|
-
// setupHudStats(stats: { [key: string]: HudStatConfig }): Iterates the stats argument to add new stats to the state
|
|
3721
|
-
// setStat(stat: string, value: number): Sets the value of a stat
|
|
3722
|
-
// addStat(stat: string, value: number): Adds a value to a stat
|
|
3723
|
-
// generateSaveData(): Function that generates a HudSave object from the data in the state
|
|
3724
|
-
// loadSaveData(data: HudSave): Function that loads the data into the state
|
|
3725
|
-
const useHud = defineStore('hud', {
|
|
3726
|
-
state: () => ({
|
|
3727
|
-
hudStats: {},
|
|
3728
|
-
}),
|
|
3729
|
-
actions: {
|
|
3730
|
-
setupHudStats(stats) {
|
|
3731
|
-
for (const stat in stats) {
|
|
3732
|
-
this.hudStats[stat] = {
|
|
3733
|
-
value: stats[stat].startingValue,
|
|
3734
|
-
};
|
|
3735
|
-
}
|
|
3736
|
-
},
|
|
3737
|
-
setStat(stat, value) {
|
|
3738
|
-
this.hudStats[stat].value = value;
|
|
3739
|
-
},
|
|
3740
|
-
addStat(stat, value) {
|
|
3741
|
-
this.hudStats[stat].value += value;
|
|
3742
|
-
},
|
|
3743
|
-
generateSaveData() {
|
|
3744
|
-
return {
|
|
3745
|
-
hudStats: this.hudStats,
|
|
3746
|
-
};
|
|
3747
|
-
},
|
|
3748
|
-
loadSaveData(data) {
|
|
3749
|
-
this.hudStats = cjs(this.hudStats, data.hudStats);
|
|
3750
|
-
},
|
|
3751
|
-
},
|
|
3752
|
-
});
|
|
3753
|
-
|
|
3754
3568
|
// Generate a pinia store named notifications with a state using the type NotificationsState, and save type NotificationsSave, with actions:
|
|
3755
3569
|
// addNotification(text: string): Adds a new notification to the state, and deletes it after a timeout
|
|
3756
3570
|
// deleteNotification(id: string): Deletes a notification from the state
|
|
@@ -3779,15 +3593,18 @@ const useNotifications = defineStore('notifications', {
|
|
|
3779
3593
|
const useInventory = defineStore('inventory', {
|
|
3780
3594
|
state: () => ({
|
|
3781
3595
|
items: {},
|
|
3596
|
+
interactionTags: {},
|
|
3782
3597
|
}),
|
|
3783
3598
|
actions: {
|
|
3784
3599
|
generateSaveData() {
|
|
3785
3600
|
return {
|
|
3786
3601
|
items: this.items,
|
|
3602
|
+
interactionTags: this.interactionTags,
|
|
3787
3603
|
};
|
|
3788
3604
|
},
|
|
3789
3605
|
loadSaveData(save) {
|
|
3790
3606
|
this.items = { ...this.items, ...save.items };
|
|
3607
|
+
this.interactionTags = { ...save.interactionTags };
|
|
3791
3608
|
},
|
|
3792
3609
|
setupItems(items) {
|
|
3793
3610
|
Object.keys(items).forEach((key) => {
|
|
@@ -3813,6 +3630,49 @@ const useInventory = defineStore('inventory', {
|
|
|
3813
3630
|
}
|
|
3814
3631
|
useNotifications().addNotification(`Received item: ${getItemConfig(item.id).name} x ${item.amount}`);
|
|
3815
3632
|
},
|
|
3633
|
+
enableInteraction(tag) {
|
|
3634
|
+
if (!tag) {
|
|
3635
|
+
tag = 'default';
|
|
3636
|
+
}
|
|
3637
|
+
this.interactionTags[tag] = {
|
|
3638
|
+
blockedInteraction: false,
|
|
3639
|
+
};
|
|
3640
|
+
},
|
|
3641
|
+
disableInteraction(tag) {
|
|
3642
|
+
if (!tag) {
|
|
3643
|
+
tag = 'default';
|
|
3644
|
+
}
|
|
3645
|
+
this.interactionTags[tag] = {
|
|
3646
|
+
blockedInteraction: true,
|
|
3647
|
+
};
|
|
3648
|
+
},
|
|
3649
|
+
onScriptStart() {
|
|
3650
|
+
const tags = getConfig().interactionTags;
|
|
3651
|
+
Object.keys(tags).forEach((tag) => {
|
|
3652
|
+
const conf = tags[tag];
|
|
3653
|
+
if (conf.onlyInteractOutsideOfScripts) {
|
|
3654
|
+
this.disableInteraction(tag);
|
|
3655
|
+
}
|
|
3656
|
+
});
|
|
3657
|
+
},
|
|
3658
|
+
onScriptEnd() {
|
|
3659
|
+
const tags = getConfig().interactionTags;
|
|
3660
|
+
Object.keys(tags).forEach((tag) => {
|
|
3661
|
+
const conf = tags[tag];
|
|
3662
|
+
if (conf.onlyInteractOutsideOfScripts) {
|
|
3663
|
+
this.enableInteraction(tag);
|
|
3664
|
+
}
|
|
3665
|
+
});
|
|
3666
|
+
},
|
|
3667
|
+
isInteractionTagBlocked(tag) {
|
|
3668
|
+
if (!tag) {
|
|
3669
|
+
tag = 'default';
|
|
3670
|
+
}
|
|
3671
|
+
if (this.interactionTags[tag]) {
|
|
3672
|
+
return this.interactionTags[tag].blockedInteraction;
|
|
3673
|
+
}
|
|
3674
|
+
return false;
|
|
3675
|
+
},
|
|
3816
3676
|
remove(item) {
|
|
3817
3677
|
const existingItem = this.getExistingItem(item.id);
|
|
3818
3678
|
if (existingItem) {
|
|
@@ -3832,93 +3692,6 @@ const useInventory = defineStore('inventory', {
|
|
|
3832
3692
|
},
|
|
3833
3693
|
});
|
|
3834
3694
|
|
|
3835
|
-
// Create a pinia store named skills with a state using the type Skills, with actions:
|
|
3836
|
-
// setupSkillCheck(skillCheck: SkillCheckState, id: string)
|
|
3837
|
-
// passSkillCheck(skillCheckId: string)
|
|
3838
|
-
// failSkillCheck(skillCheckId: string)
|
|
3839
|
-
// generateSaveData(): Function that generates a Skills object from the data in the state
|
|
3840
|
-
// loadSaveData(data: Skills): Function that loads the data into the state
|
|
3841
|
-
// setupSkills(skills: { [key: string]: SkillData})
|
|
3842
|
-
// addXp(skill: string, xp: number): Adds xp to a skill, increases skill level if it reaches the max xp defined in the skillOptions.xpPerLevel key of the config
|
|
3843
|
-
// incrementSkill(skill: string, amount: number): Increments the level of a skill by amount
|
|
3844
|
-
const useSkills = defineStore('skills', {
|
|
3845
|
-
state: () => ({
|
|
3846
|
-
skillChecks: {},
|
|
3847
|
-
skills: {},
|
|
3848
|
-
}),
|
|
3849
|
-
actions: {
|
|
3850
|
-
setupSkillCheck(skillCheck, id) {
|
|
3851
|
-
this.skillChecks[id] = skillCheck;
|
|
3852
|
-
},
|
|
3853
|
-
passSkillCheck(skillCheckId) {
|
|
3854
|
-
this.skillChecks[skillCheckId].passed = true;
|
|
3855
|
-
this.skillChecks[skillCheckId].available = false;
|
|
3856
|
-
},
|
|
3857
|
-
failSkillCheck(skillCheckId) {
|
|
3858
|
-
this.skillChecks[skillCheckId].passed = false;
|
|
3859
|
-
this.skillChecks[skillCheckId].available = false;
|
|
3860
|
-
},
|
|
3861
|
-
generateSaveData() {
|
|
3862
|
-
return {
|
|
3863
|
-
skillChecks: this.skillChecks,
|
|
3864
|
-
skills: this.skills,
|
|
3865
|
-
};
|
|
3866
|
-
},
|
|
3867
|
-
loadSaveData(data) {
|
|
3868
|
-
this.skillChecks = cjs(this.skillChecks, data.skillChecks);
|
|
3869
|
-
this.skills = cjs(this.skills, data.skills);
|
|
3870
|
-
},
|
|
3871
|
-
setupSkills(skills) {
|
|
3872
|
-
// Adds each skill in the skills object to the skills state. Add default values for startingLevel and xp of 0 if those keys are missing.
|
|
3873
|
-
for (const skill in skills) {
|
|
3874
|
-
this.skills[skill] = {
|
|
3875
|
-
level: skills[skill].startingLevel || 0,
|
|
3876
|
-
xp: 0,
|
|
3877
|
-
};
|
|
3878
|
-
}
|
|
3879
|
-
},
|
|
3880
|
-
addXp(skill, xp) {
|
|
3881
|
-
const skillData = this.skills[skill];
|
|
3882
|
-
skillData.xp += xp;
|
|
3883
|
-
if (skillData.xp >= getConfig().skillOptions.xpPerLevel) {
|
|
3884
|
-
skillData.xp = 0;
|
|
3885
|
-
skillData.level++;
|
|
3886
|
-
this.levelledUp(skill);
|
|
3887
|
-
}
|
|
3888
|
-
},
|
|
3889
|
-
incrementSkill(skill, amount) {
|
|
3890
|
-
this.skills[skill].level += amount;
|
|
3891
|
-
this.levelledUp(skill);
|
|
3892
|
-
},
|
|
3893
|
-
levelledUp(skill) {
|
|
3894
|
-
const skillName = getConfig().skills[skill].name;
|
|
3895
|
-
const skillLevel = this.skills[skill].level;
|
|
3896
|
-
useNotifications().addNotification(`Your skill in ${skillName} is now level ${skillLevel}`);
|
|
3897
|
-
},
|
|
3898
|
-
},
|
|
3899
|
-
});
|
|
3900
|
-
|
|
3901
|
-
function getFile(url) {
|
|
3902
|
-
return new Promise((resolve, reject) => {
|
|
3903
|
-
// Set up our HTTP request
|
|
3904
|
-
const xhr = new XMLHttpRequest();
|
|
3905
|
-
// Setup our listener to process completed requests
|
|
3906
|
-
xhr.onload = function () {
|
|
3907
|
-
// Process our return data
|
|
3908
|
-
if (xhr.status >= 200 && xhr.status < 300) {
|
|
3909
|
-
// This will run when the request is successful
|
|
3910
|
-
resolve(xhr.responseText);
|
|
3911
|
-
}
|
|
3912
|
-
else {
|
|
3913
|
-
reject(xhr.status);
|
|
3914
|
-
// This will run when it's not
|
|
3915
|
-
}
|
|
3916
|
-
};
|
|
3917
|
-
xhr.open('GET', url);
|
|
3918
|
-
xhr.send();
|
|
3919
|
-
});
|
|
3920
|
-
}
|
|
3921
|
-
|
|
3922
3695
|
const everyObject = (object, predicate) => {
|
|
3923
3696
|
for (const key in object) {
|
|
3924
3697
|
if (!predicate(object[key])) {
|
|
@@ -3994,26 +3767,248 @@ const useQuests = defineStore('quests', {
|
|
|
3994
3767
|
}
|
|
3995
3768
|
useNotifications().addNotification(`Quest completed: ${getQuestConfig(questId).title}`);
|
|
3996
3769
|
},
|
|
3997
|
-
isQuestCompleted(questId) {
|
|
3998
|
-
const quest = this.getQuest(questId);
|
|
3999
|
-
return everyObject(quest.objectives, (objective) => objective.state === 'completed');
|
|
3770
|
+
isQuestCompleted(questId) {
|
|
3771
|
+
const quest = this.getQuest(questId);
|
|
3772
|
+
return everyObject(quest.objectives, (objective) => objective.state === 'completed');
|
|
3773
|
+
},
|
|
3774
|
+
removeQuest(id) {
|
|
3775
|
+
delete this.quests[id];
|
|
3776
|
+
},
|
|
3777
|
+
generateSaveData() {
|
|
3778
|
+
return {
|
|
3779
|
+
quests: {
|
|
3780
|
+
...this.quests,
|
|
3781
|
+
},
|
|
3782
|
+
};
|
|
3783
|
+
},
|
|
3784
|
+
loadSaveData(data) {
|
|
3785
|
+
this.quests = data.quests;
|
|
3786
|
+
},
|
|
3787
|
+
},
|
|
3788
|
+
});
|
|
3789
|
+
|
|
3790
|
+
var isMergeableObject = function isMergeableObject(value) {
|
|
3791
|
+
return isNonNullObject(value)
|
|
3792
|
+
&& !isSpecial(value)
|
|
3793
|
+
};
|
|
3794
|
+
|
|
3795
|
+
function isNonNullObject(value) {
|
|
3796
|
+
return !!value && typeof value === 'object'
|
|
3797
|
+
}
|
|
3798
|
+
|
|
3799
|
+
function isSpecial(value) {
|
|
3800
|
+
var stringValue = Object.prototype.toString.call(value);
|
|
3801
|
+
|
|
3802
|
+
return stringValue === '[object RegExp]'
|
|
3803
|
+
|| stringValue === '[object Date]'
|
|
3804
|
+
|| isReactElement(value)
|
|
3805
|
+
}
|
|
3806
|
+
|
|
3807
|
+
// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25
|
|
3808
|
+
var canUseSymbol = typeof Symbol === 'function' && Symbol.for;
|
|
3809
|
+
var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;
|
|
3810
|
+
|
|
3811
|
+
function isReactElement(value) {
|
|
3812
|
+
return value.$$typeof === REACT_ELEMENT_TYPE
|
|
3813
|
+
}
|
|
3814
|
+
|
|
3815
|
+
function emptyTarget(val) {
|
|
3816
|
+
return Array.isArray(val) ? [] : {}
|
|
3817
|
+
}
|
|
3818
|
+
|
|
3819
|
+
function cloneUnlessOtherwiseSpecified(value, options) {
|
|
3820
|
+
return (options.clone !== false && options.isMergeableObject(value))
|
|
3821
|
+
? deepmerge(emptyTarget(value), value, options)
|
|
3822
|
+
: value
|
|
3823
|
+
}
|
|
3824
|
+
|
|
3825
|
+
function defaultArrayMerge(target, source, options) {
|
|
3826
|
+
return target.concat(source).map(function(element) {
|
|
3827
|
+
return cloneUnlessOtherwiseSpecified(element, options)
|
|
3828
|
+
})
|
|
3829
|
+
}
|
|
3830
|
+
|
|
3831
|
+
function getMergeFunction(key, options) {
|
|
3832
|
+
if (!options.customMerge) {
|
|
3833
|
+
return deepmerge
|
|
3834
|
+
}
|
|
3835
|
+
var customMerge = options.customMerge(key);
|
|
3836
|
+
return typeof customMerge === 'function' ? customMerge : deepmerge
|
|
3837
|
+
}
|
|
3838
|
+
|
|
3839
|
+
function getEnumerableOwnPropertySymbols(target) {
|
|
3840
|
+
return Object.getOwnPropertySymbols
|
|
3841
|
+
? Object.getOwnPropertySymbols(target).filter(function(symbol) {
|
|
3842
|
+
return target.propertyIsEnumerable(symbol)
|
|
3843
|
+
})
|
|
3844
|
+
: []
|
|
3845
|
+
}
|
|
3846
|
+
|
|
3847
|
+
function getKeys(target) {
|
|
3848
|
+
return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))
|
|
3849
|
+
}
|
|
3850
|
+
|
|
3851
|
+
function propertyIsOnObject(object, property) {
|
|
3852
|
+
try {
|
|
3853
|
+
return property in object
|
|
3854
|
+
} catch(_) {
|
|
3855
|
+
return false
|
|
3856
|
+
}
|
|
3857
|
+
}
|
|
3858
|
+
|
|
3859
|
+
// Protects from prototype poisoning and unexpected merging up the prototype chain.
|
|
3860
|
+
function propertyIsUnsafe(target, key) {
|
|
3861
|
+
return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,
|
|
3862
|
+
&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,
|
|
3863
|
+
&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.
|
|
3864
|
+
}
|
|
3865
|
+
|
|
3866
|
+
function mergeObject(target, source, options) {
|
|
3867
|
+
var destination = {};
|
|
3868
|
+
if (options.isMergeableObject(target)) {
|
|
3869
|
+
getKeys(target).forEach(function(key) {
|
|
3870
|
+
destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);
|
|
3871
|
+
});
|
|
3872
|
+
}
|
|
3873
|
+
getKeys(source).forEach(function(key) {
|
|
3874
|
+
if (propertyIsUnsafe(target, key)) {
|
|
3875
|
+
return
|
|
3876
|
+
}
|
|
3877
|
+
|
|
3878
|
+
if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {
|
|
3879
|
+
destination[key] = getMergeFunction(key, options)(target[key], source[key], options);
|
|
3880
|
+
} else {
|
|
3881
|
+
destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);
|
|
3882
|
+
}
|
|
3883
|
+
});
|
|
3884
|
+
return destination
|
|
3885
|
+
}
|
|
3886
|
+
|
|
3887
|
+
function deepmerge(target, source, options) {
|
|
3888
|
+
options = options || {};
|
|
3889
|
+
options.arrayMerge = options.arrayMerge || defaultArrayMerge;
|
|
3890
|
+
options.isMergeableObject = options.isMergeableObject || isMergeableObject;
|
|
3891
|
+
// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()
|
|
3892
|
+
// implementations can use it. The caller may not replace it.
|
|
3893
|
+
options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;
|
|
3894
|
+
|
|
3895
|
+
var sourceIsArray = Array.isArray(source);
|
|
3896
|
+
var targetIsArray = Array.isArray(target);
|
|
3897
|
+
var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
|
|
3898
|
+
|
|
3899
|
+
if (!sourceAndTargetTypesMatch) {
|
|
3900
|
+
return cloneUnlessOtherwiseSpecified(source, options)
|
|
3901
|
+
} else if (sourceIsArray) {
|
|
3902
|
+
return options.arrayMerge(target, source, options)
|
|
3903
|
+
} else {
|
|
3904
|
+
return mergeObject(target, source, options)
|
|
3905
|
+
}
|
|
3906
|
+
}
|
|
3907
|
+
|
|
3908
|
+
deepmerge.all = function deepmergeAll(array, options) {
|
|
3909
|
+
if (!Array.isArray(array)) {
|
|
3910
|
+
throw new Error('first argument should be an array')
|
|
3911
|
+
}
|
|
3912
|
+
|
|
3913
|
+
return array.reduce(function(prev, next) {
|
|
3914
|
+
return deepmerge(prev, next, options)
|
|
3915
|
+
}, {})
|
|
3916
|
+
};
|
|
3917
|
+
|
|
3918
|
+
var deepmerge_1 = deepmerge;
|
|
3919
|
+
|
|
3920
|
+
var cjs = deepmerge_1;
|
|
3921
|
+
|
|
3922
|
+
// Create a pinia store named skills with a state using the type Skills, with actions:
|
|
3923
|
+
// setupSkillCheck(skillCheck: SkillCheckState, id: string)
|
|
3924
|
+
// passSkillCheck(skillCheckId: string)
|
|
3925
|
+
// failSkillCheck(skillCheckId: string)
|
|
3926
|
+
// generateSaveData(): Function that generates a Skills object from the data in the state
|
|
3927
|
+
// loadSaveData(data: Skills): Function that loads the data into the state
|
|
3928
|
+
// setupSkills(skills: { [key: string]: SkillData})
|
|
3929
|
+
// addXp(skill: string, xp: number): Adds xp to a skill, increases skill level if it reaches the max xp defined in the skillOptions.xpPerLevel key of the config
|
|
3930
|
+
// incrementSkill(skill: string, amount: number): Increments the level of a skill by amount
|
|
3931
|
+
const useSkills = defineStore('skills', {
|
|
3932
|
+
state: () => ({
|
|
3933
|
+
skillChecks: {},
|
|
3934
|
+
skills: {},
|
|
3935
|
+
}),
|
|
3936
|
+
actions: {
|
|
3937
|
+
setupSkillCheck(skillCheck, id) {
|
|
3938
|
+
this.skillChecks[id] = skillCheck;
|
|
3939
|
+
},
|
|
3940
|
+
passSkillCheck(skillCheckId) {
|
|
3941
|
+
this.skillChecks[skillCheckId].passed = true;
|
|
3942
|
+
this.skillChecks[skillCheckId].available = false;
|
|
4000
3943
|
},
|
|
4001
|
-
|
|
4002
|
-
|
|
3944
|
+
failSkillCheck(skillCheckId) {
|
|
3945
|
+
this.skillChecks[skillCheckId].passed = false;
|
|
3946
|
+
this.skillChecks[skillCheckId].available = false;
|
|
4003
3947
|
},
|
|
4004
3948
|
generateSaveData() {
|
|
4005
3949
|
return {
|
|
4006
|
-
|
|
4007
|
-
|
|
4008
|
-
},
|
|
3950
|
+
skillChecks: this.skillChecks,
|
|
3951
|
+
skills: this.skills,
|
|
4009
3952
|
};
|
|
4010
3953
|
},
|
|
4011
3954
|
loadSaveData(data) {
|
|
4012
|
-
this.
|
|
3955
|
+
this.skillChecks = cjs(this.skillChecks, data.skillChecks);
|
|
3956
|
+
this.skills = cjs(this.skills, data.skills);
|
|
3957
|
+
},
|
|
3958
|
+
setupSkills(skills) {
|
|
3959
|
+
// Adds each skill in the skills object to the skills state. Add default values for startingLevel and xp of 0 if those keys are missing.
|
|
3960
|
+
for (const skill in skills) {
|
|
3961
|
+
this.skills[skill] = {
|
|
3962
|
+
level: skills[skill].startingLevel || 0,
|
|
3963
|
+
xp: 0,
|
|
3964
|
+
};
|
|
3965
|
+
}
|
|
3966
|
+
},
|
|
3967
|
+
addXp(skill, xp) {
|
|
3968
|
+
const skillData = this.skills[skill];
|
|
3969
|
+
if (!skillData) {
|
|
3970
|
+
error(`Skill ${skill} doesn't exist`);
|
|
3971
|
+
}
|
|
3972
|
+
skillData.xp += xp;
|
|
3973
|
+
if (skillData.xp >= getConfig().skillOptions.xpPerLevel) {
|
|
3974
|
+
skillData.xp = 0;
|
|
3975
|
+
skillData.level++;
|
|
3976
|
+
this.levelledUp(skill);
|
|
3977
|
+
}
|
|
3978
|
+
},
|
|
3979
|
+
incrementSkill(skill, amount) {
|
|
3980
|
+
this.skills[skill].level += amount;
|
|
3981
|
+
this.levelledUp(skill);
|
|
3982
|
+
},
|
|
3983
|
+
levelledUp(skill) {
|
|
3984
|
+
const skillName = getConfig().skills[skill].name;
|
|
3985
|
+
const skillLevel = this.skills[skill].level;
|
|
3986
|
+
useNotifications().addNotification(`Your skill in ${skillName} is now level ${skillLevel}`);
|
|
4013
3987
|
},
|
|
4014
3988
|
},
|
|
4015
3989
|
});
|
|
4016
3990
|
|
|
3991
|
+
function getFile(url) {
|
|
3992
|
+
return new Promise((resolve, reject) => {
|
|
3993
|
+
// Set up our HTTP request
|
|
3994
|
+
const xhr = new XMLHttpRequest();
|
|
3995
|
+
// Setup our listener to process completed requests
|
|
3996
|
+
xhr.onload = function () {
|
|
3997
|
+
// Process our return data
|
|
3998
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
3999
|
+
// This will run when the request is successful
|
|
4000
|
+
resolve(xhr.responseText);
|
|
4001
|
+
}
|
|
4002
|
+
else {
|
|
4003
|
+
reject(xhr.status);
|
|
4004
|
+
// This will run when it's not
|
|
4005
|
+
}
|
|
4006
|
+
};
|
|
4007
|
+
xhr.open('GET', url);
|
|
4008
|
+
xhr.send();
|
|
4009
|
+
});
|
|
4010
|
+
}
|
|
4011
|
+
|
|
4017
4012
|
// Create a pinia store named screens with a state using the type ScreenState, with actions:
|
|
4018
4013
|
// setScreen(screen: string): Sets the current screen to the given screen
|
|
4019
4014
|
// setButtons(buttons: { [key: string]: ButtonConfig }): Adds buttons to the buttons state by using the values in the buttons config object
|
|
@@ -4305,6 +4300,7 @@ const useVM = defineStore('vm', {
|
|
|
4305
4300
|
data: {},
|
|
4306
4301
|
lastLabel: 'main',
|
|
4307
4302
|
script: {},
|
|
4303
|
+
labelStack: ['main'],
|
|
4308
4304
|
}),
|
|
4309
4305
|
actions: {
|
|
4310
4306
|
generateSaveData() {
|
|
@@ -4381,6 +4377,7 @@ const useVM = defineStore('vm', {
|
|
|
4381
4377
|
newStack.label = this.currentStack.label;
|
|
4382
4378
|
}
|
|
4383
4379
|
this.stack.push(newStack);
|
|
4380
|
+
return this.runLine();
|
|
4384
4381
|
},
|
|
4385
4382
|
async nextLine() {
|
|
4386
4383
|
if (this.stack.length === 0) {
|
|
@@ -4408,6 +4405,7 @@ const useVM = defineStore('vm', {
|
|
|
4408
4405
|
this.stack.splice(this.stack.length - 1, 1);
|
|
4409
4406
|
},
|
|
4410
4407
|
finishGame() {
|
|
4408
|
+
useInventory().onScriptEnd();
|
|
4411
4409
|
const mainStore = useMain();
|
|
4412
4410
|
if (mainStore.options.debug) {
|
|
4413
4411
|
const dialogStore = useDialogStore();
|
|
@@ -4419,8 +4417,24 @@ const useVM = defineStore('vm', {
|
|
|
4419
4417
|
},
|
|
4420
4418
|
async runLine() {
|
|
4421
4419
|
const cmd = this.currentLine;
|
|
4420
|
+
useInventory().onScriptStart();
|
|
4422
4421
|
await runCommand(cmd);
|
|
4423
4422
|
},
|
|
4423
|
+
async runLabelFunction(label, comeBackToSameLine) {
|
|
4424
|
+
if (comeBackToSameLine) {
|
|
4425
|
+
this.currentStack.currentIndex--;
|
|
4426
|
+
}
|
|
4427
|
+
const branch = this.script[label];
|
|
4428
|
+
if (!branch) {
|
|
4429
|
+
console.error(`Label ${branch} doesn't exist`);
|
|
4430
|
+
}
|
|
4431
|
+
const stack = {
|
|
4432
|
+
currentIndex: 0,
|
|
4433
|
+
branch: branch,
|
|
4434
|
+
label,
|
|
4435
|
+
};
|
|
4436
|
+
await this.addStack(stack);
|
|
4437
|
+
},
|
|
4424
4438
|
runLabel(label) {
|
|
4425
4439
|
const branch = this.script[label];
|
|
4426
4440
|
if (!branch) {
|
|
@@ -4449,6 +4463,93 @@ const useVM = defineStore('vm', {
|
|
|
4449
4463
|
},
|
|
4450
4464
|
});
|
|
4451
4465
|
|
|
4466
|
+
function processText(text) {
|
|
4467
|
+
const vmStore = useVM();
|
|
4468
|
+
const skillStore = useSkills();
|
|
4469
|
+
return text.replace(/%{[^}]*}/g, (match) => {
|
|
4470
|
+
const key = match.substr(2, match.length - 3);
|
|
4471
|
+
const searchableState = {
|
|
4472
|
+
data: vmStore.data,
|
|
4473
|
+
skills: skillStore.skills,
|
|
4474
|
+
items: useInventory().items,
|
|
4475
|
+
quests: useQuests().quests,
|
|
4476
|
+
};
|
|
4477
|
+
const [obj, newKey] = findDataHelper(searchableState, key);
|
|
4478
|
+
return obj[newKey];
|
|
4479
|
+
});
|
|
4480
|
+
}
|
|
4481
|
+
|
|
4482
|
+
// Create a pinia store named dialog with a state using the type DialogState, with actions addDialog and clearDialog
|
|
4483
|
+
const useDialogStore = defineStore('dialog', {
|
|
4484
|
+
state: () => ({
|
|
4485
|
+
dialog: [],
|
|
4486
|
+
}),
|
|
4487
|
+
actions: {
|
|
4488
|
+
generateSaveData() {
|
|
4489
|
+
return {
|
|
4490
|
+
dialog: this.dialog,
|
|
4491
|
+
};
|
|
4492
|
+
},
|
|
4493
|
+
loadSaveData(data) {
|
|
4494
|
+
this.dialog = data.dialog;
|
|
4495
|
+
},
|
|
4496
|
+
addDialog(dialog) {
|
|
4497
|
+
this.dialog.push({
|
|
4498
|
+
...dialog,
|
|
4499
|
+
interactive: dialog.interactive ?? false,
|
|
4500
|
+
id: randomId(),
|
|
4501
|
+
text: processText(dialog.text),
|
|
4502
|
+
});
|
|
4503
|
+
},
|
|
4504
|
+
clearDialog() {
|
|
4505
|
+
this.dialog.splice(0, this.dialog.length);
|
|
4506
|
+
},
|
|
4507
|
+
reset() {
|
|
4508
|
+
this.dialog = [];
|
|
4509
|
+
},
|
|
4510
|
+
},
|
|
4511
|
+
getters: {
|
|
4512
|
+
currentDialog() {
|
|
4513
|
+
return this.dialog[this.dialog.length - 1];
|
|
4514
|
+
},
|
|
4515
|
+
},
|
|
4516
|
+
});
|
|
4517
|
+
|
|
4518
|
+
// Create a pinia store named hud with a state using the type HudState, and save type HudSave, with actions:
|
|
4519
|
+
// setupHudStats(stats: { [key: string]: HudStatConfig }): Iterates the stats argument to add new stats to the state
|
|
4520
|
+
// setStat(stat: string, value: number): Sets the value of a stat
|
|
4521
|
+
// addStat(stat: string, value: number): Adds a value to a stat
|
|
4522
|
+
// generateSaveData(): Function that generates a HudSave object from the data in the state
|
|
4523
|
+
// loadSaveData(data: HudSave): Function that loads the data into the state
|
|
4524
|
+
const useHud = defineStore('hud', {
|
|
4525
|
+
state: () => ({
|
|
4526
|
+
hudStats: {},
|
|
4527
|
+
}),
|
|
4528
|
+
actions: {
|
|
4529
|
+
setupHudStats(stats) {
|
|
4530
|
+
for (const stat in stats) {
|
|
4531
|
+
this.hudStats[stat] = {
|
|
4532
|
+
value: stats[stat].startingValue,
|
|
4533
|
+
};
|
|
4534
|
+
}
|
|
4535
|
+
},
|
|
4536
|
+
setStat(stat, value) {
|
|
4537
|
+
this.hudStats[stat].value = value;
|
|
4538
|
+
},
|
|
4539
|
+
addStat(stat, value) {
|
|
4540
|
+
this.hudStats[stat].value += value;
|
|
4541
|
+
},
|
|
4542
|
+
generateSaveData() {
|
|
4543
|
+
return {
|
|
4544
|
+
hudStats: this.hudStats,
|
|
4545
|
+
};
|
|
4546
|
+
},
|
|
4547
|
+
loadSaveData(data) {
|
|
4548
|
+
this.hudStats = cjs(this.hudStats, data.hudStats);
|
|
4549
|
+
},
|
|
4550
|
+
},
|
|
4551
|
+
});
|
|
4552
|
+
|
|
4452
4553
|
function createSkillCheckState() {
|
|
4453
4554
|
const skillCheck = {
|
|
4454
4555
|
passed: false,
|
|
@@ -4722,8 +4823,7 @@ async function playerAnswered(choiceIndex) {
|
|
|
4722
4823
|
branch: newBranch,
|
|
4723
4824
|
};
|
|
4724
4825
|
const vmStore = useVM();
|
|
4725
|
-
vmStore.addStack(newStack);
|
|
4726
|
-
vmStore.runLine();
|
|
4826
|
+
return vmStore.addStack(newStack);
|
|
4727
4827
|
}
|
|
4728
4828
|
else {
|
|
4729
4829
|
vmStore.nextLine();
|
|
@@ -4868,7 +4968,12 @@ const useMain = defineStore('main', {
|
|
|
4868
4968
|
this.modal = false;
|
|
4869
4969
|
},
|
|
4870
4970
|
toggleMenu() {
|
|
4871
|
-
|
|
4971
|
+
if (this.modal) {
|
|
4972
|
+
this.modal = false;
|
|
4973
|
+
}
|
|
4974
|
+
else {
|
|
4975
|
+
this.modal = 'menu';
|
|
4976
|
+
}
|
|
4872
4977
|
},
|
|
4873
4978
|
pause() {
|
|
4874
4979
|
this.paused = true;
|
|
@@ -4885,11 +4990,13 @@ const useMain = defineStore('main', {
|
|
|
4885
4990
|
},
|
|
4886
4991
|
reset() {
|
|
4887
4992
|
this.ready = false;
|
|
4888
|
-
this.playing = false;
|
|
4889
4993
|
this.errors = [];
|
|
4890
|
-
this.flowState = 'menu';
|
|
4891
4994
|
this.modal = false;
|
|
4892
4995
|
this.paused = false;
|
|
4996
|
+
useVM().reset();
|
|
4997
|
+
useAudio().reset();
|
|
4998
|
+
this.playing = false;
|
|
4999
|
+
this.ready = true;
|
|
4893
5000
|
},
|
|
4894
5001
|
generateSaveData() {
|
|
4895
5002
|
return {
|
|
@@ -7714,22 +7821,6 @@ styleInject(css_248z$8);
|
|
|
7714
7821
|
|
|
7715
7822
|
script$7.render = render$7;
|
|
7716
7823
|
|
|
7717
|
-
function processText(text) {
|
|
7718
|
-
const vmStore = useVM();
|
|
7719
|
-
const skillStore = useSkills();
|
|
7720
|
-
return text.replace(/%{[^}]*}/g, (match) => {
|
|
7721
|
-
const key = match.substr(2, match.length - 3);
|
|
7722
|
-
const searchableState = {
|
|
7723
|
-
data: vmStore.data,
|
|
7724
|
-
skills: skillStore.skills,
|
|
7725
|
-
items: useInventory().items,
|
|
7726
|
-
quests: useQuests().quests,
|
|
7727
|
-
};
|
|
7728
|
-
const [obj, newKey] = findDataHelper(searchableState, key);
|
|
7729
|
-
return obj[newKey];
|
|
7730
|
-
});
|
|
7731
|
-
}
|
|
7732
|
-
|
|
7733
7824
|
function aspectRatioFit(screenWidth, screenHeight, gameWidth, gameHeight) {
|
|
7734
7825
|
const widthRatio = screenWidth / gameWidth;
|
|
7735
7826
|
const heightRatio = screenHeight / gameHeight;
|
|
@@ -7944,7 +8035,9 @@ var script$9 = defineComponent({
|
|
|
7944
8035
|
Modal: script$2,
|
|
7945
8036
|
VolumeControls: script$4,
|
|
7946
8037
|
},
|
|
7947
|
-
props: {
|
|
8038
|
+
props: {
|
|
8039
|
+
close: Function,
|
|
8040
|
+
},
|
|
7948
8041
|
data() { },
|
|
7949
8042
|
mounted() { },
|
|
7950
8043
|
methods: {
|
|
@@ -7952,9 +8045,6 @@ var script$9 = defineComponent({
|
|
|
7952
8045
|
window.close();
|
|
7953
8046
|
// quit
|
|
7954
8047
|
},
|
|
7955
|
-
close() {
|
|
7956
|
-
this.$emit('close');
|
|
7957
|
-
},
|
|
7958
8048
|
mainMenu() {
|
|
7959
8049
|
useMain().menuReturn();
|
|
7960
8050
|
this.close();
|
|
@@ -8018,7 +8108,7 @@ var script$a = defineComponent({
|
|
|
8018
8108
|
VolumeControls: script$4,
|
|
8019
8109
|
},
|
|
8020
8110
|
props: {
|
|
8021
|
-
close:
|
|
8111
|
+
close: Function,
|
|
8022
8112
|
},
|
|
8023
8113
|
data() {
|
|
8024
8114
|
return {
|
|
@@ -8069,20 +8159,17 @@ var script$a = defineComponent({
|
|
|
8069
8159
|
});
|
|
8070
8160
|
|
|
8071
8161
|
const _hoisted_1$9 = /*#__PURE__*/createElementVNode("h3", { class: "title" }, "Skills", -1);
|
|
8072
|
-
const _hoisted_2$7 = {
|
|
8073
|
-
const _hoisted_3$4 = {
|
|
8162
|
+
const _hoisted_2$7 = {
|
|
8074
8163
|
key: 0,
|
|
8075
8164
|
class: "skills-container"
|
|
8076
8165
|
};
|
|
8077
|
-
const
|
|
8078
|
-
const
|
|
8079
|
-
const
|
|
8080
|
-
const
|
|
8081
|
-
const
|
|
8082
|
-
const
|
|
8083
|
-
|
|
8084
|
-
class: "flex flex-row skill-description-container"
|
|
8085
|
-
};
|
|
8166
|
+
const _hoisted_3$4 = ["onClick"];
|
|
8167
|
+
const _hoisted_4$3 = { class: "skill-title" };
|
|
8168
|
+
const _hoisted_5$3 = { class: "skill-xp-container" };
|
|
8169
|
+
const _hoisted_6$3 = { class: "skill-xp-text" };
|
|
8170
|
+
const _hoisted_7$2 = { class: "skill-level" };
|
|
8171
|
+
const _hoisted_8$1 = { key: 1 };
|
|
8172
|
+
const _hoisted_9$1 = { class: "flex flex-row skill-description-container" };
|
|
8086
8173
|
const _hoisted_10$1 = { class: "flex skill-left" };
|
|
8087
8174
|
const _hoisted_11$1 = { class: "flex skill-right" };
|
|
8088
8175
|
const _hoisted_12$1 = /*#__PURE__*/createElementVNode("hr", { class: "hr-solid" }, null, -1);
|
|
@@ -8099,35 +8186,31 @@ function render$a(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
8099
8186
|
_hoisted_1$9
|
|
8100
8187
|
]),
|
|
8101
8188
|
body: withCtx(() => [
|
|
8102
|
-
|
|
8103
|
-
(
|
|
8104
|
-
|
|
8105
|
-
(openBlock(
|
|
8106
|
-
|
|
8107
|
-
|
|
8108
|
-
|
|
8109
|
-
|
|
8110
|
-
|
|
8111
|
-
|
|
8112
|
-
|
|
8113
|
-
createElementVNode("div",
|
|
8114
|
-
|
|
8115
|
-
|
|
8116
|
-
|
|
8117
|
-
|
|
8118
|
-
|
|
8119
|
-
|
|
8120
|
-
|
|
8121
|
-
|
|
8122
|
-
|
|
8123
|
-
|
|
8124
|
-
|
|
8125
|
-
|
|
8189
|
+
(!_ctx.chosenSkill)
|
|
8190
|
+
? (openBlock(), createElementBlock("div", _hoisted_2$7, [
|
|
8191
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.skillsToDisplay, (skill, key) => {
|
|
8192
|
+
return (openBlock(), createElementBlock("button", {
|
|
8193
|
+
onClick: () => _ctx.clickSkill(key),
|
|
8194
|
+
class: "skill-display",
|
|
8195
|
+
style: normalizeStyle(_ctx.getSkillStyle(key)),
|
|
8196
|
+
key: key
|
|
8197
|
+
}, [
|
|
8198
|
+
createElementVNode("h3", _hoisted_4$3, toDisplayString(_ctx.getSkillName(key)), 1),
|
|
8199
|
+
createElementVNode("div", _hoisted_5$3, [
|
|
8200
|
+
createElementVNode("div", {
|
|
8201
|
+
class: "skill-xp-bar",
|
|
8202
|
+
style: normalizeStyle(_ctx.xpBarWidth(skill.xp))
|
|
8203
|
+
}, null, 4),
|
|
8204
|
+
createElementVNode("h3", _hoisted_6$3, toDisplayString(skill.xp) + " / " + toDisplayString(_ctx.xpPerLevel) + " XP", 1)
|
|
8205
|
+
]),
|
|
8206
|
+
createElementVNode("h3", _hoisted_7$2, toDisplayString(skill.level), 1)
|
|
8207
|
+
], 12, _hoisted_3$4))
|
|
8208
|
+
}), 128))
|
|
8209
|
+
]))
|
|
8210
|
+
: (typeof _ctx.chosenSkill === 'string')
|
|
8211
|
+
? (openBlock(), createElementBlock("div", _hoisted_8$1, [
|
|
8212
|
+
createElementVNode("div", _hoisted_9$1, [
|
|
8126
8213
|
createElementVNode("div", _hoisted_10$1, [
|
|
8127
|
-
createElementVNode("button", {
|
|
8128
|
-
class: "button",
|
|
8129
|
-
onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.closeSkill && _ctx.closeSkill(...args)))
|
|
8130
|
-
}, "Back"),
|
|
8131
8214
|
createElementVNode("div", {
|
|
8132
8215
|
class: "skill-display",
|
|
8133
8216
|
style: normalizeStyle(_ctx.getSkillStyle(_ctx.chosenSkill))
|
|
@@ -8139,15 +8222,19 @@ function render$a(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
8139
8222
|
createElementVNode("h3", null, "Level: " + toDisplayString(_ctx.skills[_ctx.chosenSkill].level), 1),
|
|
8140
8223
|
createElementVNode("p", null, toDisplayString(_ctx.skillConf[_ctx.chosenSkill].description), 1)
|
|
8141
8224
|
])
|
|
8142
|
-
])
|
|
8143
|
-
|
|
8144
|
-
|
|
8225
|
+
]),
|
|
8226
|
+
createElementVNode("button", {
|
|
8227
|
+
class: "button",
|
|
8228
|
+
onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.closeSkill && _ctx.closeSkill(...args)))
|
|
8229
|
+
}, toDisplayString('<--'))
|
|
8230
|
+
]))
|
|
8231
|
+
: createCommentVNode("", true)
|
|
8145
8232
|
]),
|
|
8146
8233
|
_: 1
|
|
8147
8234
|
}, 8, ["onClose"]))
|
|
8148
8235
|
}
|
|
8149
8236
|
|
|
8150
|
-
var css_248z$b = ".skills-modal {\n width: 800px;\n}\n\n.skills-container {\n display: grid;\n grid-auto-rows: auto;\n grid-template-columns: repeat(3, 1fr);\n grid-gap: 20px 20px;\n}\n\n.skill-display {\n width: 200px;\n height: 300px;\n position: relative;\n background-size: cover;\n}\n\n.skill-title {\n position: absolute;\n bottom: 0px;\n text-align: center;\n width: 100%;\n color: var(--skills-text-color);\n background: var(--skills-text-background);\n}\n\n.skill-level {\n position: absolute;\n top: 0;\n right: 0;\n font-weight: 700;\n font-size: 25px;\n color: var(--skills-level-color);\n width: var(--skills-xp-bar-height);\n height: var(--skills-xp-bar-height);\n background-color: var(--skills-level-background);\n}\n\n.skill-description-container {\n justify-content: space-between;\n align-items:
|
|
8237
|
+
var css_248z$b = ".skills-modal {\n width: 800px;\n}\n\n.skills-container {\n display: grid;\n grid-auto-rows: auto;\n grid-template-columns: repeat(3, 1fr);\n grid-gap: 20px 20px;\n}\n\n.skill-display {\n width: 200px;\n height: 300px;\n position: relative;\n background-size: cover;\n}\n\n.skill-title {\n position: absolute;\n bottom: 0px;\n text-align: center;\n width: 100%;\n color: var(--skills-text-color);\n background: var(--skills-text-background);\n}\n\n.skill-level {\n position: absolute;\n top: 0;\n right: 0;\n font-weight: 700;\n font-size: 25px;\n color: var(--skills-level-color);\n width: var(--skills-xp-bar-height);\n height: var(--skills-xp-bar-height);\n background-color: var(--skills-level-background);\n}\n\n.skill-description-container {\n justify-content: space-between;\n align-items: stretch;\n}\n\n.skill-left {\n flex-direction: column;\n border: 1px dashed white;\n padding: 10px;\n justify-content: center;\n}\n\n.skill-right {\n border: 1px dashed white;\n flex-direction: column;\n align-items: baseline;\n flex-grow: 2;\n align-items: baseline;\n}\n\n.skill-xp-container {\n position: absolute;\n top: 0;\n left: 0;\n height: var(--skills-xp-bar-height);\n width: calc(100% - var(--skills-xp-bar-height));\n background-color: rgba(0, 0, 0, 0.5);\n}\n\n.skill-xp-bar {\n position: absolute;\n top: 0;\n left: 0;\n width: 50%;\n height: 100%;\n background-color: rgba(0, 0, 250, 0.5);\n}\n\n.skill-xp-text {\n z-index: 2;\n}\r\n";
|
|
8151
8238
|
styleInject(css_248z$b);
|
|
8152
8239
|
|
|
8153
8240
|
script$a.render = render$a;
|
|
@@ -8155,14 +8242,16 @@ script$a.render = render$a;
|
|
|
8155
8242
|
var script$b = defineComponent({
|
|
8156
8243
|
setup() {
|
|
8157
8244
|
const store = useInventory();
|
|
8245
|
+
const dialogStore = useDialogStore();
|
|
8158
8246
|
const items = computed(() => store.items);
|
|
8159
|
-
|
|
8247
|
+
const currentlyChoosing = computed(() => dialogStore.currentDialog.choices);
|
|
8248
|
+
return { items, currentlyChoosing };
|
|
8160
8249
|
},
|
|
8161
8250
|
components: {
|
|
8162
8251
|
Modal: script$2,
|
|
8163
8252
|
},
|
|
8164
8253
|
props: {
|
|
8165
|
-
close:
|
|
8254
|
+
close: Function,
|
|
8166
8255
|
},
|
|
8167
8256
|
data() {
|
|
8168
8257
|
return {
|
|
@@ -8179,12 +8268,40 @@ var script$b = defineComponent({
|
|
|
8179
8268
|
getItemName(item) {
|
|
8180
8269
|
return this.itemConf[item].name;
|
|
8181
8270
|
},
|
|
8271
|
+
getItemConf(item) {
|
|
8272
|
+
return this.itemConf[item];
|
|
8273
|
+
},
|
|
8182
8274
|
clickItem(item) {
|
|
8183
8275
|
this.chosenId = item;
|
|
8184
8276
|
},
|
|
8185
8277
|
closeItem() {
|
|
8186
8278
|
this.chosenId = false;
|
|
8187
8279
|
},
|
|
8280
|
+
useItem() {
|
|
8281
|
+
if (this.canUseChosenItem) {
|
|
8282
|
+
const onUse = this.chosenItemConf.onUse;
|
|
8283
|
+
this.close();
|
|
8284
|
+
if (onUse.action === 'jump') {
|
|
8285
|
+
useVM().runLabel(onUse.label);
|
|
8286
|
+
}
|
|
8287
|
+
else if (onUse.action === 'run_label') {
|
|
8288
|
+
useVM().runLabelFunction(onUse.label, true);
|
|
8289
|
+
}
|
|
8290
|
+
else {
|
|
8291
|
+
error(`Unknown action ${onUse.action}`);
|
|
8292
|
+
}
|
|
8293
|
+
}
|
|
8294
|
+
},
|
|
8295
|
+
canUseItem(item) {
|
|
8296
|
+
const conf = this.itemConf[item.id];
|
|
8297
|
+
if (conf &&
|
|
8298
|
+
conf.onUse &&
|
|
8299
|
+
!useInventory().isInteractionTagBlocked(conf.tag) &&
|
|
8300
|
+
!this.currentlyChoosing) {
|
|
8301
|
+
return true;
|
|
8302
|
+
}
|
|
8303
|
+
return false;
|
|
8304
|
+
},
|
|
8188
8305
|
},
|
|
8189
8306
|
computed: {
|
|
8190
8307
|
itemsToDisplay() {
|
|
@@ -8202,6 +8319,9 @@ var script$b = defineComponent({
|
|
|
8202
8319
|
}
|
|
8203
8320
|
return null;
|
|
8204
8321
|
},
|
|
8322
|
+
canUseChosenItem() {
|
|
8323
|
+
return this.canUseItem(this.chosenItem);
|
|
8324
|
+
},
|
|
8205
8325
|
chosenItemConf() {
|
|
8206
8326
|
if (this.chosenId) {
|
|
8207
8327
|
return this.itemConf[this.chosenId];
|
|
@@ -8215,18 +8335,15 @@ var script$b = defineComponent({
|
|
|
8215
8335
|
});
|
|
8216
8336
|
|
|
8217
8337
|
const _hoisted_1$a = /*#__PURE__*/createElementVNode("h3", { class: "title" }, "Inventory", -1);
|
|
8218
|
-
const _hoisted_2$8 = {
|
|
8219
|
-
const _hoisted_3$5 = {
|
|
8338
|
+
const _hoisted_2$8 = {
|
|
8220
8339
|
key: 0,
|
|
8221
8340
|
class: "inventory-container"
|
|
8222
8341
|
};
|
|
8223
|
-
const
|
|
8224
|
-
const
|
|
8225
|
-
const
|
|
8226
|
-
const
|
|
8227
|
-
|
|
8228
|
-
class: "flex flex-row item-description-container"
|
|
8229
|
-
};
|
|
8342
|
+
const _hoisted_3$5 = ["onClick"];
|
|
8343
|
+
const _hoisted_4$4 = { class: "item-title" };
|
|
8344
|
+
const _hoisted_5$4 = { class: "item-amount" };
|
|
8345
|
+
const _hoisted_6$4 = { key: 1 };
|
|
8346
|
+
const _hoisted_7$3 = { class: "flex flex-row item-description-container" };
|
|
8230
8347
|
const _hoisted_8$2 = { class: "flex item-left" };
|
|
8231
8348
|
const _hoisted_9$2 = { class: "flex item-right" };
|
|
8232
8349
|
const _hoisted_10$2 = /*#__PURE__*/createElementVNode("hr", { class: "hr-solid" }, null, -1);
|
|
@@ -8248,28 +8365,24 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
8248
8365
|
_hoisted_1$a
|
|
8249
8366
|
]),
|
|
8250
8367
|
body: withCtx(() => [
|
|
8251
|
-
|
|
8252
|
-
|
|
8253
|
-
|
|
8254
|
-
(openBlock(
|
|
8255
|
-
|
|
8256
|
-
|
|
8257
|
-
|
|
8258
|
-
|
|
8259
|
-
|
|
8260
|
-
|
|
8261
|
-
|
|
8262
|
-
|
|
8263
|
-
|
|
8264
|
-
|
|
8265
|
-
|
|
8266
|
-
|
|
8267
|
-
|
|
8368
|
+
(!_ctx.chosenItem && Object.keys(_ctx.itemsToDisplay).length > 0)
|
|
8369
|
+
? (openBlock(), createElementBlock("div", _hoisted_2$8, [
|
|
8370
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.itemsToDisplay, (item) => {
|
|
8371
|
+
return (openBlock(), createElementBlock("button", {
|
|
8372
|
+
onClick: () => _ctx.clickItem(item.id),
|
|
8373
|
+
class: "item-display",
|
|
8374
|
+
style: normalizeStyle(_ctx.getItemStyle(item.id)),
|
|
8375
|
+
key: item.id
|
|
8376
|
+
}, [
|
|
8377
|
+
createElementVNode("h3", _hoisted_4$4, toDisplayString(_ctx.getItemName(item.id)), 1),
|
|
8378
|
+
createElementVNode("h3", _hoisted_5$4, toDisplayString(item.amount), 1)
|
|
8379
|
+
], 12, _hoisted_3$5))
|
|
8380
|
+
}), 128))
|
|
8381
|
+
]))
|
|
8382
|
+
: (typeof _ctx.chosenId === 'string')
|
|
8383
|
+
? (openBlock(), createElementBlock("div", _hoisted_6$4, [
|
|
8384
|
+
createElementVNode("div", _hoisted_7$3, [
|
|
8268
8385
|
createElementVNode("div", _hoisted_8$2, [
|
|
8269
|
-
createElementVNode("button", {
|
|
8270
|
-
class: "button",
|
|
8271
|
-
onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.closeItem && _ctx.closeItem(...args)))
|
|
8272
|
-
}, "Back"),
|
|
8273
8386
|
createElementVNode("div", {
|
|
8274
8387
|
class: "item-display",
|
|
8275
8388
|
style: normalizeStyle(_ctx.getItemStyle(_ctx.chosenId))
|
|
@@ -8279,17 +8392,25 @@ function render$b(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
8279
8392
|
createElementVNode("h2", null, toDisplayString(_ctx.getItemName(_ctx.chosenId)), 1),
|
|
8280
8393
|
_hoisted_10$2,
|
|
8281
8394
|
createElementVNode("h3", null, "Amount: " + toDisplayString(_ctx.chosenItem.amount), 1),
|
|
8282
|
-
createElementVNode("p", null, toDisplayString(_ctx.chosenItemConf.description), 1)
|
|
8395
|
+
createElementVNode("p", null, toDisplayString(_ctx.chosenItemConf.description), 1),
|
|
8396
|
+
createElementVNode("button", {
|
|
8397
|
+
onClick: _cache[0] || (_cache[0] = (...args) => (_ctx.useItem && _ctx.useItem(...args))),
|
|
8398
|
+
class: normalizeClass(["button", _ctx.canUseChosenItem ? '' : 'disabled'])
|
|
8399
|
+
}, " Use ", 2)
|
|
8283
8400
|
])
|
|
8284
|
-
])
|
|
8285
|
-
|
|
8286
|
-
|
|
8401
|
+
]),
|
|
8402
|
+
createElementVNode("button", {
|
|
8403
|
+
class: "button",
|
|
8404
|
+
onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.closeItem && _ctx.closeItem(...args)))
|
|
8405
|
+
}, toDisplayString('<--'))
|
|
8406
|
+
]))
|
|
8407
|
+
: (openBlock(), createElementBlock("div", _hoisted_11$2, _hoisted_13$1))
|
|
8287
8408
|
]),
|
|
8288
8409
|
_: 1
|
|
8289
8410
|
}, 8, ["onClose"]))
|
|
8290
8411
|
}
|
|
8291
8412
|
|
|
8292
|
-
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:
|
|
8413
|
+
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: stretch;\n}\n\n.item-left {\n border: 1px dashed white;\n flex-direction: column;\n padding: 10px;\n justify-content: center;\n}\n\n.item-right {\n border: 1px dashed white;\n flex-direction: column;\n flex-grow: 2;\n align-items: baseline;\n padding: 10px;\n}\r\n";
|
|
8293
8414
|
styleInject(css_248z$c);
|
|
8294
8415
|
|
|
8295
8416
|
script$b.render = render$b;
|
|
@@ -8306,7 +8427,7 @@ var script$c = defineComponent({
|
|
|
8306
8427
|
},
|
|
8307
8428
|
},
|
|
8308
8429
|
props: {
|
|
8309
|
-
close:
|
|
8430
|
+
close: Function,
|
|
8310
8431
|
},
|
|
8311
8432
|
methods: {
|
|
8312
8433
|
getQuestData(questId) {
|
|
@@ -8711,7 +8832,7 @@ var script$d = defineComponent({
|
|
|
8711
8832
|
}
|
|
8712
8833
|
return {
|
|
8713
8834
|
title,
|
|
8714
|
-
text:
|
|
8835
|
+
text: dialogKey.text,
|
|
8715
8836
|
styleId: dialogKey.speaker,
|
|
8716
8837
|
choices: dialogKey.choices,
|
|
8717
8838
|
old: index < this.dialog.length - 1,
|
|
@@ -8763,26 +8884,26 @@ function render$d(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
8763
8884
|
(_ctx.modal === 'skills')
|
|
8764
8885
|
? (openBlock(), createBlock(_component_Skills, {
|
|
8765
8886
|
key: 0,
|
|
8766
|
-
|
|
8767
|
-
}, null, 8, ["
|
|
8887
|
+
close: _ctx.closeModal
|
|
8888
|
+
}, null, 8, ["close"]))
|
|
8768
8889
|
: createCommentVNode("", true),
|
|
8769
8890
|
(_ctx.modal === 'inventory')
|
|
8770
8891
|
? (openBlock(), createBlock(_component_Inventory, {
|
|
8771
8892
|
key: 1,
|
|
8772
|
-
|
|
8773
|
-
}, null, 8, ["
|
|
8893
|
+
close: _ctx.closeModal
|
|
8894
|
+
}, null, 8, ["close"]))
|
|
8774
8895
|
: createCommentVNode("", true),
|
|
8775
8896
|
(_ctx.modal === 'quests')
|
|
8776
8897
|
? (openBlock(), createBlock(_component_Quests, {
|
|
8777
8898
|
key: 2,
|
|
8778
|
-
|
|
8779
|
-
}, null, 8, ["
|
|
8899
|
+
close: _ctx.closeModal
|
|
8900
|
+
}, null, 8, ["close"]))
|
|
8780
8901
|
: createCommentVNode("", true),
|
|
8781
8902
|
(_ctx.modal === 'menu')
|
|
8782
8903
|
? (openBlock(), createBlock(_component_MainMenu, {
|
|
8783
8904
|
key: 3,
|
|
8784
|
-
|
|
8785
|
-
}, null, 8, ["
|
|
8905
|
+
close: _ctx.closeModal
|
|
8906
|
+
}, null, 8, ["close"]))
|
|
8786
8907
|
: createCommentVNode("", true),
|
|
8787
8908
|
createVNode(Transition, { name: "fade" }, {
|
|
8788
8909
|
default: withCtx(() => [
|
|
@@ -9156,8 +9277,7 @@ const ifFunction = async (cmd) => {
|
|
|
9156
9277
|
branch: newBranch,
|
|
9157
9278
|
currentIndex: 0,
|
|
9158
9279
|
};
|
|
9159
|
-
vmStore.addStack(newStack);
|
|
9160
|
-
return vmStore.runLine();
|
|
9280
|
+
return vmStore.addStack(newStack);
|
|
9161
9281
|
}
|
|
9162
9282
|
return vmStore.nextLine();
|
|
9163
9283
|
};
|
|
@@ -9382,8 +9502,7 @@ const addItemPlugin = new CommandPlugin('add_item', async (cmd) => {
|
|
|
9382
9502
|
amount,
|
|
9383
9503
|
});
|
|
9384
9504
|
return useVM().nextLine();
|
|
9385
|
-
}, generateParser('add_item'));
|
|
9386
|
-
|
|
9505
|
+
}, generateParser('add_item'));
|
|
9387
9506
|
// Write a CommandPlugin for removeing items to the inventory store
|
|
9388
9507
|
const removeItemPlugin = new CommandPlugin('remove_item', async (cmd) => {
|
|
9389
9508
|
const id = cmd.args[0];
|
|
@@ -9394,7 +9513,21 @@ const removeItemPlugin = new CommandPlugin('remove_item', async (cmd) => {
|
|
|
9394
9513
|
amount,
|
|
9395
9514
|
});
|
|
9396
9515
|
return useVM().nextLine();
|
|
9397
|
-
}, generateParser('remove_item'));
|
|
9516
|
+
}, generateParser('remove_item'));
|
|
9517
|
+
// Write a CommandPlugin for enabling an interactiongTag in the inventory store
|
|
9518
|
+
const enableInteractionPlugin = new CommandPlugin('enable_interaction', async (cmd) => {
|
|
9519
|
+
const tag = cmd.args[0];
|
|
9520
|
+
const inventory = useInventory();
|
|
9521
|
+
inventory.enableInteraction(tag);
|
|
9522
|
+
return useVM().nextLine();
|
|
9523
|
+
}, generateParser('enable_interaction'));
|
|
9524
|
+
// Write a CommandPlugin for disabling an interactiongTag in the inventory store
|
|
9525
|
+
const disableInteractionPlugin = new CommandPlugin('disable_interaction', async (cmd) => {
|
|
9526
|
+
const tag = cmd.args[0];
|
|
9527
|
+
const inventory = useInventory();
|
|
9528
|
+
inventory.disableInteraction(tag);
|
|
9529
|
+
return useVM().nextLine();
|
|
9530
|
+
}, generateParser('disable_interaction'));
|
|
9398
9531
|
|
|
9399
9532
|
// Write a CommandPlugin for starting a quest with the useQuests quests store
|
|
9400
9533
|
const startQuestPlugin = new CommandPlugin('start_quest', async (cmd) => {
|
|
@@ -9431,8 +9564,16 @@ const completeQuestPlugin = new CommandPlugin('complete_quest', async (cmd) => {
|
|
|
9431
9564
|
return useVM().nextLine();
|
|
9432
9565
|
}, generateParser('complete_quest'));
|
|
9433
9566
|
|
|
9567
|
+
// Write a CommandPlugin for running a label using the runLabelFunction of the useVM store
|
|
9568
|
+
const runLabelPlugin = new CommandPlugin('run_label', async (cmd) => {
|
|
9569
|
+
const label = cmd.args[0];
|
|
9570
|
+
if (!label) {
|
|
9571
|
+
error(`run_label command needs a label to argument run`);
|
|
9572
|
+
}
|
|
9573
|
+
await useVM().runLabelFunction(label);
|
|
9574
|
+
}, generateParser('run_label'));
|
|
9575
|
+
|
|
9434
9576
|
function registerBaseCommands(vm) {
|
|
9435
|
-
vm.addCommand(addItemPlugin);
|
|
9436
9577
|
vm.addCommand(addLevelPlugin);
|
|
9437
9578
|
vm.addCommand(addStatPlugin);
|
|
9438
9579
|
vm.addCommand(addXpPlugin);
|
|
@@ -9444,7 +9585,6 @@ function registerBaseCommands(vm) {
|
|
|
9444
9585
|
vm.addCommand(notifyPlugin);
|
|
9445
9586
|
vm.addCommand(pauseCommand);
|
|
9446
9587
|
vm.addCommand(playCommand);
|
|
9447
|
-
vm.addCommand(removeItemPlugin);
|
|
9448
9588
|
vm.addCommand(setButtonCommand);
|
|
9449
9589
|
vm.addCommand(setScreenCommand);
|
|
9450
9590
|
vm.addCommand(setStatCommand);
|
|
@@ -9453,11 +9593,19 @@ function registerBaseCommands(vm) {
|
|
|
9453
9593
|
vm.addCommand(talkCommand);
|
|
9454
9594
|
vm.addCommand(textCommandPlugin);
|
|
9455
9595
|
vm.addCommand(waitCommand);
|
|
9596
|
+
// functions and labels
|
|
9597
|
+
vm.addCommand(jumpCommand);
|
|
9598
|
+
vm.addCommand(runLabelPlugin);
|
|
9456
9599
|
// Quests
|
|
9457
9600
|
vm.addCommand(startQuestPlugin);
|
|
9458
9601
|
vm.addCommand(startObjectivePlugin);
|
|
9459
9602
|
vm.addCommand(completeObjectivePlugin);
|
|
9460
9603
|
vm.addCommand(completeQuestPlugin);
|
|
9604
|
+
// Inventory
|
|
9605
|
+
vm.addCommand(addItemPlugin);
|
|
9606
|
+
vm.addCommand(removeItemPlugin);
|
|
9607
|
+
vm.addCommand(enableInteractionPlugin);
|
|
9608
|
+
vm.addCommand(disableInteractionPlugin);
|
|
9461
9609
|
}
|
|
9462
9610
|
|
|
9463
9611
|
class NarratPlugin {
|
|
@@ -9500,7 +9648,7 @@ async function startApp(config, options) {
|
|
|
9500
9648
|
});
|
|
9501
9649
|
registerBaseCommands(vm);
|
|
9502
9650
|
logManager.setupDebugger(options.debug);
|
|
9503
|
-
console.log('%c Narrat game engine – 1.
|
|
9651
|
+
console.log('%c Narrat game engine – 1.3.1 - June 25, 2022 22:52:46', 'background: #222; color: #bada55');
|
|
9504
9652
|
vm.callHook('onNarratSetup');
|
|
9505
9653
|
app.mount('#game-holder');
|
|
9506
9654
|
if (options.debug) {
|