diff --git a/package-lock.json b/package-lock.json index 390b24ac..447b66d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,9 +44,9 @@ } }, "@eslint/eslintrc": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", - "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -56,7 +56,7 @@ "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, @@ -174,15 +174,16 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz", - "integrity": "sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.0.tgz", + "integrity": "sha512-IJ5e2W7uFNfg4qh9eHkHRUCbgZ8VKtGwD07kannJvM5t/GU8P8+24NX8gi3Hf5jST5oWPY8kyV1s/WtfiZ4+Ww==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.11.1", - "@typescript-eslint/scope-manager": "4.11.1", + "@typescript-eslint/experimental-utils": "4.14.0", + "@typescript-eslint/scope-manager": "4.14.0", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", "regexpp": "^3.0.0", "semver": "^7.3.2", "tsutils": "^3.17.1" @@ -230,28 +231,28 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz", - "integrity": "sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.0.tgz", + "integrity": "sha512-6i6eAoiPlXMKRbXzvoQD5Yn9L7k9ezzGRvzC/x1V3650rUk3c3AOjQyGYyF9BDxQQDK2ElmKOZRD0CbtdkMzQQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.11.1", - "@typescript-eslint/types": "4.11.1", - "@typescript-eslint/typescript-estree": "4.11.1", + "@typescript-eslint/scope-manager": "4.14.0", + "@typescript-eslint/types": "4.14.0", + "@typescript-eslint/typescript-estree": "4.14.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.11.1.tgz", - "integrity": "sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.0.tgz", + "integrity": "sha512-sUDeuCjBU+ZF3Lzw0hphTyScmDDJ5QVkyE21pRoBo8iDl7WBtVFS+WDN3blY1CH3SBt7EmYCw6wfmJjF0l/uYg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.11.1", - "@typescript-eslint/types": "4.11.1", - "@typescript-eslint/typescript-estree": "4.11.1", + "@typescript-eslint/scope-manager": "4.14.0", + "@typescript-eslint/types": "4.14.0", + "@typescript-eslint/typescript-estree": "4.14.0", "debug": "^4.1.1" }, "dependencies": { @@ -273,29 +274,29 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz", - "integrity": "sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.0.tgz", + "integrity": "sha512-/J+LlRMdbPh4RdL4hfP1eCwHN5bAhFAGOTsvE6SxsrM/47XQiPSgF5MDgLyp/i9kbZV9Lx80DW0OpPkzL+uf8Q==", "dev": true, "requires": { - "@typescript-eslint/types": "4.11.1", - "@typescript-eslint/visitor-keys": "4.11.1" + "@typescript-eslint/types": "4.14.0", + "@typescript-eslint/visitor-keys": "4.14.0" } }, "@typescript-eslint/types": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.11.1.tgz", - "integrity": "sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.0.tgz", + "integrity": "sha512-VsQE4VvpldHrTFuVPY1ZnHn/Txw6cZGjL48e+iBxTi2ksa9DmebKjAeFmTVAYoSkTk7gjA7UqJ7pIsyifTsI4A==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz", - "integrity": "sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.0.tgz", + "integrity": "sha512-wRjZ5qLao+bvS2F7pX4qi2oLcOONIB+ru8RGBieDptq/SudYwshveORwCVU4/yMAd4GK7Fsf8Uq1tjV838erag==", "dev": true, "requires": { - "@typescript-eslint/types": "4.11.1", - "@typescript-eslint/visitor-keys": "4.11.1", + "@typescript-eslint/types": "4.14.0", + "@typescript-eslint/visitor-keys": "4.14.0", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -346,12 +347,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz", - "integrity": "sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.0.tgz", + "integrity": "sha512-MeHHzUyRI50DuiPgV9+LxcM52FCJFYjJiWHtXlbyC27b80mfOwKeiKI+MHOTEpcpfmoPFm/vvQS88bYIx6PZTA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.11.1", + "@typescript-eslint/types": "4.14.0", "eslint-visitor-keys": "^2.0.0" } }, @@ -570,9 +571,9 @@ "dev": true }, "archiver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.1.0.tgz", - "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.2.0.tgz", + "integrity": "sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ==", "dev": true, "requires": { "archiver-utils": "^2.1.0", @@ -1969,13 +1970,13 @@ "dev": true }, "eslint": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz", - "integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", + "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.2", + "@eslint/eslintrc": "^0.3.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1999,7 +2000,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -2111,9 +2112,9 @@ "dev": true }, "eslint-plugin-prettier": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz", - "integrity": "sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -2452,9 +2453,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -2599,12 +2600,12 @@ } }, "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", "dev": true, "requires": { - "semver-regex": "^2.0.0" + "semver-regex": "^3.1.2" } }, "findup-sync": { @@ -2985,9 +2986,9 @@ } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -3393,18 +3394,18 @@ "dev": true }, "husky": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz", - "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", "dev": true, "requires": { "chalk": "^4.0.0", "ci-info": "^2.0.0", "compare-versions": "^3.6.0", "cosmiconfig": "^7.0.0", - "find-versions": "^3.2.0", + "find-versions": "^4.0.0", "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", + "pkg-dir": "^5.0.0", "please-upgrade-node": "^3.2.0", "slash": "^3.0.0", "which-pm-runs": "^1.0.0" @@ -5170,40 +5171,49 @@ } }, "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^5.0.0" }, "dependencies": { "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "path-exists": { @@ -5663,9 +5673,9 @@ "dev": true }, "sass": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.0.tgz", - "integrity": "sha512-fhyqEbMIycQA4blrz/C0pYhv2o4x2y6FYYAH0CshBw3DXh5D5wyERgxw0ptdau1orc/GhNrhF7DFN2etyOCEng==", + "version": "1.32.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.4.tgz", + "integrity": "sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -5849,9 +5859,9 @@ } }, "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", "dev": true }, "set-blocking": { @@ -6406,9 +6416,9 @@ } }, "table": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.6.tgz", - "integrity": "sha512-OInCtPmDNieVBkVFi6C8RwU2S2H0h8mF3e3TQK4nreaUNCpooQUkI+A/KuEkm5FawfhWIfNqG+qfelVVR+V00g==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", "dev": true, "requires": { "ajv": "^7.0.2", @@ -6487,9 +6497,9 @@ } }, "tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "requires": { "bl": "^4.0.3", @@ -6657,9 +6667,9 @@ "dev": true }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz", + "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -7250,6 +7260,12 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zip-stream": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.4.tgz", diff --git a/package.json b/package.json index 06841a62..b6d11272 100644 --- a/package.json +++ b/package.json @@ -46,13 +46,13 @@ "devDependencies": { "@types/fs-extra": "^9.0.6", "@types/jasmine": "^3.6.2", - "@typescript-eslint/eslint-plugin": "^4.11.1", - "@typescript-eslint/parser": "^4.11.1", - "archiver": "^5.1.0", + "@typescript-eslint/eslint-plugin": "^4.14.0", + "@typescript-eslint/parser": "^4.14.0", + "archiver": "^5.2.0", "chalk": "^4.1.0", - "eslint": "^7.17.0", + "eslint": "^7.18.0", "eslint-config-prettier": "^7.1.0", - "eslint-plugin-prettier": "^3.3.0", + "eslint-plugin-prettier": "^3.3.1", "foundry-pc-types": "git+https://git.f3l.de/dungeonslayers/foundry-pc-types.git#f3l-fixes", "fs-extra": "^9.0.1", "gulp": "^4.0.2", @@ -60,13 +60,13 @@ "gulp-less": "^4.0.1", "gulp-sass": "^4.1.0", "gulp-typescript": "^6.0.0-alpha.1", - "husky": "^4.3.6", + "husky": "^4.3.8", "jasmine": "^3.6.3", "jasmine-xml-reporter": "^1.2.1", "json-stringify-pretty-compact": "^2.0.0", "lint-staged": "^10.5.3", "prettier": "^2.2.1", - "sass": "^1.32.0", + "sass": "^1.32.4", "ts-node": "^9.1.1", "typescript": "^4.1.3", "yargs": "^16.2.0" diff --git a/src/lang/de.json b/src/lang/de.json index 39a139ca..c457a382 100644 --- a/src/lang/de.json +++ b/src/lang/de.json @@ -8,8 +8,10 @@ "DS4.HeadingEffects": "Effekte", "DS4.HeadingInventory": "Inventar", "DS4.HeadingProfile": "Profil", - "DS4.HeadingTalents": "Talente & Fähigkeiten", + "DS4.HeadingTalentsAbilities": "Talente & Fähigkeiten", "DS4.HeadingSpells": "Zaubersprüche", + "DS4.HeadingDescription": "Beschreibung", + "DS4.HeadingSpecialCreatureAbilites": "Besondere Fähigkeiten", "DS4.AttackType": "Angriffs Typ", "DS4.AttackTypeAbbr": "AT", "DS4.WeaponBonus": "Waffen Bonus", @@ -55,6 +57,8 @@ "DS4.ItemTypeLanguagePlural": "Sprachen", "DS4.ItemTypeAlphabet": "Schriftzeichen", "DS4.ItemTypeAlphabetPlural": "Schriftzeichen", + "DS4.ItemTypeSpecialCreatureAbility": "Besondere Kreaturenfähigkeit", + "DS4.ItemTypeSpecialCreatureAbilityPlural": "Besondere Kreaturenfähigkeiten", "DS4.ArmorType": "Panzerungstyp", "DS4.ArmorTypeAbbr": "PAT", "DS4.ArmorMaterialType": "Material Typ", @@ -100,6 +104,8 @@ "DS4.SpellDuration": "Wirkdauer", "DS4.SpellCooldownDuration": "Abklingzeit", "DS4.SpellScrollPriceGold": "Schriftrollenpreis (Gold)", + "DS4.ActorTypeCharacter": "Charakter", + "DS4.ActorTypeCreature": "Kreatur", "DS4.AttributeBody": "Körper", "DS4.AttributeMobility": "Agilität", "DS4.AttributeMind": "Geist", @@ -117,31 +123,52 @@ "DS4.CombatValuesRangedAttack": "Schießen", "DS4.CombatValuesSpellcasting": "Zaubern", "DS4.CombatValuesTargetedSpellcasting": "Zielzaubern", - "DS4.BaseInfoRace": "Volk", - "DS4.BaseInfoClass": "Klasse", - "DS4.BaseInfoHeroClass": "Helden Klasse", - "DS4.BaseInfoCulture": "Kultur", - "DS4.ProgressionLevel": "Stufe", - "DS4.ProgressionExperiencePoints": "Erfahrungspunkte", - "DS4.ProgressionTalentPoints": "Talentpunkte", - "DS4.ProgressionProgressPoints": "Lernpunkte", + "DS4.CharacterBaseInfoRace": "Volk", + "DS4.CharacterBaseInfoClass": "Klasse", + "DS4.CharacterBaseInfoHeroClass": "Helden Klasse", + "DS4.CharacterBaseInfoCulture": "Kultur", + "DS4.CharacterProgressionLevel": "Stufe", + "DS4.CharacterProgressionExperiencePoints": "Erfahrungspunkte", + "DS4.CharacterProgressionTalentPoints": "Talentpunkte", + "DS4.CharacterProgressionProgressPoints": "Lernpunkte", "DS4.TalentRank": "Rang", "DS4.TalentRankBase": "Erworbener Rang", "DS4.TalentRankMax": "Maximaler Rang", "DS4.TalentRankMod": "Zusätzlicher Rang", "DS4.TalentRankTotal": "Gesamter Rang", - "DS4.LanguageLanguages": "Sprachen", - "DS4.LanguageAlphabets": "Schriftzeichen", - "DS4.ProfileGender": "Geschlecht", - "DS4.ProfileBirthday": "Geburtstag", - "DS4.ProfileBirthplace": "Geburtsort", - "DS4.ProfileAge": "Alter", - "DS4.ProfileHeight": "Größe", - "DS4.ProfilHairColor": "Haarfarbe", - "DS4.ProfileWeight": "Gewicht", - "DS4.ProfileEyeColor": "Augenfarbe", - "DS4.ProfileSpecialCharacteristics": "Besondere Eigenschaften", + "DS4.CharacterLanguageLanguages": "Sprachen", + "DS4.CharacterLanguageAlphabets": "Schriftzeichen", + "DS4.SpecialCreatureAbilityExperiencePoints": "Erfahrungspunkte", + "DS4.CharacterProfileBiography": "Biographie", + "DS4.CharacterProfileGender": "Geschlecht", + "DS4.CharacterProfileBirthday": "Geburtstag", + "DS4.CharacterProfileBirthplace": "Geburtsort", + "DS4.CharacterProfileAge": "Alter", + "DS4.CharacterProfileHeight": "Größe", + "DS4.ProfilEHairColor": "Haarfarbe", + "DS4.CharacterProfileWeight": "Gewicht", + "DS4.CharacterProfileEyeColor": "Augenfarbe", + "DS4.CharacterProfileSpecialCharacteristics": "Besondere Eigenschaften", + "DS4.CreatureTypeAnimal": "Tier", + "DS4.CreatureTypeConstruct": "Konstrukt", + "DS4.CreatureTypeHumanoid": "Humanoid", + "DS4.CreatureTypeMagicalEntity": "Magisches Wesen", + "DS4.CreatureTypePlantBeing": "Pflanzenwesen", + "DS4.CreatureTypeUndead": "Untot", + "DS4.CreatureSizeCategoryTiny": "Winzig", + "DS4.CreatureSizeCategorySmall": "Klein", + "DS4.CreatureSizeCategoryNormal": "Normal", + "DS4.CreatureSizeCategoryLarge": "Groß", + "DS4.CreatureSizeCategoryHuge": "Riesig", + "DS4.CreatureSizeCategoryColossal": "Gewaltig", + "DS4.CreatureBaseInfoLoot": "Beute", + "DS4.CreatureBaseInfoFoeFactor": "Gegnerhärte", + "DS4.CreatureBaseInfoCreatureType": "Kreaturengruppe", + "DS4.CreatureBaseInfoSizeCategory": "Größenkategorie", + "DS4.CreatureBaseInfoExperiencePoints": "Erfahrungspunkte", + "DS4.CreatureBaseInfoDescription": "Beschreibung", "DS4.WarningManageActiveEffectOnOwnedItem": "Das Verwalten von aktiven Effekten innerhalb eines besessen Items wird derzeit nicht unterstützt und wird in einem nachfolgenden Update hinzugefügt.", + "DS4.WarningActorCannotOwnItem": "Der Aktor '{actorName}' vom Typ '{actorType}' kann das Item '{itemName}' vom Typ '{itemType}' nicht besitzen.", "DS4.ErrorDiceCritOverlap": "Es gibt eine Überlappung zwischen Patzern und Immersiegen.", "DS4.ErrorExplodingRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.", "DS4.UnitRounds": "Runden", diff --git a/src/lang/en.json b/src/lang/en.json index 20d06eef..c1f9b2fb 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -8,8 +8,10 @@ "DS4.HeadingEffects": "Effects", "DS4.HeadingInventory": "Inventory", "DS4.HeadingProfile": "Profile", - "DS4.HeadingTalents": "Talents & Abilities", + "DS4.HeadingTalentsAbilities": "Talents & Abilities", "DS4.HeadingSpells": "Spells", + "DS4.HeadingDescription": "Description", + "DS4.HeadingSpecialCreatureAbilites": "Special Abilites", "DS4.AttackType": "Attack Type", "DS4.AttackTypeAbbr": "AT", "DS4.WeaponBonus": "Weapon Bonus", @@ -55,6 +57,8 @@ "DS4.ItemTypeLanguagePlural": "Languages", "DS4.ItemTypeAlphabet": "Alphabet", "DS4.ItemTypeAlphabetPlural": "Alphabets", + "DS4.ItemTypeSpecialCreatureAbility": "Special Creature Ability", + "DS4.ItemTypeSpecialCreatureAbilityPlural": "Special Creature Abilities", "DS4.ArmorType": "Armor Type", "DS4.ArmorTypeAbbr": "AT", "DS4.ArmorMaterialType": "Material Type", @@ -100,6 +104,8 @@ "DS4.SpellDuration": "Duration", "DS4.SpellCooldownDuration": "Cooldown", "DS4.SpellScrollPriceGold": "Scroll Price (Gold)", + "DS4.ActorTypeCharacter": "Character", + "DS4.ActorTypeCreature": "Creature", "DS4.AttributeBody": "Body", "DS4.AttributeMobility": "Mobility", "DS4.AttributeMind": "Mind", @@ -117,31 +123,52 @@ "DS4.CombatValuesRangedAttack": "Ranged Attack", "DS4.CombatValuesSpellcasting": "Spellcasting", "DS4.CombatValuesTargetedSpellcasting": "Targeted Spellcasting", - "DS4.BaseInfoRace": "Race", - "DS4.BaseInfoClass": "Class", - "DS4.BaseInfoHeroClass": "Hero Class", - "DS4.BaseInfoCulture": "Culture", - "DS4.ProgressionLevel": "Level", - "DS4.ProgressionExperiencePoints": "Experience Points", - "DS4.ProgressionTalentPoints": "Talent Points", - "DS4.ProgressionProgressPoints": "Progress Points", + "DS4.CharacterBaseInfoRace": "Race", + "DS4.CharacterBaseInfoClass": "Class", + "DS4.CharacterBaseInfoHeroClass": "Hero Class", + "DS4.CharacterBaseInfoCulture": "Culture", + "DS4.CharacterProgressionLevel": "Level", + "DS4.CharacterProgressionExperiencePoints": "Experience Points", + "DS4.CharacterProgressionTalentPoints": "Talent Points", + "DS4.CharacterProgressionProgressPoints": "Progress Points", "DS4.TalentRank": "Rank", "DS4.TalentRankBase": "Acquired Ranks", "DS4.TalentRankMax": "Maximum Ranks", "DS4.TalentRankMod": "Additional Ranks", "DS4.TalentRankTotal": "Total Ranks", - "DS4.LanguageLanguages": "Languages", - "DS4.LanguageAlphabets": "Alphabets", - "DS4.ProfileGender": "Gender", - "DS4.ProfileBirthday": "Birthday", - "DS4.ProfileBirthplace": "Birthplace", - "DS4.ProfileAge": "Age", - "DS4.ProfileHeight": "Height", - "DS4.ProfilHairColor": "Hair Color", - "DS4.ProfileWeight": "Weight", - "DS4.ProfileEyeColor": "Eye Color", - "DS4.ProfileSpecialCharacteristics": "Special Characteristics", + "DS4.CharacterLanguageLanguages": "Languages", + "DS4.CharacterLanguageAlphabets": "Alphabets", + "DS4.SpecialCreatureAbilityExperiencePoints": "Experience Points", + "DS4.CharacterProfileBiography": "Biography", + "DS4.CharacterProfileGender": "Gender", + "DS4.CharacterProfileBirthday": "Birthday", + "DS4.CharacterProfileBirthplace": "Birthplace", + "DS4.CharacterProfileAge": "Age", + "DS4.CharacterProfileHeight": "Height", + "DS4.ProfilEHairColor": "Hair Color", + "DS4.CharacterProfileWeight": "Weight", + "DS4.CharacterProfileEyeColor": "Eye Color", + "DS4.CharacterProfileSpecialCharacteristics": "Special Characteristics", + "DS4.CreatureTypeAnimal": "Animal", + "DS4.CreatureTypeConstruct": "Construct", + "DS4.CreatureTypeHumanoid": "Humanoid", + "DS4.CreatureTypeMagicalEntity": "Magical Entity", + "DS4.CreatureTypePlantBeing": "Plant Being", + "DS4.CreatureTypeUndead": "Undead", + "DS4.CreatureSizeCategoryTiny": "Tiny", + "DS4.CreatureSizeCategorySmall": "Small", + "DS4.CreatureSizeCategoryNormal": "Normal", + "DS4.CreatureSizeCategoryLarge": "Large", + "DS4.CreatureSizeCategoryHuge": "Huge", + "DS4.CreatureSizeCategoryColossal": "Colossal", + "DS4.CreatureBaseInfoLoot": "Loot", + "DS4.CreatureBaseInfoFoeFactor": "Foe Factor", + "DS4.CreatureBaseInfoCreatureType": "Creature Type", + "DS4.CreatureBaseInfoSizeCategory": "Size Category", + "DS4.CreatureBaseInfoExperiencePoints": "Experience Points", + "DS4.CreatureBaseInfoDescription": "Description", "DS4.WarningManageActiveEffectOnOwnedItem": "Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update.", + "DS4.WarningActorCannotOwnItem": "The actor '{actorName}' of type '{actorType}' cannot own the item '{itemName}' of type '{itemType}'.", "DS4.ErrorDiceCritOverlap": "There's an overlap between Fumbles and Coups", "DS4.ErrorExplodingRecursionLimitExceeded": "Maximum recursion depth for exploding dice roll exceeded", "DS4.UnitRounds": "Rounds", diff --git a/src/module/actor/actor-data.ts b/src/module/actor/actor-data.ts index a3ac75b9..883b6f5d 100644 --- a/src/module/actor/actor-data.ts +++ b/src/module/actor/actor-data.ts @@ -1,38 +1,19 @@ -export interface DS4ActorDataType { +import { ModifiableData, ResourceData, UsableResource } from "../common/common-data"; + +export type DS4ActorDataType = DS4ActorDataCharacter | DS4ActorDataCreature; + +interface DS4ActorDataBase { attributes: DS4ActorDataAttributes; traits: DS4ActorDataTraits; combatValues: DS4ActorDataCombatValues; - baseInfo: DS4ActorDataBaseInfo; - progression: DS4ActorDataProgression; - language: DS4ActorDataLanguage; - profile: DS4ActorDataProfile; } interface DS4ActorDataAttributes { - body: BodyAttribute; + body: ModifiableData; mobility: ModifiableData; mind: ModifiableData; } -export interface ModifiableData { - base: T; - mod: T; - total?: T; -} - -interface UsableResource { - total: T; - used: T; -} - -interface ResourceData extends ModifiableData { - value: T; - max?: T; -} - -// Blueprint in case we need more detailed differentiation -type BodyAttribute = ModifiableData; - interface DS4ActorDataTraits { strength: ModifiableData; constitution: ModifiableData; @@ -53,26 +34,34 @@ interface DS4ActorDataCombatValues { targetedSpellcasting: ModifiableData; } -interface DS4ActorDataBaseInfo { +interface DS4ActorDataCharacter extends DS4ActorDataBase { + baseInfo: DS4ActorDataCharacterBaseInfo; + progression: DS4ActorDataCharacterProgression; + language: DS4ActorDataCharacterLanguage; + profile: DS4ActorDataCharacterProfile; +} + +interface DS4ActorDataCharacterBaseInfo { race: string; class: string; heroClass: string; culture: string; } -interface DS4ActorDataProgression { +interface DS4ActorDataCharacterProgression { level: number; experiencePoints: number; talentPoints: UsableResource; progressPoints: UsableResource; } -interface DS4ActorDataLanguage { +interface DS4ActorDataCharacterLanguage { languages: string; alphabets: string; } -interface DS4ActorDataProfile { +interface DS4ActorDataCharacterProfile { + biography: string; gender: string; birthday: string; birthplace: string; @@ -83,3 +72,20 @@ interface DS4ActorDataProfile { eyeColor: string; specialCharacteristics: string; } + +interface DS4ActorDataCreature extends DS4ActorDataBase { + baseInfo: DS4ActorDataCreatureBaseInfo; +} + +type CreatureType = "animal" | "construct" | "humanoid" | "magicalEntity" | "plantBeing" | "undead"; + +type SizeCategory = "tiny" | "small" | "normal" | "large" | "huge" | "colossal"; + +interface DS4ActorDataCreatureBaseInfo { + loot: string; + foeFactor: number; + creatureType: CreatureType; + sizeCategory: SizeCategory; + experiencePoints: number; + description: string; +} diff --git a/src/module/actor/actor.ts b/src/module/actor/actor.ts index 7f2f8209..df3ad6d7 100644 --- a/src/module/actor/actor.ts +++ b/src/module/actor/actor.ts @@ -1,6 +1,7 @@ +import { ModifiableData } from "../common/common-data"; import { DS4Item } from "../item/item"; -import { DS4ItemDataType } from "../item/item-data"; -import { DS4ActorDataType, ModifiableData } from "./actor-data"; +import { DS4ItemDataType, ItemType } from "../item/item-data"; +import { DS4ActorDataType } from "./actor-data"; export class DS4Actor extends Actor { /** @override */ @@ -21,4 +22,37 @@ export class DS4Actor extends Actor combatValues.hitPoints.max = combatValues.hitPoints.total; } + + /** + * The list of item types that can be owned by this actor. + */ + get ownableItemTypes(): Array { + switch (this.data.type) { + case "character": + return [ + "weapon", + "armor", + "shield", + "trinket", + "equipment", + "spell", + "talent", + "racialAbility", + "language", + "alphabet", + ]; + case "creature": + return ["weapon", "armor", "shield", "trinket", "equipment", "spell", "specialCreatureAbility"]; + default: + return []; + } + } + + /** + * Checks whether or not the given item type can be owned by the actor. + * @param itemType the item type to check + */ + canOwnItemType(itemType: ItemType): boolean { + return this.ownableItemTypes.includes(itemType); + } } diff --git a/src/module/actor/actor-sheet.ts b/src/module/actor/sheets/actor-sheet.ts similarity index 84% rename from src/module/actor/actor-sheet.ts rename to src/module/actor/sheets/actor-sheet.ts index ca14fd0d..26f6bd8b 100644 --- a/src/module/actor/actor-sheet.ts +++ b/src/module/actor/sheets/actor-sheet.ts @@ -1,12 +1,30 @@ -import { DS4ItemDataType } from "../item/item-data"; -import { DS4Actor } from "./actor"; -import { DS4ActorDataType } from "./actor-data"; +import { DS4Item } from "../../item/item"; +import { DS4ItemDataType, ItemType } from "../../item/item-data"; +import { DS4Actor } from "../actor"; +import { DS4ActorDataType } from "../actor-data"; /** * Extend the basic ActorSheet with some very simple modifications * @extends {ActorSheet} */ export class DS4ActorSheet extends ActorSheet { + /** @override */ + static get defaultOptions(): FormApplicationOptions { + return mergeObject(super.defaultOptions, { + classes: ["ds4", "sheet", "actor"], + width: 745, + height: 600, + }); + } + + /** @override */ + get template(): string { + const path = "systems/ds4/templates/actor"; + return `${path}/${this.actor.data.type}-sheet.hbs`; + } + + /* -------------------------------------------- */ + /** * This method returns the data for the template of the actor sheet. * It explicitly adds the items of the object sorted by type in the @@ -21,21 +39,9 @@ export class DS4ActorSheet extends ActorSheet { + const data = JSON.parse(event.dataTransfer?.getData("text/plain")) as { type?: string }; + if (data.type === "Item") { + const item = await Item.fromDropData(data as Parameters[0]); + if (item && !this.actor.canOwnItemType(item.data.type as ItemType)) { + ui.notifications.warn( + game.i18n.format("DS4.WarningActorCannotOwnItem", { + actorName: this.actor.name, + actorType: this.actor.data.type, + itemName: item.name, + itemType: item.data.type, + }), + ); + return false; + } + } + return super._onDrop(event); + } } diff --git a/src/module/actor/sheets/character-sheet.ts b/src/module/actor/sheets/character-sheet.ts new file mode 100644 index 00000000..a7f9d15e --- /dev/null +++ b/src/module/actor/sheets/character-sheet.ts @@ -0,0 +1,11 @@ +import { DS4ActorSheet } from "./actor-sheet"; + +export class DS4CharacterActorSheet extends DS4ActorSheet { + /** @override */ + static get defaultOptions(): FormApplicationOptions { + return mergeObject(super.defaultOptions, { + classes: ["ds4", "sheet", "actor", "character"], + tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "inventory" }], + }); + } +} diff --git a/src/module/actor/sheets/creature-sheet.ts b/src/module/actor/sheets/creature-sheet.ts new file mode 100644 index 00000000..8c86848f --- /dev/null +++ b/src/module/actor/sheets/creature-sheet.ts @@ -0,0 +1,11 @@ +import { DS4ActorSheet } from "./actor-sheet"; + +export class DS4CreatureActorSheet extends DS4ActorSheet { + /** @override */ + static get defaultOptions(): FormApplicationOptions { + return mergeObject(super.defaultOptions, { + classes: ["ds4", "sheet", "actor", "creature"], + tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "inventory" }], + }); + } +} diff --git a/src/module/common/common-data.ts b/src/module/common/common-data.ts new file mode 100644 index 00000000..41bfc3c4 --- /dev/null +++ b/src/module/common/common-data.ts @@ -0,0 +1,15 @@ +export interface ModifiableData { + base: T; + mod: T; + total?: T; +} + +export interface ResourceData extends ModifiableData { + value: T; + max?: T; +} + +export interface UsableResource { + total: T; + used: T; +} diff --git a/src/module/config.ts b/src/module/config.ts index 9fe521e6..83b1ca79 100644 --- a/src/module/config.ts +++ b/src/module/config.ts @@ -61,6 +61,7 @@ export const DS4 = { racialAbility: "DS4.ItemTypeRacialAbility", language: "DS4.ItemTypeLanguage", alphabet: "DS4.ItemTypeAlphabet", + specialCreatureAbility: "DS4.ItemTypeSpecialCreatureAbility", }, /** @@ -123,7 +124,15 @@ export const DS4 = { }, /** - * Define the set of attributes a character has + * Define the set of actor types + */ + actorTypes: { + character: "DS4.ActorTypeCharacter", + creature: "DS4.ActorTypeCreature", + }, + + /** + * Define the set of attributes an actor has */ attributes: { body: "DS4.AttributeBody", @@ -132,7 +141,7 @@ export const DS4 = { }, /** - * Define the set of traits a character has + * Define the set of traits an actor has */ traits: { strength: "DS4.TraitStrength", @@ -144,7 +153,7 @@ export const DS4 = { }, /** - * Define the set of combat values a character has + * Define the set of combat values an actor has */ combatValues: { hitPoints: "DS4.CombatValuesHitPoints", @@ -160,50 +169,52 @@ export const DS4 = { /** * Define the base info of a character */ - baseInfo: { - race: "DS4.BaseInfoRace", - class: "DS4.BaseInfoClass", - heroClass: "DS4.BaseInfoHeroClass", - culture: "DS4.BaseInfoCulture", + characterBaseInfo: { + race: "DS4.CharacterBaseInfoRace", + class: "DS4.CharacterBaseInfoClass", + heroClass: "DS4.CharacterBaseInfoHeroClass", + culture: "DS4.CharacterBaseInfoCulture", }, /** * Define the progression info of a character */ - progression: { - level: "DS4.ProgressionLevel", - experiencePoints: "DS4.ProgressionExperiencePoints", - talentPoints: "DS4.ProgressionTalentPoints", - progressPoints: "DS4.ProgressionProgressPoints", + characterProgression: { + level: "DS4.CharacterProgressionLevel", + experiencePoints: "DS4.CharacterProgressionExperiencePoints", + talentPoints: "DS4.CharacterProgressionTalentPoints", + progressPoints: "DS4.CharacterProgressionProgressPoints", }, /** * Define the language info of a character */ - language: { - languages: "DS4.LanguageLanguages", - alphabets: "DS4.LanguageAlphabets", + characterLanguage: { + languages: "DS4.CharacterLanguageLanguages", + alphabets: "DS4.CharacterLanguageAlphabets", }, /** * Define the profile info of a character */ - profile: { - gender: "DS4.ProfileGender", - birthday: "DS4.ProfileBirthday", - birthplace: "DS4.ProfileBirthplace", - age: "DS4.ProfileAge", - height: "DS4.ProfileHeight", - hairColor: "DS4.ProfilHairColor", - weight: "DS4.ProfileWeight", - eyeColor: "DS4.ProfileEyeColor", - specialCharacteristics: "DS4.ProfileSpecialCharacteristics", + characterProfile: { + biography: "DS4.CharacterProfileBiography", + gender: "DS4.CharacterProfileGender", + birthday: "DS4.CharacterProfileBirthday", + birthplace: "DS4.CharacterProfileBirthplace", + age: "DS4.CharacterProfileAge", + height: "DS4.CharacterProfileHeight", + hairColor: "DS4.ProfilEHairColor", + weight: "DS4.CharacterProfileWeight", + eyeColor: "DS4.CharacterProfileEyeColor", + specialCharacteristics: "DS4.CharacterProfileSpecialCharacteristics", }, /** * Define the profile info types for handlebars of a character */ - profileDTypes: { + characterProfileDTypes: { + biography: "String", gender: "String", birthday: "String", birthplace: "String", @@ -215,6 +226,42 @@ export const DS4 = { specialCharacteristics: "String", }, + /** + * Define the different creature types a creature can be + */ + creatureTypes: { + animal: "DS4.CreatureTypeAnimal", + construct: "DS4.CreatureTypeConstruct", + humanoid: "DS4.CreatureTypeHumanoid", + magicalEntity: "DS4.CreatureTypeMagicalEntity", + plantBeing: "DS4.CreatureTypePlantBeing", + undead: "DS4.CreatureTypeUndead", + }, + + /** + * Define the different size categories creatures fall into + */ + creatureSizeCategories: { + tiny: "DS4.CreatureSizeCategoryTiny", + small: "DS4.CreatureSizeCategorySmall", + normal: "DS4.CreatureSizeCategoryNormal", + large: "DS4.CreatureSizeCategoryLarge", + huge: "DS4.CreatureSizeCategoryHuge", + colossal: "DS4.CreatureSizeCategoryColossal", + }, + + /** + * Define the base info of a creature + */ + creatureBaseInfo: { + loot: "DS4.CreatureBaseInfoLoot", + foeFactor: "DS4.CreatureBaseInfoFoeFactor", + creatureType: "DS4.CreatureBaseInfoCreatureType", + sizeCategory: "DS4.CreatureBaseInfoSizeCategory", + experiencePoints: "DS4.CreatureBaseInfoExperiencePoints", + description: "DS4.CreatureBaseInfoDescription", + }, + /** * Define translations for available distance units */ diff --git a/src/module/ds4.ts b/src/module/ds4.ts index ea1e69d9..94d33271 100644 --- a/src/module/ds4.ts +++ b/src/module/ds4.ts @@ -1,10 +1,11 @@ // Import Modules import { DS4Actor } from "./actor/actor"; -import { DS4ActorSheet } from "./actor/actor-sheet"; import { DS4Item } from "./item/item"; import { DS4ItemSheet } from "./item/item-sheet"; import { DS4 } from "./config"; import { DS4Check } from "./rolls/check"; +import { DS4CharacterActorSheet } from "./actor/sheets/character-sheet"; +import { DS4CreatureActorSheet } from "./actor/sheets/creature-sheet"; import { createCheckRoll } from "./rolls/check-factory"; Hooks.once("init", async function () { @@ -24,6 +25,10 @@ Hooks.once("init", async function () { CONFIG.Actor.entityClass = DS4Actor as typeof Actor; CONFIG.Item.entityClass = DS4Item as typeof Item; + // Define localized type labels + CONFIG.Actor.typeLabels = DS4.actorTypes; + CONFIG.Item.typeLabels = DS4.itemTypes; + // Configure Dice CONFIG.Dice.types = [Die, DS4Check]; CONFIG.Dice.terms = { @@ -34,7 +39,8 @@ Hooks.once("init", async function () { // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("ds4", DS4ActorSheet, { makeDefault: true }); + Actors.registerSheet("ds4", DS4CharacterActorSheet, { types: ["character"], makeDefault: true }); + Actors.registerSheet("ds4", DS4CreatureActorSheet, { types: ["creature"], makeDefault: true }); Items.unregisterSheet("core", ItemSheet); Items.registerSheet("ds4", DS4ItemSheet, { makeDefault: true }); @@ -49,7 +55,7 @@ async function registerHandlebarsPartials() { "systems/ds4/templates/item/partials/effects.hbs", "systems/ds4/templates/item/partials/body.hbs", "systems/ds4/templates/actor/partials/items-overview.hbs", - "systems/ds4/templates/actor/partials/talents-overview.hbs", + "systems/ds4/templates/actor/partials/talents-abilities-overview.hbs", "systems/ds4/templates/actor/partials/spells-overview.hbs", "systems/ds4/templates/actor/partials/overview-add-button.hbs", "systems/ds4/templates/actor/partials/overview-control-buttons.hbs", @@ -57,6 +63,7 @@ async function registerHandlebarsPartials() { "systems/ds4/templates/actor/partials/combat-values.hbs", "systems/ds4/templates/actor/partials/profile.hbs", "systems/ds4/templates/actor/partials/character-progression.hbs", + "systems/ds4/templates/actor/partials/special-creature-abilites-overview.hbs", ]; return loadTemplates(templatePaths); } @@ -84,10 +91,13 @@ Hooks.once("setup", function () { "attributes", "traits", "combatValues", - "baseInfo", - "progression", - "language", - "profile", + "characterBaseInfo", + "characterProgression", + "characterLanguage", + "characterProfile", + "creatureTypes", + "creatureSizeCategories", + "creatureBaseInfo", "temporalUnits", "temporalUnitsAbbr", "distanceUnits", @@ -96,7 +106,7 @@ Hooks.once("setup", function () { ]; // Exclude some from sorting where the default order matters - const noSort = ["attributes", "traits", "combatValues"]; + const noSort = ["attributes", "traits", "combatValues", "creatureSizeCategories"]; // Localize and sort CONFIG objects for (const o of toLocalize) { diff --git a/src/module/item/item-data.ts b/src/module/item/item-data.ts index 45622a6e..64ee17f2 100644 --- a/src/module/item/item-data.ts +++ b/src/module/item/item-data.ts @@ -1,4 +1,7 @@ -import { ModifiableData } from "../actor/actor-data"; +import { ModifiableData } from "../common/common-data"; +import { DS4 } from "../config"; + +export type ItemType = keyof typeof DS4.itemTypes; export type DS4ItemDataType = | DS4Weapon @@ -10,7 +13,8 @@ export type DS4ItemDataType = | DS4Talent | DS4RacialAbility | DS4Language - | DS4Alphabet; + | DS4Alphabet + | DS4SpecialCreatureAbility; // types @@ -59,6 +63,9 @@ interface DS4Equipment extends DS4ItemBase, DS4ItemPhysical {} type DS4RacialAbility = DS4ItemBase; type DS4Language = DS4ItemBase; type DS4Alphabet = DS4ItemBase; +interface DS4SpecialCreatureAbility extends DS4ItemBase { + experiencePoints: number; +} // templates diff --git a/src/template.json b/src/template.json index 0d723909..ca9b4ee5 100644 --- a/src/template.json +++ b/src/template.json @@ -1,84 +1,98 @@ { "Actor": { - "types": ["character"], - "templates": {}, + "types": ["character", "creature"], + "templates": { + "base": { + "attributes": { + "body": { + "base": 0, + "mod": 0 + }, + "mobility": { + "base": 0, + "mod": 0 + }, + "mind": { + "base": 0, + "mod": 0 + } + }, + "traits": { + "strength": { + "base": 0, + "mod": 0 + }, + "constitution": { + "base": 0, + "mod": 0 + }, + "agility": { + "base": 0, + "mod": 0 + }, + "dexterity": { + "base": 0, + "mod": 0 + }, + "intellect": { + "base": 0, + "mod": 0 + }, + "aura": { + "base": 0, + "mod": 0 + } + }, + "combatValues": { + "hitPoints": { + "base": 0, + "mod": 0, + "value": 0 + }, + "defense": { + "base": 0, + "mod": 0 + }, + "initiative": { + "base": 0, + "mod": 0 + }, + "movement": { + "base": 0, + "mod": 0 + }, + "meleeAttack": { + "base": 0, + "mod": 0 + }, + "rangedAttack": { + "base": 0, + "mod": 0 + }, + "spellcasting": { + "base": 0, + "mod": 0 + }, + "targetedSpellcasting": { + "base": 0, + "mod": 0 + } + } + } + }, + "creature": { + "templates": ["base"], + "baseInfo": { + "loot": "", + "foeFactor": 1, + "creatureType": "humanoid", + "sizeCategory": "normal", + "experiencePoints": 0, + "description": "" + } + }, "character": { - "templates": [], - "attributes": { - "body": { - "base": 0, - "mod": 0 - }, - "mobility": { - "base": 0, - "mod": 0 - }, - "mind": { - "base": 0, - "mod": 0 - } - }, - "traits": { - "strength": { - "base": 0, - "mod": 0 - }, - "constitution": { - "base": 0, - "mod": 0 - }, - "agility": { - "base": 0, - "mod": 0 - }, - "dexterity": { - "base": 0, - "mod": 0 - }, - "intellect": { - "base": 0, - "mod": 0 - }, - "aura": { - "base": 0, - "mod": 0 - } - }, - "combatValues": { - "hitPoints": { - "base": 0, - "mod": 0, - "value": 0 - }, - "defense": { - "base": 0, - "mod": 0 - }, - "initiative": { - "base": 0, - "mod": 0 - }, - "movement": { - "base": 0, - "mod": 0 - }, - "meleeAttack": { - "base": 0, - "mod": 0 - }, - "rangedAttack": { - "base": 0, - "mod": 0 - }, - "spellcasting": { - "base": 0, - "mod": 0 - }, - "targetedSpellcasting": { - "base": 0, - "mod": 0 - } - }, + "templates": ["base"], "baseInfo": { "race": "", "class": "", @@ -98,6 +112,7 @@ } }, "profile": { + "biography": "", "gender": "", "birthday": "", "birthplace": "", @@ -121,7 +136,8 @@ "talent", "racialAbility", "language", - "alphabet" + "alphabet", + "specialCreatureAbility" ], "templates": { "base": { @@ -199,6 +215,10 @@ "unit": "custom" }, "scrollPrice": 0 + }, + "specialCreatureAbility": { + "templates": ["base"], + "experiencePoints": 0 } } } diff --git a/src/templates/actor/actor-sheet.hbs b/src/templates/actor/character-sheet.hbs similarity index 80% rename from src/templates/actor/actor-sheet.hbs rename to src/templates/actor/character-sheet.hbs index 6763e440..5c0b4358 100644 --- a/src/templates/actor/actor-sheet.hbs +++ b/src/templates/actor/character-sheet.hbs @@ -8,17 +8,19 @@
- +
- +
+ for="data.progression.progressPoints.used">{{config.characterProgression.progressPoints}}
+ for="data.progression.talentPoints.used">{{config.characterProgression.talentPoints}}
- +
+ for="data.baseInfo.heroClass">{{config.characterBaseInfo.heroClass}}
@@ -60,7 +63,7 @@ @@ -74,14 +77,15 @@ {{> systems/ds4/templates/actor/partials/spells-overview.hbs}} {{!-- Talents Tab --}} - {{> systems/ds4/templates/actor/partials/talents-overview.hbs}} + {{> systems/ds4/templates/actor/partials/talents-abilities-overview.hbs}} {{! Profile Tab --}} {{> systems/ds4/templates/actor/partials/profile.hbs}} {{!-- Biography Tab --}}
- {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} + {{editor content=data.profile.biography target="data.profile.biography" button=true owner=owner + editable=editable}}
- \ No newline at end of file + diff --git a/src/templates/actor/creature-sheet.hbs b/src/templates/actor/creature-sheet.hbs new file mode 100644 index 00000000..2ebf5977 --- /dev/null +++ b/src/templates/actor/creature-sheet.hbs @@ -0,0 +1,78 @@ +
+ {{!-- Sheet Header --}} +
+ +
+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ {{> systems/ds4/templates/actor/partials/attributes-traits.hbs}} + {{> systems/ds4/templates/actor/partials/combat-values.hbs}} +
+
+ + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ {{!-- Items Tab --}} + {{> systems/ds4/templates/actor/partials/items-overview.hbs}} + + {{!-- Special Creature Abilities Tab --}} + {{> systems/ds4/templates/actor/partials/special-creature-abilites-overview.hbs}} + + {{!-- Spells Tab --}} + {{> systems/ds4/templates/actor/partials/spells-overview.hbs}} + + {{!-- Description Tab --}} +
+ {{editor content=data.baseInfo.description target="data.baseInfo.description" button=true owner=owner + editable=editable}} +
+
+
\ No newline at end of file diff --git a/src/templates/actor/partials/character-progression.hbs b/src/templates/actor/partials/character-progression.hbs index f22376f0..8990656c 100644 --- a/src/templates/actor/partials/character-progression.hbs +++ b/src/templates/actor/partials/character-progression.hbs @@ -1,13 +1,13 @@
-

+

+ for="data.progression.experiencePoints">{{config.characterProgression.experiencePoints}}

diff --git a/src/templates/actor/partials/items-overview.hbs b/src/templates/actor/partials/items-overview.hbs index 4dbd269b..4d7135aa 100644 --- a/src/templates/actor/partials/items-overview.hbs +++ b/src/templates/actor/partials/items-overview.hbs @@ -1,5 +1,4 @@ -{{!-- TODO: For items list: only show header, if list is not empty --}} - +{{!-- TODO: Refactor to avoid code duplication with special-creature-abilites-overview and talents-overview --}} {{!-- ======================================================================== --}} {{!-- INLINE PARTIAL DEFINITIONS --}} diff --git a/src/templates/actor/partials/profile.hbs b/src/templates/actor/partials/profile.hbs index b0034128..be95eeb5 100644 --- a/src/templates/actor/partials/profile.hbs +++ b/src/templates/actor/partials/profile.hbs @@ -1,13 +1,15 @@
{{#each data.profile as |profile-data-value profile-data-key|}} + {{#if (ne profile-data-key 'biography')}}
+ data-dtype="{{lookup ../config/characterProfileDTypes profile-data-key}}" />
+ {{/if}} {{/each}}
-
\ No newline at end of file +
diff --git a/src/templates/actor/partials/special-creature-abilites-overview.hbs b/src/templates/actor/partials/special-creature-abilites-overview.hbs new file mode 100644 index 00000000..28637149 --- /dev/null +++ b/src/templates/actor/partials/special-creature-abilites-overview.hbs @@ -0,0 +1,61 @@ +{{!-- TODO: Refactor to avoid code duplication with items-overview and talents-overview --}} + +{{!-- ======================================================================== --}} +{{!-- INLINE PARTIAL DEFINITIONS --}} +{{!-- ======================================================================== --}} + +{{!-- +!-- Render a list row for a base item from a given item. +!-- Base item means it just has an image, a description, and a name (and effects). +!-- It is a flexbox with a child for each item value of interest. +!-- The partial assumes a variable item to be given in the context. +!-- +!-- @param item: hand over the item to the partial as hash parameter +--}} +{{#*inline "baseItemListEntry"}} +
  • + {{!-- image --}} +
    + +
    + {{!-- name --}} + + {{!-- description --}} +
    {{{item.data.data.description}}}
    + {{!-- control buttons --}} + {{> systems/ds4/templates/actor/partials/overview-control-buttons.hbs }} +
  • +{{/inline}} + +{{!-- +!-- Render a list header for a base item list entries from a given item. +!-- The partial assumes a variable dataType to be given in the context. +!-- +!-- @param dataType: the string item type for the list +--}} +{{#*inline "baseItemListHeader"}} +
  • + {{!-- image --}} +
    + {{!-- name --}} +
    {{localize 'DS4.ItemName'}}
    + {{!-- description --}} +
    {{localize 'DS4.Description'}}
    + {{!-- add button --}} + {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }} +
  • +{{/inline}} + + +{{!-- ======================================================================== --}} + + +
    +
      + {{> baseItemListHeader dataType='specialCreatureAbility' }} + {{#each itemsByType.specialCreatureAbility as |item id|}} + {{> baseItemListEntry item=item}} + {{/each}} +
    +
    \ No newline at end of file diff --git a/src/templates/actor/partials/spells-overview.hbs b/src/templates/actor/partials/spells-overview.hbs index e7e865f7..8bcd33e3 100644 --- a/src/templates/actor/partials/spells-overview.hbs +++ b/src/templates/actor/partials/spells-overview.hbs @@ -34,7 +34,7 @@ {{!-- ======================================================================== --}} -
    +
    1. {{!-- equipped --}} diff --git a/src/templates/actor/partials/talents-overview.hbs b/src/templates/actor/partials/talents-abilities-overview.hbs similarity index 97% rename from src/templates/actor/partials/talents-overview.hbs rename to src/templates/actor/partials/talents-abilities-overview.hbs index 8ef93113..e40b2aa7 100644 --- a/src/templates/actor/partials/talents-overview.hbs +++ b/src/templates/actor/partials/talents-abilities-overview.hbs @@ -1,3 +1,5 @@ +{{!-- TODO: Refactor to avoid code duplication with creature-special-abilities-overview and talents-overview --}} + {{!-- ======================================================================== --}} {{!-- INLINE PARTIAL DEFINITIONS --}} {{!-- ======================================================================== --}} @@ -118,7 +120,7 @@ {{!-- ======================================================================== --}} -
      +

      {{localize 'DS4.ItemTypeTalentPlural'}}

      {{#> ifHasItemOfType itemsArray=itemsByType.talent dataType='talent' }}
        diff --git a/src/templates/item/partials/body.hbs b/src/templates/item/partials/body.hbs index a7ac4d72..2a9eaecd 100644 --- a/src/templates/item/partials/body.hbs +++ b/src/templates/item/partials/body.hbs @@ -2,7 +2,7 @@ {{!-- Sheet Tab Navigation --}}
      -
      +
      {{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
      \ No newline at end of file diff --git a/src/templates/item/specialCreatureAbility-sheet.hbs b/src/templates/item/specialCreatureAbility-sheet.hbs new file mode 100644 index 00000000..086ba9a5 --- /dev/null +++ b/src/templates/item/specialCreatureAbility-sheet.hbs @@ -0,0 +1,15 @@ +
      + {{#> systems/ds4/templates/item/partials/sheet-header.hbs}} +
      +
      + + +
      +
      + {{/systems/ds4/templates/item/partials/sheet-header.hbs}} + + {{!-- Common Item body --}} + {{#> systems/ds4/templates/item/partials/body.hbs}}{{/systems/ds4/templates/item/partials/body.hbs}} + +
      \ No newline at end of file