Compare commits

..

19 Commits

Author SHA1 Message Date
YouHaveTrouble 972b9251c3 bump version 2025-05-11 17:00:18 +02:00
YouHaveTrouble 2f10f940d8 bump version 2025-05-11 16:52:02 +02:00
YouHaveTrouble d962c85629 better quest adventurer choice ux 2025-05-11 16:37:58 +02:00
YouHaveTrouble e71326d89b update busy status dynamically 2025-05-11 14:36:10 +02:00
YouHaveTrouble 20567be96d new experimental quest view 2025-05-08 21:08:03 +02:00
YouHaveTrouble 3c79074c4c create GDD for the next iteration of the game 2024-11-19 20:35:55 +01:00
YouHaveTrouble 571dee6cc9 update news 2024-08-23 23:55:24 +02:00
YouHaveTrouble b49a30bb6e actually bearable mobile view for quests board 2023-09-23 15:29:47 +02:00
YouHaveTrouble 2a38461a47 move icon svgs to components, so they can load along everything else 2023-09-16 15:58:54 +02:00
YouHaveTrouble 52c340be26 bump version 2023-09-16 15:39:23 +02:00
YouHaveTrouble f2c5304643 don't load paths dynamically to allow offline play 2023-09-16 15:26:36 +02:00
YouHaveTrouble b6aefde9da add / to the path 2023-09-16 14:29:29 +02:00
YouHaveTrouble f31a0013a9 Merge pull request #11 from xYundy/fix-quest-button-on-ios
Fix select button color for iOS Safari
2023-09-15 12:04:09 +02:00
Wojciech 'xYundy' Zięciak e4af877358 Add missing empty line at EOF 2023-09-15 12:03:48 +02:00
YouHaveTrouble d162771749 Merge pull request #10 from xYundy/public-testing
Add script which allow to test app on external devices
2023-09-15 12:03:15 +02:00
YouHaveTrouble f53644119a Merge pull request #9 from xYundy/pwa-mobile-icon
Add PWA icons and manifest
2023-09-15 12:02:21 +02:00
Wojciech 'xYundy' Zięciak 34999a27b7 add PWA icons and manifest 2023-09-15 11:59:11 +02:00
Wojciech 'xYundy' Zięciak 6e23f9a7b4 Fix select button color for iOS Safar 2023-09-15 11:55:27 +02:00
Wojciech 'xYundy' Zięciak d852f6fd96 Add script which allow to test app on ext. devices 2023-09-15 11:47:43 +02:00
30 changed files with 624 additions and 420 deletions
+23
View File
@@ -0,0 +1,23 @@
# Game Design Document
## 1. Introduction
Guild Master is a game simulating being a fantasy guild master. The player will be able to recruit adventurers,
send them on quests, and manage the guild's resources.
## 2. Gameplay
Player will recruit adventurers and assign then to quests. Adventurers will have different statistics and a passive
ability that will make each character unique. Player will have to manage guild's resources to complete more and more
resource intensive quests and assignments.
## 3. Mechanics
Menus. Lots of menus. Possibly with fancy animations.
## 4. Characters
Set amount of available adventurers. Each with their own inventory and passive ability. Items in the inventory will
boost specific statistics of the character. They will be scaled based on level and the xp curve will be exponential.
## 5. Quests
There will always be a minimum set amount of quests available. Adventurers will have to be assigned to a quest that is
within their level range. Quests will come in different difficulties within the level range.
+3 -3
View File
@@ -8,18 +8,18 @@
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=EB+Garamond&display=swap" rel="stylesheet">
<link rel="manifest" href="/manifest.json" />
<meta name="description" <meta name="description"
content="Guild Master is a browser game where you manage your own adventurer's guild!"/> content="Guild Master is a browser game where you manage your own adventurer's guild!"/>
<meta property="twitter:title" content="Guild Master - Adventurer's guild management game"/> <meta property="twitter:title" content="Guild Master - Adventurer's guild management game"/>
<meta property="twitter:image" content="https://guildmaster.yht.one/img/icon.png"/> <meta property="twitter:image" content="https://guildmaster.yht.one/img/app-icons/icon.png"/>
<meta property="twitter:description" <meta property="twitter:description"
content="Guild Master is a browser game where you manage your own adventurer's guild!"/> content="Guild Master is a browser game where you manage your own adventurer's guild!"/>
<meta property="og:title" content="Guild Master - Adventurer's guild management game"/> <meta property="og:title" content="Guild Master - Adventurer's guild management game"/>
<meta property="og:url" content="https://guildmaster.yht.one/"/> <meta property="og:url" content="https://guildmaster.yht.one/"/>
<meta property="og:description" <meta property="og:description"
content="Guild Master is a browser game where you manage your own adventurer's guild!"/> content="Guild Master is a browser game where you manage your own adventurer's guild!"/>
<meta property="og:image" content="https://guildmaster.yht.one/img/icon.png"/> <meta property="og:image" content="https://guildmaster.yht.one/img/app-icons/icon.png"/>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
+1 -1
View File
@@ -1 +1 @@
Looking for artists for assets for this game! Need backgrounds and icons! Join discord for more info! I'm working on it...
+159 -157
View File
@@ -1,12 +1,12 @@
{ {
"name": "adventurers-guild", "name": "adventurers-guild",
"version": "0.11.0", "version": "0.14.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "adventurers-guild", "name": "adventurers-guild",
"version": "0.11.0", "version": "0.14.0",
"dependencies": { "dependencies": {
"@vueuse/components": "^9.13.0", "@vueuse/components": "^9.13.0",
"sass": "^1.66.1", "sass": "^1.66.1",
@@ -551,30 +551,31 @@
} }
}, },
"node_modules/@volar/language-core": { "node_modules/@volar/language-core": {
"version": "1.10.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.1.tgz", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz",
"integrity": "sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==", "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/source-map": "1.10.1" "@volar/source-map": "1.11.1"
} }
}, },
"node_modules/@volar/source-map": { "node_modules/@volar/source-map": {
"version": "1.10.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.1.tgz", "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz",
"integrity": "sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==", "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"muggle-string": "^0.3.1" "muggle-string": "^0.3.1"
} }
}, },
"node_modules/@volar/typescript": { "node_modules/@volar/typescript": {
"version": "1.10.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.1.tgz", "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz",
"integrity": "sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==", "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/language-core": "1.10.1" "@volar/language-core": "1.11.1",
"path-browserify": "^1.0.1"
} }
}, },
"node_modules/@vue/compiler-core": { "node_modules/@vue/compiler-core": {
@@ -629,18 +630,19 @@
"integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
}, },
"node_modules/@vue/language-core": { "node_modules/@vue/language-core": {
"version": "1.8.8", "version": "1.8.27",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.8.tgz", "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz",
"integrity": "sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==", "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/language-core": "~1.10.0", "@volar/language-core": "~1.11.1",
"@volar/source-map": "~1.10.0", "@volar/source-map": "~1.11.1",
"@vue/compiler-dom": "^3.3.0", "@vue/compiler-dom": "^3.3.0",
"@vue/reactivity": "^3.3.0",
"@vue/shared": "^3.3.0", "@vue/shared": "^3.3.0",
"minimatch": "^9.0.0", "computeds": "^0.0.1",
"minimatch": "^9.0.3",
"muggle-string": "^0.3.1", "muggle-string": "^0.3.1",
"path-browserify": "^1.0.1",
"vue-template-compiler": "^2.7.14" "vue-template-compiler": "^2.7.14"
}, },
"peerDependencies": { "peerDependencies": {
@@ -662,9 +664,9 @@
} }
}, },
"node_modules/@vue/language-core/node_modules/minimatch": { "node_modules/@vue/language-core/node_modules/minimatch": {
"version": "9.0.3", "version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"brace-expansion": "^2.0.1" "brace-expansion": "^2.0.1"
@@ -738,16 +740,6 @@
"integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==",
"dev": true "dev": true
}, },
"node_modules/@vue/typescript": {
"version": "1.8.8",
"resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.8.tgz",
"integrity": "sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==",
"dev": true,
"dependencies": {
"@volar/typescript": "~1.10.0",
"@vue/language-core": "1.8.8"
}
},
"node_modules/@vueuse/components": { "node_modules/@vueuse/components": {
"version": "9.13.0", "version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/components/-/components-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-9.13.0.tgz",
@@ -998,11 +990,11 @@
} }
}, },
"node_modules/braces": { "node_modules/braces": {
"version": "3.0.2", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dependencies": { "dependencies": {
"fill-range": "^7.0.1" "fill-range": "^7.1.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@@ -1085,6 +1077,12 @@
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true "dev": true
}, },
"node_modules/computeds": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz",
"integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==",
"dev": true
},
"node_modules/concat-map": { "node_modules/concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -1092,9 +1090,9 @@
"dev": true "dev": true
}, },
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
"version": "6.0.5", "version": "6.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"nice-try": "^1.0.4", "nice-try": "^1.0.4",
@@ -1483,9 +1481,9 @@
"dev": true "dev": true
}, },
"node_modules/eslint/node_modules/cross-spawn": { "node_modules/eslint/node_modules/cross-spawn": {
"version": "7.0.3", "version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"path-key": "^3.1.0", "path-key": "^3.1.0",
@@ -1690,9 +1688,9 @@
} }
}, },
"node_modules/fill-range": { "node_modules/fill-range": {
"version": "7.0.1", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dependencies": { "dependencies": {
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
}, },
@@ -2474,9 +2472,9 @@
"dev": true "dev": true
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.6", "version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -2676,6 +2674,12 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/path-browserify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
"dev": true
},
"node_modules/path-exists": { "node_modules/path-exists": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -2722,9 +2726,9 @@
} }
}, },
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
@@ -2759,9 +2763,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.4.28", "version": "8.5.3",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
"integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -2777,9 +2781,9 @@
} }
], ],
"dependencies": { "dependencies": {
"nanoid": "^3.3.6", "nanoid": "^3.3.8",
"picocolors": "^1.0.0", "picocolors": "^1.1.1",
"source-map-js": "^1.0.2" "source-map-js": "^1.2.1"
}, },
"engines": { "engines": {
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
@@ -2930,9 +2934,9 @@
} }
}, },
"node_modules/rollup": { "node_modules/rollup": {
"version": "3.28.0", "version": "3.29.5",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
"integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
"dev": true, "dev": true,
"bin": { "bin": {
"rollup": "dist/bin/rollup" "rollup": "dist/bin/rollup"
@@ -3052,9 +3056,9 @@
} }
}, },
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.0.2", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@@ -3439,9 +3443,9 @@
} }
}, },
"node_modules/vue-template-compiler": { "node_modules/vue-template-compiler": {
"version": "2.7.14", "version": "2.7.16",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
"integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"de-indent": "^1.0.2", "de-indent": "^1.0.2",
@@ -3449,14 +3453,14 @@
} }
}, },
"node_modules/vue-tsc": { "node_modules/vue-tsc": {
"version": "1.8.8", "version": "1.8.27",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.8.tgz", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz",
"integrity": "sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==", "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vue/language-core": "1.8.8", "@volar/typescript": "~1.11.1",
"@vue/typescript": "1.8.8", "@vue/language-core": "1.8.27",
"semver": "^7.3.8" "semver": "^7.5.4"
}, },
"bin": { "bin": {
"vue-tsc": "bin/vue-tsc.js" "vue-tsc": "bin/vue-tsc.js"
@@ -3466,13 +3470,10 @@
} }
}, },
"node_modules/vue-tsc/node_modules/semver": { "node_modules/vue-tsc/node_modules/semver": {
"version": "7.5.2", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true, "dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
}, },
@@ -3839,30 +3840,31 @@
"requires": {} "requires": {}
}, },
"@volar/language-core": { "@volar/language-core": {
"version": "1.10.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.1.tgz", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz",
"integrity": "sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==", "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/source-map": "1.10.1" "@volar/source-map": "1.11.1"
} }
}, },
"@volar/source-map": { "@volar/source-map": {
"version": "1.10.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.1.tgz", "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz",
"integrity": "sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==", "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==",
"dev": true, "dev": true,
"requires": { "requires": {
"muggle-string": "^0.3.1" "muggle-string": "^0.3.1"
} }
}, },
"@volar/typescript": { "@volar/typescript": {
"version": "1.10.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.1.tgz", "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz",
"integrity": "sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==", "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/language-core": "1.10.1" "@volar/language-core": "1.11.1",
"path-browserify": "^1.0.1"
} }
}, },
"@vue/compiler-core": { "@vue/compiler-core": {
@@ -3917,18 +3919,19 @@
"integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
}, },
"@vue/language-core": { "@vue/language-core": {
"version": "1.8.8", "version": "1.8.27",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.8.tgz", "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz",
"integrity": "sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==", "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/language-core": "~1.10.0", "@volar/language-core": "~1.11.1",
"@volar/source-map": "~1.10.0", "@volar/source-map": "~1.11.1",
"@vue/compiler-dom": "^3.3.0", "@vue/compiler-dom": "^3.3.0",
"@vue/reactivity": "^3.3.0",
"@vue/shared": "^3.3.0", "@vue/shared": "^3.3.0",
"minimatch": "^9.0.0", "computeds": "^0.0.1",
"minimatch": "^9.0.3",
"muggle-string": "^0.3.1", "muggle-string": "^0.3.1",
"path-browserify": "^1.0.1",
"vue-template-compiler": "^2.7.14" "vue-template-compiler": "^2.7.14"
}, },
"dependencies": { "dependencies": {
@@ -3942,9 +3945,9 @@
} }
}, },
"minimatch": { "minimatch": {
"version": "9.0.3", "version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true, "dev": true,
"requires": { "requires": {
"brace-expansion": "^2.0.1" "brace-expansion": "^2.0.1"
@@ -4011,16 +4014,6 @@
"integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==",
"dev": true "dev": true
}, },
"@vue/typescript": {
"version": "1.8.8",
"resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.8.tgz",
"integrity": "sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==",
"dev": true,
"requires": {
"@volar/typescript": "~1.10.0",
"@vue/language-core": "1.8.8"
}
},
"@vueuse/components": { "@vueuse/components": {
"version": "9.13.0", "version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/components/-/components-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-9.13.0.tgz",
@@ -4178,11 +4171,11 @@
} }
}, },
"braces": { "braces": {
"version": "3.0.2", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"requires": { "requires": {
"fill-range": "^7.0.1" "fill-range": "^7.1.1"
} }
}, },
"call-bind": { "call-bind": {
@@ -4242,6 +4235,12 @@
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true "dev": true
}, },
"computeds": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz",
"integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==",
"dev": true
},
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -4249,9 +4248,9 @@
"dev": true "dev": true
}, },
"cross-spawn": { "cross-spawn": {
"version": "6.0.5", "version": "6.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
"dev": true, "dev": true,
"requires": { "requires": {
"nice-try": "^1.0.4", "nice-try": "^1.0.4",
@@ -4501,9 +4500,9 @@
"dev": true "dev": true
}, },
"cross-spawn": { "cross-spawn": {
"version": "7.0.3", "version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true, "dev": true,
"requires": { "requires": {
"path-key": "^3.1.0", "path-key": "^3.1.0",
@@ -4698,9 +4697,9 @@
} }
}, },
"fill-range": { "fill-range": {
"version": "7.0.1", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"requires": { "requires": {
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
} }
@@ -5262,9 +5261,9 @@
"dev": true "dev": true
}, },
"nanoid": { "nanoid": {
"version": "3.3.6", "version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="
}, },
"natural-compare": { "natural-compare": {
"version": "1.4.0", "version": "1.4.0",
@@ -5405,6 +5404,12 @@
"json-parse-better-errors": "^1.0.1" "json-parse-better-errors": "^1.0.1"
} }
}, },
"path-browserify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
"dev": true
},
"path-exists": { "path-exists": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -5439,9 +5444,9 @@
} }
}, },
"picocolors": { "picocolors": {
"version": "1.0.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
}, },
"picomatch": { "picomatch": {
"version": "2.3.1", "version": "2.3.1",
@@ -5461,13 +5466,13 @@
"dev": true "dev": true
}, },
"postcss": { "postcss": {
"version": "8.4.28", "version": "8.5.3",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
"integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"requires": { "requires": {
"nanoid": "^3.3.6", "nanoid": "^3.3.8",
"picocolors": "^1.0.0", "picocolors": "^1.1.1",
"source-map-js": "^1.0.2" "source-map-js": "^1.2.1"
} }
}, },
"postcss-selector-parser": { "postcss-selector-parser": {
@@ -5561,9 +5566,9 @@
} }
}, },
"rollup": { "rollup": {
"version": "3.28.0", "version": "3.29.5",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
"integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
"dev": true, "dev": true,
"requires": { "requires": {
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
@@ -5638,9 +5643,9 @@
} }
}, },
"source-map-js": { "source-map-js": {
"version": "1.0.2", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
}, },
"spdx-correct": { "spdx-correct": {
"version": "3.2.0", "version": "3.2.0",
@@ -5896,9 +5901,9 @@
} }
}, },
"vue-template-compiler": { "vue-template-compiler": {
"version": "2.7.14", "version": "2.7.16",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
"integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"de-indent": "^1.0.2", "de-indent": "^1.0.2",
@@ -5906,24 +5911,21 @@
} }
}, },
"vue-tsc": { "vue-tsc": {
"version": "1.8.8", "version": "1.8.27",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.8.tgz", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz",
"integrity": "sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==", "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@vue/language-core": "1.8.8", "@volar/typescript": "~1.11.1",
"@vue/typescript": "1.8.8", "@vue/language-core": "1.8.27",
"semver": "^7.3.8" "semver": "^7.5.4"
}, },
"dependencies": { "dependencies": {
"semver": { "semver": {
"version": "7.5.2", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true, "dev": true
"requires": {
"lru-cache": "^6.0.0"
}
} }
} }
}, },
+2 -1
View File
@@ -1,9 +1,10 @@
{ {
"name": "adventurers-guild", "name": "adventurers-guild",
"version": "0.12.0", "version": "0.14.1",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"dev-public": "vite --host",
"build": "run-p type-check build-only && cp -r CNAME dist/CNAME", "build": "run-p type-check build-only && cp -r CNAME dist/CNAME",
"preview": "vite preview", "preview": "vite preview",
"build-only": "vite build", "build-only": "vite build",
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

-1
View File
@@ -1 +0,0 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Discord</title><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

-5
View File
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="none"/>
<path d="M12,2A10,10,0,0,0,8.84,21.5c.5.08.66-.23.66-.5V19.31C6.73,19.91,6.14,18,6.14,18A2.69,2.69,0,0,0,5,16.5c-.91-.62.07-.6.07-.6a2.1,2.1,0,0,1,1.53,1,2.15,2.15,0,0,0,2.91.83,2.16,2.16,0,0,1,.63-1.34C8,16.17,5.62,15.31,5.62,11.5a3.87,3.87,0,0,1,1-2.71,3.58,3.58,0,0,1,.1-2.64s.84-.27,2.75,1a9.63,9.63,0,0,1,5,0c1.91-1.29,2.75-1,2.75-1a3.58,3.58,0,0,1,.1,2.64,3.87,3.87,0,0,1,1,2.71c0,3.82-2.34,4.66-4.57,4.91a2.39,2.39,0,0,1,.69,1.85V21c0,.27.16.59.67.5A10,10,0,0,0,12,2Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 660 B

+59
View File
@@ -0,0 +1,59 @@
{
"name": "Guild Master - Adventurer's guild management game",
"short_name": "Guild Master",
"theme_color": "#3C2114",
"background_color": "#d9c8b3",
"display": "standalone",
"scope": "./",
"start_url": "./",
"icons": [
{
"src": "img/app-icons/icon-72x72.png",
"sizes": "72x72",
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "img/app-icons/icon-96x96.png",
"sizes": "96x96",
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "img/app-icons/icon-128x128.png",
"sizes": "128x128",
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "img/app-icons/icon-144x144.png",
"sizes": "144x144",
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "img/app-icons/icon-152x152.png",
"sizes": "152x152",
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "img/app-icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "img/app-icons/icon-384x384.png",
"sizes": "384x384",
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "img/app-icons/icon.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable any"
}
]
}
+56 -79
View File
@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import {RouterLink, RouterView} from 'vue-router' import {RouterLink, RouterView} from 'vue-router'
import {version} from "../package.json" import {version} from "@/../package.json";
</script> </script>
<template> <template>
@@ -100,41 +100,30 @@ export default defineComponent({
allAdventurers: {} as { [key: string]: Adventurer }, allAdventurers: {} as { [key: string]: Adventurer },
adventurers: {} as { [key: string]: Adventurer }, adventurers: {} as { [key: string]: Adventurer },
quests: {} as { [key: string]: { [key: string]: Quest } }, quests: {} as { [key: string]: { [key: string]: Quest } },
missives: { missives: [] as Array<Quest>,
F: {} as { [key: string]: Quest },
E: {} as { [key: string]: Quest },
D: {} as { [key: string]: Quest },
C: {} as { [key: string]: Quest },
B: {} as { [key: string]: Quest },
A: {} as { [key: string]: Quest },
S: {} as { [key: string]: Quest },
} as { [key: string]: { [key: string]: Quest } },
}), }),
methods: { methods: {
async updateMissives() { async updateMissives() {
for (const missiveRank in this.missives) { for (const missive of this.missives) {
const rank = getFromString(missiveRank as QuestRank); if (missive.adventurers.length < missive.maxAdventurers) {
for (const missiveId in this.missives[rank.toString() as QuestRank]) {
const missive = this.missives[rank.toString()][missiveId];
if (missive.adventurers.length <= 0) {
missive.progressPoints = 0; missive.progressPoints = 0;
continue; continue;
} }
if (missive.progressPoints >= missive.maxProgress) {
if (this.guild.autoFinishQuestsUpgrade.getRanksToAutoFinishQuestsIn().includes(rank)) {
this.finalizeQuest(missive);
continue;
}
continue;
}
for (const adventurerId in missive.adventurers) { for (const adventurerId in missive.adventurers) {
const adventurer = missive.adventurers[adventurerId]; const adventurer = missive.adventurers[adventurerId];
const attack = adventurer.getAttack(); const attack = adventurer.getAttack();
adventurer.busy = true;
missive.progressPoints = Math.min(missive.progressPoints + attack, missive.maxProgress); missive.progressPoints = Math.min(missive.progressPoints + attack, missive.maxProgress);
} }
if (
missive.progressPoints >= missive.maxProgress
&& this.guild.autoFinishQuestsUpgrade.getRanksToAutoFinishQuestsIn().includes(missive.rank)
) {
this.finalizeQuest(missive);
} }
} }
}, },
async checkForNewRecruit(currentTimestamp: number) { async checkForNewRecruit(currentTimestamp: number) {
@@ -173,7 +162,10 @@ export default defineComponent({
adventurer.busy = false; adventurer.busy = false;
} }
missive.adventurers = []; missive.adventurers = [];
delete this.missives[missive.rank.toString() as QuestRank][missive.id]; const missiveIndex = this.missives.indexOf(missive);
if (missiveIndex > -1) {
this.missives.splice(missiveIndex, 1);
}
}, },
getRandomQuest(rank: QuestRank): Quest | null { getRandomQuest(rank: QuestRank): Quest | null {
const keys = Object.keys(this.quests[rank]); const keys = Object.keys(this.quests[rank]);
@@ -183,11 +175,10 @@ export default defineComponent({
const randomIdString = keys[randomId] as string; const randomIdString = keys[randomId] as string;
return getQuestWithRewards(questsForRank[randomIdString], this.guild.expModifier.getModifier(), this.guild.goldModifier.getModifier()); return getQuestWithRewards(questsForRank[randomIdString], this.guild.expModifier.getModifier(), this.guild.goldModifier.getModifier());
}, },
createMissive(questToAdd: Quest, rank: QuestRank) { createMissive(questToAdd: Quest) {
const quest = JSON.parse(JSON.stringify(questToAdd)); const quest = JSON.parse(JSON.stringify(questToAdd));
const newId = Math.random().toString(16).slice(2).toString(); quest.id = Math.random().toString(16).slice(2).toString();
quest.id = newId; this.missives.push(quest);
this.missives[rank][newId] = quest;
}, },
loadGame() { loadGame() {
const saveData = loadGame(); const saveData = loadGame();
@@ -223,7 +214,7 @@ export default defineComponent({
} }
try { try {
const adventurer = new Adventurer( adventurers[data.id] = new Adventurer(
data.id, data.id,
data.name, data.name,
portrait, portrait,
@@ -232,30 +223,25 @@ export default defineComponent({
data.exp ?? 0, data.exp ?? 0,
data.prestige ?? 0, data.prestige ?? 0,
); );
adventurer.busy = data.busy;
adventurers[data.id] = adventurer;
} catch (e) { } catch (e) {
} }
} }
this.adventurers = adventurers; this.adventurers = adventurers;
const missives = {} as { [key: string]: { [key: string]: Quest } }; if (Array.isArray(saveData.missives)) {
for (const data of saveData.missives) {
for (const id in saveData.missives) { const quest = new Quest(data.id, getFromString(data.rank), data.title, data.text, data.maxProgress, data.expReward, data.goldReward);
const missiveRank = {} as { [key: string]: Quest }
for (const questId in saveData.missives[id]) {
const data = saveData.missives[id][questId];
const quest = new Quest(questId, getFromString(data.rank), data.title, data.text, data.maxProgress, data.expReward, data.goldReward);
quest.progressPoints = data.progressPoints; quest.progressPoints = data.progressPoints;
if (data.adventurers.length > 0) { if (data.adventurers.length > 0) {
quest.adventurers.push(this.adventurers[data.adventurers[0].id]) for (const adventurer of data.adventurers) {
const adventurerId = adventurer.id;
if (this.adventurers[adventurerId] == null) continue;
quest.adventurers.push(this.adventurers[adventurerId]);
} }
missiveRank[questId] = quest;
} }
missives[id] = missiveRank; this.missives.push(quest)
}
} }
this.missives = missives;
this.lastRecruitHandled = saveData.lastRecruitAction ?? 0; this.lastRecruitHandled = saveData.lastRecruitAction ?? 0;
@@ -284,7 +270,8 @@ export default defineComponent({
try { try {
this.screenWakeLock = await navigator.wakeLock.request("screen"); this.screenWakeLock = await navigator.wakeLock.request("screen");
console.debug("Screen wake lock acquired"); console.debug("Screen wake lock acquired");
} catch (e) {} } catch (e) {
}
}, 1000); }, 1000);
console.debug("Loading game data") console.debug("Loading game data")
@@ -326,7 +313,6 @@ export default defineComponent({
})); }));
}, 10 * 1000)); }, 10 * 1000));
this.gameTickTask = Number(setInterval(() => { this.gameTickTask = Number(setInterval(() => {
this.updateMissives(); this.updateMissives();
@@ -341,78 +327,64 @@ export default defineComponent({
if (Number(now) - Number(this.lastQuestGot.F) >= 12 * 1000) { if (Number(now) - Number(this.lastQuestGot.F) >= 12 * 1000) {
this.lastQuestGot.F = now; this.lastQuestGot.F = now;
const keys = Object.keys(this.missives[QuestRank.F]); const currentQuestAmount = this.missives.filter(quest => quest.rank === QuestRank.F).length;
if (keys.length >= 5) return; if (currentQuestAmount >= 5) return;
const quest = this.getRandomQuest(QuestRank.F); const quest = this.getRandomQuest(QuestRank.F);
if (quest !== null) { if (quest !== null) this.createMissive(quest);
this.createMissive(quest, QuestRank.F);
}
} }
if (this.guild.level < 2) return; if (this.guild.level < 2) return;
if (Number(now) - Number(this.lastQuestGot.E) >= 20 * 1000) { if (Number(now) - Number(this.lastQuestGot.E) >= 20 * 1000) {
this.lastQuestGot.E = now; this.lastQuestGot.E = now;
const keys = Object.keys(this.missives[QuestRank.E]); const currentQuestAmount = this.missives.filter(quest => quest.rank === QuestRank.E).length;
if (keys.length >= 5) return; if (currentQuestAmount >= 5) return;
const quest = this.getRandomQuest(QuestRank.E); const quest = this.getRandomQuest(QuestRank.E);
if (quest !== null) { if (quest !== null) this.createMissive(quest);
this.createMissive(quest, QuestRank.E);
}
} }
if (this.guild.level < 3) return; if (this.guild.level < 3) return;
if (Number(now) - Number(this.lastQuestGot.D) >= 50 * 1000) { if (Number(now) - Number(this.lastQuestGot.D) >= 50 * 1000) {
this.lastQuestGot.D = now; this.lastQuestGot.D = now;
const keys = Object.keys(this.missives[QuestRank.D]); const currentQuestAmount = this.missives.filter(quest => quest.rank === QuestRank.D).length;
if (keys.length >= 5) return; if (currentQuestAmount >= 5) return;
const quest = this.getRandomQuest(QuestRank.D); const quest = this.getRandomQuest(QuestRank.D);
if (quest !== null) { if (quest !== null) this.createMissive(quest);
this.createMissive(quest, QuestRank.D);
}
} }
if (this.guild.level < 4) return; if (this.guild.level < 4) return;
if (Number(now) - Number(this.lastQuestGot.C) >= 2 * 60 * 1000) { if (Number(now) - Number(this.lastQuestGot.C) >= 2 * 60 * 1000) {
this.lastQuestGot.C = now; this.lastQuestGot.C = now;
const keys = Object.keys(this.missives[QuestRank.C]); const currentQuestAmount = this.missives.filter(quest => quest.rank === QuestRank.C).length;
if (keys.length >= 5) return; if (currentQuestAmount >= 5) return;
const quest = this.getRandomQuest(QuestRank.C); const quest = this.getRandomQuest(QuestRank.C);
if (quest !== null) { if (quest !== null) this.createMissive(quest);
this.createMissive(quest, QuestRank.C);
}
} }
if (this.guild.level < 5) return; if (this.guild.level < 5) return;
if (Number(now) - Number(this.lastQuestGot.B) >= 2 * 60 * 1000) { if (Number(now) - Number(this.lastQuestGot.B) >= 2 * 60 * 1000) {
this.lastQuestGot.B = now; this.lastQuestGot.B = now;
const keys = Object.keys(this.missives[QuestRank.B]); const currentQuestAmount = this.missives.filter(quest => quest.rank === QuestRank.B).length;
if (keys.length >= 5) return; if (currentQuestAmount >= 5) return;
const quest = this.getRandomQuest(QuestRank.B); const quest = this.getRandomQuest(QuestRank.B);
if (quest !== null) { if (quest !== null) this.createMissive(quest);
this.createMissive(quest, QuestRank.B);
}
} }
if (this.guild.level < 6) return; if (this.guild.level < 6) return;
if (Number(now) - Number(this.lastQuestGot.A) >= 3 * 60 * 1000) { if (Number(now) - Number(this.lastQuestGot.A) >= 3 * 60 * 1000) {
this.lastQuestGot.A = now; this.lastQuestGot.A = now;
const keys = Object.keys(this.missives[QuestRank.A]); const currentQuestAmount = this.missives.filter(quest => quest.rank === QuestRank.A).length;
if (keys.length >= 5) return; if (currentQuestAmount >= 5) return;
const quest = this.getRandomQuest(QuestRank.A); const quest = this.getRandomQuest(QuestRank.A);
if (quest !== null) { if (quest !== null) this.createMissive(quest);
this.createMissive(quest, QuestRank.A);
}
} }
if (this.guild.level < 6) return; if (this.guild.level < 6) return;
if (Number(now) - Number(this.lastQuestGot.S) >= 5 * 60 * 1000) { if (Number(now) - Number(this.lastQuestGot.S) >= 5 * 60 * 1000) {
this.lastQuestGot.S = now; this.lastQuestGot.S = now;
const keys = Object.keys(this.missives[QuestRank.S]); const currentQuestAmount = this.missives.filter(quest => quest.rank === QuestRank.S).length;
if (keys.length >= 5) return; if (currentQuestAmount >= 5) return;
const quest = this.getRandomQuest(QuestRank.S); const quest = this.getRandomQuest(QuestRank.S);
if (quest !== null) { if (quest !== null) this.createMissive(quest);
this.createMissive(quest, QuestRank.S);
}
} }
}, 250)); }, 250));
@@ -504,6 +476,7 @@ nav {
width: 80px; width: 80px;
height: 80px; height: 80px;
} }
.lds-ring div { .lds-ring div {
box-sizing: border-box; box-sizing: border-box;
display: block; display: block;
@@ -516,15 +489,19 @@ nav {
animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
border-color: #000 transparent transparent transparent; border-color: #000 transparent transparent transparent;
} }
.lds-ring div:nth-child(1) { .lds-ring div:nth-child(1) {
animation-delay: -0.45s; animation-delay: -0.45s;
} }
.lds-ring div:nth-child(2) { .lds-ring div:nth-child(2) {
animation-delay: -0.3s; animation-delay: -0.3s;
} }
.lds-ring div:nth-child(3) { .lds-ring div:nth-child(3) {
animation-delay: -0.15s; animation-delay: -0.15s;
} }
@keyframes lds-ring { @keyframes lds-ring {
0% { 0% {
transform: rotate(0deg); transform: rotate(0deg);
+2 -2
View File
@@ -6,7 +6,7 @@ import {getFromString, QuestRank} from "@/classes/QuestRank";
export class GameData { export class GameData {
guild: Guild; guild: Guild;
adventurers: { [key: string]: Adventurer }; adventurers: { [key: string]: Adventurer };
missives: { [key: string]: { [key: string]: Quest } }; missives: Array<Quest>;
lastQuestGot: { [key: string]: null | number }; lastQuestGot: { [key: string]: null | number };
lastRecruitAction: null | number; lastRecruitAction: null | number;
adventurerForHireId: string | null; adventurerForHireId: string | null;
@@ -16,7 +16,7 @@ export class GameData {
) { ) {
this.guild = data.guild ?? new Guild(1, 0); this.guild = data.guild ?? new Guild(1, 0);
this.adventurers = data.adventurers ?? {} as { [key: string]: Adventurer }; this.adventurers = data.adventurers ?? {} as { [key: string]: Adventurer };
this.missives = data.missives ?? {} as { [key: string]: { [key: string]: Quest } }; this.missives = data.missives ?? [] as Array<Quest>;
this.lastQuestGot = data.lastQuestGot ?? {} as { [key: string]: null | number }; this.lastQuestGot = data.lastQuestGot ?? {} as { [key: string]: null | number };
this.lastRecruitAction = data.lastRecruitAction ?? null; this.lastRecruitAction = data.lastRecruitAction ?? null;
this.adventurerForHireId = data.adventurerForHireId ?? null; this.adventurerForHireId = data.adventurerForHireId ?? null;
+7 -2
View File
@@ -1,8 +1,13 @@
* {
box-sizing: border-box;
font-family: 'EB Garamond', serif;
scrollbar-color: #8f7256 rgba(0, 0, 0, 0.1);
}
body { body {
margin: 0; margin: 0;
padding: 0 0 10rem; padding: 0 0 2rem;
min-height: calc(100vh - 10rem); min-height: calc(100vh - 10rem);
font-family: 'EB Garamond', serif;
overflow-y: scroll; overflow-y: scroll;
user-select: none; user-select: none;
background-size: 25rem; background-size: 25rem;
+12 -1
View File
@@ -7,12 +7,22 @@ export class Quest {
title: string; title: string;
text: string; text: string;
adventurers: Array<Adventurer>; adventurers: Array<Adventurer>;
maxAdventurers: number;
progressPoints: number; progressPoints: number;
maxProgress: number; maxProgress: number;
expReward: number; expReward: number;
goldReward: number; goldReward: number;
constructor(id: string, rank: QuestRank, title: string, text: string, maxProgress: number, expReward: number, goldReward: number) { constructor(
id: string,
rank: QuestRank,
title: string,
text: string,
maxProgress: number,
expReward: number,
goldReward: number,
maxAdventurers: number = 1
) {
this.id = id; this.id = id;
this.rank = rank; this.rank = rank;
this.title = title; this.title = title;
@@ -22,6 +32,7 @@ export class Quest {
this.goldReward = goldReward; this.goldReward = goldReward;
this.progressPoints = 0; this.progressPoints = 0;
this.adventurers = []; this.adventurers = [];
this.maxAdventurers = maxAdventurers;
} }
getPercentProgress(): number { getPercentProgress(): number {
File diff suppressed because one or more lines are too long
+30 -10
View File
@@ -21,6 +21,8 @@ import { vOnClickOutside } from '@vueuse/components'
<span>+</span> <span>+</span>
</article> </article>
<div class="selection" v-if="selection" v-on-click-outside="closeSelect"> <div class="selection" v-if="selection" v-on-click-outside="closeSelect">
<span>Choose adventurer</span>
<div class="list">
<button <button
class="slot" class="slot"
v-for="adventurer in allAdventurers" v-for="adventurer in allAdventurers"
@@ -37,6 +39,7 @@ import { vOnClickOutside } from '@vueuse/components'
/> />
</button> </button>
</div> </div>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
@@ -61,9 +64,9 @@ export default defineComponent({
}, },
}, },
allAdventurers: { allAdventurers: {
type: Object as PropType<{[key: string]: Adventurer}>, type: Object as PropType<Array<Adventurer>>,
default() { default() {
return {} as {[key: string]: Adventurer}; return [] as Array<Adventurer>;
}, },
}, },
}, },
@@ -82,22 +85,35 @@ export default defineComponent({
.selection { .selection {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 50%; left: 0;
width: max-content; width: 100%;
max-width: 17rem; max-width: 100%;
transform: translateX(-50%) translateY(104%);
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: center; justify-content: center;
align-items: center; align-items: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
gap: 0.5rem; gap: 0.5rem;
padding: 0.5rem; padding: 0.5rem;
background-color: rgba(0,0,0, 0.2); background-color: rgba(0,0,0, 0.6);
backdrop-filter: blur(4px);
z-index: 2; z-index: 2;
cursor: default; cursor: default;
max-height: 12rem; height: 100%;
overflow-y: auto; overflow-y: scroll;
scrollbar-gutter: stable;
.list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
gap: 1rem;
max-width: 100%;
}
span {
font-size: 1.5rem;
color: #fff;
}
.slot { .slot {
width: 5rem; width: 5rem;
height: 5rem; height: 5rem;
@@ -131,5 +147,9 @@ export default defineComponent({
width: 100%; width: 100%;
height: 100%; height: 100%;
font-size: 4.5rem; font-size: 4.5rem;
color: #000;
span {
transform: translateY(-0.5rem);
}
} }
</style> </style>
+89
View File
@@ -0,0 +1,89 @@
<template>
<div class="missives-wrapper">
<h1 v-if="label !== undefined">{{ label }}</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key) in quests"
:key="key"
:adventurers="adventurers"
:missive="missive"
@click="finalizeQuest(missive)"
/>
</section>
</div>
</template>
<script lang="ts">
import {defineComponent} from 'vue'
import QuestMissive from "@/components/QuestMissive.vue";
export default defineComponent({
name: "QuestGroup",
components: {QuestMissive},
props: {
quests: {
type: Object,
required: true,
},
adventurers: {
type: Object,
required: true,
},
finalizeQuest: {
type: Function,
required: true,
},
label: {
type: String,
default: undefined,
}
},
})
</script>
<style scoped lang="scss">
h1 {
text-align: center;
}
.missives-wrapper {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.missives {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
gap: 1rem;
padding-block: 0.5rem;
padding-inline: 5rem;
overflow-x: auto;
scroll-snap-type: x mandatory;
width: 100vw;
max-width: 100%;
}
@media(min-width: 800px) {
.missives-wrapper {
padding-inline: 1rem;
max-width: 100vw;
overflow-x: hidden;
}
.missives {
display: grid;
padding-inline: 0;
max-width: 1200px;
grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
grid-auto-rows: auto;
gap: 1rem;
overflow-x: visible;
}
}
</style>
+30 -9
View File
@@ -12,13 +12,14 @@
<div class="drink-stain" v-if="drinkStain.exists"> <div class="drink-stain" v-if="drinkStain.exists">
<DrinkStain/> <DrinkStain/>
</div> </div>
<div class="rank">{{missive.rank}}</div>
<h2>{{ missive.title }}</h2> <h2>{{ missive.title }}</h2>
<p>{{ missive.text }}</p> <p>{{ missive.text }}</p>
<div class="slots"> <div class="slots">
<button class="slot"> <button class="slot">
<AdventurerComponent <AdventurerComponent
:adventurer="missive.adventurers[0]" :adventurer="missive.adventurers[0]"
:all-adventurers="adventurers" :all-adventurers="notBusyAdventurers"
@hire-adventurer="(id) => { @hire-adventurer="(id) => {
adventurers[id].busy = true; adventurers[id].busy = true;
missive.adventurers[0] = adventurers[id]; missive.adventurers[0] = adventurers[id];
@@ -36,7 +37,7 @@
</div> </div>
<div class="progressWrap"> <div class="progressWrap">
<span class="progress"></span> <span class="progress"></span>
<span class="percentage">{{ progressPercentage }}</span> <span class="percentage">{{ `${progressPercentage.toFixed(2)}%` }}</span>
</div> </div>
<h3>Rewards</h3> <h3>Rewards</h3>
<div class="rewards"> <div class="rewards">
@@ -58,6 +59,14 @@ import Parchment from "@/components/misc/Parchment.vue";
export default defineComponent({ export default defineComponent({
name: "QuestMissive", name: "QuestMissive",
components: {Parchment, WaterStain, DrinkStain, AdventurerComponent}, components: {Parchment, WaterStain, DrinkStain, AdventurerComponent},
computed: {
progressPercentageValue(): string {
return `${this.missive.progressPoints / this.missive.maxProgress * 100}%`;
},
notBusyAdventurers(): Adventurer[] {
return Object.values(this.adventurers).filter(adventurer => !adventurer.busy);
},
},
props: { props: {
missive: { missive: {
type: Object as PropType<Quest | any>, type: Object as PropType<Quest | any>,
@@ -73,7 +82,7 @@ export default defineComponent({
}, },
data: () => { data: () => {
return { return {
progressPercentage: "0%", progressPercentage: 0,
stain: false, stain: false,
drinkStain: { drinkStain: {
exists: false, exists: false,
@@ -85,8 +94,7 @@ export default defineComponent({
methods: { methods: {
updateProgress() { updateProgress() {
if (this.missive === undefined) return; if (this.missive === undefined) return;
const progress = (this.missive.progressPoints / this.missive.maxProgress * 100).toFixed(2); this.progressPercentage = this.missive.progressPoints / this.missive.maxProgress * 100;
this.progressPercentage = `${progress}%`;
}, },
randomNumber(min: number, max: number) { randomNumber(min: number, max: number) {
return Math.random() * (max - min) + min; return Math.random() * (max - min) + min;
@@ -102,7 +110,7 @@ export default defineComponent({
} }
}, },
watch: { watch: {
missive: { "missive.progressPoints": {
handler() { handler() {
this.updateProgress(); this.updateProgress();
}, },
@@ -114,11 +122,14 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.missive { .missive {
width: min(100%, 14rem); width: 14rem;
min-width: 14rem;
text-align: center; text-align: center;
border: 2px solid #000; border: 2px solid #000;
padding: 0.5rem; padding: 0.5rem;
position: relative; position: relative;
scroll-snap-align: center;
margin: 0 auto;
.parchment { .parchment {
position: absolute; position: absolute;
@@ -159,7 +170,7 @@ export default defineComponent({
left: 0; left: 0;
height: 100%; height: 100%;
display: block; display: block;
width: v-bind(progressPercentage); width: v-bind(progressPercentageValue);
background-color: rgba(0, 128, 0, 0.65); background-color: rgba(0, 128, 0, 0.65);
transition: width 250ms linear; transition: width 250ms linear;
} }
@@ -176,6 +187,16 @@ export default defineComponent({
} }
} }
.rank {
position: absolute;
top: -0.5rem;
left: 0.25rem;
font-size: 3rem;
font-weight: bold;
color: #ab0707;
z-index: -1;
}
.rewards { .rewards {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@@ -214,7 +235,6 @@ export default defineComponent({
background-color: rgba(0, 0, 0, 0.2); background-color: rgba(0, 0, 0, 0.2);
cursor: pointer; cursor: pointer;
border-radius: 0.2rem; border-radius: 0.2rem;
position: relative;
} }
} }
@@ -257,4 +277,5 @@ export default defineComponent({
} }
} }
} }
</style> </style>
+35
View File
@@ -0,0 +1,35 @@
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
name: "DiscordLogo",
props: {
width: {
type: String,
default: "2rem",
},
height: {
type: String,
default: "2rem",
},
},
})
</script>
<template>
<svg
:width="width"
:height="height"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<title>Discord</title>
<path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"/>
</svg>
</template>
<style scoped lang="scss">
svg {
}
</style>
+33
View File
@@ -0,0 +1,33 @@
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
name: "GithubLogo",
props: {
width: {
type: String,
default: "2rem",
},
height: {
type: String,
default: "2rem",
},
},
})
</script>
<template>
<svg
:width="width"
:height="height"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<rect width="24" height="24" fill="none"/>
<path d="M12,2A10,10,0,0,0,8.84,21.5c.5.08.66-.23.66-.5V19.31C6.73,19.91,6.14,18,6.14,18A2.69,2.69,0,0,0,5,16.5c-.91-.62.07-.6.07-.6a2.1,2.1,0,0,1,1.53,1,2.15,2.15,0,0,0,2.91.83,2.16,2.16,0,0,1,.63-1.34C8,16.17,5.62,15.31,5.62,11.5a3.87,3.87,0,0,1,1-2.71,3.58,3.58,0,0,1,.1-2.64s.84-.27,2.75,1a9.63,9.63,0,0,1,5,0c1.91-1.29,2.75-1,2.75-1a3.58,3.58,0,0,1,.1,2.64,3.87,3.87,0,0,1,1,2.71c0,3.82-2.34,4.66-4.57,4.91a2.39,2.39,0,0,1,.69,1.85V21c0,.27.16.59.67.5A10,10,0,0,0,12,2Z"/>
</svg>
</template>
<style scoped lang="scss">
</style>
+10 -5
View File
@@ -1,28 +1,33 @@
import {createRouter, createWebHashHistory} from 'vue-router' import {createRouter, createWebHashHistory} from 'vue-router'
import HomeView from '@/views/HomeView.vue';
import QuestView from "@/views/QuestView.vue";
import AdventurerView from "@/views/AdventurerView.vue";
import TechnicalView from "@/views/TechnicalView.vue";
const router = createRouter({ const router = createRouter({
history: createWebHashHistory(import.meta.env.BASE_URL), history: createWebHashHistory(import.meta.env.BASE_URL),
routes: [ routes: [
{ {
path: '/', path: '/',
name: 'guild', name: 'guild',
component: () => import('@/views/HomeView.vue') component: HomeView,
}, },
{ {
path: '/quests', path: '/quests',
name: 'quests', name: 'quests',
component: () => import('@/views/QuestView.vue') component: QuestView,
}, },
{ {
path: '/adventurers', path: '/adventurers',
name: 'adventurers', name: 'adventurers',
component: () => import('@/views/AdventurerView.vue') component: AdventurerView,
}, },
{ {
path: '/technical', path: '/technical',
name: 'technical', name: 'technical',
component: () => import('@/views/TechnicalView.vue') component: TechnicalView,
} },
] ]
}) })
+19 -97
View File
@@ -1,90 +1,20 @@
<template> <template>
<section> <section>
<div class="guild" v-if="guild.level >= 7 && Object.keys(quests.S).length > 0"> <QuestGroup
<h1>Rank S Quests</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key, index) in quests.S"
:key="key"
:adventurers="adventurers" :adventurers="adventurers"
:missive="missive" :quests="quests.filter(quest => quest.progressPoints < quest.maxProgress)"
@click="finalizeQuest(missive)" :finalizeQuest="finalizeQuest"
label="Quests"
v-show="quests.filter(quest => quest.progressPoints < quest.maxProgress).length > 0"
/> />
</section> <QuestGroup
</div> :finalize-quest="finalizeQuest"
<div class="guild" v-if="guild.level >= 6 && Object.keys(quests.A).length > 0">
<h1>Rank A Quests</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key, index) in quests.A"
:key="key"
:adventurers="adventurers" :adventurers="adventurers"
:missive="missive" :quests="quests.filter(quest => quest.progressPoints >= quest.maxProgress)"
@click="finalizeQuest(missive)" label="Completed Quests"
v-show="quests.filter(quest => quest.progressPoints >= quest.maxProgress).length > 0"
/> />
</section> </section>
</div>
<div class="guild" v-if="guild.level >= 5 && Object.keys(quests.B).length > 0">
<h1>Rank B Quests</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key, index) in quests.B"
:key="key"
:adventurers="adventurers"
:missive="missive"
@click="finalizeQuest(missive)"
/>
</section>
</div>
<div class="guild" v-if="guild.level >= 4 && Object.keys(quests.C).length > 0">
<h1>Rank C Quests</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key, index) in quests.C"
:key="key"
:adventurers="adventurers"
:missive="missive"
@click="finalizeQuest(missive)"
/>
</section>
</div>
<div class="guild" v-if="guild.level >= 3 && Object.keys(quests.D).length > 0">
<h1>Rank D Quests</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key, index) in quests.D"
:key="key"
:adventurers="adventurers"
:missive="missive"
@click="finalizeQuest((missive))"
/>
</section>
</div>
<div class="guild" v-if="guild.level >= 2 && Object.keys(quests.E).length > 0">
<h1>Rank E Quests</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key, index) in quests.E"
:key="key"
:adventurers="adventurers"
:missive="missive"
@click="finalizeQuest(missive)"
/>
</section>
</div>
<div class="guild" v-if="Object.keys(quests.F).length > 0">
<h1>Rank F Quests</h1>
<section class="missives">
<QuestMissive
v-for="(missive, key, index) in quests.F"
:key="key"
:adventurers="adventurers"
:missive="missive"
@click="finalizeQuest(missive)"
/>
</section>
</div>
</section>
</template> </template>
<script lang="ts"> <script lang="ts">
@@ -94,10 +24,11 @@ import type {Adventurer} from "@/classes/Adventurer";
import type {Quest} from "@/classes/Quest"; import type {Quest} from "@/classes/Quest";
import {Guild} from "@/classes/Guild"; import {Guild} from "@/classes/Guild";
import QuestMissive from "@/components/QuestMissive.vue"; import QuestMissive from "@/components/QuestMissive.vue";
import QuestGroup from "@/components/QuestGroup.vue";
export default defineComponent({ export default defineComponent({
name: "QuestView", name: "QuestView",
components: {QuestMissive, AdventurerComponent}, components: {QuestGroup, QuestMissive, AdventurerComponent},
props: { props: {
guild: { guild: {
type: Object as PropType<Guild>, type: Object as PropType<Guild>,
@@ -108,7 +39,7 @@ export default defineComponent({
required: true, required: true,
}, },
quests: { quests: {
type: Object as PropType<{ [key: string]: Quest }>, type: Object as PropType<Array<Quest>>,
required: true, required: true,
}, },
lastRecruitTime: { lastRecruitTime: {
@@ -130,28 +61,19 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.guild { section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: flex-start;
align-items: center; align-items: center;
width: 100%; width: 100%;
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
h1 {
font-size: 3rem;
text-align: center;
} }
.missives { @media(min-width: 800px) {
display: flex; section {
flex-direction: row; flex-direction: column-reverse;
flex-wrap: wrap;
width: calc(100% - 2rem);
justify-content: center;
align-items: stretch;
padding-inline: 1rem;
gap: 1rem;
} }
} }
</style> </style>
+11 -3
View File
@@ -10,11 +10,11 @@
<h1>Socials</h1> <h1>Socials</h1>
<div class="links"> <div class="links">
<a class="link" href="https://discord.gg/j8KK5dGBps"> <a class="link" href="https://discord.gg/j8KK5dGBps">
<img class="icon" src="/img/icons/discord.svg" alt="Discord"/> <DiscordLogo/>
Discord Discord
</a> </a>
<a class="link" href="https://github.com/YouHaveTrouble/GuildMaster"> <a class="link" href="https://github.com/YouHaveTrouble/GuildMaster">
<img class="icon" src="/img/icons/github.svg" alt="GitHub"/> <GithubLogo/>
GitHub GitHub
</a> </a>
</div> </div>
@@ -30,10 +30,18 @@ import {defineComponent} from "vue";
import ChangelogComponent from "@/components/technical/ChangelogComponent.vue"; import ChangelogComponent from "@/components/technical/ChangelogComponent.vue";
import SaveManagerComponent from "@/components/technical/SaveManagerComponent.vue"; import SaveManagerComponent from "@/components/technical/SaveManagerComponent.vue";
import Nail from "@/components/misc/Nail.vue"; import Nail from "@/components/misc/Nail.vue";
import DiscordLogo from "@/components/misc/DiscordLogo.vue";
import GithubLogo from "@/components/misc/GithubLogo.vue";
export default defineComponent({ export default defineComponent({
name: "TechnicalView", name: "TechnicalView",
components: {Nail, SaveManagerComponent, ChangelogComponent}, components: {
DiscordLogo,
GithubLogo,
Nail,
SaveManagerComponent,
ChangelogComponent,
},
}); });
</script> </script>