Merge remote-tracking branch 'origin/master' into 051-fixSpellProperties

This commit is contained in:
Oliver Rümpelein 2021-01-18 20:12:49 +01:00
commit 5f8848ede8
28 changed files with 965 additions and 484 deletions

View file

@ -13,7 +13,7 @@ To install and use the Dungeonslayers 4 system for Foundry Virtual Tabletop,
simply paste the following URL into the **Install System** dialog on the Setup simply paste the following URL into the **Install System** dialog on the Setup
menu of the application. menu of the application.
https://git.f3l.de/dungeonslayers/ds4/-/raw/master/src/system.json?inline=false https://git.f3l.de/dungeonslayers/ds4/-/raw/latest/src/system.json?inline=false
## Development ## Development

206
package-lock.json generated
View file

@ -44,9 +44,9 @@
} }
}, },
"@eslint/eslintrc": { "@eslint/eslintrc": {
"version": "0.2.2", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
"integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
"dev": true, "dev": true,
"requires": { "requires": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
@ -56,7 +56,7 @@
"ignore": "^4.0.6", "ignore": "^4.0.6",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
"js-yaml": "^3.13.1", "js-yaml": "^3.13.1",
"lodash": "^4.17.19", "lodash": "^4.17.20",
"minimatch": "^3.0.4", "minimatch": "^3.0.4",
"strip-json-comments": "^3.1.1" "strip-json-comments": "^3.1.1"
}, },
@ -174,15 +174,16 @@
} }
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "4.11.1", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.0.tgz",
"integrity": "sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw==", "integrity": "sha512-IJ5e2W7uFNfg4qh9eHkHRUCbgZ8VKtGwD07kannJvM5t/GU8P8+24NX8gi3Hf5jST5oWPY8kyV1s/WtfiZ4+Ww==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/experimental-utils": "4.11.1", "@typescript-eslint/experimental-utils": "4.14.0",
"@typescript-eslint/scope-manager": "4.11.1", "@typescript-eslint/scope-manager": "4.14.0",
"debug": "^4.1.1", "debug": "^4.1.1",
"functional-red-black-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1",
"lodash": "^4.17.15",
"regexpp": "^3.0.0", "regexpp": "^3.0.0",
"semver": "^7.3.2", "semver": "^7.3.2",
"tsutils": "^3.17.1" "tsutils": "^3.17.1"
@ -230,28 +231,28 @@
} }
}, },
"@typescript-eslint/experimental-utils": { "@typescript-eslint/experimental-utils": {
"version": "4.11.1", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.0.tgz",
"integrity": "sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g==", "integrity": "sha512-6i6eAoiPlXMKRbXzvoQD5Yn9L7k9ezzGRvzC/x1V3650rUk3c3AOjQyGYyF9BDxQQDK2ElmKOZRD0CbtdkMzQQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.3", "@types/json-schema": "^7.0.3",
"@typescript-eslint/scope-manager": "4.11.1", "@typescript-eslint/scope-manager": "4.14.0",
"@typescript-eslint/types": "4.11.1", "@typescript-eslint/types": "4.14.0",
"@typescript-eslint/typescript-estree": "4.11.1", "@typescript-eslint/typescript-estree": "4.14.0",
"eslint-scope": "^5.0.0", "eslint-scope": "^5.0.0",
"eslint-utils": "^2.0.0" "eslint-utils": "^2.0.0"
} }
}, },
"@typescript-eslint/parser": { "@typescript-eslint/parser": {
"version": "4.11.1", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.11.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.0.tgz",
"integrity": "sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw==", "integrity": "sha512-sUDeuCjBU+ZF3Lzw0hphTyScmDDJ5QVkyE21pRoBo8iDl7WBtVFS+WDN3blY1CH3SBt7EmYCw6wfmJjF0l/uYg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/scope-manager": "4.11.1", "@typescript-eslint/scope-manager": "4.14.0",
"@typescript-eslint/types": "4.11.1", "@typescript-eslint/types": "4.14.0",
"@typescript-eslint/typescript-estree": "4.11.1", "@typescript-eslint/typescript-estree": "4.14.0",
"debug": "^4.1.1" "debug": "^4.1.1"
}, },
"dependencies": { "dependencies": {
@ -273,29 +274,29 @@
} }
}, },
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "4.11.1", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.0.tgz",
"integrity": "sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ==", "integrity": "sha512-/J+LlRMdbPh4RdL4hfP1eCwHN5bAhFAGOTsvE6SxsrM/47XQiPSgF5MDgLyp/i9kbZV9Lx80DW0OpPkzL+uf8Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "4.11.1", "@typescript-eslint/types": "4.14.0",
"@typescript-eslint/visitor-keys": "4.11.1" "@typescript-eslint/visitor-keys": "4.14.0"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "4.11.1", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.11.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.0.tgz",
"integrity": "sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA==", "integrity": "sha512-VsQE4VvpldHrTFuVPY1ZnHn/Txw6cZGjL48e+iBxTi2ksa9DmebKjAeFmTVAYoSkTk7gjA7UqJ7pIsyifTsI4A==",
"dev": true "dev": true
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "4.11.1", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.0.tgz",
"integrity": "sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw==", "integrity": "sha512-wRjZ5qLao+bvS2F7pX4qi2oLcOONIB+ru8RGBieDptq/SudYwshveORwCVU4/yMAd4GK7Fsf8Uq1tjV838erag==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "4.11.1", "@typescript-eslint/types": "4.14.0",
"@typescript-eslint/visitor-keys": "4.11.1", "@typescript-eslint/visitor-keys": "4.14.0",
"debug": "^4.1.1", "debug": "^4.1.1",
"globby": "^11.0.1", "globby": "^11.0.1",
"is-glob": "^4.0.1", "is-glob": "^4.0.1",
@ -346,12 +347,12 @@
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "4.11.1", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.0.tgz",
"integrity": "sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg==", "integrity": "sha512-MeHHzUyRI50DuiPgV9+LxcM52FCJFYjJiWHtXlbyC27b80mfOwKeiKI+MHOTEpcpfmoPFm/vvQS88bYIx6PZTA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "4.11.1", "@typescript-eslint/types": "4.14.0",
"eslint-visitor-keys": "^2.0.0" "eslint-visitor-keys": "^2.0.0"
} }
}, },
@ -570,9 +571,9 @@
"dev": true "dev": true
}, },
"archiver": { "archiver": {
"version": "5.1.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/archiver/-/archiver-5.1.0.tgz", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.2.0.tgz",
"integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", "integrity": "sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"archiver-utils": "^2.1.0", "archiver-utils": "^2.1.0",
@ -1969,13 +1970,13 @@
"dev": true "dev": true
}, },
"eslint": { "eslint": {
"version": "7.17.0", "version": "7.18.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz",
"integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==", "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/code-frame": "^7.0.0", "@babel/code-frame": "^7.0.0",
"@eslint/eslintrc": "^0.2.2", "@eslint/eslintrc": "^0.3.0",
"ajv": "^6.10.0", "ajv": "^6.10.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
"cross-spawn": "^7.0.2", "cross-spawn": "^7.0.2",
@ -1999,7 +2000,7 @@
"js-yaml": "^3.13.1", "js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1", "json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1", "levn": "^0.4.1",
"lodash": "^4.17.19", "lodash": "^4.17.20",
"minimatch": "^3.0.4", "minimatch": "^3.0.4",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
"optionator": "^0.9.1", "optionator": "^0.9.1",
@ -2111,9 +2112,9 @@
"dev": true "dev": true
}, },
"eslint-plugin-prettier": { "eslint-plugin-prettier": {
"version": "3.3.0", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz",
"integrity": "sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ==", "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"prettier-linter-helpers": "^1.0.0" "prettier-linter-helpers": "^1.0.0"
@ -2452,9 +2453,9 @@
"dev": true "dev": true
}, },
"fast-glob": { "fast-glob": {
"version": "3.2.4", "version": "3.2.5",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
"integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.stat": "^2.0.2",
@ -2599,12 +2600,12 @@
} }
}, },
"find-versions": { "find-versions": {
"version": "3.2.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz",
"integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"semver-regex": "^2.0.0" "semver-regex": "^3.1.2"
} }
}, },
"findup-sync": { "findup-sync": {
@ -2985,9 +2986,9 @@
} }
}, },
"globby": { "globby": {
"version": "11.0.1", "version": "11.0.2",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
"integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
"dev": true, "dev": true,
"requires": { "requires": {
"array-union": "^2.1.0", "array-union": "^2.1.0",
@ -3393,18 +3394,18 @@
"dev": true "dev": true
}, },
"husky": { "husky": {
"version": "4.3.6", "version": "4.3.8",
"resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz", "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz",
"integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==", "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==",
"dev": true, "dev": true,
"requires": { "requires": {
"chalk": "^4.0.0", "chalk": "^4.0.0",
"ci-info": "^2.0.0", "ci-info": "^2.0.0",
"compare-versions": "^3.6.0", "compare-versions": "^3.6.0",
"cosmiconfig": "^7.0.0", "cosmiconfig": "^7.0.0",
"find-versions": "^3.2.0", "find-versions": "^4.0.0",
"opencollective-postinstall": "^2.0.2", "opencollective-postinstall": "^2.0.2",
"pkg-dir": "^4.2.0", "pkg-dir": "^5.0.0",
"please-upgrade-node": "^3.2.0", "please-upgrade-node": "^3.2.0",
"slash": "^3.0.0", "slash": "^3.0.0",
"which-pm-runs": "^1.0.0" "which-pm-runs": "^1.0.0"
@ -5170,40 +5171,49 @@
} }
}, },
"pkg-dir": { "pkg-dir": {
"version": "4.2.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
"dev": true, "dev": true,
"requires": { "requires": {
"find-up": "^4.0.0" "find-up": "^5.0.0"
}, },
"dependencies": { "dependencies": {
"find-up": { "find-up": {
"version": "4.1.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true, "dev": true,
"requires": { "requires": {
"locate-path": "^5.0.0", "locate-path": "^6.0.0",
"path-exists": "^4.0.0" "path-exists": "^4.0.0"
} }
}, },
"locate-path": { "locate-path": {
"version": "5.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true, "dev": true,
"requires": { "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": { "p-locate": {
"version": "4.1.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true, "dev": true,
"requires": { "requires": {
"p-limit": "^2.2.0" "p-limit": "^3.0.2"
} }
}, },
"path-exists": { "path-exists": {
@ -5663,9 +5673,9 @@
"dev": true "dev": true
}, },
"sass": { "sass": {
"version": "1.32.0", "version": "1.32.4",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.32.0.tgz", "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.4.tgz",
"integrity": "sha512-fhyqEbMIycQA4blrz/C0pYhv2o4x2y6FYYAH0CshBw3DXh5D5wyERgxw0ptdau1orc/GhNrhF7DFN2etyOCEng==", "integrity": "sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w==",
"dev": true, "dev": true,
"requires": { "requires": {
"chokidar": ">=2.0.0 <4.0.0" "chokidar": ">=2.0.0 <4.0.0"
@ -5849,9 +5859,9 @@
} }
}, },
"semver-regex": { "semver-regex": {
"version": "2.0.0", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz",
"integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==",
"dev": true "dev": true
}, },
"set-blocking": { "set-blocking": {
@ -6406,9 +6416,9 @@
} }
}, },
"table": { "table": {
"version": "6.0.6", "version": "6.0.7",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.6.tgz", "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
"integrity": "sha512-OInCtPmDNieVBkVFi6C8RwU2S2H0h8mF3e3TQK4nreaUNCpooQUkI+A/KuEkm5FawfhWIfNqG+qfelVVR+V00g==", "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"dev": true, "dev": true,
"requires": { "requires": {
"ajv": "^7.0.2", "ajv": "^7.0.2",
@ -6487,9 +6497,9 @@
} }
}, },
"tar-stream": { "tar-stream": {
"version": "2.1.4", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"bl": "^4.0.3", "bl": "^4.0.3",
@ -6657,9 +6667,9 @@
"dev": true "dev": true
}, },
"tsutils": { "tsutils": {
"version": "3.17.1", "version": "3.19.1",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz",
"integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==",
"dev": true, "dev": true,
"requires": { "requires": {
"tslib": "^1.8.1" "tslib": "^1.8.1"
@ -7250,6 +7260,12 @@
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true "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": { "zip-stream": {
"version": "4.0.4", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.4.tgz", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.4.tgz",

View file

@ -46,13 +46,13 @@
"devDependencies": { "devDependencies": {
"@types/fs-extra": "^9.0.6", "@types/fs-extra": "^9.0.6",
"@types/jasmine": "^3.6.2", "@types/jasmine": "^3.6.2",
"@typescript-eslint/eslint-plugin": "^4.11.1", "@typescript-eslint/eslint-plugin": "^4.14.0",
"@typescript-eslint/parser": "^4.11.1", "@typescript-eslint/parser": "^4.14.0",
"archiver": "^5.1.0", "archiver": "^5.2.0",
"chalk": "^4.1.0", "chalk": "^4.1.0",
"eslint": "^7.17.0", "eslint": "^7.18.0",
"eslint-config-prettier": "^7.1.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", "foundry-pc-types": "git+https://git.f3l.de/dungeonslayers/foundry-pc-types.git#f3l-fixes",
"fs-extra": "^9.0.1", "fs-extra": "^9.0.1",
"gulp": "^4.0.2", "gulp": "^4.0.2",
@ -60,13 +60,13 @@
"gulp-less": "^4.0.1", "gulp-less": "^4.0.1",
"gulp-sass": "^4.1.0", "gulp-sass": "^4.1.0",
"gulp-typescript": "^6.0.0-alpha.1", "gulp-typescript": "^6.0.0-alpha.1",
"husky": "^4.3.6", "husky": "^4.3.8",
"jasmine": "^3.6.3", "jasmine": "^3.6.3",
"jasmine-xml-reporter": "^1.2.1", "jasmine-xml-reporter": "^1.2.1",
"json-stringify-pretty-compact": "^2.0.0", "json-stringify-pretty-compact": "^2.0.0",
"lint-staged": "^10.5.3", "lint-staged": "^10.5.3",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"sass": "^1.32.0", "sass": "^1.32.4",
"ts-node": "^9.1.1", "ts-node": "^9.1.1",
"typescript": "^4.1.3", "typescript": "^4.1.3",
"yargs": "^16.2.0" "yargs": "^16.2.0"

View file

@ -8,8 +8,10 @@
"DS4.HeadingEffects": "Effekte", "DS4.HeadingEffects": "Effekte",
"DS4.HeadingInventory": "Inventar", "DS4.HeadingInventory": "Inventar",
"DS4.HeadingProfile": "Profil", "DS4.HeadingProfile": "Profil",
"DS4.HeadingTalents": "Talente & Fähigkeiten", "DS4.HeadingTalentsAbilities": "Talente & Fähigkeiten",
"DS4.HeadingSpells": "Zaubersprüche", "DS4.HeadingSpells": "Zaubersprüche",
"DS4.HeadingDescription": "Beschreibung",
"DS4.HeadingSpecialCreatureAbilites": "Besondere Fähigkeiten",
"DS4.AttackType": "Angriffs Typ", "DS4.AttackType": "Angriffs Typ",
"DS4.AttackTypeAbbr": "AT", "DS4.AttackTypeAbbr": "AT",
"DS4.WeaponBonus": "Waffen Bonus", "DS4.WeaponBonus": "Waffen Bonus",
@ -55,6 +57,8 @@
"DS4.ItemTypeLanguagePlural": "Sprachen", "DS4.ItemTypeLanguagePlural": "Sprachen",
"DS4.ItemTypeAlphabet": "Schriftzeichen", "DS4.ItemTypeAlphabet": "Schriftzeichen",
"DS4.ItemTypeAlphabetPlural": "Schriftzeichen", "DS4.ItemTypeAlphabetPlural": "Schriftzeichen",
"DS4.ItemTypeSpecialCreatureAbility": "Besondere Kreaturenfähigkeit",
"DS4.ItemTypeSpecialCreatureAbilityPlural": "Besondere Kreaturenfähigkeiten",
"DS4.ArmorType": "Panzerungstyp", "DS4.ArmorType": "Panzerungstyp",
"DS4.ArmorTypeAbbr": "PAT", "DS4.ArmorTypeAbbr": "PAT",
"DS4.ArmorMaterialType": "Material Typ", "DS4.ArmorMaterialType": "Material Typ",
@ -100,6 +104,8 @@
"DS4.SpellDuration": "Wirkdauer", "DS4.SpellDuration": "Wirkdauer",
"DS4.SpellCooldownDuration": "Abklingzeit", "DS4.SpellCooldownDuration": "Abklingzeit",
"DS4.SpellScrollPriceGold": "Schriftrollenpreis (Gold)", "DS4.SpellScrollPriceGold": "Schriftrollenpreis (Gold)",
"DS4.ActorTypeCharacter": "Charakter",
"DS4.ActorTypeCreature": "Kreatur",
"DS4.AttributeBody": "Körper", "DS4.AttributeBody": "Körper",
"DS4.AttributeMobility": "Agilität", "DS4.AttributeMobility": "Agilität",
"DS4.AttributeMind": "Geist", "DS4.AttributeMind": "Geist",
@ -117,31 +123,56 @@
"DS4.CombatValuesRangedAttack": "Schießen", "DS4.CombatValuesRangedAttack": "Schießen",
"DS4.CombatValuesSpellcasting": "Zaubern", "DS4.CombatValuesSpellcasting": "Zaubern",
"DS4.CombatValuesTargetedSpellcasting": "Zielzaubern", "DS4.CombatValuesTargetedSpellcasting": "Zielzaubern",
"DS4.BaseInfoRace": "Volk", "DS4.CharacterBaseInfoRace": "Volk",
"DS4.BaseInfoClass": "Klasse", "DS4.CharacterBaseInfoClass": "Klasse",
"DS4.BaseInfoHeroClass": "Helden Klasse", "DS4.CharacterBaseInfoHeroClass": "Helden Klasse",
"DS4.BaseInfoCulture": "Kultur", "DS4.CharacterBaseInfoCulture": "Kultur",
"DS4.ProgressionLevel": "Stufe", "DS4.CharacterProgressionLevel": "Stufe",
"DS4.ProgressionExperiencePoints": "Erfahrungspunkte", "DS4.CharacterProgressionExperiencePoints": "Erfahrungspunkte",
"DS4.ProgressionTalentPoints": "Talentpunkte", "DS4.CharacterProgressionTalentPoints": "Talentpunkte",
"DS4.ProgressionProgressPoints": "Lernpunkte", "DS4.CharacterProgressionProgressPoints": "Lernpunkte",
"DS4.TalentRank": "Rang", "DS4.TalentRank": "Rang",
"DS4.TalentRankBase": "Erworbener Rang", "DS4.TalentRankBase": "Erworbener Rang",
"DS4.TalentRankMax": "Maximaler Rang", "DS4.TalentRankMax": "Maximaler Rang",
"DS4.TalentRankMod": "Zusätzlicher Rang", "DS4.TalentRankMod": "Zusätzlicher Rang",
"DS4.TalentRankTotal": "Gesamter Rang", "DS4.TalentRankTotal": "Gesamter Rang",
"DS4.LanguageLanguages": "Sprachen", "DS4.CharacterLanguageLanguages": "Sprachen",
"DS4.LanguageAlphabets": "Schriftzeichen", "DS4.CharacterLanguageAlphabets": "Schriftzeichen",
"DS4.ProfileGender": "Geschlecht", "DS4.SpecialCreatureAbilityExperiencePoints": "Erfahrungspunkte",
"DS4.ProfileBirthday": "Geburtstag", "DS4.CharacterProfileBiography": "Biographie",
"DS4.ProfileBirthplace": "Geburtsort", "DS4.CharacterProfileGender": "Geschlecht",
"DS4.ProfileAge": "Alter", "DS4.CharacterProfileBirthday": "Geburtstag",
"DS4.ProfileHeight": "Größe", "DS4.CharacterProfileBirthplace": "Geburtsort",
"DS4.ProfilHairColor": "Haarfarbe", "DS4.CharacterProfileAge": "Alter",
"DS4.ProfileWeight": "Gewicht", "DS4.CharacterProfileHeight": "Größe",
"DS4.ProfileEyeColor": "Augenfarbe", "DS4.CharacterProfileHairColor": "Haarfarbe",
"DS4.ProfileSpecialCharacteristics": "Besondere Eigenschaften", "DS4.CharacterProfileWeight": "Gewicht",
"DS4.CharacterProfileEyeColor": "Augenfarbe",
"DS4.CharacterProfileSpecialCharacteristics": "Besondere Eigenschaften",
"DS4.CharacterCurrencyGold": "Gold",
"DS4.CharacterCurrencySilver": "Silber",
"DS4.CharacterCurrencyCopper": "Kupfer",
"DS4.CharacterCurrency": "Währung",
"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.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.ErrorDiceCritOverlap": "Es gibt eine Überlappung zwischen Patzern und Immersiegen.",
"DS4.ErrorExplodingRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.", "DS4.ErrorExplodingRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.",
"DS4.UnitRounds": "Runden", "DS4.UnitRounds": "Runden",

View file

@ -8,8 +8,10 @@
"DS4.HeadingEffects": "Effects", "DS4.HeadingEffects": "Effects",
"DS4.HeadingInventory": "Inventory", "DS4.HeadingInventory": "Inventory",
"DS4.HeadingProfile": "Profile", "DS4.HeadingProfile": "Profile",
"DS4.HeadingTalents": "Talents & Abilities", "DS4.HeadingTalentsAbilities": "Talents & Abilities",
"DS4.HeadingSpells": "Spells", "DS4.HeadingSpells": "Spells",
"DS4.HeadingDescription": "Description",
"DS4.HeadingSpecialCreatureAbilites": "Special Abilites",
"DS4.AttackType": "Attack Type", "DS4.AttackType": "Attack Type",
"DS4.AttackTypeAbbr": "AT", "DS4.AttackTypeAbbr": "AT",
"DS4.WeaponBonus": "Weapon Bonus", "DS4.WeaponBonus": "Weapon Bonus",
@ -55,6 +57,8 @@
"DS4.ItemTypeLanguagePlural": "Languages", "DS4.ItemTypeLanguagePlural": "Languages",
"DS4.ItemTypeAlphabet": "Alphabet", "DS4.ItemTypeAlphabet": "Alphabet",
"DS4.ItemTypeAlphabetPlural": "Alphabets", "DS4.ItemTypeAlphabetPlural": "Alphabets",
"DS4.ItemTypeSpecialCreatureAbility": "Special Creature Ability",
"DS4.ItemTypeSpecialCreatureAbilityPlural": "Special Creature Abilities",
"DS4.ArmorType": "Armor Type", "DS4.ArmorType": "Armor Type",
"DS4.ArmorTypeAbbr": "AT", "DS4.ArmorTypeAbbr": "AT",
"DS4.ArmorMaterialType": "Material Type", "DS4.ArmorMaterialType": "Material Type",
@ -100,6 +104,8 @@
"DS4.SpellDuration": "Duration", "DS4.SpellDuration": "Duration",
"DS4.SpellCooldownDuration": "Cooldown", "DS4.SpellCooldownDuration": "Cooldown",
"DS4.SpellScrollPriceGold": "Scroll Price (Gold)", "DS4.SpellScrollPriceGold": "Scroll Price (Gold)",
"DS4.ActorTypeCharacter": "Character",
"DS4.ActorTypeCreature": "Creature",
"DS4.AttributeBody": "Body", "DS4.AttributeBody": "Body",
"DS4.AttributeMobility": "Mobility", "DS4.AttributeMobility": "Mobility",
"DS4.AttributeMind": "Mind", "DS4.AttributeMind": "Mind",
@ -117,31 +123,56 @@
"DS4.CombatValuesRangedAttack": "Ranged Attack", "DS4.CombatValuesRangedAttack": "Ranged Attack",
"DS4.CombatValuesSpellcasting": "Spellcasting", "DS4.CombatValuesSpellcasting": "Spellcasting",
"DS4.CombatValuesTargetedSpellcasting": "Targeted Spellcasting", "DS4.CombatValuesTargetedSpellcasting": "Targeted Spellcasting",
"DS4.BaseInfoRace": "Race", "DS4.CharacterBaseInfoRace": "Race",
"DS4.BaseInfoClass": "Class", "DS4.CharacterBaseInfoClass": "Class",
"DS4.BaseInfoHeroClass": "Hero Class", "DS4.CharacterBaseInfoHeroClass": "Hero Class",
"DS4.BaseInfoCulture": "Culture", "DS4.CharacterBaseInfoCulture": "Culture",
"DS4.ProgressionLevel": "Level", "DS4.CharacterProgressionLevel": "Level",
"DS4.ProgressionExperiencePoints": "Experience Points", "DS4.CharacterProgressionExperiencePoints": "Experience Points",
"DS4.ProgressionTalentPoints": "Talent Points", "DS4.CharacterProgressionTalentPoints": "Talent Points",
"DS4.ProgressionProgressPoints": "Progress Points", "DS4.CharacterProgressionProgressPoints": "Progress Points",
"DS4.TalentRank": "Rank", "DS4.TalentRank": "Rank",
"DS4.TalentRankBase": "Acquired Ranks", "DS4.TalentRankBase": "Acquired Ranks",
"DS4.TalentRankMax": "Maximum Ranks", "DS4.TalentRankMax": "Maximum Ranks",
"DS4.TalentRankMod": "Additional Ranks", "DS4.TalentRankMod": "Additional Ranks",
"DS4.TalentRankTotal": "Total Ranks", "DS4.TalentRankTotal": "Total Ranks",
"DS4.LanguageLanguages": "Languages", "DS4.CharacterLanguageLanguages": "Languages",
"DS4.LanguageAlphabets": "Alphabets", "DS4.CharacterLanguageAlphabets": "Alphabets",
"DS4.ProfileGender": "Gender", "DS4.SpecialCreatureAbilityExperiencePoints": "Experience Points",
"DS4.ProfileBirthday": "Birthday", "DS4.CharacterProfileBiography": "Biography",
"DS4.ProfileBirthplace": "Birthplace", "DS4.CharacterProfileGender": "Gender",
"DS4.ProfileAge": "Age", "DS4.CharacterProfileBirthday": "Birthday",
"DS4.ProfileHeight": "Height", "DS4.CharacterProfileBirthplace": "Birthplace",
"DS4.ProfilHairColor": "Hair Color", "DS4.CharacterProfileAge": "Age",
"DS4.ProfileWeight": "Weight", "DS4.CharacterProfileHeight": "Height",
"DS4.ProfileEyeColor": "Eye Color", "DS4.CharacterProfileHairColor": "Hair Color",
"DS4.ProfileSpecialCharacteristics": "Special Characteristics", "DS4.CharacterProfileWeight": "Weight",
"DS4.CharacterProfileEyeColor": "Eye Color",
"DS4.CharacterProfileSpecialCharacteristics": "Special Characteristics",
"DS4.CharacterCurrencyGold": "Gold",
"DS4.CharacterCurrencySilver": "Silver",
"DS4.CharacterCurrencyCopper": "Copper",
"DS4.CharacterCurrency": "Currency",
"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.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.ErrorDiceCritOverlap": "There's an overlap between Fumbles and Coups",
"DS4.ErrorExplodingRecursionLimitExceeded": "Maximum recursion depth for exploding dice roll exceeded", "DS4.ErrorExplodingRecursionLimitExceeded": "Maximum recursion depth for exploding dice roll exceeded",
"DS4.UnitRounds": "Rounds", "DS4.UnitRounds": "Rounds",

View file

@ -1,38 +1,19 @@
export interface DS4ActorDataType { import { ModifiableData, ResourceData, UsableResource } from "../common/common-data";
export type DS4ActorDataType = DS4ActorDataCharacter | DS4ActorDataCreature;
interface DS4ActorDataBase {
attributes: DS4ActorDataAttributes; attributes: DS4ActorDataAttributes;
traits: DS4ActorDataTraits; traits: DS4ActorDataTraits;
combatValues: DS4ActorDataCombatValues; combatValues: DS4ActorDataCombatValues;
baseInfo: DS4ActorDataBaseInfo;
progression: DS4ActorDataProgression;
language: DS4ActorDataLanguage;
profile: DS4ActorDataProfile;
} }
interface DS4ActorDataAttributes { interface DS4ActorDataAttributes {
body: BodyAttribute; body: ModifiableData<number>;
mobility: ModifiableData<number>; mobility: ModifiableData<number>;
mind: ModifiableData<number>; mind: ModifiableData<number>;
} }
export interface ModifiableData<T> {
base: T;
mod: T;
total?: T;
}
interface UsableResource<T> {
total: T;
used: T;
}
interface ResourceData<T> extends ModifiableData<T> {
value: T;
max?: T;
}
// Blueprint in case we need more detailed differentiation
type BodyAttribute = ModifiableData<number>;
interface DS4ActorDataTraits { interface DS4ActorDataTraits {
strength: ModifiableData<number>; strength: ModifiableData<number>;
constitution: ModifiableData<number>; constitution: ModifiableData<number>;
@ -53,26 +34,35 @@ interface DS4ActorDataCombatValues {
targetedSpellcasting: ModifiableData<number>; targetedSpellcasting: ModifiableData<number>;
} }
interface DS4ActorDataBaseInfo { interface DS4ActorDataCharacter extends DS4ActorDataBase {
baseInfo: DS4ActorDataCharacterBaseInfo;
progression: DS4ActorDataCharacterProgression;
language: DS4ActorDataCharacterLanguage;
profile: DS4ActorDataCharacterProfile;
currency: DS4ActorDataCharacterCurrency;
}
interface DS4ActorDataCharacterBaseInfo {
race: string; race: string;
class: string; class: string;
heroClass: string; heroClass: string;
culture: string; culture: string;
} }
interface DS4ActorDataProgression { interface DS4ActorDataCharacterProgression {
level: number; level: number;
experiencePoints: number; experiencePoints: number;
talentPoints: UsableResource<number>; talentPoints: UsableResource<number>;
progressPoints: UsableResource<number>; progressPoints: UsableResource<number>;
} }
interface DS4ActorDataLanguage { interface DS4ActorDataCharacterLanguage {
languages: string; languages: string;
alphabets: string; alphabets: string;
} }
interface DS4ActorDataProfile { interface DS4ActorDataCharacterProfile {
biography: string;
gender: string; gender: string;
birthday: string; birthday: string;
birthplace: string; birthplace: string;
@ -83,3 +73,26 @@ interface DS4ActorDataProfile {
eyeColor: string; eyeColor: string;
specialCharacteristics: string; specialCharacteristics: string;
} }
interface DS4ActorDataCharacterCurrency {
gold: number;
silver: number;
copper: number;
}
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;
}

View file

@ -1,6 +1,7 @@
import { ModifiableData } from "../common/common-data";
import { DS4Item } from "../item/item"; import { DS4Item } from "../item/item";
import { DS4ItemDataType } from "../item/item-data"; import { DS4ItemDataType, ItemType } from "../item/item-data";
import { DS4ActorDataType, ModifiableData } from "./actor-data"; import { DS4ActorDataType } from "./actor-data";
export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item> { export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item> {
/** @override */ /** @override */
@ -21,4 +22,37 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
combatValues.hitPoints.max = combatValues.hitPoints.total; combatValues.hitPoints.max = combatValues.hitPoints.total;
} }
/**
* The list of item types that can be owned by this actor.
*/
get ownableItemTypes(): Array<ItemType> {
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);
}
} }

View file

@ -1,12 +1,30 @@
import { DS4ItemDataType } from "../item/item-data"; import { DS4Item } from "../../item/item";
import { DS4Actor } from "./actor"; import { DS4ItemDataType, ItemType } from "../../item/item-data";
import { DS4ActorDataType } from "./actor-data"; import { DS4Actor } from "../actor";
import { DS4ActorDataType } from "../actor-data";
/** /**
* Extend the basic ActorSheet with some very simple modifications * Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet} * @extends {ActorSheet}
*/ */
export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4ItemDataType> { export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4ItemDataType> {
/** @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. * 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 * It explicitly adds the items of the object sorted by type in the
@ -21,21 +39,9 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
// Add the items explicitly sorted by type to the data: // Add the items explicitly sorted by type to the data:
itemsByType: this.actor.itemTypes, itemsByType: this.actor.itemTypes,
}; };
console.log("Data:", data);
return data; return data;
} }
/** @override */
static get defaultOptions(): FormApplicationOptions {
return mergeObject(super.defaultOptions, {
classes: ["ds4", "sheet", "actor"],
template: "systems/ds4/templates/actor/actor-sheet.hbs",
width: 745,
height: 600,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "inventory" }],
});
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/** @override */ /** @override */
@ -200,4 +206,26 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
}); });
} }
} }
/**
* @override
*/
async _onDrop(event: DragEvent): Promise<boolean | unknown> {
const data = JSON.parse(event.dataTransfer?.getData("text/plain")) as { type?: string };
if (data.type === "Item") {
const item = await Item.fromDropData(data as Parameters<typeof DS4Item.fromDropData>[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);
}
} }

View file

@ -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" }],
});
}
}

View file

@ -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" }],
});
}
}

View file

@ -0,0 +1,15 @@
export interface ModifiableData<T> {
base: T;
mod: T;
total?: T;
}
export interface ResourceData<T> extends ModifiableData<T> {
value: T;
max?: T;
}
export interface UsableResource<T> {
total: T;
used: T;
}

View file

@ -61,6 +61,7 @@ export const DS4 = {
racialAbility: "DS4.ItemTypeRacialAbility", racialAbility: "DS4.ItemTypeRacialAbility",
language: "DS4.ItemTypeLanguage", language: "DS4.ItemTypeLanguage",
alphabet: "DS4.ItemTypeAlphabet", 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: { attributes: {
body: "DS4.AttributeBody", 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: { traits: {
strength: "DS4.TraitStrength", 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: { combatValues: {
hitPoints: "DS4.CombatValuesHitPoints", hitPoints: "DS4.CombatValuesHitPoints",
@ -160,50 +169,52 @@ export const DS4 = {
/** /**
* Define the base info of a character * Define the base info of a character
*/ */
baseInfo: { characterBaseInfo: {
race: "DS4.BaseInfoRace", race: "DS4.CharacterBaseInfoRace",
class: "DS4.BaseInfoClass", class: "DS4.CharacterBaseInfoClass",
heroClass: "DS4.BaseInfoHeroClass", heroClass: "DS4.CharacterBaseInfoHeroClass",
culture: "DS4.BaseInfoCulture", culture: "DS4.CharacterBaseInfoCulture",
}, },
/** /**
* Define the progression info of a character * Define the progression info of a character
*/ */
progression: { characterProgression: {
level: "DS4.ProgressionLevel", level: "DS4.CharacterProgressionLevel",
experiencePoints: "DS4.ProgressionExperiencePoints", experiencePoints: "DS4.CharacterProgressionExperiencePoints",
talentPoints: "DS4.ProgressionTalentPoints", talentPoints: "DS4.CharacterProgressionTalentPoints",
progressPoints: "DS4.ProgressionProgressPoints", progressPoints: "DS4.CharacterProgressionProgressPoints",
}, },
/** /**
* Define the language info of a character * Define the language info of a character
*/ */
language: { characterLanguage: {
languages: "DS4.LanguageLanguages", languages: "DS4.CharacterLanguageLanguages",
alphabets: "DS4.LanguageAlphabets", alphabets: "DS4.CharacterLanguageAlphabets",
}, },
/** /**
* Define the profile info of a character * Define the profile info of a character
*/ */
profile: { characterProfile: {
gender: "DS4.ProfileGender", biography: "DS4.CharacterProfileBiography",
birthday: "DS4.ProfileBirthday", gender: "DS4.CharacterProfileGender",
birthplace: "DS4.ProfileBirthplace", birthday: "DS4.CharacterProfileBirthday",
age: "DS4.ProfileAge", birthplace: "DS4.CharacterProfileBirthplace",
height: "DS4.ProfileHeight", age: "DS4.CharacterProfileAge",
hairColor: "DS4.ProfilHairColor", height: "DS4.CharacterProfileHeight",
weight: "DS4.ProfileWeight", hairColor: "DS4.CharacterProfileHairColor",
eyeColor: "DS4.ProfileEyeColor", weight: "DS4.CharacterProfileWeight",
specialCharacteristics: "DS4.ProfileSpecialCharacteristics", eyeColor: "DS4.CharacterProfileEyeColor",
specialCharacteristics: "DS4.CharacterProfileSpecialCharacteristics",
}, },
/** /**
* Define the profile info types for handlebars of a character * Define the profile info types for handlebars of a character
*/ */
profileDTypes: { characterProfileDTypes: {
biography: "String",
gender: "String", gender: "String",
birthday: "String", birthday: "String",
birthplace: "String", birthplace: "String",
@ -215,6 +226,51 @@ export const DS4 = {
specialCharacteristics: "String", specialCharacteristics: "String",
}, },
/**
* Define currency elements of a character
*/
characterCurrency: {
gold: "DS4.CharacterCurrencyGold",
silver: "DS4.CharacterCurrencySilver",
copper: "DS4.CharacterCurrencyCopper",
},
/**
* 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 * Define translations for available distance units
*/ */

View file

@ -1,10 +1,11 @@
// Import Modules // Import Modules
import { DS4Actor } from "./actor/actor"; import { DS4Actor } from "./actor/actor";
import { DS4ActorSheet } from "./actor/actor-sheet";
import { DS4Item } from "./item/item"; import { DS4Item } from "./item/item";
import { DS4ItemSheet } from "./item/item-sheet"; import { DS4ItemSheet } from "./item/item-sheet";
import { DS4 } from "./config"; import { DS4 } from "./config";
import { DS4Check } from "./rolls/check"; 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"; import { createCheckRoll } from "./rolls/check-factory";
Hooks.once("init", async function () { Hooks.once("init", async function () {
@ -24,6 +25,10 @@ Hooks.once("init", async function () {
CONFIG.Actor.entityClass = DS4Actor as typeof Actor; CONFIG.Actor.entityClass = DS4Actor as typeof Actor;
CONFIG.Item.entityClass = DS4Item as typeof Item; CONFIG.Item.entityClass = DS4Item as typeof Item;
// Define localized type labels
CONFIG.Actor.typeLabels = DS4.actorTypes;
CONFIG.Item.typeLabels = DS4.itemTypes;
// Configure Dice // Configure Dice
CONFIG.Dice.types = [Die, DS4Check]; CONFIG.Dice.types = [Die, DS4Check];
CONFIG.Dice.terms = { CONFIG.Dice.terms = {
@ -34,7 +39,8 @@ Hooks.once("init", async function () {
// Register sheet application classes // Register sheet application classes
Actors.unregisterSheet("core", ActorSheet); 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.unregisterSheet("core", ItemSheet);
Items.registerSheet("ds4", DS4ItemSheet, { makeDefault: true }); 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/effects.hbs",
"systems/ds4/templates/item/partials/body.hbs", "systems/ds4/templates/item/partials/body.hbs",
"systems/ds4/templates/actor/partials/items-overview.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/spells-overview.hbs",
"systems/ds4/templates/actor/partials/overview-add-button.hbs", "systems/ds4/templates/actor/partials/overview-add-button.hbs",
"systems/ds4/templates/actor/partials/overview-control-buttons.hbs", "systems/ds4/templates/actor/partials/overview-control-buttons.hbs",
@ -57,6 +63,9 @@ async function registerHandlebarsPartials() {
"systems/ds4/templates/actor/partials/combat-values.hbs", "systems/ds4/templates/actor/partials/combat-values.hbs",
"systems/ds4/templates/actor/partials/profile.hbs", "systems/ds4/templates/actor/partials/profile.hbs",
"systems/ds4/templates/actor/partials/character-progression.hbs", "systems/ds4/templates/actor/partials/character-progression.hbs",
"systems/ds4/templates/actor/partials/special-creature-abilites-overview.hbs",
"systems/ds4/templates/actor/partials/character-inventory.hbs",
"systems/ds4/templates/actor/partials/creature-inventory.hbs",
]; ];
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }
@ -84,10 +93,14 @@ Hooks.once("setup", function () {
"attributes", "attributes",
"traits", "traits",
"combatValues", "combatValues",
"baseInfo", "characterBaseInfo",
"progression", "characterProgression",
"language", "characterLanguage",
"profile", "characterProfile",
"characterCurrency",
"creatureTypes",
"creatureSizeCategories",
"creatureBaseInfo",
"temporalUnits", "temporalUnits",
"temporalUnitsAbbr", "temporalUnitsAbbr",
"distanceUnits", "distanceUnits",
@ -96,7 +109,7 @@ Hooks.once("setup", function () {
]; ];
// Exclude some from sorting where the default order matters // 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 // Localize and sort CONFIG objects
for (const o of toLocalize) { for (const o of toLocalize) {

View file

@ -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 = export type DS4ItemDataType =
| DS4Weapon | DS4Weapon
@ -10,7 +13,8 @@ export type DS4ItemDataType =
| DS4Talent | DS4Talent
| DS4RacialAbility | DS4RacialAbility
| DS4Language | DS4Language
| DS4Alphabet; | DS4Alphabet
| DS4SpecialCreatureAbility;
// types // types
@ -59,6 +63,9 @@ interface DS4Equipment extends DS4ItemBase, DS4ItemPhysical {}
type DS4RacialAbility = DS4ItemBase; type DS4RacialAbility = DS4ItemBase;
type DS4Language = DS4ItemBase; type DS4Language = DS4ItemBase;
type DS4Alphabet = DS4ItemBase; type DS4Alphabet = DS4ItemBase;
interface DS4SpecialCreatureAbility extends DS4ItemBase {
experiencePoints: number;
}
// templates // templates

View file

@ -1,9 +1,8 @@
{ {
"Actor": { "Actor": {
"types": ["character"], "types": ["character", "creature"],
"templates": {}, "templates": {
"character": { "base": {
"templates": [],
"attributes": { "attributes": {
"body": { "body": {
"base": 0, "base": 0,
@ -78,7 +77,22 @@
"base": 0, "base": 0,
"mod": 0 "mod": 0
} }
}
}
}, },
"creature": {
"templates": ["base"],
"baseInfo": {
"loot": "",
"foeFactor": 1,
"creatureType": "humanoid",
"sizeCategory": "normal",
"experiencePoints": 0,
"description": ""
}
},
"character": {
"templates": ["base"],
"baseInfo": { "baseInfo": {
"race": "", "race": "",
"class": "", "class": "",
@ -98,6 +112,7 @@
} }
}, },
"profile": { "profile": {
"biography": "",
"gender": "", "gender": "",
"birthday": "", "birthday": "",
"birthplace": "", "birthplace": "",
@ -107,6 +122,11 @@
"weight": 0, "weight": 0,
"eyeColor": "", "eyeColor": "",
"specialCharacteristics": "" "specialCharacteristics": ""
},
"currency": {
"gold": 0,
"silver": 0,
"copper": 0
} }
} }
}, },
@ -121,7 +141,8 @@
"talent", "talent",
"racialAbility", "racialAbility",
"language", "language",
"alphabet" "alphabet",
"specialCreatureAbility"
], ],
"templates": { "templates": {
"base": { "base": {
@ -199,6 +220,10 @@
"unit": "custom" "unit": "custom"
}, },
"scrollPrice": 0 "scrollPrice": 0
},
"specialCreatureAbility": {
"templates": ["base"],
"experiencePoints": 0
} }
} }
} }

View file

@ -12,19 +12,21 @@
<div class="flexrow basic-properties"> <div class="flexrow basic-properties">
<div class="basic-property"> <div class="basic-property">
<label class="basic-property-label" for="data.baseInfo.race">{{config.baseInfo.race}}</label> <label class="basic-property-label"
for="data.baseInfo.race">{{config.characterBaseInfo.race}}</label>
<input type="text" name="data.baseInfo.race" id="data.baseInfo.race" value="{{data.baseInfo.race}}" <input type="text" name="data.baseInfo.race" id="data.baseInfo.race" value="{{data.baseInfo.race}}"
data-dtype="String" /> data-dtype="String" />
</div> </div>
<div class="basic-property"> <div class="basic-property">
<label class="basic-property-label" for="data.baseInfo.culture">{{config.baseInfo.culture}}</label> <label class="basic-property-label"
for="data.baseInfo.culture">{{config.characterBaseInfo.culture}}</label>
<input id="data.baseInfo.culture" type="text" name="data.baseInfo.culture" <input id="data.baseInfo.culture" type="text" name="data.baseInfo.culture"
value="{{data.baseInfo.culture}}" value="{{data.baseInfo.culture}}"
data-dtype="String" /> data-dtype="String" />
</div> </div>
<div class="basic-property flex125"> <div class="basic-property flex125">
<label class="basic-property-label" <label class="basic-property-label"
for="data.progression.progressPoints.used">{{config.progression.progressPoints}}</label> for="data.progression.progressPoints.used">{{config.characterProgression.progressPoints}}</label>
<div class="flexrow"> <div class="flexrow">
<input id="data.progression.progressPoints.used" type="number" <input id="data.progression.progressPoints.used" type="number"
name="data.progression.progressPoints.used" name="data.progression.progressPoints.used"
@ -41,7 +43,7 @@
</div> </div>
<div class="basic-property flex125"> <div class="basic-property flex125">
<label class="basic-property-label" <label class="basic-property-label"
for="data.progression.talentPoints.used">{{config.progression.talentPoints}}</label> for="data.progression.talentPoints.used">{{config.characterProgression.talentPoints}}</label>
<div class="flexrow"> <div class="flexrow">
<input type="number" name="data.progression.talentPoints.used" <input type="number" name="data.progression.talentPoints.used"
id="data.progression.talentPoints.used" id="data.progression.talentPoints.used"
@ -53,13 +55,14 @@
</div> </div>
</div> </div>
<div class="basic-property"> <div class="basic-property">
<label class="basic-property-label" for="data.baseInfo.class">{{config.baseInfo.class}}</label> <label class="basic-property-label"
for="data.baseInfo.class">{{config.characterBaseInfo.class}}</label>
<input type="text" id="data.baseInfo.class" name="data.baseInfo.class" <input type="text" id="data.baseInfo.class" name="data.baseInfo.class"
value="{{data.baseInfo.class}}" data-dtype="String" /> value="{{data.baseInfo.class}}" data-dtype="String" />
</div> </div>
<div class="basic-property"> <div class="basic-property">
<label class="basic-property-label" <label class="basic-property-label"
for="data.baseInfo.heroClass">{{config.baseInfo.heroClass}}</label> for="data.baseInfo.heroClass">{{config.characterBaseInfo.heroClass}}</label>
<input type="text" id="data.baseInfo.heroClass" name="data.baseInfo.heroClass" <input type="text" id="data.baseInfo.heroClass" name="data.baseInfo.heroClass"
value="{{data.baseInfo.heroClass}}" value="{{data.baseInfo.heroClass}}"
data-dtype="String" /> data-dtype="String" />
@ -76,7 +79,7 @@
<nav class="sheet-tabs tabs" data-group="primary"> <nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a> <a class="item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a>
<a class="item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a> <a class="item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a>
<a class="item" data-tab="talents">{{localize 'DS4.HeadingTalents'}}</a> <a class="item" data-tab="talents-abilities">{{localize 'DS4.HeadingTalentsAbilities'}}</a>
<a class="item" data-tab="profile">{{localize "DS4.HeadingProfile"}}</a> <a class="item" data-tab="profile">{{localize "DS4.HeadingProfile"}}</a>
<a class="item" data-tab="biography">{{localize 'DS4.HeadingBiography'}}</a> <a class="item" data-tab="biography">{{localize 'DS4.HeadingBiography'}}</a>
</nav> </nav>
@ -84,20 +87,21 @@
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
{{!-- Items Tab --}} {{!-- Items Tab --}}
{{> systems/ds4/templates/actor/partials/items-overview.hbs}} {{> systems/ds4/templates/actor/partials/character-inventory.hbs}}
{{!-- Spells Tab --}} {{!-- Spells Tab --}}
{{> systems/ds4/templates/actor/partials/spells-overview.hbs}} {{> systems/ds4/templates/actor/partials/spells-overview.hbs}}
{{!-- Talents Tab --}} {{!-- Talents Tab --}}
{{> systems/ds4/templates/actor/partials/talents-overview.hbs}} {{> systems/ds4/templates/actor/partials/talents-abilities-overview.hbs}}
{{! Profile Tab --}} {{! Profile Tab --}}
{{> systems/ds4/templates/actor/partials/profile.hbs}} {{> systems/ds4/templates/actor/partials/profile.hbs}}
{{!-- Biography Tab --}} {{!-- Biography Tab --}}
<div class="tab biography" data-group="primary" data-tab="biography"> <div class="tab biography" data-group="primary" data-tab="biography">
{{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}}
</div> </div>
</section> </section>
</form> </form>

View file

@ -0,0 +1,78 @@
<form class="{{cssClass}} flexcol" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100" />
<div class="header-fields flexrow">
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1>
<div class="flexrow basic-properties">
<div class="basic-property">
<label>{{config.creatureBaseInfo.creatureType}}</label>
<select name="data.baseInfo.creatureType" data-type="String">
{{#select data.baseInfo.creatureType}}
{{#each config.creatureTypes as |value key|}}
<option value="{{key}}">{{value}}</option>
{{/each}}
{{/select}}
</select>
</div>
<div class="basic-property">
<label class="basic-property-label"
for="data.baseInfo.loot">{{config.creatureBaseInfo.loot}}</label>
<input type="text" name="data.baseInfo.loot" value="{{data.baseInfo.loot}}" data-dtype="String" />
</div>
<div class="basic-property">
<label class="basic-property-label"
for="data.baseInfo.foeFactor">{{config.creatureBaseInfo.foeFactor}}</label>
<input type="text" name="data.baseInfo.foeFactor" value="{{data.baseInfo.foeFactor}}"
data-dtype="Number" />
</div>
<div class="basic-property">
<label>{{config.creatureBaseInfo.sizeCategory}}</label>
<select name="data.baseInfo.sizeCategory" data-type="String">
{{#select data.baseInfo.sizeCategory}}
{{#each config.creatureSizeCategories as |value key|}}
<option value="{{key}}">{{value}}</option>
{{/each}}
{{/select}}
</select>
</div>
<div class="basic-property">
<label class="basic-property-label"
for="data.baseInfo.experiencePoints">{{config.creatureBaseInfo.experiencePoints}}</label>
<input type="text" name="data.baseInfo.experiencePoints" value="{{data.baseInfo.experiencePoints}}"
data-dtype="Number" />
</div>
</div>
</div>
<div class="character-values">
{{> systems/ds4/templates/actor/partials/attributes-traits.hbs}}
{{> systems/ds4/templates/actor/partials/combat-values.hbs}}
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a>
<a class="item" data-tab="special-creature-abilites">{{localize 'DS4.HeadingSpecialCreatureAbilites'}}</a>
<a class="item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a>
<a class="item" data-tab="description">{{localize 'DS4.HeadingDescription'}}</a>
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{!-- Items Tab --}}
{{> systems/ds4/templates/actor/partials/creature-inventory.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 --}}
<div class="tab description" data-group="primary" data-tab="description">
{{editor content=data.baseInfo.description target="data.baseInfo.description" button=true owner=owner
editable=editable}}
</div>
</section>
</form>

View file

@ -0,0 +1,21 @@
<div class="tab inventory" data-group="primary" data-tab="inventory">
{{!-- Money--}}
<h4 class="items-list-title">{{localize 'DS4.CharacterCurrency'}}</h4>
<ol class="items-list">
<li class="item flexrow item-header">
<label for="data.currency.gold" class="flex05">{{config.characterCurrency.gold}}</label>
<input class="flex3 item-num-val item-change" type="number" min="0" step="1" name="data.currency.gold"
id="data.currency.gold" value="{{data.currency.gold}}" data-dtype="Number" />
<label for="data.currency.silver" class="flex05">{{config.characterCurrency.silver}}</label>
<input class="flex3 item-num-val item-change" type="number" min="0" step="1" name="data.currency.silver"
id="data.currency.silver" value="{{data.currency.silver}}" data-dtype="Number" />
<label for="data.currency.copper" class="flex05">{{config.characterCurrency.copper}}</label>
<input class="flex3 item-num-val item-change" type="number" min="0" step="1" name="data.currency.copper"
id="data.currency.copper" value="{{data.currency.copper}}" data-dtype="Number" />
</li>
</ol>
{{> systems/ds4/templates/actor/partials/items-overview.hbs}}
</div>

View file

@ -1,6 +1,6 @@
<div class="progression flexrow"> <div class="progression flexrow">
<div class="progression-entry"> <div class="progression-entry">
<h2 class="progression-label"><label for="data.progression.level">{{config.progression.level}}</label> <h2 class="progression-label"><label for="data.progression.level">{{config.characterProgression.level}}</label>
</h2> </h2>
<label for="data.progression.level" class="hidden">Progression Level</label> <label for="data.progression.level" class="hidden">Progression Level</label>
<input class="progression-value" type="number" name="data.progression.level" id="data.progression.level" value="{{data.progression.level}}" <input class="progression-value" type="number" name="data.progression.level" id="data.progression.level" value="{{data.progression.level}}"
@ -8,7 +8,7 @@
</div> </div>
<div class="progression-entry"> <div class="progression-entry">
<h2 class="progression-label"><label <h2 class="progression-label"><label
for="data.progression.experiencePoints">{{config.progression.experiencePoints}}</label> for="data.progression.experiencePoints">{{config.characterProgression.experiencePoints}}</label>
</h2> </h2>
<label for="data.progression.experiencePoints" class="hidden">Experience Points</label> <label for="data.progression.experiencePoints" class="hidden">Experience Points</label>
<input class="progression-value" type="number" name="data.progression.experiencePoints" id="data.progression.experiencePoints" <input class="progression-value" type="number" name="data.progression.experiencePoints" id="data.progression.experiencePoints"

View file

@ -0,0 +1,5 @@
<div class="tab inventory" data-group="primary" data-tab="inventory">
{{> systems/ds4/templates/actor/partials/items-overview.hbs}}
</div>

View file

@ -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 --}} {{!-- INLINE PARTIAL DEFINITIONS --}}
@ -77,8 +76,8 @@
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" /> <img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
</div> </div>
{{!-- amount --}} {{!-- amount --}}
<input class="flex05 item-num-val item-change" type="number" min="0" step="1" value="{{item.data.data.quantity}}" data-dtype="Number" <input class="flex05 item-num-val item-change" type="number" min="0" step="1" value="{{item.data.data.quantity}}"
data-property="data.quantity" title="{{localize 'DS4.Quantity'}}" /> data-dtype="Number" data-property="data.quantity" title="{{localize 'DS4.Quantity'}}" />
{{!-- name --}} {{!-- name --}}
<input class="flex3 item-name item-change" type="text" value="{{item.name}}" data-dtype="String" <input class="flex3 item-name item-change" type="text" value="{{item.name}}" data-dtype="String"
data-property="name" title="{{localize 'DS4.ItemName'}}" /> data-property="name" title="{{localize 'DS4.ItemName'}}" />
@ -94,9 +93,6 @@
{{!-- ======================================================================== --}} {{!-- ======================================================================== --}}
<div class="tab inventory" data-group="primary" data-tab="inventory">
{{!-- WEAPONS --}} {{!-- WEAPONS --}}
<h4 class="items-list-title">{{localize 'DS4.ItemTypeWeaponPlural'}}</h4> <h4 class="items-list-title">{{localize 'DS4.ItemTypeWeaponPlural'}}</h4>
{{!-- {{#if (and (ne itemsByType.weapon undefined) (gt itemsByType.weapon.length 0)) }} --}} {{!-- {{#if (and (ne itemsByType.weapon undefined) (gt itemsByType.weapon.length 0)) }} --}}
@ -200,4 +196,3 @@
{{/each}} {{/each}}
</ol> </ol>
{{/ifHasItemOfType}} {{/ifHasItemOfType}}
</div>

View file

@ -1,13 +1,15 @@
<div class="tab profile" data-group="primary" data-tab="profile"> <div class="tab profile" data-group="primary" data-tab="profile">
<div class="grid grid-2col"> <div class="grid grid-2col">
{{#each data.profile as |profile-data-value profile-data-key|}} {{#each data.profile as |profile-data-value profile-data-key|}}
{{#if (ne profile-data-key 'biography')}}
<div class="profile-entry"> <div class="profile-entry">
<label for="data.profile.{{profile-data-key}}"> <label for="data.profile.{{profile-data-key}}">
{{lookup ../config.profile profile-data-key}} {{lookup ../config.characterProfile profile-data-key}}
</label> </label>
<input type="text" name="data.profile.{{profile-data-key}}" value="{{profile-data-value}}" <input type="text" name="data.profile.{{profile-data-key}}" value="{{profile-data-value}}"
data-dtype="{{lookup ../config/profileDTypes profile-data-key}}" /> data-dtype="{{lookup ../config/characterProfileDTypes profile-data-key}}" />
</div> </div>
{{/if}}
{{/each}} {{/each}}
</div> </div>
</div> </div>

View file

@ -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"}}
<li class="item flexrow" data-item-id="{{item._id}}">
{{!-- image --}}
<div class="flex05 item-image">
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
</div>
{{!-- name --}}
<input class="flex1 item-name item-change" type="text" value="{{item.name}}" data-dtype="String"
data-property="name" title="{{localize 'DS4.ItemName'}}">
{{!-- description --}}
<div class="flex3 item-description">{{{item.data.data.description}}}</div>
{{!-- control buttons --}}
{{> systems/ds4/templates/actor/partials/overview-control-buttons.hbs }}
</li>
{{/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"}}
<li class="item flexrow item-header">
{{!-- image --}}
<div class="flex05 item-image"></div>
{{!-- name --}}
<div class="flex1 item-name">{{localize 'DS4.ItemName'}}</div>
{{!-- description --}}
<div class="flex3">{{localize 'DS4.Description'}}</div>
{{!-- add button --}}
{{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
</li>
{{/inline}}
{{!-- ======================================================================== --}}
<div class="tab special-creature-abilites" data-group="primary" data-tab="special-creature-abilites">
<ol class="items-list">
{{> baseItemListHeader dataType='specialCreatureAbility' }}
{{#each itemsByType.specialCreatureAbility as |item id|}}
{{> baseItemListEntry item=item}}
{{/each}}
</ol>
</div>

View file

@ -2,32 +2,39 @@
{{!-- INLINE PARTIAL DEFINITIONS --}} {{!-- INLINE PARTIAL DEFINITIONS --}}
{{!-- ======================================================================== --}} {{!-- ======================================================================== --}}
{{!-- {{!--
!-- Two templates for displaying values with unit. !-- Base template to display a value with unit.
!-- @param unitDatum: the object to display; must have a value and a unit attribute !-- @param unitDatum: the object to display; must have a value and a unit attribute
!-- @param localizationString !-- @param localizationString
!-- @param config: the config object !-- @param unitNames: mapping of allowed unitDatum.unit values to localized unit name
!-- @param unitAbbrs: mapping of allowed unitDatum.unit values to unit abbreviation
--}}
{{#*inline "unit"}}
<div class="unit-data-pair item-num-val"
title="{{localize localizationString}} [{{lookup unitNames unitDatum.unit}}]" >
{{#if unitDatum.value }}
{{unitDatum.value}}{{lookup unitAbbrs unitDatum.unit}}
{{else}}-{{/if}}
</div>
{{/inline}}
{{!--
!-- Two templates based on the "unit" template for displaying values with unit.
!-- Both accept a `config` object holding the unitNames and unitAbbr instead of
!-- directly handing over the latter two.
--}} --}}
{{#*inline "temporalUnit"}} {{#*inline "temporalUnit"}}
<div class="unit-data-pair item-num-val" {{> unit unitNames=config.temporalUnits unitAbbrs=config.temporalUnitsAbbr unitDatum=unitDatum localizationString=localizationString}}
title="{{localize localizationString}} [{{lookup config.temporalUnits unitDatum.unit}}]" >
{{unitDatum.value}}{{lookup config.temporalUnitsAbbr unitDatum.unit}}
</div>
{{/inline}} {{/inline}}
{{#*inline "distanceUnit"}} {{#*inline "distanceUnit"}}
<div class="unit-data-pair item-num-val" {{> unit unitNames=config.distanceUnits unitAbbrs=config.distanceUnitsAbbr unitDatum=unitDatum localizationString=localizationString}}
title="{{localize localizationString}} [{{lookup config.distanceUnits unitDatum.unit}}]" >
{{unitDatum.value}}{{lookup config.distanceUnitsAbbr unitDatum.unit}}
</div>
{{/inline}} {{/inline}}
{{!-- ======================================================================== --}} {{!-- ======================================================================== --}}
<div class="tab items" data-group="primary" data-tab="spells"> <div class="tab spells" data-group="primary" data-tab="spells">
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">
{{!-- equipped --}} {{!-- equipped --}}

View file

@ -1,3 +1,5 @@
{{!-- TODO: Refactor to avoid code duplication with creature-special-abilities-overview and talents-overview --}}
{{!-- ======================================================================== --}} {{!-- ======================================================================== --}}
{{!-- INLINE PARTIAL DEFINITIONS --}} {{!-- INLINE PARTIAL DEFINITIONS --}}
{{!-- ======================================================================== --}} {{!-- ======================================================================== --}}
@ -118,7 +120,7 @@
{{!-- ======================================================================== --}} {{!-- ======================================================================== --}}
<div class="tab items" data-group="primary" data-tab="talents"> <div class="tab talents-abilities" data-group="primary" data-tab="talents-abilities">
<h4 class="items-list-title">{{localize 'DS4.ItemTypeTalentPlural'}}</h4> <h4 class="items-list-title">{{localize 'DS4.ItemTypeTalentPlural'}}</h4>
{{#> ifHasItemOfType itemsArray=itemsByType.talent dataType='talent' }} {{#> ifHasItemOfType itemsArray=itemsByType.talent dataType='talent' }}
<ol class="items-list"> <ol class="items-list">

View file

@ -2,7 +2,7 @@
{{!-- Sheet Tab Navigation --}} {{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary"> <nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="description">{{localize "DS4.Description"}}</a> <a class="item" data-tab="description">{{localize "DS4.HeadingDescription"}}</a>
<a class="item" data-tab="effects">{{localize "DS4.HeadingEffects"}}</a> <a class="item" data-tab="effects">{{localize "DS4.HeadingEffects"}}</a>
{{#if isPhysical}} {{#if isPhysical}}
<a class="item" data-tab="details">{{localize "DS4.HeadingDetails"}}</a> <a class="item" data-tab="details">{{localize "DS4.HeadingDetails"}}</a>

View file

@ -31,7 +31,7 @@ Additional elements of the side-properties div can be handed over via the @parti
{{/if}} {{/if}}
{{> @partial-block}} {{> @partial-block}}
</div> </div>
<div class="description" title="{{localize 'DS4.Description'}}"> <div class="description" title="{{localize 'DS4.HeadingDescription'}}">
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}} {{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div> </div>
</div> </div>

View file

@ -0,0 +1,15 @@
<form class="{{cssClass}}" autocomplete="off">
{{#> systems/ds4/templates/item/partials/sheet-header.hbs}}
<div class="grid grid-3col basic-properties">
<div class="basic-property">
<label>{{localize "DS4.SpecialCreatureAbilityExperiencePoints"}}</label>
<input type="number" min="0" step="1" name="data.experiencePoints" value="{{data.experiencePoints}}"
placeholder="0" data-dtype="Number" />
</div>
</div>
{{/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}}
</form>