From a2dc5615936121cfd5bcb9269d6bb3226b20d408 Mon Sep 17 00:00:00 2001 From: CK <31608392+unrealkakeman89@users.noreply.github.com> Date: Fri, 15 Jan 2021 11:57:15 -0500 Subject: [PATCH 01/22] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index da0a6445..7edd985d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Foundry Virtual Tabletop - SW5e Game System +This unofficial implementation of the SW5e system for Foundry VTT is made by fans for fans and is not associated with SW5e, Disney, Wizards of the Coast, or their partners in any way. + This game system for [Foundry Virtual Tabletop](http://foundryvtt.com) provides character sheet and game system support for the SW5E roleplaying game. From 6bbf3304eca26caf1b31f96698365518ecb37a52 Mon Sep 17 00:00:00 2001 From: TJ Date: Fri, 15 Jan 2021 22:58:54 -0600 Subject: [PATCH 02/22] Add code to handle github action --- .github/workflows/main.yml | 24 ++++++++++++ gulpfile.js | 32 +++++++--------- package-lock.json | 75 +++++++++++--------------------------- package.json | 9 +++++ 4 files changed, 67 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/main.yml create mode 100644 package.json diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..2a0d6590 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,24 @@ +name: Gulp build and commit updated stylesheets + +on: + push: + branches: [master, Develop] + pull_request: + branches: [master, Develop] + +jobs: + gulp-build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.ref }} + + - name: Compile with Gulp + uses: elstudio/actions-js-build/build@v2 + + - name: Commit changes + uses: elstudio/actions-js-build/commit@v3 + with: + commitMessage: Regenerate css diff --git a/gulpfile.js b/gulpfile.js index c56d2ae6..dabc0757 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,31 +1,28 @@ -const gulp = require('gulp'); -const less = require('gulp-less'); +const gulp = require("gulp"); +const less = require("gulp-less"); /* ----------------------------------------- */ /* Compile LESS /* ----------------------------------------- */ const SW5E_LESS = ["less/**/*.less"]; + function compileLESS() { - return gulp.src("less/original/sw5e.less") - .pipe(less()) - .pipe(gulp.dest("./")) + return gulp.src("less/original/sw5e.less").pipe(less()).pipe(gulp.dest("./")); } + function compileGlobalLess() { - return gulp.src("less/update/sw5e-global.less") - .pipe(less()) - .pipe(gulp.dest("./")) + return gulp.src("less/update/sw5e-global.less").pipe(less()).pipe(gulp.dest("./")); } + function compileLightLess() { - return gulp.src("less/update/sw5e-light.less") - .pipe(less()) - .pipe(gulp.dest("./")) + return gulp.src("less/update/sw5e-light.less").pipe(less()).pipe(gulp.dest("./")); } + function compileDarkLess() { - return gulp.src("less/update/sw5e-dark.less") - .pipe(less()) - .pipe(gulp.dest("./")) + return gulp.src("less/update/sw5e-dark.less").pipe(less()).pipe(gulp.dest("./")); } + const css = gulp.series(compileLESS, compileGlobalLess, compileLightLess, compileDarkLess); /* ----------------------------------------- */ @@ -40,8 +37,5 @@ function watchUpdates() { /* Export Tasks /* ----------------------------------------- */ -exports.default = gulp.series( - gulp.parallel(css), - watchUpdates -); -exports.css = css; +exports.default = css; +gulp.parallel(css), (exports.watch = gulp.series(gulp.parallel(css), watchUpdates)); diff --git a/package-lock.json b/package-lock.json index 588658f8..759e9b50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4 +1,5 @@ { + "name": "sw5e", "requires": true, "lockfileVersion": 1, "dependencies": { @@ -89,7 +90,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -99,7 +99,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -272,7 +271,6 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -287,7 +285,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -296,7 +293,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -305,7 +301,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -314,7 +309,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -332,6 +326,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -349,7 +344,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -367,7 +361,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -388,7 +381,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -419,7 +411,6 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -697,6 +688,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "optional": true, "requires": { "prr": "~1.0.1" } @@ -782,7 +774,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -797,7 +788,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -806,7 +796,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -864,7 +853,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -880,7 +868,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -889,7 +876,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -898,7 +884,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -907,7 +892,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -916,7 +900,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -944,13 +927,13 @@ "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -962,7 +945,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -982,7 +964,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, "requires": { "detect-file": "^1.0.0", "is-glob": "^4.0.0", @@ -1055,7 +1036,6 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", @@ -1130,7 +1110,6 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dev": true, "requires": { "anymatch": "^2.0.0", "async-done": "^1.2.0", @@ -1180,7 +1159,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, "requires": { "glob-watcher": "^5.0.3", "gulp-cli": "^2.2.0", @@ -1192,7 +1170,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", - "dev": true, "requires": { "ansi-colors": "^1.0.1", "archy": "^1.0.0", @@ -1220,7 +1197,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-4.0.1.tgz", "integrity": "sha512-hmM2k0FfQp7Ptm3ZaqO2CkMX3hqpiIOn4OHtuSsCeFym63F7oWlEua5v6u1cIjVUKYsVIs9zPg9vbqTEb/udpA==", - "dev": true, "requires": { "accord": "^0.29.0", "less": "2.6.x || ^3.7.1", @@ -1256,7 +1232,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -1267,7 +1242,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -1277,7 +1251,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1300,7 +1273,8 @@ "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=" + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true }, "indx": { "version": "0.2.3", @@ -1322,9 +1296,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "interpret": { "version": "1.4.0", @@ -1474,7 +1448,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -1483,7 +1456,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1640,7 +1612,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, "requires": { "extend": "^3.0.0", "findup-sync": "^3.0.0", @@ -1708,6 +1679,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -1716,7 +1688,8 @@ "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "optional": true } } }, @@ -1745,7 +1718,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, "requires": { "findup-sync": "^2.0.0", "micromatch": "^3.0.4", @@ -1757,7 +1729,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, "requires": { "detect-file": "^1.0.0", "is-glob": "^3.1.0", @@ -1769,7 +1740,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, "requires": { "is-extglob": "^2.1.0" } @@ -1780,7 +1750,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -1800,7 +1769,8 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true }, "minimatch": { "version": "3.0.4", @@ -1842,13 +1812,13 @@ "nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -2187,7 +2157,8 @@ "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "optional": true }, "pump": { "version": "2.0.1", @@ -2245,7 +2216,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -2428,7 +2398,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -2444,7 +2413,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -2453,7 +2421,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2787,7 +2754,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -2857,7 +2823,8 @@ "uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true }, "unc-path-regex": { "version": "0.1.2", diff --git a/package.json b/package.json new file mode 100644 index 00000000..10023633 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "sw5e", + "description": "This game system for [Foundry Virtual Tabletop](http://foundryvtt.com) provides character sheet and game system \r support for the SW5E roleplaying game.", + "main": "sw5e.js", + "dependencies": { + "gulp": "^4.0.2", + "gulp-less": "^4.0.1" + } +} From 72ddf9344224759b26a8b23a91ef4f286757ff33 Mon Sep 17 00:00:00 2001 From: Cyr- Date: Sat, 16 Jan 2021 05:04:48 +0000 Subject: [PATCH 03/22] Regenerate css --- sw5e-global.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sw5e-global.css b/sw5e-global.css index 71738ad7..81758d82 100644 --- a/sw5e-global.css +++ b/sw5e-global.css @@ -80,6 +80,9 @@ body { font-family: 'Open Sans'; font-size: 13px; font-weight: 400; + background-image: url('./ui/SW5e-logo.svg'); + background-repeat: no-repeat; + background-size: cover; } h1 { font-family: 'Russo One'; From 45989ff9a4967aae155298498806795b6b2d8d34 Mon Sep 17 00:00:00 2001 From: Kakeman89 Date: Mon, 18 Jan 2021 10:05:31 -0500 Subject: [PATCH 04/22] Update classfeatures.db --- packs/packs/classfeatures.db | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/packs/packs/classfeatures.db b/packs/packs/classfeatures.db index 4956f5b9..c0574245 100644 --- a/packs/packs/classfeatures.db +++ b/packs/packs/classfeatures.db @@ -52,7 +52,7 @@ {"_id":"3NOg28znKOJczSZi","name":"Discoveries (Geneticist)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you select this pursuit, you gain access to new discoveries which reflect the changes you have caused your own body to undergo. Whenever you learn a new discovery, you can choose from any of the following as well. The discoveries are listed in alphabetical order.

\n
\n
\n

ADAPTED HIDE

\n

When you aren’t wearing armor, your AC is 13 + your Dexterity modifier. Additionally, you are adapted to hot or cold climates (your choice), as described in chapter 5 of the Dungeon Master’s Guide. When you undergo your mutagenic transformation, you add your full Intelligence modifier, instead of half, to your AC for the duration.

\n
\n

ATMOSPHERIC ADAPTATION

\n

You can breathe air and water. When you undergo your mutagenic transformation, you no longer need to breathe, and you can survive up to one hour within the vacuum of space for the duration.

\n
\n

ENHANCED MUSCULATURE

\n

Your carrying capacity and the weight you can push, drag, or lift doubles. If it would already double, it instead triples. Additionally, when you make a long jump, you can cover a number of feet up to twice your Strength score. When you make a high jump, you can leap a number of feet up into the air equal to 3 + twice your Strength modifier. When you undergo your mutagenic transformation, you have advantage on Strength checks and Strength saving throws for the duration.

\n
\n

ICARIAN MUTATION

\n

You sprout a pair of winged arms. You gain a flying speed equal to half your walking speed. You can only gain the benefit of items held by two of your arms at any given time, and once per round you can switch which arms you are benefiting from (no action required). When you undergo your mutagenic transformation, your flying speed increases to your full walking speed, and you can use your bonus action to take the Dash action for the duration.

\n
\n

MUTAGENIC HARDINESS

\n

Your hit point maximum increases by a number equal to your level, and it increases by 1 every time you gain a level. When you undergo your mutagenic transformation, and at the beginning of each of your turns, you gain temporary hit points equal to your half your scholar level (rounded down) + your Intelligence modifier for the duration.

\n
\n

PREDATORY SENSES

\n

You have darkvision out to 60 feet. If you already have darkvision, its range instead increases by 30 feet. When you undergo your mutagenic transformation, you gain advantage on Wisdom (Perception) checks that rely on smell for the duration. Additionally, you can track creatures that have left a scent in the last 24 hours.

\n
\n

UNDERGROUND ADAPTATION

\n

You gain a burrowing speed equal to your walking speed and you can tunnel through solid rock at a rate of 1 foot per round. In order to use this speed, you must have two free hands. When you undergo your mutagenic transformation, you gain tremorsense out to 30 feet for the duration. You can detect and pinpoint the origin of vibrations within a specific radius, provided that monster and the source of the vibrations are in contact with the same ground or substance. Tremorsense can’t be used to detect flying or incorporeal creatures.

\n
\n

UNNATURAL WEAPONRY

\n

You sprout claws or some other natural weapon, which deal 1d4 kinetic damage on a hit. You can use your choice of your Strength, Dexterity, or Intelligence modifier for the attack and damage rolls. You must use the same modifier for both rolls. When you undergo your mutagenic transformation, your unarmed strikes increase to a d6 and are considered enhanced for the duration. Additionally, you deal an additional 1d4 acid, lightning, or poison damage when you hit with them.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"3OqwFmlRSb2bklnK","name":"Bumbling Technique","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this order at 3rd level, your martial arts technique mixes combat training with the precision of a dancer and the antics of a jester. When you make a Charisma (Performance) check, you gain a bonus to the check equal to half your Wisdom modifier (rounded down, minimum of +1) if it doesn’t already include that modifier.

\n
\n

Additionally, you learn how to twist and turn quickly. Whenever you use your bonus action to make an unarmed strike, creatures you hit can’t make opportunity attacks against you, and your speed increases by 10 feet until the end of your turn.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"3QWti3hBCcOHMenb","name":"Additional Maneuvers (Scholar: Doctor)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Lastly at 3rd level, you gain access to new maneuvers which reflect the progress of your studies into the medical arts. Whenever you learn a new maneuver, you can choose from any of the following as well. The maneuvers are listed in alphabetical order.

\n
\n
\n

ADRENALINE HIT

\n

You can use an action and expend one superiority die to inject a creature with regenerative medication that temporarily enhances their agility. When you do so, a creature you can touch regains hit points equal to the superiority die roll. Additionally, until the start of your next turn, when that creature would take damage, the amount is reduced by an amount equal to your Intelligence modifier.

\n
\n

EMERGENCY PRESCRIPTION

\n

As an action, you can expend one superiority die and touch a creature. That creature regains hit points equal to result of the die + your Intelligence modifier, and when that creature makes their first ability check, attack roll, or saving throw before the start of your next turn they roll the superiority die and add it to the roll.

\n
\n

ENHANCEMENT INJECTION

\n

As an action, you can expend one superiority die to inject a creature you can touch with enhancements, granting them temporary hit points equal to the superiority die roll + your Intelligence modifier, which last for 1 minute. Additionally, when the target makes a Strength or Constitution check or saving throw while it has these temporary hit points, it gains a bonus equal to your Intelligence modifier.

\n
\n

NEUROBLOCK

\n

When you make an attack roll, you can expend a superiority die and add it to the attack roll. On a hit, the creature’s next attack has disadvantage and it cannot regain hit points until the start of your next turn.

\n
\n

REASSURE

\n

As an action, you can expend a superiority die and call out to a creature within 60 feet that can see or hear you that is charmed, frightened, or stunned. When you do so, that creature immediately makes another saving throw, adding the amount rolled to the save.

\n
\n

REMOVE TOXINS

\n

As an action, you can expend a superiority die to purge the toxins from a creature you can touch. The target regains hit points equal to the number rolled and, if it is poisoned or diseased, you neutralize the poison or disease. If more than one poison or disease afflicts the target, you neutralize one poison or disease that you know is present, or you neutralize one at random.

\n
\n

SMELLING SALTS

\n

As a bonus action, you can expend a superiority die to heal a creature you can touch by a number of hit points equal to the number rolled.

\n
\n

TRANSFUSION

\n

Once per turn when you hit a creature with a finesse melee weapon, you can expend a superiority to give you or an ally that is within 5 feet of the creature a transfusion. Add the superiority dice to the damage you deal. You or your ally gain hit points equivalent to the damage you deal to the creature.

\n

You can be the creature hit with the attack as long as there is an ally with 5 feet of you, in which you can let it hit without rolling an attack and must choose an ally to heal with the transfusion.

\n
\n

WEAK POINT STRIKE

\n

When you hit a creature with a weapon attack, you can expend a superiority die to temporarily daze the creature. Add the number rolled to the damage of the weapon attack and the creature must succeed on a Constitution saving throw or be stunned until the end of its next turn.

\n
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"name":"Elemental Adept","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 6th, 11th, and 17th level

\n

You gain two of the following features. You gain an additional option at 11th and 17th level.

\n

You can use these features a combined number of times equal to your proficiency bonus, as shown in the monk table. You regain all expended uses when you complete a long rest.

\n

While you have no remaining uses of this feature, you can instead expend 2 focus points to use it. When you do so, your maximum focus points are reduced by 2 until you complete a long rest.

\n
\n
\n

Burning Ember Flourish

\n

You can use your action to choose an area of flame that you can see and that fits within a 5-foot cube within 60 feet. You can extinguish the fire in that area, and you create either fireworks or smoke when you do so.

\n

  Fireworks. The target explodes with a dazzling display of colors. Each creature within 10 feet of the target must succeed on a Constitution saving throw or become blinded until the end of your next turn.

\n

  Smoke. Thick black smoke spreads out from the target in a 20-foot radius, moving around corners. The area of the smoke is heavily obscured. The smoke persists for 1 minute or until a strong wind disperses it.

\n
\n

Curtain of Unyielding Wind

\n

As an action, you can spend 2 focus points to call up a mighty gale, which swirls around you in a 10-foot radius and moves with you, remaining centered on you. The wind lasts for 10 minutes. The wind deafens both you and other creatures in its area. It extinguishes unprotected flames in its area that are torch-sized or smaller and hedges out vapor, gas, and fog that can be dispersed by strong wind. The area is difficult terrain for creatures other than you, and the attack rolls of ranged weapon attacks have disadvantage if the attacks pass in or out of the wind.

\n
\n

Crushing Hand of the Mountain

\n

As an action, you can choose a 5-foot-square unoccupied space on the ground that you can see within 30 feet. A Medium hand made from soil and stone, which lasts for 1 minute, rises in that space and reaches for one Large or smaller creature you can see within 5 feet of it. The target must make a Strength saving throw. On a failed save, the target takes 2d6 kinetic damage and is restrained for the duration. As a bonus action on each of your turns, you can cause the hand to crush the restrained target, which must make a Strength saving throw. It takes 2d6 kinetic damage on a failed save or half as much damage on a successful one. To break out, the restrained creature can use its action to make a Strength check against your focus save DC. On a success, the target escapes and is no longer restrained by the hand. As an action, you can cause the hand to reach for a different creature or to move to a different unoccupied space within range. The hand releases a restrained target if you do either.

\n
\n

Hatchling's Flame

\n

As an action, you focus your energy into a torrent of fire that streaks away from you. A line of roaring flame 30 feet long and 5 feet wide emanates from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 3d8 fire damage on a failed save, or half as much damage on a successful one.

\n
\n

Patient Bantha Listens

\n

You reach out to the ground beneath you. You can use your bonus action to gain tremorsense with a range of 30 feet and a burrow speed equal to your walking speed for up to 1 minute. Your movement leaves behind a tunnel that remains for as long as this ability is active, after which it collapses.

\n
\n

Rush of the Shyrack

\n

As an action, you can spend 2 focus points to form a line of strong wind 60 feet long and 10 feet wide that blasts from you in a direction you choose for one minute or until you lose concentration or dismiss the effect (no action required). Each Large or smaller creature that starts its turn in the line must succeed on a Strength saving throw or be pushed 15 feet away from you in a direction following the line. Any creature in the line must spend 2 feet of movement for every 1 foot it moves when moving closer to you. The gust disperses gas or vapor, and it extinguishes candles, torches, and similar unprotected flames in the area. It causes protected flames, such as those of lanterns, to dance wildly and has a 50 percent chance to extinguish them. As a bonus action on each of your turns before the effect ends, you can change the direction in which the line blasts from you.

\n
\n

Shape the Raincloud

\n

You can use your action to pull water from air and return it to the atmosphere. In an open container, you can create up to 20 gallons of drinkable water. You may also produce a rain that falls within a 30-foot cube and extinguishes open-air flames. You can destroy the same amount of water in an open container, or destroy a 30-foot cube of fog.

\n
\n

Swarming Ice Rabbit

\n

As an action, you can cause a flurry of ice crystals to erupt from a point you can see within 90 feet. Each creature in a 5-foot-radius sphere centered on that point must make a Dexterity saving throw. On a failed save, a creature takes 3d6 cold damage and gains 1 slowed level until the start of your next turn. On a successful save, a creature takes half as much damage and isn't slowed.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"3YCcAbIVrG0op5oH"} +{"_id":"3YCcAbIVrG0op5oH","name":"Elemental Adept","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 6th, 11th, and 17th level

\n

You gain two of the following features. You gain an additional option at 11th and 17th level.

\n

You can use these features a combined number of times equal to your proficiency bonus, as shown in the monk table. You regain all expended uses when you complete a long rest.

\n

While you have no remaining uses of this feature, you can instead expend 2 focus points to use it. When you do so, your maximum focus points are reduced by 2 until you complete a long rest.

\n
\n
\n

Burning Ember Flourish

\n

You can use your action to choose an area of flame that you can see and that fits within a 5-foot cube within 60 feet. You can extinguish the fire in that area, and you create either fireworks or smoke when you do so.

\n

  Fireworks. The target explodes with a dazzling display of colors. Each creature within 10 feet of the target must succeed on a Constitution saving throw or become blinded until the end of your next turn.

\n

  Smoke. Thick black smoke spreads out from the target in a 20-foot radius, moving around corners. The area of the smoke is heavily obscured. The smoke persists for 1 minute or until a strong wind disperses it.

\n
\n

Curtain of Unyielding Wind

\n

As an action, you can spend 2 focus points to call up a mighty gale, which swirls around you in a 10-foot radius and moves with you, remaining centered on you. The wind lasts for 10 minutes. The wind deafens both you and other creatures in its area. It extinguishes unprotected flames in its area that are torch-sized or smaller and hedges out vapor, gas, and fog that can be dispersed by strong wind. The area is difficult terrain for creatures other than you, and the attack rolls of ranged weapon attacks have disadvantage if the attacks pass in or out of the wind.

\n
\n

Crushing Hand of the Mountain

\n

As an action, you can choose a 5-foot-square unoccupied space on the ground that you can see within 30 feet. A Medium hand made from soil and stone, which lasts for 1 minute, rises in that space and reaches for one Large or smaller creature you can see within 5 feet of it. The target must make a Strength saving throw. On a failed save, the target takes 2d6 kinetic damage and is restrained for the duration. As a bonus action on each of your turns, you can cause the hand to crush the restrained target, which must make a Strength saving throw. It takes 2d6 kinetic damage on a failed save or half as much damage on a successful one. To break out, the restrained creature can use its action to make a Strength check against your focus save DC. On a success, the target escapes and is no longer restrained by the hand. As an action, you can cause the hand to reach for a different creature or to move to a different unoccupied space within range. The hand releases a restrained target if you do either.

\n
\n

Hatchling's Flame

\n

As an action, you focus your energy into a torrent of fire that streaks away from you. A line of roaring flame 30 feet long and 5 feet wide emanates from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 3d8 fire damage on a failed save, or half as much damage on a successful one.

\n
\n

Patient Bantha Listens

\n

You reach out to the ground beneath you. You can use your bonus action to gain tremorsense with a range of 30 feet and a burrow speed equal to your walking speed for up to 1 minute. Your movement leaves behind a tunnel that remains for as long as this ability is active, after which it collapses.

\n
\n

Rush of the Shyrack

\n

As an action, you can spend 2 focus points to form a line of strong wind 60 feet long and 10 feet wide that blasts from you in a direction you choose for one minute or until you lose concentration or dismiss the effect (no action required). Each Large or smaller creature that starts its turn in the line must succeed on a Strength saving throw or be pushed 15 feet away from you in a direction following the line. Any creature in the line must spend 2 feet of movement for every 1 foot it moves when moving closer to you. The gust disperses gas or vapor, and it extinguishes candles, torches, and similar unprotected flames in the area. It causes protected flames, such as those of lanterns, to dance wildly and has a 50 percent chance to extinguish them. As a bonus action on each of your turns before the effect ends, you can change the direction in which the line blasts from you.

\n
\n

Shape the Raincloud

\n

You can use your action to pull water from air and return it to the atmosphere. In an open container, you can create up to 20 gallons of drinkable water. You may also produce a rain that falls within a 30-foot cube and extinguishes open-air flames. You can destroy the same amount of water in an open container, or destroy a 30-foot cube of fog.

\n
\n

Swarming Ice Rabbit

\n

As an action, you can cause a flurry of ice crystals to erupt from a point you can see within 90 feet. Each creature in a 5-foot-radius sphere centered on that point must make a Dexterity saving throw. On a failed save, a creature takes 3d6 cold damage and gains 1 slowed level until the start of your next turn. On a successful save, a creature takes half as much damage and isn't slowed.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"3g7tveozmCHAkd5R","name":"Inquisitor's Wrath","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 15th level, you can cast the force suppression and sever force force powers at 3rd level against the target of your Ranger’s Quarry without expending tech points. If they are within 30 feet of you, you have advantage on the forcecasting ability check for these powers.

\n

You can use this feature a number of times equal to 1 + your Intelligence modifier (a minimum of once). You regain all expended uses when you finish a long rest.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"action","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"3jBAw3l2ulXKcqLV","name":"Forcecasting (Operative: Beguiler)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this practice at 3rd level, you have derived powers from your emotional connection to the Force. See chapter 10 for the general rules of forcecasting and chapter 11 for the force powers list.

\n

FORCE POWERS KNOWN

\n

You learn 4 force powers of your choice, and you learn more at higher levels, as shown in the Force Powers Known column of the Beguiler Practice Forcecasting table. You may not learn a force power of a level higher than your Max Power Level, and you may learn a force power at the same time you learn its prerequisite.

\n

FORCE POINTS

\n

You have a number of force points equal to your operative level, as shown in the Force Points column of the Beguiler Practice Forcecasting table, + your Wisdom or Charisma modifier (your choice). You use these force points to cast force powers. You regain all expended force points when you finish a long rest.

\n

MAX POWER LEVEL

\n

Many force powers can be overpowered, consuming more force points to create a greater effect. You can overpower these abilities to a maximum level, which increases at higher levels, as shown in the Max Power Level column of the Beguiler Practice Forcecasting table.

\n

You may only cast force powers at 4th-level once. You regain the ability to do so after a long rest.

\n

FORCECASTING ABILITY

\n

Your forcecasting ability varies based on the alignment of the powers you cast. You use your Wisdom for light side powers, Charisma for dark side powers, and Wisdom or Charisma for universal powers (your choice). You use this ability score modifier whenever a power refers to your forcecasting ability. Additionally, you use this ability score modifier when setting the saving throw DC for a force power you cast and when making an attack roll with one.

\n
\n

Force save DC = 8 + your proficiency bonus + your forcecasting ability modifier

\n
\n

Force attack modifier = your proficiency bonus + your forcecasting ability modifier

\n
\n

THE BEGUILER PRACTICE

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LevelForce Powers KnownForce PointsMax Power Level
3rd431st
4th641st
5th751st
6th861st
7th1072nd
8th1182nd
9th1292nd
10th13102nd
11th14112nd
12th15122nd
13th17133rd
14th18143rd
15th19153rd
16th20163rd
17th22174th
18th23184th
19th24194th
20th25204th
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"3jqPPd5qJBBnonPw","name":"Seeing Sound","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"classfeature","data":{"description":{"value":"

Starting at 10th level, while you are raging or experiencing the high of a substance, you have blindsight with a range of 10 feet. If you are both raging and experiencing the high of a substance, you instead have blindsight with a range of 30 feet.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -61,7 +61,7 @@ {"_id":"3qzL7p1j5m4LlIah","name":"Force Recovery","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 1st level, you have learned to regain some of your energy by briefly meditating. When you finish a short rest, you can regain a number of force points equal to half your consular level (rounded down) + your Wisdom or Charisma modifier (your choice, minimum of one). Once you’ve used this feature, you must complete a long rest before you can use it again.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"3wNWE9KjkFD76PuW","name":"Droid Companion","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, you learn to employ all the knowledge you’ve accumulated to create and customize your own personalized droid companion.

\n

Choose your droid, which is detailed at the end of this discipline. Over the course of 8 hours, which can be done during a long rest, you can expend 500 cr worth of materials to finally finish your droid.

\n

If your droid is irreparably destroyed, or you want to interface with a different droid, you can spend an additional 250 credits and 1 hour to change the target of this feature. You may only have one droid companion at a time.

\n

Your droid gains a variety of benefits while it is interfaced with you:

\n
    \n
  • The droid obeys your commands as best it can. It acts on your turn, and you determine its actions, decisions, attitudes, and so on. If you are incapacitated or absent, your droid acts on its own.
  • \n
  • Your droid’s level equals your engineer level, and for each engineer level you gain after 3rd, your droid companion gains an additional Hit Die and increases its hit points accordingly.
  • \n
  • Your droid has the proficiency bonus of a player character of the same level.
  • \n
  • Whenever you gain the Ability Score Improvement feature in this class, your droid’s abilities also improve. Your droid can increase one ability score of your choice by 2, or it can increase two ability scores of your choice by 1. As normal, your droid can’t increase an ability score above 20 using this feature unless its description specifies otherwise.
  • \n
  • Your droid can not wear armor, but you can have the armor professionally integrated into its chassis. Over the course of a long rest, you can expend materials equal to half the cost of the armor in order to integrate it into your droid. Your droid must be proficient in armor in order to have it integrated.
  • \n
  • Your droid is a valid target of the tracker droid interface tech power.
  • \n
\n

Additionally, you can modify your droid. Your droid companion has 4 modification slots, and it gains more at higher levels, as shown in the Modification Slots column of the engineer table. For each modification installed, your tech point maximum is reduced by 1. Over the course of a long rest, you can replace or remove a number of modifications up to your Intelligence modifier (minimum of one).

\n

GENERATING YOUR DROID

\n

Choosing your droid companion is an integral part of being an Astrotech Engineer. The class of droid you choose determines their features. Class I through V droids are all appropriate options, with their statistics listed below.

\n

Once you’ve selected your type of droid class, you assign your droid’s ability scores using standard array (16, 14, 14, 12, 10, 8) as you see fit.

\n
\n

DROID FEATURES

\n

All droids share the following features.

\n
\n
RESISTANCES AND VULNERABILITIES
\n

\n
    \n
  • Droid Resistances: Your droid is resistant to necrotic, poison, and psychic damage, and immune to poison and disease.
  • \n
  • Droid Vulnerabilities: Your droid is vulnerable to ion damage. Additionally, your droid has disadvantage on saving throws against effects that would deal ion or lightning damage.
  • \n
\n
\n
TRAITS
\n

\n
    \n
  • \n
    Creature Type: Droid
    \n
  • \n
  • \n
    Armor Integration: Your droid can not wear armor, but you can have the armor professionally integrated into its chassis. Over the course of a long rest, you can expend materials equal to half the cost of the armor in order to have it integrated. This work must be done by someone proficient with astrotech’s implements. Your droid must be proficient in armor in order to have it integrated.
    \n
  • \n
  • \n
    Droid Systems: Your droid does not need to eat or drink.
    \n
  • \n
\n
\n

CLASS I DROID

\n
\n
Class I droids are programmed for the mathematical, medical, or physical sciences. Subcategories of the first degree are medical droids, biological science droids, physical science droids, and mathematics droids.
\n
As a class I droid, your droid companion has the following features.
\n
HIT POINTS
\n

\n
    \n
  • Hit Dice: 1d8 per class I droid level
  • \n
  • Hit Points at 1st Level: 8 + your droid’s Constitution modifier
  • \n
  • Hit Points at Higher Levels: 1d8 (or 5) + your droid’s Constitution modifier per class I droid level after 1st
  • \n
\n
\n
PROFICIENCIES
\n

\n
    \n
  • Armor: Light armor plating
  • \n
  • Weapons: Simple blasters, simple vibroweapons
  • \n
  • Tools: None
  • \n
\n
\n
    \n
  • Languages: Class I droids can speak, read, and write Galactic Basic and one language of your choice. They can understand spoken and written Binary, but can not speak it
  • \n
  • Saving Throws: Wisdom, Intelligence
  • \n
  • Skills: Two Intelligence, Wisdom, or Charisma skills of your choice
  • \n
\n
\n
FEATURES
\n

\n
    \n
  • \n
    Size: Medium
    \n
  • \n
  • \n
    Speed: 25 ft.
    \n
  • \n
\n
\n

CLASS II DROID

\n
\n
Class II droids are programmed for engineering and other technical sciences. They differ from class I droids because they apply the science to real-life situations. Class II droids are rarely equipped with Basic vocabulators, instead communicating through Binary. There are five subcategories of class II droids. Astromech, exploration, environmental, engineering, and maintenance droids are all class II
droids.
\n
As a class II droid, your droid companion has the following features.
\n
HIT POINTS
\n

\n
    \n
  • Hit Dice: 1d6 per class II droid level
  • \n
  • Hit Points at 1st Level: 6 + your droid’s Constitution modifier
  • \n
  • Hit Points at Higher Levels: 1d6 (or 4) + your droid’s Constitution modifier per class II droid level after 1st
  • \n
\n
\n
PROFICIENCIES
\n

\n
    \n
  • Armor: Light armor, medium armor
  • \n
  • Weapons: Simple blasters and simple vibroweapons with the light property
  • \n
  • Tools: Your choice of demolition’s kit, security kit, or slicer’s kit
  • \n
\n
\n
    \n
  • Languages: Class II droids can speak, read, and write Binary. They can understand spoken and written Galactic Basic and one language of your choice, but can not speak it
  • \n
  • Saving Throws: Dexterity, Intelligence
  • \n
  • Skills: Two of your choice
  • \n
\n
\n
FEATURES
\n

\n
    \n
  • \n
    Size: Small
    \n
  • \n
  • \n
    Speed: 25 ft.
    \n
  • \n
\n
\n

CLASS III DROID

\n
\n
Class III droids are programmed to interact with humans. They are said to be the most advanced droids ever invented. Protocol, servant, tutor, and child care droids are all class III droids.
\n
As a class III droid, your droid companion has the following features.
\n
HIT POINTS
\n

\n
    \n
  • Hit Dice: 1d8 per class III droid level
  • \n
  • Hit Points at 1st Level: 8 + your droid’s Constitution modifier
  • \n
  • Hit Points at Higher Levels: 1d8 (or 5) + your droid’s Constitution modifier per class III droid level after 1st
  • \n
\n
\n
PROFICIENCIES
\n

\n
    \n
  • Armor: Light armor
  • \n
  • Weapons: Simple blasters, simple vibroweapons
  • \n
  • Tools: None
  • \n
\n
\n
    \n
  • Languages: Class III droids can speak and understand all registered languages
  • \n
  • Saving Throws: Wisdom, Charisma
  • \n
  • Skills: None
  • \n
\n
\n
FEATURES
\n

\n
    \n
  • \n
    Size: Medium
    \n
  • \n
  • \n
    Speed: 25 ft.
    \n
  • \n
\n
\n

CLASS IV DROID

\n
\n
Class IV droids are programmed for military and security purposes. Such droids tend to perform tasks of violence or combat might be expected. Almost all class IV droids carry weapons. Armed combat droids are among the first droids ever created. Security, gladiator, battle, and assassin droids are all class IV droids.
\n
As a class IV droid, your droid companion has the following features.
\n
HIT POINTS
\n

\n
    \n
  • Hit Dice: 1d8 per class IV droid level
  • \n
  • Hit Points at 1st Level: 8 + your droid’s Constitution modifier
  • \n
  • Hit Points at Higher Levels: 1d8 (or 5) + your droid’s Constitution modifier per class IV droid level after 1st
  • \n
\n
\n
PROFICIENCIES
\n

\n
    \n
  • Armor: All armor
  • \n
  • Weapons: All blasters, All vibroweapons
  • \n
  • Tools: None
  • \n
\n
\n
    \n
  • Languages: Class IV droids can speak, read, and write Galactic Basic and one language of your choice. They can understand spoken and written Binary, but can not speak it
  • \n
  • Saving Throws: Strength, Dexterity
  • \n
  • Skills: None
  • \n
\n
\n
FEATURES
\n

\n
    \n
  • \n
    Size: Medium
    \n
  • \n
  • \n
    Speed: 30 ft.
    \n
  • \n
\n
\n

CLASS V DROID

\n
\n
Class V droids are programmed for menial and low-skill tasks. Such droids tend to perform basic tasks such as construction, lifting, maintenance, mining, sanitation, and transportation.
\n
As a class V droid, your droid companion has the following features.
\n
HIT POINTS
\n

\n
    \n
  • Hit Dice: 1d8 per class V droid level
  • \n
  • Hit Points at 1st Level: 8 + your droid’s Constitution modifier
  • \n
  • Hit Points at Higher Levels: 1d8 (or 5) + your droid’s Constitution modifier per class V droid level after 1st
  • \n
\n
\n
PROFICIENCIES
\n

\n
    \n
  • Armor: Light armor, medium armor
  • \n
  • Weapons: All vibroweapons, simple blasters
  • \n
  • Tools: One set of artisan’s implements
  • \n
\n
\n
    \n
  • Languages: Class V droids can speak, read, and write Binary. They can understand spoken and written Galactic Basic and one language of your choice, but can not speak it
  • \n
  • Saving Throws: Strength, Constitution
  • \n
  • Skills: Athletics
  • \n
\n
\n
FEATURES
\n

\n
    \n
  • \n
    Size: Medium
    \n
  • \n
  • \n
    Speed: 30 ft.
    \n
  • \n
\n
\n

ASTROTECH MODIFICATIONS

\n

If a modification has prerequisites, you must meet them to install it. You can install the modification at the same time that you meet its prerequisites.

\n
\n
\n

ADVANCED POWER CORE

\n

Prerequisite: 7th level, d10 Hit Die
Your droid’s hit points increase by an amount equal to its level + 1 and its Hit Die becomes a d12.

\n
\n

ALARM PROTOCOL

\n

You install an alarm module in your droid, granting the following benefits:

\n
    \n
  • Your droid grants a +5 bonus to initiative to creatures within 5 feet of it.
  • \n
  • You and your droid can’t be surprised while your droid is conscious.
  • \n
\n
\n

ANALYSIS PROTOCOL

\n

Prerequisite: 7th level, Class I Droid
Your droid can analyze a target, develop a plan on how to best overcome any potential obstacle, and execute that plan with ruthless efficiency. As a bonus action on your droid’s turn, your droid can analyze a target it can see within 60 feet of it. For the next minute, or until it analyzes another target, it gains the following benefits:

\n
    \n
  • When it analyzes a hostile creature, its attack and damage rolls made with weapons with the finesse property or blaster weapons against that target may use its Intelligence modifier instead of Strength or Dexterity.
  • \n
  • When it analyzes a friendly creature, the target can end your droid’s Analysis Protocol on them (no action required) to add half your droid’s Intelligence modifier (rounded down, minimum of +1) to one attack roll, ability check, or saving throw. Once a friendly creature has benefited from this ability, they can not do so again until they complete a short or long rest.
  • \n
\n
\n

ARM CANNONS

\n

You install dual arm cannons in your droid. The arm cannons have 2 charges. As an action, your droid can use charges to cast the overload tech power, using 1 charge per level. The saving throw is made against your droid’s tech save DC (8 + your droid’s proficiency bonus + your droid’s Intelligence modifier).

\n

You can choose this modification multiple times. Each time you do so, the arm cannons gain another charge, to a maximum of 4. The arm cannons regain all charges after a long rest.

\n
\n

BACK-UP PROTOCOL

\n

Prerequisite: 7th level
You install an emergency protocol in your droid, prompting a quick reboot after critical damage is taken. If your droid would be reduced to 0 hit points, it instead is reduced to 1.

\n

Once your droid uses this feature, it must finish a short or long rest before it can use it again.

\n
\n

CELERITY AUGMENT

\n

You augment your droid to move a little faster. Your droid’s speed increases by 5 feet.

\n

You can choose this modification twice.

\n
\n

CHARISMA CHIP

\n

Prerequisite: Class III Droid
You install a charisma chip in your droid. When an ally your droid can see makes an ability check, attack roll, or saving throw, your droid can use its reaction to give them advantage on the roll. It can do so before or after they roll the d20, but before the GM says the roll succeeds or fails. Once your droid uses this ability, it can’t use it again until it finishes a short or long rest.

\n
\n

DARKVISION OPTICS

\n

Your droid has darkvision to a range of 60 feet. If your droid already has darkvision, this modification increases its range by 30 feet.

\n
\n

DURABILITY MODULE

\n

You enhance your droid’s durability, granting the following benefits:

\n
    \n
  • When your droid rolls a Hit Die to regain hit points, the minimum number of hit points your droid can regain from the roll equals twice your droid’s Constitution modifier (minimum of 2).
  • \n
  • Your droid’s hit point maximum increases by an amount equal to twice its level when you install this protocol. Whenever your droid gains a level thereafter, its hit point maximum increases by an additional 2 hit points.
  • \n
\n
\n

EMERGENCY MODE

\n

Prerequisite: 15th level
Prerequisite: Back-Up Protocol
You modify your droid’s back-up protocol. When your droid’s back-up protocol is initiated, it can use its reaction to make one attack roll against a target within range. If the target is the source of the damage that reduced your droid to 0, the attack roll has advantage.

\n
\n

ENERGY SHIELD

\n

You install an energy shield in your droid, which has 1 charge. As an action, your droid can use 1 charge to cast the energy shield tech power.

\n

You can choose this modification multiple times. Each time you do so, the energy shield gains another charge, to a maximum of 3. The energy shield regains all expended charges after a long rest.

\n
\n

EXPERTISE PROTOCOL

\n

Prerequisite: 5th level
You install a protocol in your droid that grants it expertise in a tool or skill in which it is proficient.

\n
\n

FALSE COMBUSTION

\n

Prerequisite: Class II Droid
As a reaction in response to taking damage, your droid can feign an explosion. For 1 minute, it appears to be destroyed to all outward inspection. A creature can use its action to inspect your droid and make an Intelligence (Investigation) check (DC = 8 + your droid’s proficiency bonus + your droid’s Intelligence modifier). If it succeeds, it becomes aware that your droid still functions.

\n
\n

FIGHTING STYLE PROTOCOL

\n

Your droid adopts a particular style of fighting as its specialty. Choose one of the fighting style options, detailed in chapter 6. Your droid can’t take a Fighting Style option more than once, even if it later gets to choose again.

\n
\n

FLAMETHROWER

\n

You install a flamethrower in your droid. The flamethrower has 1 charge. As an action, your droid can cast the jet of flame tech power, though it does not scale with higher levels, or use 1 charge to cast the flame sweep tech power at 1st level. The saving throw is made against your droid’s tech save DC (8 + your droid’s proficiency bonus + your droid’s Intelligence modifier).

\n

You can choose this modification multiple times. Each time you do so, the flamethrower gains another charge, to a maximum of 3. If the flamethrower has multiple charges, you can use multiple charges to cast flame sweep at a higher level, 1 point per charge. The flamethrower regains all expended charges after a long rest.

\n
\n

FOUR-ARMED COMBATANT

\n

Prerequisite: Class IV Droid
You install two additional arms to improve your droid’s combat capabilities, granting it four arms which it can use independently of one another. Your droid can only gain the benefit of items held by two of its arms at any given time, and once per round your droid can switch which arms it is benefiting from (no action required).

\n

While your droid has at least 3 arms free, it has a climbing speed equal to its walking speed.

\n
\n

HEAVY PLATING

\n

Prerequisite: Medium Armor proficiency
Your droid gains proficiency in heavy armor. If your droid is already proficient in heavy armor, instead critical hits are treated as normal hits against it.

\n
\n

LIGHT PLATING

\n

Your droid gains proficiency in light armor. If your droid is already proficient in light armor, instead your droid’s speed increases by 5 feet while light armor is integrated.

\n
\n

MARTIAL PROTOCOL

\n

Prerequisite: 7th level, Class IV Droid
Your droid has martial training that allows it to perform special combat maneuvers. It gains the following benefits:

\n
    \n
  • It learns two maneuvers of your choice from among those available to the fighter class. If a maneuver it uses requires its target to make a saving throw to resist the maneuver’s effects, the saving throw DC equals 8 + your droid’s proficiency bonus + your droid’s Strength or Dexterity modifier (your choice).
  • \n
  • Your droid has two superiority dice, which are d4s. These dice are used to fuel its maneuvers. A superiority die is expended when your droid uses it. It regain all of its expended superiority dice when you finish a short or long rest.
  • \n
\n
\n

MEDIUM PLATING

\n

Prerequisite: Light Armor proficiency
Your droid gains proficiency in medium armor. If your droid is already proficient in medium armor, the maximum Dexterity bonus your droid can add to AC increases to 3 from 2 while medium armor is integrated.

\n
\n

MEMORY PROTOCOL

\n

Prerequisite: Class I Droid
Your droid can recall anything it has read in the past month that it understood. This includes but is not limited to books, maps, signs, and lists.

\n
\n

OBSERVANT PROTOCOL

\n

Prerequisite: 7th level
Prerequisite: Alarm Protocol
You modify the alarm module in your droid, granting the following benefits:

\n
    \n
  • If your droid can see a creature’s mouth while it is speaking a language it understands, your droid can interpret what it’s saying by reading its lips.
  • \n
  • Your droid is considered to have advantage when determining its passive Wisdom (Perception) and passive Intelligence (Investigation) scores.
  • \n
\n
\n

PERFORMANCE PROTOCOL

\n

Prerequisite: 7th level, Class III Droid
You modify your droid’s charisma chip, granting the following benefits:

\n
    \n
  • Your droid has advantage on Charisma (Performance) checks.
  • \n
  • Your droid can also use its bonus action to motivate an ally within 30 feet of it. Until the start of your droid’s next turn, the ally can add the droid’s Charisma modifier (minimum of +1) to the first attack roll, ability check, or saving throw they make. Your droid can use this feature a number of time equal to its Charisma modifier, and it regains all expended uses after it completes a long rest.
  • \n
\n
\n

POWERFUL DROID

\n

Prerequisite: Class V Droid
Your droid’s carrying capacity and the weight it can push, drag, or lift doubles. If it would already double, it instead triples.

\n
\n

POWERFUL GRIP

\n

Prerequisite: 7th level, Class V Droid
When your droid hits a creature with a melee weapon attack on its turn and has a free hand, it can use a bonus action to attempt to grapple the target. If it does so, and the grapple succeeds, your droid can make one additional attack against the target (no action required).

\n
\n

PREMIUM POWER CORE

\n

Prerequisite: d6 Hit Die
Your droid’s hit points increase by an amount equal to its level + 1 and its Hit Die becomes a d8.

\n
\n

PROFICIENCY PROTOCOL

\n

You install a protocol in your droid that grants it proficiency in a tool or skill. Your droid gains proficiency in a tool or skill of your choice.

\n

You can choose this modification multiple times.

\n
\n

PROTOTYPE POWER CORE

\n

Prerequisite: d8 Hit Die
Your droid’s hit points increase by an amount equal to its level + 1 and its Hit Die becomes a d10.

\n
\n

REPULSOR COIL

\n

Prerequisite: 7th level, Class II Droid
You install repulsor coils in your droid’s legs. Your droid gains a flying speed equal to its walking speed.

\n
\n

SENSOR AUGMENTATION

\n

You augment your droid with an advanced sensor, granting the following benefits:

\n
    \n
  • Your droid has advantage on Wisdom (Perception) and Intelligence (Investigation) checks made to detect the presence of secret doors.
  • \n
  • Your droid has advantage on saving throws made to avoid or resist traps.
  • \n
  • Your droid has resistance to the damage dealt by traps.
  • \n
  • Your droid can search for traps while traveling at a normal pace, instead of only at a slow pace.
  • \n
\n
\n

STUN RAY

\n

You install a stun ray in your droid. The stun ray has 1 charge. As an action, your droid can use 1 charge to cast the hold droid or paralyze humanoid tech power. The saving throw is made against your droid’s tech save DC (8 + your droid’s proficiency bonus + your droid’s Intelligence modifier).

\n

You can choose this modification multiple times. Each time you do so, the stun ray gains another charge, to a maximum of 3. The stun ray regains all expended charges after a long rest.

\n
\n

TECHCASTING PROTOCOL

\n

Your droid learns one at-will tech power and one 1st-level tech power, which it can cast at its lowest level once per long rest. Your droid’s techcasting ability is Intelligence. It does not require use of a wristpad for these powers. At-will powers chosen in this way do not scale with higher levels.

\n
\n

TOUGHNESS MODULE

\n

Prerequisite: 11th level
Prerequisite: Durability Module
You modify the durability module in your droid, granting the following benefit:

\n
    \n
  • Your droid becomes proficient in Constitution saving throws. If it is already proficient, it becomes proficient in another saving throw of your choice.
  • \n
  • Whenever your droid takes the Dodge action in combat, it can spend one Hit Die to heal itself. Roll the die, add its Constitution modifier, and it regains a number of hit points equal to the total (minimum of one).
  • \n
\n
\n

TRUESIGHT OPTICS

\n

Prerequisite: 11th level
Prerequisite: Darkvision Optics
Your droid can see through illusions and detect invisibility within 30 feet, as with truesight.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"3wmpa2PloRYvU2na","name":"Out of Touch","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 7th level, as an action, you can step out of sync with the rest of the universe for 1 minute. At the start of each of your turns, roll a d20. If you roll 11 or higher, you and everything your are wearing or carrying are completely invisible to all beings, except for those with truesight. On a roll of 10 or lower, you instead appear as an indistinguishably blurred form roughly your normal height and weight, though a being with truesight sees you normally. Regardless of your appearance, for the duration, your speed doubles, you gain a flying speed equal to your walking speed, and you can move through creatures and objects willingly though you can not affect them and they can not affect you. You can end this feature early on your turn (no action required). When this effect ends, if you are inside a solid object or creature, you are immediately shunted to the nearest unoccupied space that you can occupy and take force damage equal to twice the number of feet you are moved.

\n

This effect ends early if you are incapacitated or die. Once you’ve used this feature, you must complete a short or long rest before you can use it again.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"action","cost":0,"condition":""},"duration":{"value":1,"units":"minute"},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"sr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"name":"Avatar","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 17th level

\n

As an ultimate display of your mastery of the elements, you can spend 5 focus points as an action to have the elements of water, earth, fire, and air form a protective sphere around your body, gaining multiple benefits for 1 minute. While this ability is active, you have resistance to cold, energy, fire, kinetic, lightning, and sonic damage. You also gain a burrow, fly, and swim speed equal to your movement speed. Lastly, you can use any of the following abilities as a bonus action:

\n
    \n
  • You create a small earthquake on the ground in a 15 foot radius around you. Each creature in that area must make a Dexterity saving throw. On a failed save, a creature takes 1 d6 kinetic damage and is knocked prone.
  • \n
  • You create a line of fire 15 feet long and 5 feet wide extending from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 3d6 fire damage on a failed save, or half as much damage on a successful one.
  • \n
  • You create a 15 foot cube of swirling wind centered on a point you can see within 60 feet of you. Each creature in that area must make a Constitution saving throw. A creature takes 1 d10 kinetic damage on a failed save, or half as much damage on a successful one. If a Large or smaller creature fails the save, that creature is also pushed up to 10 feet away from the center of the cube.
  • \n
  • You create a 15 foot cone of ice shards extending from your outstretched hand in a direction you choose. Each creature in the cone must make a Constitution save throw. A creature takes 2d6 cold damage on a failed save, or half as much damage on a successful one. A creature that fails its save against this effect has its speed halved until the start of your next turn.
  • \n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"41pjk6FyBk1MYXMy"} +{"_id":"41pjk6FyBk1MYXMy","name":"Avatar","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 17th level

\n

As an ultimate display of your mastery of the elements, you can spend 5 focus points as an action to have the elements of water, earth, fire, and air form a protective sphere around your body, gaining multiple benefits for 1 minute. While this ability is active, you have resistance to cold, energy, fire, kinetic, lightning, and sonic damage. You also gain a burrow, fly, and swim speed equal to your movement speed. Lastly, you can use any of the following abilities as a bonus action:

\n
    \n
  • You create a small earthquake on the ground in a 15 foot radius around you. Each creature in that area must make a Dexterity saving throw. On a failed save, a creature takes 1 d6 kinetic damage and is knocked prone.
  • \n
  • You create a line of fire 15 feet long and 5 feet wide extending from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 3d6 fire damage on a failed save, or half as much damage on a successful one.
  • \n
  • You create a 15 foot cube of swirling wind centered on a point you can see within 60 feet of you. Each creature in that area must make a Constitution saving throw. A creature takes 1 d10 kinetic damage on a failed save, or half as much damage on a successful one. If a Large or smaller creature fails the save, that creature is also pushed up to 10 feet away from the center of the cube.
  • \n
  • You create a 15 foot cone of ice shards extending from your outstretched hand in a direction you choose. Each creature in the cone must make a Constitution save throw. A creature takes 2d6 cold damage on a failed save, or half as much damage on a successful one. A creature that fails its save against this effect has its speed halved until the start of your next turn.
  • \n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"4X59Gjodqz87nMsa","name":"Crisis Management","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 11th level, while you can see your turret, it can add half its proficiency bonus (rounded up) to any saving throws it makes.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"4XaA12U40vAZxRhi","name":"Deflect Missiles","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, you can use your reaction to deflect a projectile when you are dealt damage by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by 1d10 + your Dexterity modifier + your monk level.

\n

If you reduce the damage to 0, and the damage is kinetic, energy, or ion, you can redirect it at another target if you have a weapon capable of doing so. You can spend 1 focus point to make a ranged attack as you deflect the projectile, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the projectile counts as a monk weapon for the attack.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"4da8QNAWRrgGCkt3","name":"Flow-Walking","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 6th level, you can cast the phasestrike force power without expending force points. When you reach 11th level, the damage bonus of the special attack made during phasestrike increases to 2d8, and at 17th level it increases to 3d8.

\n

Additionally, when you use your action to cast an at-will force power, you can use your Martial Arts or Focus features.

\n

You can use these features a combined number of times equal to your Wisdom or Charisma modifier (your choice, a minimum of once). You regain any expended uses when you finish a long rest.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"special","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -108,7 +108,7 @@ {"_id":"7oDo92yMLpT66oRw","name":"Double Tap (Operative: Sharpshooter)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 17th level, you’ve learned to capitalize when you have the advantage. When you take the Attack action and make an attack with advantage, you can choose to forgo the advantage. If you do, you can make an additional attack against the target or another creature within 5 feet of it (no action required). Both attacks can benefit from your Sneak Attack damage, instead of only one.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"7u4ivAWUJpqE9096","name":"Form Basics (Ataru)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this form as your focus at 3rd level, you learn the basics of the chosen form. You gain the Ataru lightsaber form, detailed in Chapter 6 of the Player’s Handbook. If you already know this form, you can instead choose another lightsaber form. You can’t take a lightsaber form option more than once, even if you later get to choose again.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"8GhHyN7gwQWVQZNN","name":"Aberrant Resilience","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting when you choose this calling at 3rd level, you learn the resistance force power, which does not count against your total powers known. Additionally, you can use your Deflection and Slow Time Force-Empowered Self options when you cast it as your action. Finally, this power no longer requires concentration for you when you target yourself with it.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"_id":"8Pf5riC9RKGwLk7L","name":"Bonus Proficiencies (Engineer: Artificer)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in artificer’s implements, and with the lightsaber simple lightweapon. Additionally, when you engage in crafting with artificer’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"8Pf5riC9RKGwLk7L","name":"Bonus Proficiencies (Engineer: Artificer)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in artificer’s implements, and with the lightsaber simple lightweapon. Additionally, when you engage in crafting with artificer’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"8a0uFLTBNeZWDHqO","name":"One With the Blade","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 6th level, you extend your focus into your Echani weapons, granting you the following benefits.

\n
\n

ENHANCED ECHANI WEAPONS

\n

Your attacks with your Echani weapons count as enhanced for the purpose of overcoming resistance and immunity to unenhanced attacks and damage.

\n
\n

DEFT STRIKE

\n

When you hit a target with an Echani weapon, you can spend 1 focus point to cause the weapon to deal extra damage to the target equal to your Martial Arts die. You can use this feature only once on each of your turns.

\n
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"8c7Qdhh9vBX7Thxz","name":"Crimson Squall","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 6th level, you’ve learned to enhance your kata. As a bonus action while wielding a monk weapon, you can expend 1 focus point to cause the area within 5 feet of you to become difficult terrain for 1 minute. This area travels with you, and creatures within the area can not make opportunity attacks.

\n

At 11th level, the range of this area increases to 15 feet, and at 17th level, the range of this area increases to 30 feet.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"bonus","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"attribute","target":"","amount":1},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"8d2b9T3Zxw49RGmR","name":"One With the Force (Monk: Whills)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 11th level, you learn how to enter a trance, preparing to unleash yourself upon your enemy. While in this trance, you can still talk and move. If you stay in the trance for at least one minute, when you roll initiative, you can make a ranged weapon attack on a number of creatures up to your Wisdom or Charisma modifier (your choice, a minimum of one) within 30 feet of you when you were in this trance.

\n

Once you’ve used this feature, you must complete a short or long rest before you can use it again.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"minute","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"sr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -216,6 +216,8 @@ {"_id":"GuyZIHUnTINGFLXQ","name":"Know Your Enemy","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 7th level, if you spend at least 1 minute observing or interacting with another creature outside combat, you can learn certain information about its capabilities compared to your own. The GM tells you if the creature is your equal, superior, or inferior in regard to two of the following characteristics of your choice:

\n
    \n
  • Strength score
  • \n
  • Dexterity score
  • \n
  • Constitution score
  • \n
  • Armor Class
  • \n
  • Current hit points
  • \n
  • Total class levels (if any)
  • \n
  • Fighter class levels (if any)
  • \n
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"GzfX3ZSoFVyyHbH1","name":"Instinctive Leap","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 6th level, when a hostile creatures moves to within 5 feet of you, you can use your reaction to disengage and leap up to half your speed. If you end this movement in the air, you immediately fall to the ground.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"reaction","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"H00QpZIVvyleKRdW","name":"Unstoppable Force (Berserker: Juggernaut)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, your momentum makes you nigh unstoppable. While raging, you can move through a hostile creature’s space regardless of that creature’s size. When you do so, you must make a Strength (Athletics) check contested by the target’s Strength (Athletics) check. If you move at least 10 feet before moving through a hostile creature’s space, and that creature is your size or smaller, they have disadvantage on the check. If you succeed, you don’t treat the movement as difficult terrain, the creature is pushed 5 feet in a direction of your choice, and you don’t provoke opportunity attacks from that creature until the end of your turn.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"name":"Potent Fortifications","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Construction Engineering: 3rd level

\n

When a friendly creature other than you that you can see is hit with a ranged attack while within 5 feet of your deployed portable structure, you can use your reaction and expend one use of your Potent Aptitude to have your structure take the damage instead. If your structure would normally have immunity or resistance to this damage, it loses that immunity or resistance for this attack. When you do so, the damage is reduced by an amount equal to 1 d10 + your Intelligence modifier + your engineer level.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"reaction","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"H1wby8wQisTrmDFb"} +{"name":"Master Builder","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Construction Engineering: 18th level

\n

Your ability with your portable structures has reached untold superiority. You gain the following benefits:

\n
    \n
  • You can have two structures active at a time, instead of only one. as you learn to more efficiendy use your portable structure.
  • \n
  • Your structures no longer take double damage from the siege property.
  • \n
  • Your structures no longer automatically fail Strength, Dexterity, and Constitution saving throws. Instead, your structure adds your proficiency bonus to the d20 roll when it makes one of these saving throws.
  • \n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"H4XstMjZvkAsfyoJ"} {"_id":"HBT87umTugPVJBT7","name":"Inspiring Presence","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 6th level your mere presence on the battlefield rallies your allies. When you rage, choose up to 3 allies that you can see within 30 feet of you. Each creature gains temporary hit points equal to half your berserker level (rounded down) + your Charisma modifier (minimum of one).

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"special","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":3,"width":null,"units":"","type":"ally"},"range":{"value":30,"long":null,"units":"ft"},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"heal","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["3+1","temphp"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"HNSfcrOoizwfHN4U","name":"Form Basics (Shii-Cho)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this form as your focus at 3rd level, you learn the basics of the chosen form. You gain the Shii-Cho lightsaber form, detailed in Chapter 6 of the Player’s Handbook. If you already know this form, you can instead choose another lightsaber form. You can’t take a lightsaber form option more than once, even if you later get to choose again.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"HdWZ2lQgsbEnra24","name":"Evasion","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 7th level, your instinctive agility lets you dodge out of the way of certain area effects. When you are subjected to an effect, such as a consular’s force storm or an engineer’s explosion, that allows you to make a Dexterity saving throw to take only half damage, you instead take no damage if you succeed on a saving throw, and only half damage if you fail.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -299,7 +301,7 @@ {"_id":"OZImqRmAk5aeBX2o","name":"General Practice","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this practice at 3rd level, you gain proficiency in Medicine, and you can use your Intelligence modifier instead of your Wisdom modifier for checks made with it.

\n

Additionally, you can expend one use of a medkit to help revitalize your wounded allies during a short rest. If you or any friendly creatures within 30 feet of you regain hit points at the end of the short rest by spending one or more Hit Dice, each of those creatures regains an extra 1d6 hit points.

\n

The extra hit points increase when you reach certain levels in this class: to 1d8 at 9th level, to 1d10 at 13th level, and to 1d12 at 17th level.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"Ob4SKH2kAglyDbkk","name":"Redirected Shot","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 10th level, you learn how to direct an errant shot toward a new target. When you make an attack roll with an enhanced shot and miss, you can use a bonus action to reroll the attack roll against a different target within 60 feet of the original target.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"OqdAc34c0Db1huf7","name":"Comfort Food","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 9th level, if you or any friendly creatures who have consumed food you prepared during a short rest regain hit points by spending hit dice at the end of the short rest, each of those creatures regains an extra 1d8 hit points.

\n

The extra hit points increase when you reach certain levels in this class: to 1d10 at 11th level, and to 1d12 at 15th level.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"name":"Elemental Paragon","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 17th level

\n

You gain one of the following features.

\n

Once you've used the chosen feature, you must complete a long rest before you can use it again.

\n

While you have no remaining uses of this feature, you can instead expend 4 focus points to use it. When you do so, your maximum focus points are reduced by 4 until you complete a long rest.

\n
\n
\n

Archetype of Air

\n

Prerequisite: Ride the Wind

\n

As an action, you conjure a whirlwind around you, granting the following benefits until the start of your next turn:

\n
    \n
  • Ranged attacks made against you have disadvantage.
  • \n
  • You gain a flying speed of 60 feet. If you are still flying when the technique ends, you fall, unless you can somehow prevent it.
  • \n
  • You can use your action to create a 15 foot cube of swirling wind centered on a point you can see within 60 feet of you. Each creature in that area must make a Constitution saving throw. A creature takes 2d10 kinetic damage on a failed save, or half as much damage on a successful one. If a Large or smaller creature fails the save, that creature is also pushed up to 10 feet away from the center of the cube.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
\n

Figure of Flame

\n

Prerequisite: River of Hungry Flame

\n

As an action, you cause flames to race across your body, granting the following benefits until the start of your next turn:

\n
    \n
  • You have resistance to fire damage.
  • \n
  • The flames shed bright light in a 30 foot radius and dim light for an additional 30 feet.
  • \n
  • Any creature that moves within 5 feet of you for the first time on a turn or ends its turn there takes 1d10 fire damage.
  • \n
  • You can use your action to create a line of fire 15 feet long and 5 feet wide extending from you in a direction you choose. Each creature in the line must make a Dexterity saving throw, taking 4d8 fire damage on a failed save or half as much on a successful one.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
\n

Icon of Ice

\n

Prerequisite: Shape the Flowing River

\n

As an action, you cause frost to chill the area around you, granting the following benefits until the start of your next turn:

\n
    \n
  • You have resistance to cold damage.
  • \n
  • You can move across difficult terrain created by ice or snow without spending extra movement.
  • \n
  • The ground in a 10 foot radius around you is icy and is difficult terrain for creatures other than you. The radius moves with you.
  • \n
  • You can use your action to create a 15 foot cone of freezing ice extending from your outstretched hand in a direction you choose. Each creature in the cone must make a Constitution saving throw. A creature takes 4d6 cold damage on a failed save or half as much damage on a successful one. A creature that fails its save against this effect gains 1 slowed level until the start of your next turn.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
\n

Embodiment of Earth

\n

Prerequisite: Earth Reaches for Sky

\n

As an action, you cause rock to envelop you, granting the following benefits until the start of your next turn:

\n
    \n
  • You have resistance to kinetic and energy damage.
  • \n
  • You can move across difficult terrain made of earth or stone without spending extra movement. You can move through solid earth or stone as if it were air without destabilizing it, but you can't end your movement there. If you do so, you are immediately shunted to the nearest unoccupied space that you can occupy and take force damage equal to twice the number of feet you are moved.
  • \n
  • You can use your action to create a small earthquake on the ground in a 15 foot radius centered on you. Other creatures on that ground must succeed on a Dexterity saving throw or be knocked prone.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"OwENWRt1mFVfU8bB"} +{"_id":"OwENWRt1mFVfU8bB","name":"Elemental Paragon","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 17th level

\n

You gain one of the following features.

\n

Once you've used the chosen feature, you must complete a long rest before you can use it again.

\n

While you have no remaining uses of this feature, you can instead expend 4 focus points to use it. When you do so, your maximum focus points are reduced by 4 until you complete a long rest.

\n
\n
\n

Archetype of Air

\n

Prerequisite: Ride the Wind

\n

As an action, you conjure a whirlwind around you, granting the following benefits until the start of your next turn:

\n
    \n
  • Ranged attacks made against you have disadvantage.
  • \n
  • You gain a flying speed of 60 feet. If you are still flying when the technique ends, you fall, unless you can somehow prevent it.
  • \n
  • You can use your action to create a 15 foot cube of swirling wind centered on a point you can see within 60 feet of you. Each creature in that area must make a Constitution saving throw. A creature takes 2d10 kinetic damage on a failed save, or half as much damage on a successful one. If a Large or smaller creature fails the save, that creature is also pushed up to 10 feet away from the center of the cube.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
\n

Figure of Flame

\n

Prerequisite: River of Hungry Flame

\n

As an action, you cause flames to race across your body, granting the following benefits until the start of your next turn:

\n
    \n
  • You have resistance to fire damage.
  • \n
  • The flames shed bright light in a 30 foot radius and dim light for an additional 30 feet.
  • \n
  • Any creature that moves within 5 feet of you for the first time on a turn or ends its turn there takes 1d10 fire damage.
  • \n
  • You can use your action to create a line of fire 15 feet long and 5 feet wide extending from you in a direction you choose. Each creature in the line must make a Dexterity saving throw, taking 4d8 fire damage on a failed save or half as much on a successful one.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
\n

Icon of Ice

\n

Prerequisite: Shape the Flowing River

\n

As an action, you cause frost to chill the area around you, granting the following benefits until the start of your next turn:

\n
    \n
  • You have resistance to cold damage.
  • \n
  • You can move across difficult terrain created by ice or snow without spending extra movement.
  • \n
  • The ground in a 10 foot radius around you is icy and is difficult terrain for creatures other than you. The radius moves with you.
  • \n
  • You can use your action to create a 15 foot cone of freezing ice extending from your outstretched hand in a direction you choose. Each creature in the cone must make a Constitution saving throw. A creature takes 4d6 cold damage on a failed save or half as much damage on a successful one. A creature that fails its save against this effect gains 1 slowed level until the start of your next turn.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
\n

Embodiment of Earth

\n

Prerequisite: Earth Reaches for Sky

\n

As an action, you cause rock to envelop you, granting the following benefits until the start of your next turn:

\n
    \n
  • You have resistance to kinetic and energy damage.
  • \n
  • You can move across difficult terrain made of earth or stone without spending extra movement. You can move through solid earth or stone as if it were air without destabilizing it, but you can't end your movement there. If you do so, you are immediately shunted to the nearest unoccupied space that you can occupy and take force damage equal to twice the number of feet you are moved.
  • \n
  • You can use your action to create a small earthquake on the ground in a 15 foot radius centered on you. Other creatures on that ground must succeed on a Dexterity saving throw or be knocked prone.
  • \n
\n

At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"OwFJ3XWTg2ECPPqS","name":"Forcecasting (Consular)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 1st level, in your meditations on the force, you have learned powers, fragments of knowledge that imbue you with an abiding force ability. See chapter 10 for the general rules of forcecasting and chapter 11 for the force powers list.

\n

FORCE POWERS KNOWN

\n

You learn 9 force powers of your choice, and you learn more at higher levels, as shown in the Force Powers Known column of the consular table. You may not learn a force power of a level higher than your Max Power Level, and you may learn a force power at the same time you learn its prerequisite.

\n

FORCE POINTS

\n

You have a number of force points equal to your consular level x 4, as shown in the Force Points column of the consular table, + your Wisdom or Charisma modifier (your choice). You use these force points to cast force powers. You regain all expended force points when you finish a long rest.

\n

MAX POWER LEVEL

\n

Many force powers can be overpowered, consuming more force points to create a greater effect. You can overpower these abilities to a maximum level, which increases at higher levels, as shown in the Max Power Level column of the consular table.

\n

You may only cast force powers at 6th, 7th, 8th, and 9th-level once. You regain the ability to do so after a long rest.

\n

FORCECASTING ABILITY

\n

Your forcecasting ability varies based on the alignment of the powers you cast. You use Wisdom for light side powers, Charisma for dark side powers, and Wisdom or Charisma for universal powers (your choice). You use this ability score modifier whenever a power refers to your forcecasting ability. Additionally, you use this ability score modifier when setting the saving throw DC for a force power you cast and when making an attack roll with one.

\n
\n

Force save DC = 8 + your proficiency bonus + your forcecasting ability modifier

\n
\n

Force attack modifier = your proficiency bonus + your forcecasting ability modifier

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"P44Rcdvtp5HH7DgM","name":"Bonus Proficiencies (Fighter: Mounted)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this specialty at 3rd level, you gain proficiency in Animal Handling or Piloting.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"P5jlHfbFfEgppwin","name":"Forceblade Mastery","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 18th level, you’ve mastered controlling your forceblade with your mind, using it to keep your enemies at bay. As an action, you can telekinetically control your forceblade and have it strike any number of creatures within 10 feet of you, spending 1 force point per target. Each target must make a Dexterity saving throw (DC = 8 + your bonus to weapon attack rolls with that weapon). On a failed save, it takes damage using your Kinetic Combat die + half your sentinel level (rounded down), is pushed back 10 feet and knocked prone.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":"enemy"},"range":{"value":10,"long":null,"units":"ft"},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["1d12+9",""]],"versatile":""},"formula":"","save":{"ability":"dex","dc":null,"scaling":"flat"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -319,6 +321,7 @@ {"_id":"QW2GcMjunyXuGZXe","name":"Reckless Strikes","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, while you are raging, not wearing heavy armor, and not wielding a shield, when you hit a creature with an unarmed strike or improvised weapon, you can choose to forgo your rage damage to make the attack a reckless strike.

\n

Some of your reckless strikes require your target to make a saving throw to resist the reckless strike’s effects. The saving throw DC is calculated as follows:

\n
\n

Reckless Strike save DC = 8 + your proficiency bonus + your Strength modifier

\n
\n

BRACING STRIKE

\n

You gain temporary hit points equal to your rage damage bonus. If the target is grappled by you, you instead gain temporary hit points equal to twice your rage damage bonus.

\n

PUNISHING STRIKE

\n

Your target must make a Constitution saving throw. On a failed save, the creature is deafened until the start of its next turn. If the target is grappled by you, it is instead incapacitated until the start of its next turn.

\n

STAGGERING STRIKE

\n

Your target must make a Strength or Dexterity saving throw (the target chooses the ability score to use). On a failed save, your target is pushed back 5 feet. If the target is grappled by you, it instead knocked prone.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"Qdbzi0NO5FVsmFXd","name":"Ionized Weave","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 10th level, when you cast a damage-dealing force power that requires a force attack or saving throw, you can spend force points to cause that power to instead deal ion damage. The number of force points equals half the power’s level (round down, minimum of one). If the power would call for a saving throw other than Dexterity, it instead calls for a Dexterity saving throw.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"QiK8clUuVuTqq9YB","name":"On the Hunt","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 15th level, when you use your Predator’s Resolve feature, a number of friendly creatures you choose up to your Intelligence modifier that you can see within 30 feet of you also gain the benefits of the feature.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"name":"Build and Destroy","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Construction Engineering: 6th level

\n

You've learned how to manipulate the weak points in structures with your technology. Your tech powers and weapon attacks gain the siege property, and your portable structures have resistance to kinetic, energy, and ion damage dealt by weapons.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"QoAgL1uVhHkRhtNs"} {"_id":"QoSoggniLQlVPh3D","name":"Fighting Spirit","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 3rd level, your intensity in battle can shield you and help you strike true. As a bonus action on your turn, you can give yourself advantage on all weapon attack rolls until the end of the current turn. When you do so, you also gain 5 temporary hit points. The number of hit points increases when you reach certain levels in this class, increasing to 10 at 10th level and 15 at 15th level.

\n

You can use this feature three times. You regain all expended uses when you finish a long rest.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"bonus","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":"self"},"range":{"value":null,"long":null,"units":""},"uses":{"value":3,"max":3,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"heal","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["5","temphp"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"Qqp4sbAvV5R3xgO4","name":"Greater Extra Attack","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 11th level, you can attack three times, instead of once, whenever you take the Attack action on your turn.

\n

Additionally, when you use a bonus action to engage in Double- or Two-Weapon Fighting, you can make two attacks, instead of one.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"QwDExZ4sYBdx4d4o","name":"Scout Routines","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 3rd level, you’ve developed one routine, as detailed below. You develop an additional routine at 7th and 15th level.

\n
\n

SCOUT ROUTINES

\n

The routines are presented in alphabetical order. If multiple scouts grant the same routine, affected creatures can only benefit from it once. You must be conscious to grant the benefit of your routines.

\n

At 9th level, the range of your routines increases to 15 feet, and at 17th level, the range of these routines increases to 30 feet.

\n
\n
\n

ADAPTABILITY ROUTINE

\n

At the start of each of your turns, you can choose an ability score with a saving throw in which you are not proficient. Until the start of your next turn, you add half your proficiency bonus, rounded down, to saving throws you make with the chosen ability. Alternatively, you can choose to extend this benefit to friendly creatures within 5 feet of you, except for you.

\n
\n

MAVEN’S ROUTINE

\n

At the start of each of your turns, you can choose to gain resistance to damage from tech powers until the start of your next turn. Alternatively, you can choose to extend this benefit to friendly creatures within 5 feet of you, except for you.

\n
\n

MESMER’S ROUTINE

\n

At the start of each of your turns, you can choose to have advantage on saving throws against effects that would incapacitate you or put you to sleep until the start of your next turn. Alternatively, you can choose to extend this benefit to friendly creatures within 5 feet of you, except for you.

\n
\n

NOMAD’S ROUTINE

\n

At the start of each of your turns, you can choose to gain advantage on Constitution saving throws to avoid exhaustion from unenhanced sources, as well as being naturally adapted to both hot and cold climates. Alternatively, you can choose to extend this benefit to friendly creatures within 5 feet of you, except for you.

\n
\n

RESPONDER’S ROUTINE

\n

When you roll initiative, you can choose to add your proficiency bonus to the initiative roll and have advantage on attack rolls against creatures that have not yet acted. Alternatively, you can choose to allow each creature within 5 feet of you, including you, to add half your proficiency bonus to the initiative roll and have advantage on the first attack roll they make against a creature that has not yet acted.

\n
\n

SHARPSHOOTER’S ROUTINE

\n

At the start of each of your turns, you can choose to gain a bonus to the first weapon attack roll you make before the start of your next turn equal to your Intelligence modifier. Alternatively, you can choose to allow each creature within 5 feet of you, including you, to add half your Intelligence modifier to the first weapon attack roll they make before the start of your next turn.

\n
\n

STRIDER’S ROUTINE

\n

At the start of each of your turns, you can choose to have each slowed level only reduce your speed by 5 feet, unless it would reduce your speed to 0 until the start of your next turn. Alternatively, you can choose to extend this benefit to friendly creatures within 5 feet of you, except for you.

\n
\n

WARDEN’S ROUTINE

\n

At the start of each of your turns, you can choose to gain a climbing and swimming speed equal to your walking speed. Alternatively, you can choose to extend this benefit to friendly creatures within 5 feet of you, except for you.

\n
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -364,7 +367,7 @@ {"_id":"U07y3DHxu9EddHoC","name":"Cause and Effect","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 7th level, you learn to throw grenades as a bonus action. Additionally, when a creature fails a saving throw against a charge or grenade, you can expend a superiority die to apply one of your maneuvers. You can only use this feature once per grenade.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"U3ukuB66gtdm8C7V","name":"Devastating Critical","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 15th level, when you score a critical hit with a weapon attack, you gain a bonus to that weapon’s damage roll equal to your fighter level.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"UALQWbDzmp6H8Uiq","name":"Shadow's Wrath","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 18th level, your training has taught you advanced techniques while you maneuver in the shadows. While you are hidden from your target, the first attack roll you make each round does not automatically reveal your presence. Make a Dexterity (Stealth) check against your target’s Wisdom (Perception) check. On a success, you remain hidden. If you are also invisible, you remain invisible.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"_id":"UJVTP58YyoNqEbg6","name":"Bonus Proficiencies (Engineer: Armormech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in armormech’s implements, medium armor, and heavy armor. Additionally, when you engage in crafting with armormech’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"UJVTP58YyoNqEbg6","name":"Bonus Proficiencies (Engineer: Armormech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in armormech’s implements, medium armor, and heavy armor. Additionally, when you engage in crafting with armormech’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"UNoJQm1l6ho9QEHR","name":"Whirling Weapons","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 7th level, your constant blur of motion and attacks becomes an unending barrage as you build momentum. Once on your turn when you miss with a weapon attack you can make another weapon attack, no action required.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"UYWFpXz6HKecYIC2","name":"War Chant","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

By 14th level you have memorized the litanies, songs, and chants of your people and their dedication to war. When you enter a rage you can take a commanding stance. If you do so, for the duration of your rage you have a special reaction you can take on a number of allies’ turns equal to your Charisma modifier (minimum of one). You can only use this special reaction to use your Commanding Rage feature.

\n

Additionally, during this rage, when an enemy within 10 feet of you makes an attack roll against an ally, you can use your reaction to reduce that roll by an amount equal to your Charisma modifier.

\n

Once you’ve used this feature, you must complete a long rest before you can use it again.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"special","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"UeB3t6DmMaGzNijo","name":"Crimson Armaments","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning when you choose this order at 3rd level, you gain proficiency in light and medium armor. If you are already proficient in light and medium armor, you instead gain proficiency in heavy armor. Additionally, you can now gain the benefits of your Martial Arts and Unarmored Movement features while wearing armor as long as you are not wielding a shield.

\n

Additionally, you’ve learned to adapt to new weaponry. Over the course of an hour, which can be performed during a short rest, you can perform a kata with a weapon of your choice. You gain proficiency in that weapon if you do not already have proficiency, and it becomes a monk weapon for you. You can only adapt to one weapon at a time, and if you attempt to adapt to another weapon you immediately lose your proficiency with the chosen weapon.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -407,7 +410,7 @@ {"_id":"Xs7cWfBnM2YbgDro","name":"Powered Ambush","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 9th level, if you are hidden from a creature when you cast a power on it, the creature has disadvantage on any saving throw it makes against the power this turn.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"XunBynvxZH9qkNEs","name":"Extra Attack","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 5th level, you can attack twice, instead of once, whenever you take the Attack action on your turn.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"Y78JOUdUxUJXEfa5","name":"Borrowed Luck","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Once you’ve reached 17th level, you have gained the ability to unnaturally alter luck in your favor. Once per round, after an attack roll, saving throw, or ability check is rolled by you or a creature that you can see, you can replace the number on the d20 with a 7. Note the number on the d20 of the roll that you replaced. That number becomes your borrowed luck roll.

\n

While you have a borrowed luck roll, you can expend it and replace any ability check, attack roll, or saving throw made by you or a creature that you can see with the value of the borrowed luck roll. You can only have one borrowed luck roll at a time, and you lose any unused borrowed luck rolls when you complete a short or long rest.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"_id":"YFrVQpPzar30Wpgx","name":"Bonus Proficiencies (Engineer: Audiotech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in three musical instruments and audiotech’s implements. Additionally, when you engage in crafting with audiotech's implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"YFrVQpPzar30Wpgx","name":"Bonus Proficiencies (Engineer: Audiotech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in three musical instruments and audiotech’s implements. Additionally, when you engage in crafting with audiotech's implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"YHPUv9lN3nCapAgP","name":"Persistent Rage","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 15th level, your rage is so fierce that it ends early only if you fall unconscious or if you choose to end it.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"YND5s9bZK1Fp05dX","name":"Size Matters Not","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 10th level, you can manipulate creatures of Huge size or smaller with your force powers and Way of Telekinetics features.

\n

Additionally, when you use your action to cast a force power, you can use a bonus action to fly up to 10 feet without provoking opportunity attacks.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"YO47dPo3A0QCh006","name":"Stunning Strike","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 5th level, you can interfere with an opponent’s body. When you hit another creature with a melee weapon attack, you can spend 1 focus point to attempt a stunning strike. The target must succeed on a Constitution saving throw or be stunned until the end of your next turn.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"special","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"width":null,"units":"","type":"enemy"},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"con","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -421,7 +424,7 @@ {"_id":"ZAGjuz5DZXFXIRjn","name":"Concussive Blast","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 6th level, you add your Intelligence modifier (a minimum of +1) to any damage you deal with tech powers and class features that deal sonic damage.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"ZM7V1WpNbiY9XbzE","name":"Kinetic Ward","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, you can use your reaction to deflect a strike when you are dealt damage by a melee weapon attack. When you do so, the damage you take from the attack is reduced by 1d10 + your Dexterity modifier + your sentinel level. If you reduce the damage to 0, you can redirect it at another target if you have a weapon capable of doing so. You can spend 1 force point to make a melee weapon attack at a target within 5 feet of you with the weapon, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and if the attack hits it uses your Kinetic Combat die for its damage roll. If saber ward is active, you have advantage on the attack roll.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"reaction","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"ZU13gEZVPufJ7Csp","name":"Preserve Life","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 6th level, as an action, you can channel the Force and evoke healing energy that restores a number of hit points equal to five times your consular level. Choose any creatures within 30 feet of you, and divide those hit points among them. This feature can restore a creature to no more than half its hit point maximum. This feature has no effect on droids or constructs.

\n

You can use this feature a number of times equal to your Wisdom or Charisma modifier (your choice, a minimum of once). You regain all expended uses when you finish a long rest.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":"creature"},"range":{"value":30,"long":null,"units":"ft"},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"heal","attackBonus":0,"chatFlavor":"Restores a creature to no more than half its hit point maximum.","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"_id":"ZUYgGHpQpiGmxo3A","name":"Bonus Proficiencies (Engineer: Armstech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in armstech’s implements, medium armor, martial blasters, and martial vibroweapons. Additionally, when you engage in crafting with armstech’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"ZUYgGHpQpiGmxo3A","name":"Bonus Proficiencies (Engineer: Armstech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in armstech’s implements, medium armor, martial blasters, and martial vibroweapons. Additionally, when you engage in crafting with armstech’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"ZZIIY5ZE7nGrwWHV","name":"Geneticist's Resilience","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 9th level, your genetic alterations make you immune to poison and disease. Additionally, you have resistance to poison damage.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"ZbwvEeTXEPwoApqc","name":"Ammunition Upgrades","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 18th level, your ammunition enhancements improve.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"ZcaltXfSW00wZfRn","name":"Survey Master","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 17th level, when you use the Surveyed Area feature, the area affected is a 30-foot cube instead of a 15-foot cube.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -478,7 +481,7 @@ {"_id":"ejRFTWGKdTdtU1gH","name":"Remarkable Athlete","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, you can add half your proficiency bonus (rounded up) to any Strength, Dexterity, or Constitution check you make that doesn’t already use your proficiency bonus.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"f11Wex2VzoorFTfN","name":"Got Your Back","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 14th level, once per turn, when your companion is within 10 feet of you, and both you and your companion have to make a saving throw to resist the same effect, either you or your companion can choose to have disadvantage on the save. If either of you do so, the other of the two of you gains advantage on the save. You can use this feature before or after you both make the saving throw, but you must do so before the GM says whether the save succeeds or fails.

\n

At 17th level, your companion must be within 60 feet of you to benefit from this feature.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"f1XeMafaqejD02MW","name":"Tech Mastery","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 20th level, your mastery of technology is unrivaled. Your Constitution and Intelligence scores increase by 2. Your maximum for those scores increases by 2.

\n

Additionally, when you roll initiative and have no uses of Potent Aptitude left, you regain one use.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"name":"Elemental Master","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 11th and 17th level

\n

At 11th level, you gain one of the following features. You gain an additional option at 17th level.

\n

You can use these features a combined number of times equal to half your proficiency bonus, as shown in the monk table. You regain all expended uses when you complete a long rest.

\n

While you have no remaining uses of this feature, you can instead expend 3 focus points to use it. When you do so, your maximum focus points are reduced by 3 until you complete a long rest.

\n
\n
\n

Earth Reaches for Sky

\n

Prerequisite: Crushing Hand of the Mountain or Patient Bantha Listens

\n

As an action, you can choose a point you can see on the ground within 120 feet. A fountain of churned earth and stone erupts in a 20-foot cube centered on that point. Each creature in that area must make a Dexterity saving throw. A creature takes 3d12 kinetic damage on a failed save, or half as much damage on a successful one. Additionally, the ground in that area becomes difficult terrain until cleared. Each 5-foot-square portion of the area requires at least 1 minute to clear by hand.

\n
\n

Ride the Wind

\n

Prerequisite: Curtain of Unyielding Wind or Rush of the Shyrack

\n

As an action, you can gain a flying speed equal to your movement speed for 10 minutes. You can hover while this technique is active, but when it ends, you fall if you are still aloft, unless you can stop the fall.

\n
\n

River of Hungry Flame

\n

Prerequisite: Burning Ember Flourish or Hatchling's Flame

\n

As an action, you can create a wall of fire on a solid surface within 120 feet. You can make the wall up to 60 feet long, 20 feet high, and 1 foot thick, or a ringed wall up to 20 feet in diameter, 20 feet high, and 1 foot thick. The wall is opaque and lasts for 1 minute.

\n

When the wall appears, each creature within its area must make a Dexterity saving throw. On a failed save, a creature takes 5d8 fire damage, or half as much damage on a successful save.

\n

One side of the wall, chosen by you when you use this feature, deals 5d8 fire damage to each creature that ends its turn within 10 feet of that side of the wall. A creature takes the same damage when it enters the wall for the first time on a turn or ends its turn there. The other side of the wall deals no damage.

\n
\n

Shape the Flowing River

\n

Prerequisite: Shape the Raincloud or Swarming Ice Rabbit

\n
As an action, you can control any freestanding water within 300 feet of you inside an area you choose that is a cube up to 100 feet on a side. You can choose from any of the following effects when you use this feature. As an action on your turn, you can repeat the same effect or choose a different one.
\n
 
\n  Flood. You cause the water level of all standing water in the area to rise by as much as 20 feet. If the area includes a shore, the flooding water spills over onto dry land. If you choose an area in a large body of water, you instead create a 20-foot tall wave that travels from one side of the area to the other and then crashes down. Any Huge or smaller creatures in the wave's path are carried with it to the other side. Any Huge or smaller creatures struck by the wave have a 25 percent chance of being knocked prone. The water level remains elevated until the feature ends or you choose a different effect. If this effect produced a wave, the wave repeats on the start of your next turn while the flood effect lasts.\n
 
\n  Part Water. You cause water in the area to move apart and create a trench. The trench extends across the feature's area, and the separated water forms a wall to either side. The trench remains until the feature ends or you choose a different effect. The water then slowly fills in the trench over the course of the next round until the normal water level is restored.\n
 
\n  Redirect Flow. You cause flowing water in the area to move in a direction you choose, even if the water has to flow over obstacles, up walls, or in other unlikely directions. The water in the area moves as you direct it, but once it moves beyond the feature's area, it resumes its flow based on the terrain conditions. The water continues co move in the direction you chose until the feature ends or you choose a different effect.\n
 
\n  Whirlpool. This effect requires a body of water at least 50 feet square and 25 feet deep. You cause a whirlpool to form in the center of the area. The whirlpool forms a vortex that is 5 feet wide at the base, up to 50 feet wide at the top, and 25 feet tall. Any creature or object in the water and within 25 feet of the vortex is pulled 10 feet toward it. A creature can swim away from the vortex by making a Strength (Athletics) check against your feature save DC. When a creature enters the vortex for the first time on a turn or starts its turn there, it must make a Strength saving throw. On a failed save, the creature takes 2d8 kinetic damage and is caught in the vortex until the feature ends. On a successful save, the creature takes half damage, and isn't caught in the vortex. A creature caught in the vortex can use its action to try to swim away from the vortex as described above, but has disadvantage on the Strength (Athletics) check to do so. The first time each turn that an object enters the vortex, the object takes 2d8 kinetic damage; this damage occurs each round it remains in the vortex.
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"f34HJgbp7fw5ryET"} +{"_id":"f34HJgbp7fw5ryET","name":"Elemental Master","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 11th and 17th level

\n

At 11th level, you gain one of the following features. You gain an additional option at 17th level.

\n

You can use these features a combined number of times equal to half your proficiency bonus, as shown in the monk table. You regain all expended uses when you complete a long rest.

\n

While you have no remaining uses of this feature, you can instead expend 3 focus points to use it. When you do so, your maximum focus points are reduced by 3 until you complete a long rest.

\n
\n
\n

Earth Reaches for Sky

\n

Prerequisite: Crushing Hand of the Mountain or Patient Bantha Listens

\n

As an action, you can choose a point you can see on the ground within 120 feet. A fountain of churned earth and stone erupts in a 20-foot cube centered on that point. Each creature in that area must make a Dexterity saving throw. A creature takes 3d12 kinetic damage on a failed save, or half as much damage on a successful one. Additionally, the ground in that area becomes difficult terrain until cleared. Each 5-foot-square portion of the area requires at least 1 minute to clear by hand.

\n
\n

Ride the Wind

\n

Prerequisite: Curtain of Unyielding Wind or Rush of the Shyrack

\n

As an action, you can gain a flying speed equal to your movement speed for 10 minutes. You can hover while this technique is active, but when it ends, you fall if you are still aloft, unless you can stop the fall.

\n
\n

River of Hungry Flame

\n

Prerequisite: Burning Ember Flourish or Hatchling's Flame

\n

As an action, you can create a wall of fire on a solid surface within 120 feet. You can make the wall up to 60 feet long, 20 feet high, and 1 foot thick, or a ringed wall up to 20 feet in diameter, 20 feet high, and 1 foot thick. The wall is opaque and lasts for 1 minute.

\n

When the wall appears, each creature within its area must make a Dexterity saving throw. On a failed save, a creature takes 5d8 fire damage, or half as much damage on a successful save.

\n

One side of the wall, chosen by you when you use this feature, deals 5d8 fire damage to each creature that ends its turn within 10 feet of that side of the wall. A creature takes the same damage when it enters the wall for the first time on a turn or ends its turn there. The other side of the wall deals no damage.

\n
\n

Shape the Flowing River

\n

Prerequisite: Shape the Raincloud or Swarming Ice Rabbit

\n
As an action, you can control any freestanding water within 300 feet of you inside an area you choose that is a cube up to 100 feet on a side. You can choose from any of the following effects when you use this feature. As an action on your turn, you can repeat the same effect or choose a different one.
\n
 
\n  Flood. You cause the water level of all standing water in the area to rise by as much as 20 feet. If the area includes a shore, the flooding water spills over onto dry land. If you choose an area in a large body of water, you instead create a 20-foot tall wave that travels from one side of the area to the other and then crashes down. Any Huge or smaller creatures in the wave's path are carried with it to the other side. Any Huge or smaller creatures struck by the wave have a 25 percent chance of being knocked prone. The water level remains elevated until the feature ends or you choose a different effect. If this effect produced a wave, the wave repeats on the start of your next turn while the flood effect lasts.\n
 
\n  Part Water. You cause water in the area to move apart and create a trench. The trench extends across the feature's area, and the separated water forms a wall to either side. The trench remains until the feature ends or you choose a different effect. The water then slowly fills in the trench over the course of the next round until the normal water level is restored.\n
 
\n  Redirect Flow. You cause flowing water in the area to move in a direction you choose, even if the water has to flow over obstacles, up walls, or in other unlikely directions. The water in the area moves as you direct it, but once it moves beyond the feature's area, it resumes its flow based on the terrain conditions. The water continues co move in the direction you chose until the feature ends or you choose a different effect.\n
 
\n  Whirlpool. This effect requires a body of water at least 50 feet square and 25 feet deep. You cause a whirlpool to form in the center of the area. The whirlpool forms a vortex that is 5 feet wide at the base, up to 50 feet wide at the top, and 25 feet tall. Any creature or object in the water and within 25 feet of the vortex is pulled 10 feet toward it. A creature can swim away from the vortex by making a Strength (Athletics) check against your feature save DC. When a creature enters the vortex for the first time on a turn or starts its turn there, it must make a Strength saving throw. On a failed save, the creature takes 2d8 kinetic damage and is caught in the vortex until the feature ends. On a successful save, the creature takes half damage, and isn't caught in the vortex. A creature caught in the vortex can use its action to try to swim away from the vortex as described above, but has disadvantage on the Strength (Athletics) check to do so. The first time each turn that an object enters the vortex, the object takes 2d8 kinetic damage; this damage occurs each round it remains in the vortex.
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"f9JvCohVnIKR3kXb","name":"My Little Friend Says Hello There","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, you know how to use the sheer size of your weapon to strike fear in those around you. You can add your Strength modifier to any Charisma (Intimidation) check you make while wielding a weapon with the heavy or strength properties that doesn’t already include that modifier.

\n

 

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":"Fighter: Heavy 3"},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"fDrprD1zPyK36J4Q","name":"Supernatural Defense","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 7th level, whenever the target of your Ranger’s Quarry forces you to make a saving throw, or whenever you make an ability check to escape that targets grapple, you can use your reaction and roll your Ranger’s Quarry Damage Die, adding it to the roll.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"reaction","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"fFKNqUAWh0ZOhvRc","name":"Indomitable Might","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 18th level, if your total for a Strength check is less than your Strength score, you can use that score in place of the total.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -499,6 +502,7 @@ {"_id":"gm0iK2pPXSGQbJx4","name":"Focused Augmentation","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 18th level, you add your Intelligence modifier to Constitution saving throws you make to maintain concentration.

\n

Additionally, when you cast a power that requires concentration and would affect only one target, you can target an additional creature with that power.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"gnRErzmAIMcmICTM","name":"Ever-Ready Shot","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 15th level, your enhanced ammunition is available whenever battle starts. If you roll initiative and have no uses of Special Ammunition remaining, you regain one use of it.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"go2e9gqD5AnLGKMK","name":"Armormech's Celerity","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 14th level, when you take the Attack action or use your action to a cast a tech power of 1st-level or higher, you can make one weapon attack as a bonus action.

\n

You can use this feature a number of times equal to your Intelligence modifier (a minimum of once). You regain all expended uses when you complete a long rest.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"bonus","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"name":"Structural Knowledge","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Construction Engineering: 14th level

\n

You can spend 1 hour inspecting and looking over a structure you can see from every angle available to you and comparing it to data you have on hand. At the end of the hour, you learn the basic blueprints for the structure, including but not limited to:

\n
    \n
  • The structure's total hit points.
  • \n
  • Any common materials that make up the structures.
  • \n
  • Whether or not the structure is in use or abandoned.
  • \n
  • The total floor count for the structure, as well as the general purpose of each floor if it was created to suit a specific purpose.
  • \n
  • All non secret entrances (including doors, windows, vents, pipe systems) and where you could find them.
  • \n
  • A basic map layout of every floor and ventilation system for the building.
  • \n
  • The history of the building such as what company or species could have constructed it, as well as how long it's been built
  • \n
  • Any structural weak points it might have.
  • \n
\n

Additionally, when you make an Investigation while searching this structure for hidden structural elements, such as doors or passages, if you have constructor's implements, you can treat a d20 roll of 9 or lower as a 10.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"grC8MlSimBop7zdo"} {"_id":"gsw3asysi2xekW3l","name":"Mark of the Meticulous","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, you can use Intelligence instead of Dexterity for the attack and damage rolls made with weapons with the finesse property or blaster weapons against the target of your Ranger’s Quarry.

\n

Additionally, once per round, when you hit the target of your Ranger’s Quarry with a tech attack, or it fails a saving throw against a tech power you cast that deals damage, you can deal additional damage equal to your Ranger’s Quarry damage die of the same type as the tech power’s damage.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"h1uDhP1tEOuvjRw6","name":"Dewback's Instinct","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"classfeature","data":{"description":{"value":"

Choose three damage types. While raging, you have resistance to the chosen damage types.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"h4qwVuxZNtdOiH75","name":"Channel the Force (Ataru)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Lastly at 3rd level, you gain the following Channel the Force option.

\n
\n

RETREATING LEAP

\n

When a creature makes a melee attack roll against you, you can expend a use of your Channel the Force and your reaction to jump 10 feet in a direction of your choice, imposing disadvantage on the roll. This movement does not provoke opportunity attacks. You can wait until after the attack roll is made, but before the DM determines whether the attack hits.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -570,6 +574,7 @@ {"_id":"mUQpy94CIAOkbxC1","name":"Survivor","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 18th level, you attain the pinnacle of resilience in battle. At the start of each of your turns, you regain hit points equal to 5 + your Constitution modifier if you have no more than half your hit points left. You don’t gain this benefit if you have 0 hit points.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"special","cost":0,"condition":"Start of your turn, HP is greater than 0 and half or less MaxHP"},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":"self"},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"con","actionType":"heal","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["5+@mod","healing"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"mY6mOTYRUXAGEfaE","name":"Fling People","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 10th level, you learn to throw creatures as easily as you throw your weapons. When you successfully grapple a creature, you may immediately throw the creature:

\n

THROW FRIEND

\n

If the creature is a willing ally and volunteers to be grappled, you throw the target into any unoccupied space within 60 feet. That creature may immediately use its reaction to make one melee weapon attack, adding your Strength modifier to the attack’s damage roll.

\n

THROW FOE

\n

If the creature is an opponent, you throw the target into any unoccupied space within 30 feet, where it takes damage equal to your Strength modifier and falls prone.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"mYAWcD7bouvWCW5d","name":"Interconnectedness","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 14th level, when you cast a 5th level or lower force power that deals damage or restores hit points and targets only one creature, the power can instead target two creatures within range and within 5 feet of each other.

\n

You can use this feature a number of times equal to your Wisdom or Charisma modifier (your choice, a minimum of once). You regain all expended uses when you finish a long rest.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"name":"Bonus Proficiencies (Engineer: Construction)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Construction Engineering: 3rd level

\n

You gain proficiency in constructor's implements. Additionally, when you engage in crafting with constructor's implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"mh7B0PHjzOdizb1B"} {"_id":"mwFCS2UnVVoYdhzx","name":"Hunter's Prey","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this technique at 3rd level, you gain one of the following features of your choice.

\n
\n
\n

COLOSSUS SLAYER

\n

Your tenacity can wear down the most potent foes. When you hit a creature with a weapon attack, the creature takes an extra 1d8 damage if it’s below its hit point maximum. You can deal this extra damage only once per turn, and this damage is the same type as the weapon’s damage.

\n
\n

GIANT KILLER

\n

When a Large or larger creature within 5 feet of you hits or misses you with an attack, you can use your reaction to attack that creature immediately after its attack, provided that you can see the creature.

\n
\n

HORDE BREAKER

\n

Once on each of your turns when you make a weapon attack, you can make another attack with the same weapon against a different creature that is within 5 feet of the original target and within range of your weapon, no action required.

\n
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"n1nSwzit7F7yg7dh","name":"Potent Techcasting","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Lastly at 3rd level, when you miss with a tech attack roll, or a creature succeeds on a saving throw against a tech power you cast, you can expend one use of your Potent Aptitude to overwhelm them. Roll the die, and either add it to the attack roll or subtract it from their saving throw.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"n2T7oiP0MfoQ0Sds","name":"Bonus Proficiencies (Consular: Tutelage)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

You gain proficiency in your choice of Intimidation or Persuasion.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -645,12 +650,13 @@ {"_id":"s7L1KzijyPgWkRng","name":"Mark of the Predator","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, if the target of your Ranger’s Quarry feature can see you, a number of friendly creatures you choose up to your Intelligence modifier have advantage on Dexterity (Stealth) checks made to hide from it.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"s9N0SbnOiNitLT5W","name":"Clarity of Vision","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 18th level, the visions in your dreams intensify and paint a more accurate picture in your mind of what is to come. You roll three d20s for your Force Visions feature, rather than two.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sB7WR4Mow93lkPYh","name":"Surveyed Area","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 3rd level, you can now use your Critical Analysis feature on a 15-foot cube area within 60 feet of you that you can see. You can treat any creatures inside this cube as if they are the target of your Critical Analysis feature, and when a creature ends your Critical Analysis feature on themself, it does not end this effect for other creatures in your Surveyed Area.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"_id":"sDqQ6apF5bfbS6GS","name":"Bonus Proficiencies (Engineer: Astrotech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in astrotech’s implements. Additionally, when you engage in crafting with astrotech’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"sDqQ6apF5bfbS6GS","name":"Bonus Proficiencies (Engineer: Astrotech)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you choose this discipline at 3rd level, you gain proficiency in astrotech’s implements. Additionally, when you engage in crafting with astrotech’s implements, the rate at which you craft doubles.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sMap3pJ2eaRKjLhs","name":"Dervish","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 7th level, when you score a critical hit with a melee weapon attack, you regain a use of your Adaptive Fighting, to a maximum of your Strength or Dexterity modifier (your choice, minimum of one).

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sQ9c8Bnuj93ozEPr","name":"Force Shield","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 2nd level, you learn how to defend yourself purely through your strength with the Force. When you are hit by an attack, you can use your reaction to shroud yourself in Force energy. Until the start of your next turn, you have a bonus to AC equal to your Wisdom or Charisma modifier (your choice, a minimum of +1). This includes the triggering attack.

\n

You can use this feature twice. You gain an additional use at 5th, 11th, and 17th level in this class. You regain all expended uses when you finish a long rest.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"reaction","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":"self"},"range":{"value":null,"long":null,"units":""},"uses":{"value":2,"max":2,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sTy1MsBoX23ucs5S","name":"Discoveries (Slicer)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

When you select this pursuit, you gain access to new discoveries which reflect your understanding of tech casting. Whenever you learn a new discovery, you can choose from any of the following as well. The discoveries are listed in alphabetical order.

\n
\n
\n

ADMINISTRATOR’S LOG

\n

If you spend at least 10 minutes working on a computer or terminal, you can get a full list of users who have accessed the machine within the past 24 hours. Over the course of a long rest, you may then form a facsimile of identification that would allow you to pass yourself off as that person when accessing machines.

\n
\n

BACKDOOR EGRESS

\n

When you cast a tech power that affects an area and requires a saving throw, and you are inside that power’s area, you can use your reaction to move up to half your speed without provoking opportunity attacks. If you end this movement outside the area affected by the tech power, you do not have to make a saving throw to avoid its effects.

\n
\n

INTELLIGENCE CORE OVERRIDE

\n

Prerequisite: 9th level
You can cast the override interface tech power at 5th level without spending tech points.

\n

Once you’ve used this feature, you must complete a long rest before you can use it again.

\n
\n

RESOURCE APPROPRIATION

\n

Prerequisite: 11th level
If you reduce the target of your Critical Analysis feature to 0 hit points, and it has tech point remaining, you may choose to gain any tech points it had remaining. Your current tech points cannot exceed your tech point maximum.

\n

Once you’ve used this feature, you must complete a short or long rest before you can use it again.

\n
\n

SKILLFUL CASTING

\n

When you hit a creature with an at-will tech power that requires an attack roll, you may treat that attack roll as a weapon attack for the purpose of using maneuvers.

\n
\n

SLEEPER PROGRAM

\n

Whenever you cast a tech power with a casting time of 1 action, you can choose to delay the power’s activation up to a minute. When you do so, you cast the power as normal, but holds its energy for the duration of the delay. Holding onto the power’s effect requires concentration. If your concentration is broken before the delay ends, the power dissipates without taking effect. You can use your reaction to activate the power at any time.

\n

You can use this feature a number of times equal to your Intelligence modifier (a minimum of once). You regain all expended uses when you finish a long rest.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sUs6idlxKXYU4ba6","name":"Force Deflection","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 3rd level, when you fail a saving throw, you can use your reaction to gain a +4 bonus to that saving throw.

\n

You can use this feature a number of times equal to your Wisdom or Charisma modifier (your choice, a minimum of once). You regain all expended uses when you finish a short or long rest.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"reaction","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"sr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sZbz4ionDvaecDde","name":"Redirect Error","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 9th level, when the target of your Critical Analysis feature casts a tech power that affects an area, you can use your reaction to cause that power to instead affect an area in a 10-foot-radius sphere centered on the caster.

\n

Once you’ve used this feature, you must complete a long rest before you can use it again.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"reaction","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"name":"Portable Structure","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Construction Engineering: 3rd, 11th, and 17th level

\n

You have constructed a set of malleable, portable fortifications that can you and your allies. Over the course of a long rest, you create a portable structure that travels with you.

\n

Your portable structure can only be directed by you, and you must have a tech focus in order to direct it remotely. If you lack a tech focus, you can instead direct it while it is within 5 feet of you. Your portable structure has the following features:

\n
    \n
  • Its AC equals your tech save DC.
  • \n
  • It has a number of hit points equal to 5 x your engineer level. If your structure is reduced to 0 hit points, it collapses and can't be use again until you spend 1 hour repairing it. which can be done during a short or long rest.
  • \n
  • You can restore missing hit points to your structure by casting the mending tech power on it. or by completing a short or long rest. Casting the mending tech power restores a number of missing hit points equal to your Intelligence modifier (minimum of one), but it can't be repaired to more than half its hit point maximum in this way. Completing a short rest restores your structure to half its hit point maximum, and completing a long rest restores it to its hit point maximum.
  • \n
  • Your structure has two modes: dismantled and deployed. While dismantled, your structure's speed equals your own, it hovers 5 feet off the ground, it up the space a 5 foot cube, and it weighs 500 lbs. This increases to a 10 foot cube and 1,000 lbs. at 11 th level, and a 15 foot cube and 2,000 lbs. at 17th level as you upgrade it. While deployed, your structure's speed is 0 and it takes up space dictated by how its deployed.
  • \n
\n

As an action, you can remotely deploy your structure at a space you can see on the ground within 30 feet of you, provided there is sufficient space to support it. This range increases to 60 feet at 11 th level and 120 feet at 17th level. Automatic dismantling of your structure takes 1 minute, and can be initiated on your turn (no action required).

\n

You can deploy your choice from these structures a combined total of four times, and you gain more uses at higher levels, as shown in the Modification Slots column of the engineer table. Each time you use this feature in excess of your proficiency bonus, your tech point maximum is reduced by 1 until you complete a long rest. You regain all expended uses when you complete a long rest.

\n
\n

Bridge

\n

You deploy a bridge up to 30 feet long, 10 feet wide, and 3 feet thick. The bridge starts from the point at which you deploy it, and extends in a direction of your choice. When you dismantle your bridge, it retracts to the point at which you initially deployed it. Both ends of the bridge must be supported in some function; one end cannot be suspended in the air or on unstable terrain. The bridge can hold up to 1,000 lbs., any weight above which causes the bridge to instantly drop to 0 hit points, destroying it. If a creature is on the bridge when it is destroyed or dismantled, it must make a Dexterity saving throw against your tech save DC. On a successful saving throw, it reaches the closest part of the bridge that has stable support, or it maintains a grip on your bridge as it retracts, as appropriate. On a failed save, it falls.

\n

When you reach 11th level, the bridge can now extend up to 45 feet long, 15 feet wide, and it can support up to 2,000 lbs. When you reach 17th level, the bridge can now extend up to 60 feet long, 20 feet wide, and it can support up to 4,000 lbs.

\n
\n

Cage

\n

You create a cage that surrounds a cube up to 10 feet on each side centered on the target location. The cube is surrounded on all sides except the ground by 2-foot-thick walls. The walls and roof are completely opaque, and you choose whether the structure has a light source when you deploy it that provides bright light within the cube. Otherwise, the space within the cube is in complete darkness. The cage is permeable, as air, water, and sound passes through it You can attempt to trap unwilling Medium or smaller creatures inside the cage. When you deploy this structure in an unwilling creature's space, it must make a Dexterity saving throw against your tech save DC. On a successful save, it can immediately move to nearest unoccupied space outside the sage. Otherwise, it is trapped within the structure when it is deployed.

\n

When you reach 11th level, the cage can extend up to 15 feet on each side, and it can trap creatures of Large size or smaller. When you reach 17th level, the cage can extend up to 20 feet on each side, and it can trap creatures of Huge size or smaller.

\n
\n

Shelter

\n

You erect a shelter up to 15 feet long, 10 feet wide, 10 feet tall, with one-foot-thick walls, a roof, and a floor. It has a single door along its walls in a location of your choice. The building has temperature control and lighting systems, and can withstand harsh winds, heavy rain and snow. Any creature inside the shelter is protected from hazardous environmental effects outside the shelter such as extreme heat or cold. The structure does not provide additional breathing air for anyone inside if the environment it is placed in is not breathable. The house can comfortably support up to 5 Medium creatures. For each Medium creature, it can instead support 2 Small creatures. For each Small creature, it can instead support 2 Tiny creatures.

\n

When you reach 11 th level, the house can extend up to 30 feet long, 15 feet wide, 15 feet tall, and it can now comfortable support up to 10 Medium creatures. For each Medium creature, it can instead support 2 Small creatures. For each Small creature, it can instead support 2 Tiny creatures. Additionally, when a creature completes a long rest while within your shelter, they regain all spent Hit Dice, instead of only half. When you reach 17th level, the house can extend up to 45 feet long 20 feet wide, 20 feet tall, and it can now comfortable support up to 10 Large creatures. For each Large creature, it can instead support 2 Medium creatures. For each Medium creature, it can instead support 2 Small creatures. For each Small creature, it can instead support 2 Tiny creatures. Additionally, when a creature completes a long rest while within your shelter, their exhaustion level is reduced by 2, instead of only 1.

\n
\n

Tower

\n

You erect a tower from a 5-foot square platform centered on the target location that rises up to 30 feet. If the tower is created under a creature, that creature must succeed on a Dexterity saving throw or be lifted by the tower. A creature can choose to fail the save. The tower comes equipped with a ladder that reaches from the ground to the platform.

\n

When you reach 11 th level, the tower's platform can extend 5 feet by 10 feet and rise up to 40 feet When you reach 17th level, the tower's platform can cover a 10-foot square, and rise up to 50 feet. Additionally, any creature on the tower's platform has advantage on Wisdom (Perception) checks that rely on sight.

\n
\n

Wall

\n

You deploy a wall up to 30 feet long 10 feet high, and 3 feet thick, or a ringed wall up to 10 feet in diameter, 10 feet high, and 3 feet thick. The wall features ramparts deep enough to support creatures of Medium size or smaller, and provides one-quarter cover to any creature on its ramparts. The wall includes a ladder on the side of your choice. You choose whether the wall contains any openings otherwise. Any openings chosen in this way can be seen through on both sides. The wall can be climbed, but requires a Strength (Athletics) check against your tech save DC for any creature without a climbing speed. A creature can only make this check once per turn.

\n

When you reach 11 th level, the wall can deploy up to 45 feet long and 15 feet high, or a ringed wall up to 15 feet in diameter and 15 feet high. Additionally, the wall now provides half cover to any creature on its ramparts. When you reach 17th level, the wall can deploy up to 60 feet long and 20 feet high, or a ringed wall up to 20 feet in diameter and 20 feet high. Additionally, the wall now provides three-quarters cover to any creature on its ramparts.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"sbC804GyKAWJhQ12"} {"_id":"sbYfAu9t8TUNR5hp","name":"Overwhelming Cleave","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 10th level, when you successfully push a creature into a surface or another creature while raging, the pushed creature takes kinetic damage equal to your Rage Damage. Additionally, the first time you hit with a melee weapon attack using Strength each turn, you can attempt to damage another creature with the same attack. Choose another creature within 5 feet of the original target and within your reach. If the original attack roll would hit the second creature, it takes damage equal to your Strength modifier. The damage is of the same type dealt by the original attack.

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sfEr8ZBFVddlfLeF","name":"Varactyl's Instinct","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"classfeature","data":{"description":{"value":"

Prerequisite: 13th level
While raging, you have advantage Dexterity checks, your attack rolls can't suffer from disadvantage, and each slowed level only reduces your speed by 5 feet, unless it would reduce your speed to 0.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"sgJdISZMtwv08WPJ","name":"Katarn's Instinct","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"classfeature","data":{"description":{"value":"

You gain a climbing speed equal to your movement speed.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -724,7 +730,7 @@ {"_id":"zEnd8MGQwyOOZ0dI","name":"Maximum Output","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Beginning at 7th level, when you take the Attack action while wielding a weapon with the heavy or strength properties, you can forgo one or more attacks. If you do so, the first time you deal damage with the weapon before the start of your next turn, you deal additional damage of the same type as the weapon’s damage. If this instance would deal damage to multiple creatures, you can only apply this additional damage to one of them. For each attack you forgo, you deal additional damage equal to 1d12 + half your fighter level (rounded down). If you miss with the first attack roll you make before the end of your next turn, or one target succeeds on the saving throw against your weapon’s burst or rapid property, you instead deal normal weapon damage.

\n

 

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","requirements":"Fighter: Heavy 7"},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"zJffmk1ndwbjk0GH","name":"Additional Maneuvers (Scholar: Tactician)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Lastly at 3rd level, you gain access to new maneuvers which reflect your mastery in the field of combat. Whenever you learn a new maneuver, you can choose from any of the following as well. The maneuvers are listed in alphabetical order.

\n
\n
\n

BOLSTER

\n

On your turn, you can use a bonus action and expend one superiority die to bolster the resolve of one of your companions. When you do so, choose a friendly creature who can see or hear you. That creature gains temporary hit points equal to the superiority die roll + your Intelligence modifier.

\n
\n

COMMANDER’S STRIKE

\n

When you take the Attack action on your turn, you can forgo one of your attacks and use a bonus action to direct one of your companions to strike. When you do so, choose a friendly creature within 60 feet who can see or hear you and expend one superiority die. That creature can immediately use its reaction to make one weapon attack, adding your superiority die to the attack’s damage roll.

\n
\n

DISARMING ATTACK

\n

When you hit a creature with a weapon attack, you can expend one superiority die to attempt to disarm the target, forcing it to drop one item of your choice that it’s holding. You add the superiority die to the attack’s damage roll, and the target must make a Strength saving throw. On a failed save, it drops the object you choose. The object lands at its feet.

\n
\n

DISTRACTING STRIKE

\n

When you hit a creature with a weapon attack, you can expend one superiority die to distract the creature, giving your allies an opening. You add the superiority die to the attack’s damage roll. The next attack roll against the target by an attacker other than you has advantage if the attack is made before the start of your next turn.

\n
\n

MANEUVERING ATTACK

\n

When you hit a creature with a weapon attack, you can expend one superiority die to maneuver one of your allies into a more advantageous position. You add the superiority die to the attack’s damage roll, and you choose a friendly creature who can see or hear you.

\n

That creature can use its reaction to move up to half its speed without provoking opportunity attacks from the target of your attack.

\n
\n

PUSHING ATTACK

\n

When you hit a creature with a weapon attack, you can expend one superiority die to attempt to drive the target back. You add the superiority die to the attack’s damage roll, and if the target is Large or smaller, it must make a Strength saving throw. On a failed save, you push the target up to 15 feet away from you.

\n
\n

RIPOSTE

\n

When a creature misses you with a melee attack, you can use your reaction and expend one superiority die to make a melee weapon attack against the creature. If you hit, you add the superiority die to the attack’s damage roll.

\n
\n

SCHOLAR’S PARRY

\n

When a creature damages you with a weapon attack, you can use your reaction and expend one superiority die to reduce the damage by the number you roll on your superiority die + your Intelligence modifier.

\n
\n

TARGETED ATTACK

\n

When you make a weapon attack roll, you can expend one superiority die to add it to the roll. You can use this maneuver before or after making the attack roll, but before any effects of the attack are applied.

\n
\n

TRIP ATTACK

\n

When you hit a creature with a weapon attack, you can expend one superiority die to attempt to knock the target down. You add the superiority die to the attack’s damage roll, and if the target is Large or smaller, it must make a Strength saving throw. On a failed save, you knock the target prone.

\n
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"zNvb5e1XZ8ItSe75","name":"Bonus Proficiencies (Scout: Bulwark)","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

You gain proficiency in heavy armor.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} -{"name":"Elemental Attunement","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 3rd, 11th, and 17th level

\n

You gain the ability to bend the elements to your will. As an action, you can manipulate these forces to create one of the following effects of your choice at a space within 10 feet of you:

\n
    \n
  • Create a harmless, instantaneous sensory effect related to air, earth, fire, or water, such as a shower of sparks, a puff of wind, a spray of light mist, or a gentle rumbling of stone.
  • \n
  • Instantaneously light or snuff out a candle, a torch, or a small campfire.
  • \n
  • Chill or warm up to 1 pound of nonliving material for up to 1 hour.
  • \n
  • Cause earth, fire, water, or mist that can fit within a 1 foot cube to shape itself into a crude form you designate for 1 minute.
  • \n
\n

This range increases to 30 feet at 11th level and 60 feet at 17th level.

\n

Additionally, as a bonus action on your turn, you can spend 1 focus point to conjure a weapon made of one of the four elements—air, earth, fire, or water—which lasts for 1 minute. Your weapon takes an appearance of your choice, it can only be used by you, and you can't be disarmed of it while you are conscious. You are proficient in this weapon, which counts as a monk weapon for you and uses your Martial Arts die for its damage rolls. You can only have one of these weapons at a time, and if you summon a new one the old one immediately disappears.

\n
\n
\n

Air

\n

Your whistling weapon has the thrown property with a range of 20/60 and deals sonic damage on a hit. Additionally, when you hit a creature with the weapon, it is deafened until the end of its next turn.

\n
\n

Earth

\n

Your earthen weapon takes the form of stone and deals kinetic damage on a hit. Additionally, when you hit a creature with it, you can force the target to make a Strength saving throw. On a failed save, the target is pushed back 5 feet. Lastly, while active, you can use Strength instead of Dexterity when determining your AC, as long as it doesn't already include that modifier.

\n
\n

Fire

\n

Your flaming weapon sheds bright light in a 10-foot radius and dim light for an additional 10 feet, deals fire damage, and when you hit a creature with it, the creature takes additional damage equal to half your Wisdom or Charisma modifier (your choice, rounded up, minimum of one).

\n
\n

Water

\n

Your watery weapon has the reach property, deals cold damage on a hit, and you can use your Wisdom or Charisma modifier (your choice) instead of Dexterity or Strength for its attack and damage rolls. You must use the same modifier for both rolls. Additionally, when you would make a melee weapon attack, you can instead use your weapon to wet a 5-foot square within your weapon's reach. The affected area is difficult terrain. Each creature who starts its turn in the square or enters it for the first time must make a Dexterity saving throw, falling prone on a failed save.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"action","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"zRddQYFsypuRfneH"} +{"_id":"zRddQYFsypuRfneH","name":"Elemental Attunement","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Monk: Kro Var Order: 3rd, 11th, and 17th level

\n

You gain the ability to bend the elements to your will. As an action, you can manipulate these forces to create one of the following effects of your choice at a space within 10 feet of you:

\n
    \n
  • Create a harmless, instantaneous sensory effect related to air, earth, fire, or water, such as a shower of sparks, a puff of wind, a spray of light mist, or a gentle rumbling of stone.
  • \n
  • Instantaneously light or snuff out a candle, a torch, or a small campfire.
  • \n
  • Chill or warm up to 1 pound of nonliving material for up to 1 hour.
  • \n
  • Cause earth, fire, water, or mist that can fit within a 1 foot cube to shape itself into a crude form you designate for 1 minute.
  • \n
\n

This range increases to 30 feet at 11th level and 60 feet at 17th level.

\n

Additionally, as a bonus action on your turn, you can spend 1 focus point to conjure a weapon made of one of the four elements—air, earth, fire, or water—which lasts for 1 minute. Your weapon takes an appearance of your choice, it can only be used by you, and you can't be disarmed of it while you are conscious. You are proficient in this weapon, which counts as a monk weapon for you and uses your Martial Arts die for its damage rolls. You can only have one of these weapons at a time, and if you summon a new one the old one immediately disappears.

\n
\n
\n

Air

\n

Your whistling weapon has the thrown property with a range of 20/60 and deals sonic damage on a hit. Additionally, when you hit a creature with the weapon, it is deafened until the end of its next turn.

\n
\n

Earth

\n

Your earthen weapon takes the form of stone and deals kinetic damage on a hit. Additionally, when you hit a creature with it, you can force the target to make a Strength saving throw. On a failed save, the target is pushed back 5 feet. Lastly, while active, you can use Strength instead of Dexterity when determining your AC, as long as it doesn't already include that modifier.

\n
\n

Fire

\n

Your flaming weapon sheds bright light in a 10-foot radius and dim light for an additional 10 feet, deals fire damage, and when you hit a creature with it, the creature takes additional damage equal to half your Wisdom or Charisma modifier (your choice, rounded up, minimum of one).

\n
\n

Water

\n

Your watery weapon has the reach property, deals cold damage on a hit, and you can use your Wisdom or Charisma modifier (your choice) instead of Dexterity or Strength for its attack and damage rolls. You must use the same modifier for both rolls. Additionally, when you would make a melee weapon attack, you can instead use your weapon to wet a 5-foot square within your weapon's reach. The affected area is difficult terrain. Each creature who starts its turn in the square or enters it for the first time must make a Dexterity saving throw, falling prone on a failed save.

\n
","chat":"","unidentified":""},"source":"EC","activation":{"type":"action","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false},"requirements":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"zZz07JN0gA6nsAPa","name":"Focused Rage","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Also at 3rd level, you hone your rage to a razor sharp focus. While raging, when you make a melee weapon attack using Dexterity, you add your rage damage to the damage roll. Additionally, you can use your Reckless Attack feature to give you advantage on melee weapon attacks using Dexterity during your turn.

","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"zb4QnZTseq74tpHT","name":"Protector","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting when you choose this calling at 3rd level, you learn the saber ward force power, which does not count against your total powers known. Additionally, you can use your Deflection and Slow Time Force-Empowered Self options when you cast it as your action. Finally, when you cast it, you can spend 2 force points to extend the benefits to creatures of your choice within 5 feet of you while the power is active. The creatures immediately lose this benefit if they move more than 5 feet away from you.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"zbCDtd1DzA3bhJwV","name":"Nature's Vigor","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 7th level, you’ve learned to attune your senses with nature. If you spend at least 1 minute meditating while in nature, you gain the following benefits for 1 hour:

\n
    \n
  • You ignore difficult terrain caused by nature.
  • \n
  • You can understand plants within 30 feet of you. They can telepathically communicate simple ideas to you, including memories from within the past day.
  • \n
  • You can command plants within 30 feet of you to create difficult terrain, or other tasks at the GM’s discretion (no action required).
  • \n
\n

Once you’ve used this feature, you must complete a short or long rest before you can use it again.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"minute","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"sr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} @@ -735,4 +741,3 @@ {"_id":"zzbwoqUNCb6U0lRK","name":"Unarmored Movement","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

Starting at 3rd level, your speed increases by 10 feet while you are not wearing armor or wielding a shield. This bonus increases when you reach certain monk levels, as shown in the table below.

\n

At 9th level, you gain the ability to move along vertical surfaces and across liquids on your turn without falling during the move.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LevelUnarmored Movement
1st-
2nd-
3rd+10 ft.
4th+10 ft.
5th+15 ft.
6th+15 ft.
7th+15 ft.
8th+15 ft.
9th+20 ft.
10th+20 ft.
11th+20 ft.
12th+20 ft.
13th+25 ft.
14th+25 ft.
15th+25 ft.
16th+25 ft.
17th+30 ft.
18th+30 ft.
19th+30 ft.
20th+30 ft.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":""},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"_id":"zztRtikqjZ4bFjV0","name":"Invasive Presence","permission":{"default":0,"lwoKvFakziGOHjXS":3},"type":"classfeature","data":{"description":{"value":"

At 7th level, your spirit can invade another creature’s being. As an action, your spirit can touch a creature within 5 feet of it, forcing it to make a Wisdom saving throw against your universal force save DC. If you or creatures that are friendly to you are fighting it, it has advantage on the saving throw.

\n

On a failed save, your spirit moves into that creatures space, inhabiting its body, for 1 minute. The affected creature has disadvantage on the first attack roll, ability check, or saving throw it makes each turn. At the end of each its turns, the creature repeats this save. On a success, it repels the spirit from its body, and it becomes immune to this feature for 24 hours.

\n

Once you’ve used this feature, you must complete a long rest before you can use it again.

\n

 

","chat":"","unidentified":""},"source":"EC","activation":{"type":"action","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"className":"","recharge":{"value":null,"charged":false}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} - From f070d2725c8e3ad0c7c9c8e7e3805271d22badaa Mon Sep 17 00:00:00 2001 From: TJ Date: Mon, 18 Jan 2021 16:13:32 -0600 Subject: [PATCH 05/22] Added new handling for resources/rolling --- module/actor/entity.js | 66 ++-- module/config.js | 11 +- module/dice.js | 77 ++++- module/item/entity.js | 665 +++++++++++++++++++++++------------------ 4 files changed, 494 insertions(+), 325 deletions(-) diff --git a/module/actor/entity.js b/module/actor/entity.js index bdbd385e..c608ea12 100644 --- a/module/actor/entity.js +++ b/module/actor/entity.js @@ -92,8 +92,14 @@ export default class Actor5e extends Actor { init.total = init.mod + init.prof + init.bonus; // Prepare power-casting data - this._computePowercastingDC(this.data); + data.attributes.powerdc = data.attributes.powercasting ? data.abilities[data.attributes.powercasting].dc : 10; this._computePowercastingProgression(this.data); + + // Compute owned item attributes which depend on prepared Actor data + this.items.forEach(item => { + item.getSaveDC(); + item.getAttackToHit(); + }); } /* -------------------------------------------- */ @@ -168,7 +174,10 @@ export default class Actor5e extends Actor { } // Load item data for all identified features - const features = await Promise.all(ids.map(id => fromUuid(id))); + const features = []; + for ( let id of ids ) { + features.push(await fromUuid(id)); + } // Class powers should always be prepared for ( const feature of features ) { @@ -312,19 +321,22 @@ export default class Actor5e extends Actor { const joat = flags.jackOfAllTrades; const observant = flags.observantFeat; const skillBonus = Number.isNumeric(bonuses.skill) ? parseInt(bonuses.skill) : 0; - let round = Math.floor; for (let [id, skl] of Object.entries(data.skills)) { - skl.value = parseFloat(skl.value || 0); + skl.value = Math.clamped(Number(skl.value).toNearest(0.5), 0, 2) ?? 0; + let round = Math.floor; - // Apply Remarkable Athlete or Jack of all Trades - let multi = skl.value; - if ( athlete && (skl.value === 0) && feats.remarkableAthlete.abilities.includes(skl.ability) ) { - multi = 0.5; + // Remarkable + if ( athlete && (skl.value < 0.5) && feats.remarkableAthlete.abilities.includes(skl.ability) ) { + skl.value = 0.5; round = Math.ceil; } - if ( joat && (skl.value === 0 ) ) multi = 0.5; - // Retain the maximum skill proficiency when skill proficiencies are merged + // Jack of All Trades + if ( joat && (skl.value < 0.5) ) { + skl.value = 0.5; + } + + // Polymorph Skill Proficiencies if ( originalSkills ) { skl.value = Math.max(skl.value, originalSkills[id].value); } @@ -332,7 +344,7 @@ export default class Actor5e extends Actor { // Compute modifier skl.bonus = checkBonus + skillBonus; skl.mod = data.abilities[skl.ability].mod; - skl.prof = round(multi * data.attributes.prof); + skl.prof = round(skl.value * data.attributes.prof); skl.total = skl.mod + skl.prof + skl.bonus; // Compute passive bonus @@ -343,23 +355,6 @@ export default class Actor5e extends Actor { /* -------------------------------------------- */ - /** - * Compute the powercasting DC for all item abilities which use power DC scaling - * @param {object} actorData The actor data being prepared - * @private - */ - _computePowercastingDC(actorData) { - - // Compute the powercasting DC - const data = actorData.data; - data.attributes.powerdc = data.attributes.powercasting ? data.abilities[data.attributes.powercasting].dc : 10; - - // Compute ability save DCs that depend on the calling actor - this.items.forEach(i => i.getSaveDC()); - } - - /* -------------------------------------------- */ - /** * Prepare data related to the power-casting capabilities of the Actor * @private @@ -408,7 +403,7 @@ export default class Actor5e extends Actor { progression.slot = Math.ceil(caster.data.levels / denom); } - // EXCEPTION: NPC with an explicit powercaster level + // EXCEPTION: NPC with an explicit power-caster level if (isNPC && actorData.data.details.powerLevel) { progression.slot = actorData.data.details.powerLevel; } @@ -419,9 +414,9 @@ export default class Actor5e extends Actor { for ( let [n, lvl] of Object.entries(powers) ) { let i = parseInt(n.slice(-1)); if ( Number.isNaN(i) ) continue; - if ( Number.isNumeric(lvl.override) ) lvl.max = Math.max(parseInt(lvl.override), 1); + if ( Number.isNumeric(lvl.override) ) lvl.max = Math.max(parseInt(lvl.override), 0); else lvl.max = slots[i-1] || 0; - lvl.value = Math.min(parseInt(lvl.value), lvl.max); + lvl.value = parseInt(lvl.value); } // Determine the Actor's pact magic level (if any) @@ -1108,8 +1103,7 @@ export default class Actor5e extends Actor { // Recover power slots for ( let [k, v] of Object.entries(data.powers) ) { - if ( !v.max && !v.override ) continue; - updateData[`data.powers.${k}.value`] = v.override || v.max; + updateData[`data.powers.${k}.value`] = !Number.isNaN(v.override) ? v.override : (v.max ?? 0); } // Recover pact slots. @@ -1186,7 +1180,6 @@ export default class Actor5e extends Actor { /* -------------------------------------------- */ - /** * Transform this Actor into another one. * @@ -1216,10 +1209,10 @@ export default class Actor5e extends Actor { } // Get the original Actor data and the new source data - const o = duplicate(this.data); + const o = this.toJSON(); o.flags.sw5e = o.flags.sw5e || {}; o.flags.sw5e.transformOptions = {mergeSkills, mergeSaves}; - const source = duplicate(target.data); + const source = target.toJSON(); // Prepare new data to merge from the source const d = { @@ -1227,6 +1220,7 @@ export default class Actor5e extends Actor { name: `${o.name} (${source.name})`, // Append the new shape to your old name data: source.data, // Get the data model of your new form items: source.items, // Get the items of your new form + effects: o.effects.concat(source.effects), // Combine active effects from both forms token: source.token, // New token configuration img: source.img, // New appearance permission: o.permission, // Use the original actor permissions diff --git a/module/config.js b/module/config.js index 3cf516e6..14ca3ee2 100644 --- a/module/config.js +++ b/module/config.js @@ -56,6 +56,16 @@ SW5E.alignments = { /* -------------------------------------------- */ +/** + * An enumeration of item attunement types + * @enum {number} + */ +SW5E.attunementTypes = { + NONE: 0, + REQUIRED: 1, + ATTUNED: 2, +} + /** * An enumeration of item attunement states * @type {{"0": string, "1": string, "2": string}} @@ -457,7 +467,6 @@ SW5E.senses = { "truesight": "SW5E.SenseTruesight" }; - /* -------------------------------------------- */ /** diff --git a/module/dice.js b/module/dice.js index 3a28b827..c05dd3df 100644 --- a/module/dice.js +++ b/module/dice.js @@ -1,3 +1,69 @@ +/** + * A standardized helper function for simplifying the constant parts of a multipart roll formula + * + * @param {string} formula The original Roll formula + * @param {Object} data Actor or item data against which to parse the roll + * @param {Object} options Formatting options + * @param {boolean} options.constantFirst Puts the constants before the dice terms in the resulting formula + * + * @return {string} The resulting simplified formula + */ +export function simplifyRollFormula(formula, data, {constantFirst = false} = {}) { + const roll = new Roll(formula, data); // Parses the formula and replaces any @properties + const terms = roll.terms; + + // Some terms are "too complicated" for this algorithm to simplify + // In this case, the original formula is returned. + if (terms.some(_isUnsupportedTerm)) return roll.formula; + + const rollableTerms = []; // Terms that are non-constant, and their associated operators + const constantTerms = []; // Terms that are constant, and their associated operators + let operators = []; // Temporary storage for operators before they are moved to one of the above + + for (let term of terms) { // For each term + if (["+", "-"].includes(term)) operators.push(term); // If the term is an addition/subtraction operator, push the term into the operators array + else { // Otherwise the term is not an operator + if (term instanceof DiceTerm) { // If the term is something rollable + rollableTerms.push(...operators); // Place all the operators into the rollableTerms array + rollableTerms.push(term); // Then place this rollable term into it as well + } // + else { // Otherwise, this must be a constant + constantTerms.push(...operators); // Place the operators into the constantTerms array + constantTerms.push(term); // Then also add this constant term to that array. + } // + operators = []; // Finally, the operators have now all been assigend to one of the arrays, so empty this before the next iteration. + } + } + + const constantFormula = Roll.cleanFormula(constantTerms); // Cleans up the constant terms and produces a new formula string + const rollableFormula = Roll.cleanFormula(rollableTerms); // Cleans up the non-constant terms and produces a new formula string + + const constantPart = roll._safeEval(constantFormula); // Mathematically evaluate the constant formula to produce a single constant term + + const parts = constantFirst ? // Order the rollable and constant terms, either constant first or second depending on the optional argumen + [constantPart, rollableFormula] : [rollableFormula, constantPart]; + + // Join the parts with a + sign, pass them to `Roll` once again to clean up the formula + return new Roll(parts.filterJoin(" + ")).formula; +} + +/* -------------------------------------------- */ + +/** + * Only some terms are supported by simplifyRollFormula, this method returns true when the term is not supported. + * @param {*} term - A single Dice term to check support on + * @return {Boolean} True when unsupported, false if supported + */ +function _isUnsupportedTerm(term) { + const diceTerm = term instanceof DiceTerm; + const operator = ["+", "-"].includes(term); + const number = !isNaN(Number(term)); + + return !(diceTerm || operator || number); +} + +/* -------------------------------------------- */ + /** * A standardized helper function for managing core 5e "d20 rolls" * @@ -53,7 +119,7 @@ export async function d20Roll({parts=[], data={}, event={}, rollMode=null, templ // Determine the d20 roll and modifiers let nd = 1; - let mods = halflingLucky ? "r=1" : ""; + let mods = halflingLucky ? "r1=1" : ""; // Handle advantage if (adv === 1) { @@ -109,6 +175,8 @@ export async function d20Roll({parts=[], data={}, event={}, rollMode=null, templ if (d.faces === 20) { d.options.critical = critical; d.options.fumble = fumble; + if ( adv === 1 ) d.options.advantage = true; + else if ( adv === -1 ) d.options.disadvantage = true; if (targetValue) d.options.target = targetValue; } } @@ -131,7 +199,6 @@ export async function d20Roll({parts=[], data={}, event={}, rollMode=null, templ /* -------------------------------------------- */ - /** * Present a Dialog form which creates a d20 roll once submitted * @return {Promise} @@ -175,7 +242,6 @@ async function _d20RollDialog({template, title, parts, data, rollMode, dialogOpt }); } - /* -------------------------------------------- */ /** @@ -235,14 +301,15 @@ export async function damageRoll({parts, actor, data, event={}, rollMode=null, t roll.terms[0].alter(1, criticalBonusDice); roll._formula = roll.formula; } - roll.dice.forEach(d => d.options.critical = true); messageData.flavor += ` (${game.i18n.localize("SW5E.Critical")})`; if ( "flags.sw5e.roll" in messageData ) messageData["flags.sw5e.roll"].critical = true; } // Execute the roll try { - return roll.roll(); + roll.evaluate() + if ( crit ) roll.dice.forEach(d => d.options.critical = true); // TODO workaround core bug which wipes Roll#options on roll + return roll; } catch(err) { console.error(err); ui.notifications.error(`Dice roll evaluation failed: ${err.message}`); diff --git a/module/item/entity.js b/module/item/entity.js index 7b539a8d..fc76affe 100644 --- a/module/item/entity.js +++ b/module/item/entity.js @@ -1,4 +1,4 @@ -import {d20Roll, damageRoll} from "../dice.js"; +import {simplifyRollFormula, d20Roll, damageRoll} from "../dice.js"; import AbilityUseDialog from "../apps/ability-use-dialog.js"; import AbilityTemplate from "../pixi/ability-template.js"; @@ -101,7 +101,8 @@ export default class Item5e extends Item { * @type {boolean} */ get hasSave() { - return !!(this.data.data.save && this.data.data.save.ability); + const save = this.data.data?.save || {}; + return !!(save.ability && save.scaling); } /* -------------------------------------------- */ @@ -255,29 +256,41 @@ export default class Item5e extends Item { // Saving throws this.getSaveDC(); + // To Hit + this.getAttackToHit(); + // Damage let dam = data.damage || {}; if ( dam.parts ) { labels.damage = dam.parts.map(d => d[0]).join(" + ").replace(/\+ -/g, "- "); labels.damageTypes = dam.parts.map(d => C.damageTypes[d[1]]).join(", "); } - } - // Assign labels - this.labels = labels; + // Limited Uses + if ( this.isOwned && !!data.uses?.max ) { + let max = data.uses.max; + if ( !Number.isNumeric(max) ) { + max = Roll.replaceFormulaData(max, this.actor.getRollData()); + if ( Roll.MATH_PROXY.safeEval ) max = Roll.MATH_PROXY.safeEval(max); + } + data.uses.max = Number(max); + } + } } + /* -------------------------------------------- */ + /** - * Update the derived spell DC for an item that requires a saving throw + * Update the derived power DC for an item that requires a saving throw * @returns {number|null} */ getSaveDC() { if ( !this.hasSave ) return; const save = this.data.data?.save; - // Actor spell-DC based scaling - if ( save.scaling === "spell" ) { - save.dc = this.isOwned ? getProperty(this.actor.data, "data.attributes.spelldc") : null; + // Actor power-DC based scaling + if ( save.scaling === "power" ) { + save.dc = this.isOwned ? getProperty(this.actor.data, "data.attributes.powerdc") : null; } // Ability-score based scaling @@ -286,22 +299,332 @@ export default class Item5e extends Item { } // Update labels - const abl = CONFIG.DND5E.abilities[save.ability]; - this.labels.save = game.i18n.format("DND5E.SaveDC", {dc: save.dc || "", ability: abl}); + const abl = CONFIG.SW5E.abilities[save.ability]; + this.labels.save = game.i18n.format("SW5E.SaveDC", {dc: save.dc || "", ability: abl}); return save.dc; } /* -------------------------------------------- */ + /** + * Update a label to the Item detailing its total to hit bonus. + * Sources: + * - item entity's innate attack bonus + * - item's actor's proficiency bonus if applicable + * - item's actor's global bonuses to the given item type + * - item's ammunition if applicable + * + * @returns {Object} returns `rollData` and `parts` to be used in the item's Attack roll + */ + getAttackToHit() { + const itemData = this.data.data; + if ( !this.hasAttack || !itemData ) return; + const rollData = this.getRollData(); + + // Define Roll bonuses + const parts = []; + + // Include the item's innate attack bonus as the initial value and label + if ( itemData.attackBonus ) { + parts.push(itemData.attackBonus) + this.labels.toHit = itemData.attackBonus; + } + + // Take no further action for un-owned items + if ( !this.isOwned ) return {rollData, parts}; + + // Ability score modifier + parts.push(`@mod`); + + // Add proficiency bonus if an explicit proficiency flag is present or for non-item features + if ( !["weapon", "consumable"].includes(this.data.type) || itemData.proficient ) { + parts.push("@prof"); + } + + // Actor-level global bonus to attack rolls + const actorBonus = this.actor.data.data.bonuses?.[itemData.actionType] || {}; + if ( actorBonus.attack ) parts.push(actorBonus.attack); + + // One-time bonus provided by consumed ammunition + if ( (itemData.consume?.type === 'ammo') && !!this.actor.items ) { + const ammoItemData = this.actor.items.get(itemData.consume.target)?.data; + + if (ammoItemData) { + const ammoItemQuantity = ammoItemData.data.quantity; + const ammoCanBeConsumed = ammoItemQuantity && (ammoItemQuantity - (itemData.consume.amount ?? 0) >= 0); + const ammoItemAttackBonus = ammoItemData.data.attackBonus; + const ammoIsTypeConsumable = (ammoItemData.type === "consumable") && (ammoItemData.data.consumableType === "ammo") + if ( ammoCanBeConsumed && ammoItemAttackBonus && ammoIsTypeConsumable ) { + parts.push("@ammo"); + rollData["ammo"] = ammoItemAttackBonus; + } + } + } + + // Condense the resulting attack bonus formula into a simplified label + let toHitLabel = simplifyRollFormula(parts.join('+'), rollData).trim(); + if (toHitLabel.charAt(0) !== '-') { + toHitLabel = '+ ' + toHitLabel + } + this.labels.toHit = toHitLabel; + + // Update labels and return the prepared roll data + return {rollData, parts}; + } + + /* -------------------------------------------- */ + /** * Roll the item to Chat, creating a chat card which contains follow up attack or damage roll options * @param {boolean} [configureDialog] Display a configuration dialog for the item roll, if applicable? * @param {string} [rollMode] The roll display mode with which to display (or not) the card * @param {boolean} [createMessage] Whether to automatically create a chat message (if true) or simply return * the prepared chat message data (if false). - * @return {Promise} + * @return {Promise} */ - async roll({configureDialog=true, rollMode=null, createMessage=true}={}) { + async roll({configureDialog=true, rollMode, createMessage=true}={}) { + let item = this; + const actor = this.actor; + + // Reference aspects of the item data necessary for usage + const id = this.data.data; // Item data + const hasArea = this.hasAreaTarget; // Is the ability usage an AoE? + const resource = id.consume || {}; // Resource consumption + const recharge = id.recharge || {}; // Recharge mechanic + const uses = id?.uses ?? {}; // Limited uses + const isPower = this.type === "power"; // Does the item require a power slot? + const requirePowerSlot = isPower && (id.level > 0) && CONFIG.SW5E.powerUpcastModes.includes(id.preparation.mode); + + // Define follow-up actions resulting from the item usage + let createMeasuredTemplate = hasArea; // Trigger a template creation + let consumeRecharge = !!recharge.value; // Consume recharge + let consumeResource = !!resource.target && (resource.type !== "ammo") // Consume a linked (non-ammo) resource + let consumePowerSlot = requirePowerSlot; // Consume a power slot + let consumeUsage = !!uses.per; // Consume limited uses + let consumeQuantity = uses.autoDestroy; // Consume quantity of the item in lieu of uses + + // Display a configuration dialog to customize the usage + const needsConfiguration = createMeasuredTemplate || consumeRecharge || consumeResource || consumePowerSlot || consumeUsage; + if (configureDialog && needsConfiguration) { + const configuration = await AbilityUseDialog.create(this); + if (!configuration) return; + + // Determine consumption preferences + createMeasuredTemplate = Boolean(configuration.placeTemplate); + consumeUsage = Boolean(configuration.consumeUse); + consumeRecharge = Boolean(configuration.consumeRecharge); + consumeResource = Boolean(configuration.consumeResource); + consumePowerSlot = Boolean(configuration.consumeSlot); + + // Handle power upcasting + if ( requirePowerSlot ) { + const slotLevel = configuration.level; + const powerLevel = slotLevel === "pact" ? actor.data.data.powerss.pact.level : parseInt(slotLevel); + if (powerLevel !== id.level) { + const upcastData = mergeObject(this.data, {"data.level": powerLevel}, {inplace: false}); + item = this.constructor.createOwned(upcastData, actor); // Replace the item with an upcast version + } + if ( consumePowerSlot ) consumePowerSlot = slotLevel === "pact" ? "pact" : `power${powerLevel}`; + } + } + + // Determine whether the item can be used by testing for resource consumption + const usage = item._getUsageUpdates({consumeRecharge, consumeResource, consumePowerSlot, consumeUsage, consumeQuantity}); + if ( !usage ) return; + const {actorUpdates, itemUpdates, resourceUpdates} = usage; + + // Commit pending data updates + if ( !isObjectEmpty(itemUpdates) ) await item.update(itemUpdates); + if ( consumeQuantity && (item.data.data.quantity === 0) ) await item.delete(); + if ( !isObjectEmpty(actorUpdates) ) await actor.update(actorUpdates); + if ( !isObjectEmpty(resourceUpdates) ) { + const resource = actor.items.get(id.consume?.target); + if ( resource ) await resource.update(resourceUpdates); + } + + // Initiate measured template creation + if ( createMeasuredTemplate ) { + const template = game.sw5e.canvas.AbilityTemplate.fromItem(item); + if ( template ) template.drawPreview(); + } + + // Create or return the Chat Message data + return item.displayCard({rollMode, createMessage}); + } + + /* -------------------------------------------- */ + + /** + * Verify that the consumed resources used by an Item are available. + * Otherwise display an error and return false. + * @param {boolean} consumeQuantity Consume quantity of the item if other consumption modes are not available? + * @param {boolean} consumeRecharge Whether the item consumes the recharge mechanic + * @param {boolean} consumeResource Whether the item consumes a limited resource + * @param {string|boolean} consumePowerSlot A level of power slot consumed, or false + * @param {boolean} consumeUsage Whether the item consumes a limited usage + * @returns {object|boolean} A set of data changes to apply when the item is used, or false + * @private + */ + _getUsageUpdates({consumeQuantity=false, consumeRecharge=false, consumeResource=false, consumePowerSlot=false, consumeUsage=false}) { + + // Reference item data + const id = this.data.data; + const actorUpdates = {}; + const itemUpdates = {}; + const resourceUpdates = {}; + + // Consume Recharge + if ( consumeRecharge ) { + const recharge = id.recharge || {}; + if ( recharge.charged === false ) { + ui.notifications.warn(game.i18n.format("SW5E.ItemNoUses", {name: this.name})); + return false; + } + itemUpdates["data.recharge.charged"] = false; + } + + // Consume Limited Resource + if ( consumeResource ) { + const canConsume = this._handleConsumeResource(itemUpdates, actorUpdates, resourceUpdates); + if ( canConsume === false ) return false; + } + + // Consume Power Slots + if ( consumePowerSlot ) { + const level = this.actor?.data.data.powers[consumePowerSlot]; + const powers = Number(level?.value ?? 0); + if ( powers === 0 ) { + const label = game.i18n.localize(consumePowerSlot === "pact" ? "SW5E.PowerProgPact" : `SW5E.PowerLevel${id.level}`); + ui.notifications.warn(game.i18n.format("SW5E.PowerCastNoSlots", {name: this.name, level: label})); + return false; + } + actorUpdates[`data.powers.${consumePowerSlot}.value`] = Math.max(powers - 1, 0); + } + + // Consume Limited Usage + if ( consumeUsage ) { + const uses = id.uses || {}; + const available = Number(uses.value ?? 0); + let used = false; + + // Reduce usages + const remaining = Math.max(available - 1, 0); + if ( available >= 1 ) { + used = true; + itemUpdates["data.uses.value"] = remaining; + } + + // Reduce quantity if not reducing usages or if usages hit 0 and we are set to consumeQuantity + if ( consumeQuantity && (!used || (remaining === 0)) ) { + const q = Number(id.quantity ?? 1); + if ( q >= 1 ) { + used = true; + itemUpdates["data.quantity"] = Math.max(q - 1, 0); + itemUpdates["data.uses.value"] = uses.max ?? 1; + } + } + + // If the item was not used, return a warning + if ( !used ) { + ui.notifications.warn(game.i18n.format("SW5E.ItemNoUses", {name: this.name})); + return false; + } + } + + // Return the configured usage + return {itemUpdates, actorUpdates, resourceUpdates}; + } + + /* -------------------------------------------- */ + + /** + * Handle update actions required when consuming an external resource + * @param {object} itemUpdates An object of data updates applied to this item + * @param {object} actorUpdates An object of data updates applied to the item owner (Actor) + * @param {object} resourceUpdates An object of data updates applied to a different resource item (Item) + * @return {boolean|void} Return false to block further progress, or return nothing to continue + * @private + */ + _handleConsumeResource(itemUpdates, actorUpdates, resourceUpdates) { + const actor = this.actor; + const itemData = this.data.data; + const consume = itemData.consume || {}; + if ( !consume.type ) return; + + // No consumed target + const typeLabel = CONFIG.SW5E.abilityConsumptionTypes[consume.type]; + if ( !consume.target ) { + ui.notifications.warn(game.i18n.format("SW5E.ConsumeWarningNoResource", {name: this.name, type: typeLabel})); + return false; + } + + // Identify the consumed resource and its current quantity + let resource = null; + let amount = Number(consume.amount ?? 1); + let quantity = 0; + switch ( consume.type ) { + case "attribute": + resource = getProperty(actor.data.data, consume.target); + quantity = resource || 0; + break; + case "ammo": + case "material": + resource = actor.items.get(consume.target); + quantity = resource ? resource.data.data.quantity : 0; + break; + case "charges": + resource = actor.items.get(consume.target); + if ( !resource ) break; + const uses = resource.data.data.uses; + if ( uses.per && uses.max ) quantity = uses.value; + else if ( resource.data.data.recharge?.value ) { + quantity = resource.data.data.recharge.charged ? 1 : 0; + amount = 1; + } + break; + } + + // Verify that a consumed resource is available + if ( !resource ) { + ui.notifications.warn(game.i18n.format("SW5E.ConsumeWarningNoSource", {name: this.name, type: typeLabel})); + return false; + } + + // Verify that the required quantity is available + let remaining = quantity - amount; + if ( remaining < 0 ) { + ui.notifications.warn(game.i18n.format("SW5E.ConsumeWarningNoQuantity", {name: this.name, type: typeLabel})); + return false; + } + + // Define updates to provided data objects + switch ( consume.type ) { + case "attribute": + actorUpdates[`data.${consume.target}`] = remaining; + break; + case "ammo": + case "material": + resourceUpdates["data.quantity"] = remaining; + break; + case "charges": + const uses = resource.data.data.uses || {}; + const recharge = resource.data.data.recharge || {}; + if ( uses.per && uses.max ) resourceUpdates["data.uses.value"] = remaining; + else if ( recharge.value ) resourceUpdates["data.recharge.charged"] = false; + break; + } + } + + /* -------------------------------------------- */ + + /** + * Display the chat card for an Item as a Chat Message + * @param {object} options Options which configure the display of the item chat card + * @param {string} rollMode The message visibility mode to apply to the created card + * @param {boolean} createMessage Whether to automatically create a ChatMessage entity (if true), or only return + * the prepared message data (if false) + */ + async displayCard({rollMode, createMessage=true}={}) { // Basic template rendering data const token = this.actor.token; @@ -320,190 +643,31 @@ export default class Item5e extends Item { hasAreaTarget: this.hasAreaTarget }; - // For feature items, optionally show an ability usage dialog - if (this.data.type === "feat") { - let configured = await this._rollFeat(configureDialog); - if ( configured === false ) return; - } else if ( this.data.type === "consumable" ) { - let configured = await this._rollConsumable(configureDialog); - if ( configured === false ) return; - } - - // For items which consume a resource, handle that here - const allowed = await this._handleResourceConsumption({isCard: true, isAttack: false}); - if ( allowed === false ) return; - // Render the chat card template const templateType = ["tool"].includes(this.data.type) ? this.data.type : "item"; const template = `systems/sw5e/templates/chat/${templateType}-card.html`; const html = await renderTemplate(template, templateData); - // Basic chat message data + // Create the ChatMessage data object const chatData = { user: game.user._id, type: CONST.CHAT_MESSAGE_TYPES.OTHER, content: html, flavor: this.data.data.chatFlavor || this.name, - speaker: { - actor: this.actor._id, - token: this.actor.token, - alias: this.actor.name - }, + speaker: ChatMessage.getSpeaker({actor: this.actor, token}), flags: {"core.canPopout": true} }; - // If the consumable was destroyed in the process - embed the item data in the surviving message + // If the Item was destroyed in the process of displaying its card - embed the item data in the chat message if ( (this.data.type === "consumable") && !this.actor.items.has(this.id) ) { chatData.flags["sw5e.itemData"] = this.data; } - // Toggle default roll mode - rollMode = rollMode || game.settings.get("core", "rollMode"); - if ( ["gmroll", "blindroll"].includes(rollMode) ) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM"); - if ( rollMode === "blindroll" ) chatData["blind"] = true; + // Apply the roll mode to adjust message visibility + ChatMessage.applyRollMode(chatData, rollMode || game.settings.get("core", "rollMode")); - // Create the chat message - if ( createMessage ) return ChatMessage.create(chatData); - else return chatData; - } - - /* -------------------------------------------- */ - - /** - * For items which consume a resource, handle the consumption of that resource when the item is used. - * There are four types of ability consumptions which are handled: - * 1. Ammunition (on attack rolls) - * 2. Attributes (on card usage) - * 3. Materials (on card usage) - * 4. Item Charges (on card usage) - * - * @param {boolean} isCard Is the item card being played? - * @param {boolean} isAttack Is an attack roll being made? - * @return {Promise} Can the item card or attack roll be allowed to proceed? - * @private - */ - async _handleResourceConsumption({isCard=false, isAttack=false}={}) { - const itemData = this.data.data; - const consume = itemData.consume || {}; - if ( !consume.type ) return true; - const actor = this.actor; - const typeLabel = CONFIG.SW5E.abilityConsumptionTypes[consume.type]; - - // Only handle certain types for certain actions - if ( ((consume.type === "ammo") && !isAttack ) || ((consume.type !== "ammo") && !isCard) ) return true; - - // No consumed target set - if ( !consume.target ) { - ui.notifications.warn(game.i18n.format("SW5E.ConsumeWarningNoResource", {name: this.name, type: typeLabel})); - return false; - } - - // Identify the consumed resource and it's quantity - let consumed = null; - let amount = parseInt(consume.amount || 1); - let quantity = 0; - switch ( consume.type ) { - case "attribute": - consumed = getProperty(actor.data.data, consume.target); - quantity = consumed || 0; - break; - case "ammo": - case "material": - consumed = actor.items.get(consume.target); - quantity = consumed ? consumed.data.data.quantity : 0; - break; - case "charges": - consumed = actor.items.get(consume.target); - if ( !consumed ) break; - const uses = consumed.data.data.uses; - if ( uses.per && uses.max ) quantity = uses.value; - else if ( consumed.data.data.recharge?.value ) { - quantity = consumed.data.data.recharge.charged ? 1 : 0; - amount = 1; - } - break; - } - - // Verify that the consumed resource is available - if ( [null, undefined].includes(consumed) ) { - ui.notifications.warn(game.i18n.format("SW5E.ConsumeWarningNoSource", {name: this.name, type: typeLabel})); - return false; - } - let remaining = quantity - amount; - if ( remaining < 0) { - ui.notifications.warn(game.i18n.format("SW5E.ConsumeWarningNoQuantity", {name: this.name, type: typeLabel})); - return false; - } - - // Update the consumed resource - switch ( consume.type ) { - case "attribute": - await this.actor.update({[`data.${consume.target}`]: remaining}); - break; - case "ammo": - case "material": - await consumed.update({"data.quantity": remaining}); - break; - case "charges": - const uses = consumed.data.data.uses || {}; - const recharge = consumed.data.data.recharge || {}; - if ( uses.per && uses.max ) await consumed.update({"data.uses.value": remaining}); - else if ( recharge.value ) await consumed.update({"data.recharge.charged": false}); - break; - } - return true; - } - - /* -------------------------------------------- */ - - /** - * Additional rolling steps when rolling a feat-type item - * @private - * @return {boolean} whether the roll should be prevented - */ - async _rollFeat(configureDialog) { - if ( this.data.type !== "feat" ) throw new Error("Wrong Item type"); - - // Configure whether to consume a limited use or to place a template - const charge = this.data.data.recharge; - const uses = this.data.data.uses; - let usesCharges = !!uses.per && !!uses.max; - let placeTemplate = false; - let consume = charge.value || usesCharges; - - // Determine whether the feat uses charges - configureDialog = configureDialog && (consume || this.hasAreaTarget); - if ( configureDialog ) { - const usage = await AbilityUseDialog.create(this); - if ( usage === null ) return false; - consume = Boolean(usage.get("consumeUse")); - placeTemplate = Boolean(usage.get("placeTemplate")); - } - - // Update Item data - const current = getProperty(this.data, "data.uses.value") || 0; - if ( consume && charge.value ) { - if ( !charge.charged ) { - ui.notifications.warn(game.i18n.format("SW5E.ItemNoUses", {name: this.name})); - return false; - } - else await this.update({"data.recharge.charged": false}); - } - else if ( consume && usesCharges ) { - if ( uses.value <= 0 ) { - ui.notifications.warn(game.i18n.format("SW5E.ItemNoUses", {name: this.name})); - return false; - } - await this.update({"data.uses.value": Math.max(current - 1, 0)}); - } - - // Maybe initiate template placement workflow - if ( this.hasAreaTarget && placeTemplate ) { - const template = AbilityTemplate.fromItem(this); - if ( template ) template.drawPreview(); - if ( this.owner && this.owner.sheet ) this.owner.sheet.minimize(); - } - return true; + // Create the Chat Message or return its data + return createMessage ? ChatMessage.create(chatData) : chatData; } /* -------------------------------------------- */ @@ -527,8 +691,9 @@ export default class Item5e extends Item { const fn = this[`_${this.data.type}ChatData`]; if ( fn ) fn.bind(this)(data, labels, props); - // General equipment properties + // Equipment properties if ( data.hasOwnProperty("equipped") && !["loot", "tool"].includes(this.data.type) ) { + if ( data.attunement === CONFIG.SW5E.attunementTypes.REQUIRED ) props.push(game.i18n.localize(CONFIG.SW5E.attunements[CONFIG.SW5E.attunementTypes.REQUIRED])); props.push( game.i18n.localize(data.equipped ? "SW5E.Equipped" : "SW5E.Unequipped"), game.i18n.localize(data.proficient ? "SW5E.Proficient" : "SW5E.NotProficient"), @@ -653,43 +818,35 @@ export default class Item5e extends Item { */ async rollAttack(options={}) { const itemData = this.data.data; - const actorData = this.actor.data.data; const flags = this.actor.data.flags.sw5e || {}; if ( !this.hasAttack ) { throw new Error("You may not place an Attack Roll with this Item."); } let title = `${this.name} - ${game.i18n.localize("SW5E.AttackRoll")}`; - const rollData = this.getRollData(); - // Define Roll bonuses - const parts = [`@mod`]; - if ( (this.data.type !== "weapon") || itemData.proficient ) { - parts.push("@prof"); - } + // get the parts and rollData for this item's attack + const {parts, rollData} = this.getAttackToHit(); - // Attack Bonus - if ( itemData.attackBonus ) parts.push(itemData.attackBonus); - const actorBonus = actorData?.bonuses?.[itemData.actionType] || {}; - if ( actorBonus.attack ) parts.push(actorBonus.attack); - - // Ammunition Bonus + // Handle ammunition consumption delete this._ammo; + let ammo = null; + let ammoUpdate = null; const consume = itemData.consume; if ( consume?.type === "ammo" ) { - const ammo = this.actor.items.get(consume.target); - if(ammo?.data){ + ammo = this.actor.items.get(consume.target); + if (ammo?.data) { const q = ammo.data.data.quantity; const consumeAmount = consume.amount ?? 0; if ( q && (q - consumeAmount >= 0) ) { this._ammo = ammo; - let ammoBonus = ammo.data.data.attackBonus; - if ( ammoBonus ) { - parts.push("@ammo"); - rollData["ammo"] = ammoBonus; - title += ` [${ammo.name}]`; - } + title += ` [${ammo.name}]`; } } + + // Get pending ammunition update + const usage = this._getUsageUpdates({consumeResource: true}); + if ( usage === false ) return null; + ammoUpdate = usage.resourceUpdates || {}; } // Compose roll options @@ -730,9 +887,8 @@ export default class Item5e extends Item { const roll = await d20Roll(rollConfig); if ( roll === false ) return null; - // Handle resource consumption if the attack roll was made - const allowed = await this._handleResourceConsumption({isCard: false, isAttack: true}); - if ( allowed === false ) return null; + // Commit ammunition consumption on attack rolls resource consumption if the attack roll was made + if ( ammo && !isObjectEmpty(ammoUpdate) ) await ammo.update(ammoUpdate); return roll; } @@ -747,7 +903,7 @@ export default class Item5e extends Item { * @param {object} [options] Additional options passed to the damageRoll function * @return {Promise} A Promise which resolves to the created Roll instance */ - rollDamage({event, powerLevel=null, versatile=false, options={}}={}) { + rollDamage({critical=false, event=null, powerLevel=null, versatile=false, options={}}={}) { if ( !this.hasDamage ) throw new Error("You may not make a Damage Roll with this Item."); const itemData = this.data.data; const actorData = this.actor.data.data; @@ -761,10 +917,12 @@ export default class Item5e extends Item { // Configure the damage roll const title = `${this.name} - ${game.i18n.localize("SW5E.DamageRoll")}`; const rollConfig = { - event: event, - parts: parts, actor: this.actor, + critical: critical ?? event?.altKey ?? false, data: rollData, + event: event, + fastForward: event ? event.shiftKey || event.altKey || event.ctrlKey || event.metaKey : false, + parts: parts, title: title, flavor: this.labels.damageTypes.length ? `${title} (${this.labels.damageTypes})` : title, speaker: ChatMessage.getSpeaker({actor: this.actor}), @@ -784,9 +942,9 @@ export default class Item5e extends Item { // Scale damage from up-casting powers if ( (this.data.type === "power") ) { - if ( (itemData.scaling.mode === "atwill") ) { + if ( (itemData.scaling.mode === "cantrip") ) { const level = this.actor.data.type === "character" ? actorData.details.level : actorData.details.powerLevel; - this._scaleAtWillDamage(parts, itemData.scaling.formula, level, rollData); + this._scaleCantripDamage(parts, itemData.scaling.formula, level, rollData); } else if ( powerLevel && (itemData.scaling.mode === "level") && itemData.scaling.formula ) { const scaling = itemData.scaling.formula; @@ -800,10 +958,13 @@ export default class Item5e extends Item { parts.push(actorBonus.damage); } - // Add ammunition damage - if ( this._ammo ) { + // Handle ammunition damage + const ammoData = this._ammo?.data; + + // only add the ammunition damage if the ammution is a consumable with type 'ammo' + if ( this._ammo && (ammoData.type === "consumable") && (ammoData.data.consumableType === "ammo") ) { parts.push("@ammo"); - rollData["ammo"] = this._ammo.data.data.damage.parts.map(p => p[0]).join("+"); + rollData["ammo"] = ammoData.data.damage.parts.map(p => p[0]).join("+"); rollConfig.flavor += ` [${this._ammo.name}]`; delete this._ammo; } @@ -913,74 +1074,6 @@ export default class Item5e extends Item { /* -------------------------------------------- */ - /** - * Use a consumable item, deducting from the quantity or charges of the item. - * @param {boolean} configureDialog Whether to show a configuration dialog - * @return {boolean} Whether further execution should be prevented - * @private - */ - async _rollConsumable(configureDialog) { - if ( this.data.type !== "consumable" ) throw new Error("Wrong Item type"); - const itemData = this.data.data; - - // Determine whether to deduct uses of the item - const uses = itemData.uses || {}; - const autoDestroy = uses.autoDestroy; - let usesCharges = !!uses.per && (uses.max > 0); - const recharge = itemData.recharge || {}; - const usesRecharge = !!recharge.value; - - // Display a configuration dialog to confirm the usage - let placeTemplate = false; - let consume = uses.autoUse || true; - if ( configureDialog ) { - const usage = await AbilityUseDialog.create(this); - if ( usage === null ) return false; - consume = Boolean(usage.get("consumeUse")); - placeTemplate = Boolean(usage.get("placeTemplate")); - } - - // Update Item data - if ( consume ) { - const current = uses.value || 0; - const remaining = usesCharges ? Math.max(current - 1, 0) : current; - if ( usesRecharge ) await this.update({"data.recharge.charged": false}); - else { - const q = itemData.quantity; - // Case 1, reduce charges - if ( remaining ) { - await this.update({"data.uses.value": remaining}); - } - // Case 2, reduce quantity - else if ( q > 1 ) { - await this.update({"data.quantity": q - 1, "data.uses.value": uses.max || 0}); - } - // Case 3, destroy the item - else if ( (q <= 1) && autoDestroy ) { - await this.actor.deleteOwnedItem(this.id); - } - // Case 4, reduce item to 0 quantity and 0 charges - else if ( (q === 1) ) { - await this.update({"data.quantity": q - 1, "data.uses.value": 0}); - } - // Case 5, item unusable, display warning and do nothing - else { - ui.notifications.warn(game.i18n.format("SW5E.ItemNoUses", {name: this.name})); - } - } - } - - // Maybe initiate template placement workflow - if ( this.hasAreaTarget && placeTemplate ) { - const template = AbilityTemplate.fromItem(this); - if ( template ) template.drawPreview(); - if ( this.owner && this.owner.sheet ) this.owner.sheet.minimize(); - } - return true; - } - - /* -------------------------------------------- */ - /** * Perform an ability recharge test for an item which uses the d6 recharge mechanic * @return {Promise} A Promise which resolves to the created Roll instance @@ -1033,6 +1126,7 @@ export default class Item5e extends Item { left: window.innerWidth - 710, }, halflingLucky: this.actor.getFlag("sw5e", "halflingLucky" ) || false, + reliableTalent: (this.data.data.proficient >= 1) && this.actor.getFlag("sw5e", "reliableTalent"), messageData: {"flags.sw5e.roll": {type: "tool", itemId: this.id }} }, options); rollConfig.event = options.event; @@ -1114,9 +1208,14 @@ export default class Item5e extends Item { case "attack": await item.rollAttack({event}); break; case "damage": - await item.rollDamage({event, powerLevel}); break; case "versatile": - await item.rollDamage({event, powerLevel, versatile: true}); break; + await item.rollDamage({ + critical: event.altKey, + event: event, + powerLevel: powerLevel, + versatile: action === "versatile" + }); + break; case "formula": await item.rollFormula({event, powerLevel}); break; case "save": @@ -1129,7 +1228,7 @@ export default class Item5e extends Item { case "toolCheck": await item.rollToolCheck({event}); break; case "placeTemplate": - const template = AbilityTemplate.fromItem(item); + const template = game.sw5e.canvas.AbilityTemplate.fromItem(item); if ( template ) template.drawPreview(); break; } From 9c6bd3873e73e301e3e26af03c4d240652bfd6b4 Mon Sep 17 00:00:00 2001 From: supervj <64861570+supervj@users.noreply.github.com> Date: Mon, 18 Jan 2021 23:49:04 -0500 Subject: [PATCH 06/22] Update Core 1.2.2 Update core to 1.2.2. Sheets are broken --- less/original/apps.less | 5 --- module/actor/entity.js | 1 + module/actor/sheets/newSheet/base.js | 40 ++++++++++++++----- module/actor/sheets/newSheet/character.js | 15 +++++++ module/actor/sheets/newSheet/npc.js | 4 +- module/actor/sheets/newSheet/vehicle.js | 14 +++---- module/actor/sheets/oldSheets/base.js | 40 ++++++++++++++----- module/actor/sheets/oldSheets/character.js | 7 +++- module/actor/sheets/oldSheets/vehicle.js | 14 +++---- module/apps/ability-use-dialog.js | 9 +++-- module/apps/trait-selector.js | 4 +- module/combat.js | 2 +- module/config.js | 29 ++++++++++---- module/item/entity.js | 8 ++-- module/item/sheet.js | 7 +++- module/migration.js | 21 ++-------- module/pixi/ability-template.js | 4 +- packs/packs/species.db | 4 +- sw5e copy.css | 4 +- sw5e-update.css | 2 +- sw5e.js | 11 +++-- system.json | 2 +- template.json | 21 +++++----- .../actors/newActor/character-sheet.html | 2 +- templates/actors/newActor/npc-sheet.html | 1 + .../actors/newActor/parts/swalt-traits.html | 2 +- templates/actors/newActor/vehicle-sheet.html | 12 ++++-- .../actors/oldActor/character-sheet.html | 2 +- .../actors/oldActor/parts/actor-traits.html | 2 +- templates/actors/oldActor/vehicle-sheet.html | 12 ++++-- templates/apps/ability-use.html | 2 +- 31 files changed, 189 insertions(+), 114 deletions(-) diff --git a/less/original/apps.less b/less/original/apps.less index 53e37d78..728a3c71 100644 --- a/less/original/apps.less +++ b/less/original/apps.less @@ -426,11 +426,6 @@ border: none; margin-right: 5px; } - h4 { - margin: 0; - white-space: nowrap; - overflow-x: hidden; - } } } diff --git a/module/actor/entity.js b/module/actor/entity.js index c608ea12..a25fd738 100644 --- a/module/actor/entity.js +++ b/module/actor/entity.js @@ -1180,6 +1180,7 @@ export default class Actor5e extends Actor { /* -------------------------------------------- */ + /** * Transform this Actor into another one. * diff --git a/module/actor/sheets/newSheet/base.js b/module/actor/sheets/newSheet/base.js index 92a3da39..4638cd21 100644 --- a/module/actor/sheets/newSheet/base.js +++ b/module/actor/sheets/newSheet/base.js @@ -119,22 +119,44 @@ export default class ActorSheet5e extends ActorSheet { /* -------------------------------------------- */ /** - * Prepare the display of movement speed data for the Actor - * @param {object} actorData + * Prepare the display of movement speed data for the Actor* + * @param {object} actorData The Actor data being prepared. + * @param {boolean} [largestPrimary=false] Show the largest movement speed as "primary", otherwise show "walk" * @returns {{primary: string, special: string}} * @private */ - _getMovementSpeed(actorData) { + _getMovementSpeed(actorData, largestPrimary=false) { const movement = actorData.data.attributes.movement || {}; - const speeds = [ + + // Prepare an array of available movement speeds + let speeds = [ [movement.burrow, `${game.i18n.localize("SW5E.MovementBurrow")} ${movement.burrow}`], [movement.climb, `${game.i18n.localize("SW5E.MovementClimb")} ${movement.climb}`], [movement.fly, `${game.i18n.localize("SW5E.MovementFly")} ${movement.fly}` + (movement.hover ? ` (${game.i18n.localize("SW5E.MovementHover")})` : "")], [movement.swim, `${game.i18n.localize("SW5E.MovementSwim")} ${movement.swim}`] - ].filter(s => !!s[0]).sort((a, b) => b[0] - a[0]); - return { - primary: `${movement.walk || 0} ${movement.units}`, - special: speeds.length ? speeds.map(s => s[1]).join(", ") : "" + ] + if ( largestPrimary ) { + speeds.push([movement.walk, `${game.i18n.localize("SW5E.MovementWalk")} ${movement.walk}`]); + } + + // Filter and sort speeds on their values + speeds = speeds.filter(s => !!s[0]).sort((a, b) => b[0] - a[0]); + + // Case 1: Largest as primary + if ( largestPrimary ) { + let primary = speeds.shift(); + return { + primary: `${primary ? primary[1] : "0"} ${movement.units}`, + special: speeds.map(s => s[1]).join(", ") + } + } + + // Case 2: Walk as primary + else { + return { + primary: `${movement.walk || 0} ${movement.units}`, + special: speeds.length ? speeds.map(s => s[1]).join(", ") : "" + } } } @@ -352,7 +374,7 @@ export default class ActorSheet5e extends ActorSheet { 1: '', 2: '' }; - return icons[level]; + return icons[level] || icons[0]; } /* -------------------------------------------- */ diff --git a/module/actor/sheets/newSheet/character.js b/module/actor/sheets/newSheet/character.js index ea995442..be3e82ed 100644 --- a/module/actor/sheets/newSheet/character.js +++ b/module/actor/sheets/newSheet/character.js @@ -57,6 +57,9 @@ export default class ActorSheet5eCharacterNew extends ActorSheet5e { // Experience Tracking sheetData["disableExperience"] = game.settings.get("sw5e", "disableExperienceTracking"); sheetData["classLabels"] = this.actor.itemTypes.class.map(c => c.name).join(", "); + sheetData["multiclassLabels"] = this.actor.itemTypes.class.map(c => { + return [c.data.data.archetype, c.name, c.data.data.levels].filterJoin(' ') + }).join(', '); // Return data for rendering return sheetData; @@ -86,6 +89,18 @@ export default class ActorSheet5eCharacterNew extends ActorSheet5e { // Item details item.img = item.img || DEFAULT_TOKEN; item.isStack = Number.isNumeric(item.data.quantity) && (item.data.quantity !== 1); + item.attunement = { + [CONFIG.SW5E.attunementTypes.REQUIRED]: { + icon: "fa-sun", + cls: "not-attuned", + title: "SW5E.AttunementRequired" + }, + [CONFIG.SW5E.attunementTypes.ATTUNED]: { + icon: "fa-sun", + cls: "attuned", + title: "SW5E.AttunementAttuned" + } + }[item.data.attunement]; // Item usage item.hasUses = item.data.uses && (item.data.uses.max > 0); diff --git a/module/actor/sheets/newSheet/npc.js b/module/actor/sheets/newSheet/npc.js index d884d770..da67f782 100644 --- a/module/actor/sheets/newSheet/npc.js +++ b/module/actor/sheets/newSheet/npc.js @@ -115,7 +115,7 @@ export default class ActorSheet5eNPCNew extends ActorSheet5e { /** @override */ activateListeners(html) { super.activateListeners(html); - html.find(".health .rollable").click(this._onRollHealthFormula.bind(this)); + html.find(".health .rollable").click(this._onRollHPFormula.bind(this)); } /* -------------------------------------------- */ @@ -125,7 +125,7 @@ export default class ActorSheet5eNPCNew extends ActorSheet5e { * @param {Event} event The original click event * @private */ - _onRollHealthFormula(event) { + _onRollHPFormula(event) { event.preventDefault(); const formula = this.actor.data.data.attributes.hp.formula; if ( !formula ) return; diff --git a/module/actor/sheets/newSheet/vehicle.js b/module/actor/sheets/newSheet/vehicle.js index e34026c0..cba36ebd 100644 --- a/module/actor/sheets/newSheet/vehicle.js +++ b/module/actor/sheets/newSheet/vehicle.js @@ -56,6 +56,13 @@ export default class ActorSheet5eVehicle extends ActorSheet5e { /* -------------------------------------------- */ + /** @override */ + _getMovementSpeed(actorData, largestPrimary=true) { + return super._getMovementSpeed(actorData, largestPrimary); + } + + /* -------------------------------------------- */ + /** * Prepare items that are mounted to a vehicle and require one or more crew * to operate. @@ -86,13 +93,6 @@ export default class ActorSheet5eVehicle extends ActorSheet5e { /* -------------------------------------------- */ - /** @override */ - _getMovementSpeed(actorData) { - return {primary: "", special: ""}; - } - - /* -------------------------------------------- */ - /** * Organize Owned Items for rendering the Vehicle sheet. * @private diff --git a/module/actor/sheets/oldSheets/base.js b/module/actor/sheets/oldSheets/base.js index 961ba894..485a78b7 100644 --- a/module/actor/sheets/oldSheets/base.js +++ b/module/actor/sheets/oldSheets/base.js @@ -119,22 +119,44 @@ export default class ActorSheet5e extends ActorSheet { /* -------------------------------------------- */ /** - * Prepare the display of movement speed data for the Actor - * @param {object} actorData + * Prepare the display of movement speed data for the Actor* + * @param {object} actorData The Actor data being prepared. + * @param {boolean} [largestPrimary=false] Show the largest movement speed as "primary", otherwise show "walk" * @returns {{primary: string, special: string}} * @private */ - _getMovementSpeed(actorData) { + _getMovementSpeed(actorData, largestPrimary=false) { const movement = actorData.data.attributes.movement || {}; - const speeds = [ + + // Prepare an array of available movement speeds + let speeds = [ [movement.burrow, `${game.i18n.localize("SW5E.MovementBurrow")} ${movement.burrow}`], [movement.climb, `${game.i18n.localize("SW5E.MovementClimb")} ${movement.climb}`], [movement.fly, `${game.i18n.localize("SW5E.MovementFly")} ${movement.fly}` + (movement.hover ? ` (${game.i18n.localize("SW5E.MovementHover")})` : "")], [movement.swim, `${game.i18n.localize("SW5E.MovementSwim")} ${movement.swim}`] - ].filter(s => !!s[0]).sort((a, b) => b[0] - a[0]); - return { - primary: `${movement.walk || 0} ${movement.units}`, - special: speeds.length ? speeds.map(s => s[1]).join(", ") : "" + ] + if ( largestPrimary ) { + speeds.push([movement.walk, `${game.i18n.localize("SW5E.MovementWalk")} ${movement.walk}`]); + } + + // Filter and sort speeds on their values + speeds = speeds.filter(s => !!s[0]).sort((a, b) => b[0] - a[0]); + + // Case 1: Largest as primary + if ( largestPrimary ) { + let primary = speeds.shift(); + return { + primary: `${primary ? primary[1] : "0"} ${movement.units}`, + special: speeds.map(s => s[1]).join(", ") + } + } + + // Case 2: Walk as primary + else { + return { + primary: `${movement.walk || 0} ${movement.units}`, + special: speeds.length ? speeds.map(s => s[1]).join(", ") : "" + } } } @@ -352,7 +374,7 @@ export default class ActorSheet5e extends ActorSheet { 1: '', 2: '' }; - return icons[level]; + return icons[level] || icons[0]; } /* -------------------------------------------- */ diff --git a/module/actor/sheets/oldSheets/character.js b/module/actor/sheets/oldSheets/character.js index 51e181cf..dc28b205 100644 --- a/module/actor/sheets/oldSheets/character.js +++ b/module/actor/sheets/oldSheets/character.js @@ -46,6 +46,9 @@ export default class ActorSheet5eCharacter extends ActorSheet5e { // Experience Tracking sheetData["disableExperience"] = game.settings.get("sw5e", "disableExperienceTracking"); sheetData["classLabels"] = this.actor.itemTypes.class.map(c => c.name).join(", "); + sheetData["multiclassLabels"] = this.actor.itemTypes.class.map(c => { + return [c.data.data.archetype, c.name, c.data.data.levels].filterJoin(' ') + }).join(', '); // Return data for rendering return sheetData; @@ -76,12 +79,12 @@ export default class ActorSheet5eCharacter extends ActorSheet5e { item.img = item.img || DEFAULT_TOKEN; item.isStack = Number.isNumeric(item.data.quantity) && (item.data.quantity !== 1); item.attunement = { - 1: { + [CONFIG.SW5E.attunementTypes.REQUIRED]: { icon: "fa-sun", cls: "not-attuned", title: "SW5E.AttunementRequired" }, - 2: { + [CONFIG.SW5E.attunementTypes.ATTUNED]: { icon: "fa-sun", cls: "attuned", title: "SW5E.AttunementAttuned" diff --git a/module/actor/sheets/oldSheets/vehicle.js b/module/actor/sheets/oldSheets/vehicle.js index e34026c0..cba36ebd 100644 --- a/module/actor/sheets/oldSheets/vehicle.js +++ b/module/actor/sheets/oldSheets/vehicle.js @@ -56,6 +56,13 @@ export default class ActorSheet5eVehicle extends ActorSheet5e { /* -------------------------------------------- */ + /** @override */ + _getMovementSpeed(actorData, largestPrimary=true) { + return super._getMovementSpeed(actorData, largestPrimary); + } + + /* -------------------------------------------- */ + /** * Prepare items that are mounted to a vehicle and require one or more crew * to operate. @@ -86,13 +93,6 @@ export default class ActorSheet5eVehicle extends ActorSheet5e { /* -------------------------------------------- */ - /** @override */ - _getMovementSpeed(actorData) { - return {primary: "", special: ""}; - } - - /* -------------------------------------------- */ - /** * Organize Owned Items for rendering the Vehicle sheet. * @private diff --git a/module/apps/ability-use-dialog.js b/module/apps/ability-use-dialog.js index 079ea93d..a0f8b716 100644 --- a/module/apps/ability-use-dialog.js +++ b/module/apps/ability-use-dialog.js @@ -127,10 +127,13 @@ export default class AbilityUseDialog extends Dialog { }); } const canCast = powerLevels.some(l => l.hasSlots); + if ( !canCast ) data.errors.push(game.i18n.format("SW5E.PowerCastNoSlots", { + level: CONFIG.SW5E.powerLevels[lvl], + name: data.item.name + })); - // Return merged data - data = mergeObject(data, { isPower: true, consumePowerSlot, powerLevels }); - if ( !canCast ) data.errors.push("SW5E.PowerCastNoSlots"); + // Merge power casting data + return mergeObject(data, { isPower: true, consumePowerSlot, powerLevels }); } /* -------------------------------------------- */ diff --git a/module/apps/trait-selector.js b/module/apps/trait-selector.js index 5a9e48be..5e63d63d 100644 --- a/module/apps/trait-selector.js +++ b/module/apps/trait-selector.js @@ -49,7 +49,7 @@ export default class TraitSelector extends FormApplication { } // Return data - return { + return { allowCustom: this.options.allowCustom, choices: choices, custom: attr ? attr.custom : "" @@ -85,4 +85,4 @@ export default class TraitSelector extends FormApplication { // Update the object this.object.update(updateData); } -} \ No newline at end of file +} diff --git a/module/combat.js b/module/combat.js index ed12959b..b407c33a 100644 --- a/module/combat.js +++ b/module/combat.js @@ -13,7 +13,7 @@ export const _getInitiativeFormula = function(combatant) { let nd = 1; let mods = ""; - if (actor.getFlag("sw5e", "halflingLucky")) mods += "r=1"; + if (actor.getFlag("sw5e", "halflingLucky")) mods += "r1=1"; if (actor.getFlag("sw5e", "initiativeAdv")) { nd = 2; mods += "kh"; diff --git a/module/config.js b/module/config.js index 14ca3ee2..4008e13b 100644 --- a/module/config.js +++ b/module/config.js @@ -4,14 +4,13 @@ import {ClassFeatures} from "./classFeatures.js" export const SW5E = {}; // ASCII Artwork -SW5E.ASCII = `__________________________________________ - _ - | | - ___| |_ __ _ _ ____ ____ _ _ __ ___ -/ __| __/ _\\ | |__\\ \\ /\\ / / _\\ | |__/ __| -\\__ \\ || (_) | | \\ \V \V / (_) | | \\__ \\ -|___/\\__\\__/_|_| \\_/\\_/ \\__/_|_| |___/ -__________________________________________`; +SW5E.ASCII = ` + ___________ ___________ +/ _____/ \\ / \\ ____/ ____ +\\_____ \\\\ \\/\\/ /____ \\_/ __ \\ +/ \\\\ // \\ ___/ +\\______ / \\__/\\ //______ /\\__ > + \\/ \\/ \\/ \\/ `; /** @@ -315,6 +314,7 @@ SW5E.damageResistanceTypes = duplicate(SW5E.damageTypes); /* -------------------------------------------- */ + // armor Types SW5E.armorPropertiesTypes = { "Absorptive": "SW5E.ArmorProperAbsorptive", @@ -349,6 +349,19 @@ SW5E.armorPropertiesTypes = { "Versatile": "SW5E.ArmorProperVersatile" }; +/** + * The valid units of measure for movement distances in the game system. + * By default this uses the imperial units of feet and miles. + * @type {Object} + */ +SW5E.movementTypes = { + "burrow": "SW5E.MovementBurrow", + "climb": "SW5E.MovementClimb", + "fly": "SW5E.MovementFly", + "swim": "SW5E.MovementSwim", + "walk": "SW5E.MovementWalk", +} + /** * The valid units of measure for movement distances in the game system. * By default this uses the imperial units of feet and miles. diff --git a/module/item/entity.js b/module/item/entity.js index fc76affe..a1b64f0c 100644 --- a/module/item/entity.js +++ b/module/item/entity.js @@ -1,6 +1,5 @@ import {simplifyRollFormula, d20Roll, damageRoll} from "../dice.js"; import AbilityUseDialog from "../apps/ability-use-dialog.js"; -import AbilityTemplate from "../pixi/ability-template.js"; /** * Override and extend the basic :class:`Item` implementation @@ -419,7 +418,7 @@ export default class Item5e extends Item { // Handle power upcasting if ( requirePowerSlot ) { const slotLevel = configuration.level; - const powerLevel = slotLevel === "pact" ? actor.data.data.powerss.pact.level : parseInt(slotLevel); + const powerLevel = slotLevel === "pact" ? actor.data.data.powers.pact.level : parseInt(slotLevel); if (powerLevel !== id.level) { const upcastData = mergeObject(this.data, {"data.level": powerLevel}, {inplace: false}); item = this.constructor.createOwned(upcastData, actor); // Replace the item with an upcast version @@ -898,6 +897,7 @@ export default class Item5e extends Item { * Place a damage roll using an item (weapon, feat, power, or equipment) * Rely upon the damageRoll logic for the core implementation. * @param {MouseEvent} [event] An event which triggered this roll, if any + * @param {boolean} [critical] Should damage be rolled as a critical hit? * @param {number} [powerLevel] If the item is a power, override the level for damage scaling * @param {boolean} [versatile] If the item is a weapon, roll damage using the versatile formula * @param {object} [options] Additional options passed to the damageRoll function @@ -942,9 +942,9 @@ export default class Item5e extends Item { // Scale damage from up-casting powers if ( (this.data.type === "power") ) { - if ( (itemData.scaling.mode === "cantrip") ) { + if ( (itemData.scaling.mode === "atwill") ) { const level = this.actor.data.type === "character" ? actorData.details.level : actorData.details.powerLevel; - this._scaleCantripDamage(parts, itemData.scaling.formula, level, rollData); + this._scaleAtWillDamage(parts, itemData.scaling.formula, level, rollData); } else if ( powerLevel && (itemData.scaling.mode === "level") && itemData.scaling.formula ) { const scaling = itemData.scaling.formula; diff --git a/module/item/sheet.js b/module/item/sheet.js index fc13c5e0..d01cf51f 100644 --- a/module/item/sheet.js +++ b/module/item/sheet.js @@ -61,6 +61,9 @@ export default class ItemSheet5e extends ItemSheet { data.isFlatDC = getProperty(data.item.data, "save.scaling") === "flat"; data.isLine = ["line", "wall"].includes(data.item.data.target?.type); + // Original maximum uses formula + if ( this.item._data.data?.uses?.max ) data.data.uses.max = this.item._data.data.uses.max; + // Vehicles data.isCrewed = data.item.data.activation?.type === 'crew'; data.isMountable = this._isItemMountable(data.item); @@ -91,7 +94,7 @@ export default class ItemSheet5e extends ItemSheet { ammo[i.id] = `${i.name} (${i.data.data.quantity})`; } return ammo; - }, {}); + }, {[item._id]: `${item.name} (${item.data.quantity})`}); } // Attributes @@ -335,7 +338,7 @@ export default class ItemSheet5e extends ItemSheet { // Render the Trait Selector dialog new TraitSelector(this.item, { - name: a.dataset.edit, + name: a.dataset.target, title: label.innerText, choices: Object.entries(CONFIG.SW5E.skills).reduce((obj, e) => { if ( choices.includes(e[0] ) ) obj[e[0]] = e[1]; diff --git a/module/migration.js b/module/migration.js index 2e19c076..b627e0e3 100644 --- a/module/migration.js +++ b/module/migration.js @@ -127,7 +127,6 @@ export const migrateActorData = function(actor) { const updateData = {}; // Actor Data Updates - _migrateActorBonuses(actor, updateData); _migrateActorMovement(actor, updateData); _migrateActorSenses(actor, updateData); @@ -229,28 +228,14 @@ export const migrateSceneData = function(scene) { /* Low level migration utilities /* -------------------------------------------- */ -/** - * Migrate the actor bonuses object - * @private - */ -function _migrateActorBonuses(actor, updateData) { - const b = game.system.model.Actor.character.bonuses; - for ( let k of Object.keys(actor.data.bonuses || {}) ) { - if ( k in b ) updateData[`data.bonuses.${k}`] = b[k]; - else updateData[`data.bonuses.-=${k}`] = null; - } -} - -/* -------------------------------------------- */ - /** * Migrate the actor speed string to movement object * @private */ function _migrateActorMovement(actor, updateData) { const ad = actor.data; - const old = ad?.attributes?.speed?.value; - if ( old === undefined ) return; + const old = actor.type === 'vehicle' ? ad?.attributes?.speed : ad?.attributes?.speed?.value; + if ( typeof old !== "string" ) return; const s = (old || "").split(" "); if ( s.length > 0 ) updateData["data.attributes.movement.walk"] = Number.isNumeric(s[0]) ? parseInt(s[0]) : null; updateData["data.attributes.-=speed"] = null; @@ -302,7 +287,7 @@ function _migrateActorSenses(actor, updateData) { */ function _migrateItemAttunement(item, updateData) { if ( item.data.attuned === undefined ) return; - updateData["data.attunement"] = 0; + updateData["data.attunement"] = CONFIG.SW5E.attunementTypes.NONE; updateData["data.-=attuned"] = null; return updateData; } diff --git a/module/pixi/ability-template.js b/module/pixi/ability-template.js index e594319d..702343b2 100644 --- a/module/pixi/ability-template.js +++ b/module/pixi/ability-template.js @@ -29,8 +29,8 @@ export default class AbilityTemplate extends MeasuredTemplate { // Additional type-specific data switch ( templateShape ) { - case "cone": // 5e cone RAW should be 53.13 degrees - templateData.angle = 53.13; + case "cone": + templateData.angle = CONFIG.MeasuredTemplate.defaults.angle; break; case "rect": // 5e rectangular AoEs are always cubes templateData.distance = Math.hypot(target.value, target.value); diff --git a/packs/packs/species.db b/packs/packs/species.db index 7e03e4d4..8a8b39a4 100644 --- a/packs/packs/species.db +++ b/packs/packs/species.db @@ -42,9 +42,9 @@ {"_id":"Ka28NJkuuU4olwBu","name":"Geonosian","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

Geonosians have a hard chitin exoskeleton that provided protection from physical impacts and bouts of radiation that occasionally shower their world. Geonosians are strong despite their thin builds, and are capable of constructing massive hives and factories in concert. The head of a Geonosian is elongated and large with their skulls ridged on the top and by the side where they have bulbous, thick-lidded eyes. Both are physically strong and covered with bony ridges which protected their arms, legs, and vital organs.

Society and Culture

Geonosian society is caste-based with little upward mobility, though some of the lower caste do develop ambition. Workers are conditioned to loathe even the concept of separation from their hive and the system of control. A low-ranking worker's normal life is one of endless toil and labor to satisfy the aristocracy, who are known to make spectacular demands. The warrior caste tend to be highly competitive and are eager to prove themselves. They are born with an abnormal level of intelligence, and one of their only hopes of escape from their rigid duty is entering voluntarily into gladiatorial combat. Should they survive, they are granted freedom. Ultimately, their society exist to benefit those few members that reside in the upper caste. Members of the aristocratic classes are known to be ambitious, domineering, and manipulative. They constantly move towards improving their standing and holdings while sumultaneously working to ruin their rivals.

Names

Geonosian names are usually harsh sounding. Lower castes don't get surnames. Upper caste surnames are familial.

  Male Names. Buck, Goshey, Nik, Sozz, Techtu

  Female Names. Datte, Kida, Miri, Nare, Tenessi

  Surnames. Chak, Hor, Lur, Marpes, Zol","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. You Dexterity score increases by 2, and your Constitution or Intelligence score increases by 1.

Age. Geonosians reach adulthood at 10 and live less than a century.

Alignment. Geonosians' greedy and self-serving nature causes them to tend toward the dark side, though there are exceptions.

Size. Geonosians typically stand from 5 to 6 feet tall and rarely weigh more than 80 lbs. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Crafter. Geonosian culture promotes artisanry. You have proficiency in one set of artisan's tools of your choice.

Exoskeleton. You have a thick exoskeleton. While you are unarmored or wearing light armor, your AC is 12 + your Dexterity modifier.

Flight. You have a flying speed of 30 feet. To use this speed, you can't be wearing medium or heavy armor.

Geonosian Weaponry. You have proficiency in simple blasters.

Languages. You can speak, read, and write Galactic Basic and Geonosian. The Geonosian language consists of click consonants through use of a Geonosians' dual mandibles. This makes it difficult for other species to learn to speak it.

"},"skinColorOptions":{"value":"Gray, green, or orange"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Hive-based, winged semi-insectoids"},"heightAverage":{"value":"5'5\""},"heightRollMod":{"value":"+2d4\""},"weightAverage":{"value":"60 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Geonosis"},"slanguage":{"value":"Geonosian"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Geonosian","mode":"=","targetSpecific":false,"id":1,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.dex.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":3,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":4,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"12","mode":"=","targetSpecific":false,"id":5,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.attributes.movement.fly","value":"30","mode":"=","targetSpecific":false,"id":6,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[],"label":"Attributes Speed Special"},{"modSpecKey":"data.traits.weaponProf.custom","value":"simple blasters","mode":"+","targetSpecific":false,"id":7,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[],"label":"Traits Weapon Prof. Custom"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"geonosian","mode":"+","targetSpecific":false,"id":9,"itemId":"WBiaOzIzielpRhTw","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Geonosian.webp","effects":[{"_id":"pjSHHuM2UzrJ1wY8","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Geonosian","mode":5,"priority":5},{"key":"data.abilities.dex.value","value":2,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.attributes.ac.value","value":"12+@abilities.dex.mod","mode":5,"priority":1},{"key":"data.attributes.movement.fly","value":30,"mode":5,"priority":5},{"key":"data.traits.weaponProf.custom","value":"simple blasters","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"geonosian","mode":0,"priority":0}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Geonosian.webp","label":"Geonosian","tint":"","transfer":true}]} {"_id":"L4V0Gj83vTUPnRCZ","name":"Ardennian","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

\n

Ardennians are sentient humanoid simians hailing from the tropical paradise of Ardennia. They are covered in fur from head to their wrists and ankles, with brown and grey being the most common fur colors. Ardennians sport four arms and prehensile feet. All six of their limbs are equally dexterous.

\n

Society and Culture

\n

The Ardennian people themselves are a friendly communal species that are well known for welcoming visitors and inviting newcomers to traditional feasts and dances on the sandy beaches of Ardennia. Rural Ardiennan's live in modern tree-villages in the thick, dim jungle canopy on the majority of the islands. Ground level accommodations are available for off world visitors even in the smaller villages. Most off-worlders stay in the large modern resort complexes which boast having miles of private beaches or in the modern cities. Several large cities exist, scattered around the world, which typically encompass an entire island or a series of smaller islands joined together.

\n

Ardennia's distance from the main hyperlanes makes it one of the lesser-known vacation destinations, but it's a popular one for those who don't mind the extra travel time. Some affluent visitors prefer the solitude that Ardennia offers, and occasionally end up purchasing one of the smaller islands to build their own home. Ardennia is notable for having the most beach per square meter in the galaxy.

\n

Names

\n

Ardennians' names are typically concise and rarely more than two syllables, with a familal surname.

\n

  Male Names. Rio, Jakar, Hul, Lup, Quil, Jerno

\n

  Female Names. Rac, Bras, Nuc, Kua, Karta, Sanya

\n

  Surnames. Betal, Durant, Jabut, Karon, Rambuan

","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Dexterity score increases by 2, and your Charisma score increases by 1.

Age. Ardennians reach adulthood in their late teens and live less than a century.

Alignment. Ardennians' peaceful nature causes them to tend toward the light side, though there are exceptions.

Size. Ardennians typically stand 4 to 4 and a half feet tall and weigh around 60 lbs. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Darkvision. You have a keen eyesight, especially in the dark. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can't discern color in darkness, only shades of gray.

Four-Armed. Ardennians have four arms which they can use independently of one another. You can only gain the benefit of items held by two of your arms at any given time, and once per round you can switch which arms you are benefiting from (no action required).

Jungle Dweller. Growing up in the tree-villages of Ardennia has left an impact. You don't treat jungle terrain as difficult terrain.

Mask of the Wild. You can attempt to hide even when you are only lightly obscured by foliage, heavy rain, falling snow, mist, and other natural phenomena.

Prehensile Feet. You have supreme control over your feet and can use them to manipulate objects as well as your hands.

Strong-Legged. When you make a long jump, you can cover a number of feet up to twice your Strength score. When you make a high jump, you can leap a number of feet up into the air equal to 3 + twice your Strength modifier.

Treeclimber. You have a climbing speed of 25 feet. You have advantage on Strength saving throws and Strength (Athletics) checks that involve climbing.

Languages. You can speak, read, and write Galactic Basic and Ardennian. Ardennian has a bubbly, energizing tone to it.

"},"skinColorOptions":{"value":"Brown or black"},"hairColorOptions":{"value":"Brown to gray"},"eyeColorOptions":{"value":"Brown or black"},"distinctions":{"value":"Four arms, fur-covered, prehensile feet"},"heightAverage":{"value":"3'2\""},"heightRollMod":{"value":"+2d8\""},"weightAverage":{"value":"50 lb."},"weightRollMod":{"value":"x1 lb."},"homeworld":{"value":"Ardennia"},"slanguage":{"value":"Adrennian"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Ardennian","mode":"=","targetSpecific":false,"id":1,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.dex.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.traits.senses","value":"Darkvision (60 ft.)","mode":"+","targetSpecific":false,"id":6,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Traits Senses"},{"modSpecKey":"data.attributes.movement.climb","value":"25","mode":"+","targetSpecific":false,"id":7,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Attributes Speed Special"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[],"label":"Traits Language"},{"modSpecKey":"data.traits.languages.value","value":"ardennian","mode":"+","targetSpecific":false,"id":9,"itemId":"N0nQEW5WU61tfyIg","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Ardennian.webp","effects":[{"_id":"abUBIqj4EjIoc7yP","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Ardennian","mode":5,"priority":5},{"key":"data.abilities.dex.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.cha.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.traits.senses","value":"Darkvision (60 ft.)","mode":2,"priority":20},{"key":"data.attributes.movement.climb","value":25,"mode":5,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"ardennian","mode":0,"priority":0},{"key":"flags.sw5e.maskOfTheWild","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.strongLegged","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.extraArms","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Ardennian.webp","label":"Ardennian","tint":"","transfer":true}]} {"_id":"LFw4fu1bKYufZDr2","name":"Gran","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

Gran can easily be identified by their three eyes and their goat-like snout. Female Gran also have three breasts. They have excellent vision, able to resolve more colors than most species, and even able to see into the infrared, thus they are able to sense one another's emotions and disposition by noting subtle changes in body heat and skin color. Gran have two stomachs, having evolved from herbivorous grazing animals who lived in herds on the mountains and highlands of Kinyen. A single meal can take almost an entire day to finish, after that a Gran does not often need to eat for several days.

Society and Culture

The peaceful nature of Gran society is a reflection of their homeworld, Kinyen. Kinyen boasted large and rolling grasslands and highlands, a dense and beautiful forest, and one of the longest and clearest rivers in the Bes Ber Bikade sector. The beauty of this planet, and the need for primitive Gran to band together for defense against predatory animals, helped the Gran develop strong bonds of home and family in their society. \r\n\r\nThe Grans are also very protective of their families, and were some of the most devoted parents in the galaxy. This is because of their very powerful and sensitive sight, which can sense the emotions of their mates and their children. Gran society maintains its balance by setting up strict career quotas, and making sure young Gran are educated for a specific job that best served his or her talents.

Names

Gran names typically are monosyllabic and accompanied by a surname, which is familial.

  Male Names. Ask, Dree, Ree, Pax, Nic

  Female Names. Yan, Alijia, Meeb, Sir, Zeek

  Surnames. Moe, Leem, Yees, Wix, Naaq","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Constitution score increases by 2, and your Wisdom score increases by 1.

Age. Gran reach adulthood around their late teens and live up to 80 years.

Alignment. Gran highly organized society cause them to tend toward lawful alignments, though there are exceptions..

Size. Gran typically stand between 5 and 6 feet tall and weigh around 170 lbs. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Slow Metabolism. You are able to go a number of days without food equal to 3 + twice your Constitution modifier before suffering exhaustion.

Keen Sight. Through use of infrared vision, you have advantage on Wisdom (Perception) checks that rely on sight.

Reader of Hearts. Through identifying subtle variations in a target's body heat, the Gran are able to better understand their emotions and intentions. You are proficient in the Insight skill.

Toughness. Your hit point maximum increases by 1, and it increases by 1 every time you gain a level.

Languages. You can speak, read, and write Galactic Basic and Gran. It is rare to hear Gran spoken on any world other than Kinyen.

"},"skinColorOptions":{"value":"Blue or tan"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Black, purple"},"distinctions":{"value":"Three eyes and goat-like snout"},"heightAverage":{"value":"4'10\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"115 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Kinyen"},"slanguage":{"value":"Gran"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Gran","mode":"=","targetSpecific":false,"id":1,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.con.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.skills.ins.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"gran","mode":"+","targetSpecific":false,"id":8,"itemId":"uSOMaDF0wbLAz0qi","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Gran.webp","effects":[{"_id":"2cpzxKWagRwrN2wf","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Gran","mode":5,"priority":5},{"key":"data.abilities.con.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.skills.ins.value","value":1,"mode":4,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"gran","mode":0,"priority":0},{"key":"flags.sw5e.toughness","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.keenSenses","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Gran.webp","label":"Gran","tint":"","transfer":true}]} -{"_id":"M0j4gpd1ufV6pFCH","name":"Arcona","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

\n

Arcona have anvil-shaped heads, claws, marble-like eyes, and protective skin. Cona is always hot, and has very little water, but the atmosphere is filled with ammonia vapor. Arcona adapted to this environment by eating the ammonia-converting roots of flora as a source of water. Arcona depended on the ammonia to live and, as a result, arcona living offworld have to take ammonia supplements. Despite their large eyes, arcona have very poor eyesight. Their eyes, made up of thousands of photoreceptors, can not detect fine shapes, only seeing blurry objects. To aid this, they have a small sensory organ between their eyes. Often mistaken for their nose, this organ detects heat patterns from living beings. Thus, arcona can recognize things by its heat pattern.

\n

Arcona are highly susceptible to addiction to spice and common salt, which serves as a hallucinogen with effects resembling that of intoxication. Their eyes shift to gold after prolonged addiction.

\n

Society and Culture

\n

Arcona normally think of themselves not as individuals but as a collective whole. Largely forsaking individuality, they often refer to themselves as “we” even when alone. The arcona live in loose, family-based communities called nests, which are ruled by a Grand Nest. Because arcona are born in nests underground, they obtain a close sense of family living in close quarters with siblings. Males raise the young, since females are typically impulsive thrill-seekers.

\n

Names

\n

Arcona names are quite diverse, named by their fathers in the nest. Surnames are either familial or nest-based.

\n

  Male Names. Bijrik, El, Jat, Kazat, Onalol, Shle

\n

  Female Names. Ak, Cimam, Cuten, He, Madan, Omik

\n

  Surnames. Cheen, -drell, -faxel, Shran, Takonak, -voll

","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Charisma score increases by 2, and your Constitution score increases by 1.

\n

Age. Arcona reach adulthood in their late teens and live for more than a century.

\n

Alignment. Arcona tend toward no particular alignment. They can vary from the chaotic thrillseekers to the orderly lawkeepers. The best and worst are found among them.

\n

Size. Arcona typically stand 5 and a half to 6 and a half feet tall and generally weigh about 140 lbs. Regardless of your position in that range, your size is Medium.

\n

Speed. Your base walking speed is 30 feet.

\n

Claws. Your sharp talons are natural weapons, which you can use to make unarmed strikes. If you hit with them, you deal kinetic damage equal to 1d4 + your Strength modifier.

\n

Clever. You have proficiency in one Intelligence skill of your choice.

\n

Easily Addicted. Arcona are susceptible to spice addiction, and as a result you are taught to identify it from an early age. Additionally, consuming salt can cause them to hallucinate, potentially replicating the effects of spice. Whenever you make an ability check related to identifying salt or spice or seeing whether something contains salt or spice, you have advantage.

\n

Hide. You have a thick hide. When you aren’t wearing armor, your AC is 13 + your Dexterity modifier. Additionally, your thick hide is naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master’s Guide.

\n

Keen Smell. You have advantage on Wisdom (Perception) checks that involve smell.

\n

Reptilian Senses. Whenever you make a Wisdom (Perception) check related to sensing heat, you are considered to have expertise in the Perception skill.

\n

Languages. You can speak, read, and write Galactic Basic and Arconese. Arconese is spoken through complex, guttural squeaks from the back of the throat. However, arcona born and raised in colonies outside of Cona often did not learn Arconese, but the local language instead.

"},"skinColorOptions":{"value":"Ebony to mahogany"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Green, blue, pink, gold when addicted"},"distinctions":{"value":"Flat heads, easily addicted"},"heightAverage":{"value":"5'0\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"95 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Cona"},"slanguage":{"value":"Arconese"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Arcona.webp","effects":[{"_id":"NGgLg9M06MvvWwAh","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Arcona","mode":5,"priority":20},{"key":"data.abilities.cha.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":20},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":20},{"key":"data.attributes.ac.value","value":"13+@abilities.dex.mod","mode":5,"priority":1},{"key":"data.traits.languages.value","value":"arconese","mode":0,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":20},{"key":"flags.sw5e.keenSenses","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Arcona.webp","label":"Arcona","tint":"","transfer":true}]} +{"_id":"M0j4gpd1ufV6pFCH","name":"Arcona","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

\n

Arcona have anvil-shaped heads, claws, marble-like eyes, and protective skin. Cona is always hot, and has very little water, but the atmosphere is filled with ammonia vapor. Arcona adapted to this environment by eating the ammonia-converting roots of flora as a source of water. Arcona depended on the ammonia to live and, as a result, arcona living offworld have to take ammonia supplements. Despite their large eyes, arcona have very poor eyesight. Their eyes, made up of thousands of photoreceptors, can not detect fine shapes, only seeing blurry objects. To aid this, they have a small sensory organ between their eyes. Often mistaken for their nose, this organ detects heat patterns from living beings. Thus, arcona can recognize things by its heat pattern.

\n

Arcona are highly susceptible to addiction to spice and common salt, which serves as a hallucinogen with effects resembling that of intoxication. Their eyes shift to gold after prolonged addiction.

\n

Society and Culture

\n

Arcona normally think of themselves not as individuals but as a collective whole. Largely forpaking individuality, they often refer to themselves as “we” even when alone. The arcona live in loose, family-based communities called nests, which are ruled by a Grand Nest. Because arcona are born in nests underground, they obtain a close sense of family living in close quarters with siblings. Males raise the young, since females are typically impulsive thrill-seekers.

\n

Names

\n

Arcona names are quite diverse, named by their fathers in the nest. Surnames are either familial or nest-based.

\n

  Male Names. Bijrik, El, Jat, Kazat, Onalol, Shle

\n

  Female Names. Ak, Cimam, Cuten, He, Madan, Omik

\n

  Surnames. Cheen, -drell, -faxel, Shran, Takonak, -voll

","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Charisma score increases by 2, and your Constitution score increases by 1.

\n

Age. Arcona reach adulthood in their late teens and live for more than a century.

\n

Alignment. Arcona tend toward no particular alignment. They can vary from the chaotic thrillseekers to the orderly lawkeepers. The best and worst are found among them.

\n

Size. Arcona typically stand 5 and a half to 6 and a half feet tall and generally weigh about 140 lbs. Regardless of your position in that range, your size is Medium.

\n

Speed. Your base walking speed is 30 feet.

\n

Claws. Your sharp talons are natural weapons, which you can use to make unarmed strikes. If you hit with them, you deal kinetic damage equal to 1d4 + your Strength modifier.

\n

Clever. You have proficiency in one Intelligence skill of your choice.

\n

Easily Addicted. Arcona are susceptible to spice addiction, and as a result you are taught to identify it from an early age. Additionally, consuming salt can cause them to hallucinate, potentially replicating the effects of spice. Whenever you make an ability check related to identifying salt or spice or seeing whether something contains salt or spice, you have advantage.

\n

Hide. You have a thick hide. When you aren’t wearing armor, your AC is 13 + your Dexterity modifier. Additionally, your thick hide is naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master’s Guide.

\n

Keen Smell. You have advantage on Wisdom (Perception) checks that involve smell.

\n

Reptilian Senses. Whenever you make a Wisdom (Perception) check related to sensing heat, you are considered to have expertise in the Perception skill.

\n

Languages. You can speak, read, and write Galactic Basic and Arconese. Arconese is spoken through complex, guttural squeaks from the back of the throat. However, arcona born and raised in colonies outside of Cona often did not learn Arconese, but the local language instead.

"},"skinColorOptions":{"value":"Ebony to mahogany"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Green, blue, pink, gold when addicted"},"distinctions":{"value":"Flat heads, easily addicted"},"heightAverage":{"value":"5'0\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"95 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Cona"},"slanguage":{"value":"Arconese"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Arcona.webp","effects":[{"_id":"NGgLg9M06MvvWwAh","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Arcona","mode":5,"priority":20},{"key":"data.abilities.cha.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":20},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":20},{"key":"data.attributes.ac.value","value":"13+@abilities.dex.mod","mode":5,"priority":1},{"key":"data.traits.languages.value","value":"arconese","mode":0,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":20},{"key":"flags.sw5e.keenSenses","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Arcona.webp","label":"Arcona","tint":"","transfer":true}]} {"_id":"Ml2v48CH0up32k47","name":"Besalisk","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

\n

Male Besalisks' heads sported prominent crests and four arms hung at their sides; females of the species could have as many as eight arms, but like Humans had a primary hand and a limited range of functionality with the others. The addition of the extra appendages required a hearty metabolism, and these bulky beings were able to store food and water for many days, and if the need arose, they could survive for long periods without either. Scruffy sensory whiskers lined the area below their noses, just above the robust wattle most adult Besalisks possessed.

\n

Society and Culture

\n

Because of Ojom's harsh environment, large cities were never developed on the world; instead small communes of about a thousand families claim territories around the world and are each led by an elected leader. The communes have a strict policy of keeping the size of their groupings equal to avoid conflict. When too many families grow in one area, the leader would ask certain families to break away and start a new community on another glacier. While not involved in galactic politics and because they do not produce any of their own technology, the Besalisks established large orbital space stations where offworlders could come to do business. Any violence on these stations is committed by offworlders as Besalisks avoid confrontation and focus on trading and making deals.

\n

Names

\n

Besalisk names are generally words that embody them, with a surname attached to their commune.

\n

  Male Names. Darius, Dexter, Plun, Pong

\n

  Female Names. Delia, Mora, Ren, Teen

\n

  Surnames. Jettster, Kil, Krell, Ugg

","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Strength score increases by 2, and your Wisdom score increases by 1.

Age. Besalisks reach adulthood in their early teens and generally live to be about 70.

Alignment. Besalisks tend toward no particular alignment. The best and worst are found among them.

Size. Besalisks tower over almost all other species, with the smallest standing at 6 feet tall and weighing 200 lbs., and the largest approaching 8 feet tall and 400 lbs. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Four-Armed. Besalisks have four arms which they can use independently of one another. You can only gain the benefit of items held by two of your arms at any given time, and once per round you can switch which arms you are benefiting from (no action required).

Long-Limbed. When you make a melee attack on your turn, your reach for it is 5 feet greater than normal.

Powerful Build. You count as one size larger when determining your carrying capacity and the weight you can push, drag, or lift.

Languages. You can speak, read, and write Galactic Basic and Besalisk.

"},"skinColorOptions":{"value":"Brown or green"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Yellow"},"distinctions":{"value":"Bony headcrest, four arms, inflatable wattle"},"heightAverage":{"value":"6'0\""},"heightRollMod":{"value":"+2d12\""},"weightAverage":{"value":"175 lb."},"weightRollMod":{"value":"x(2d6) lb."},"homeworld":{"value":"Ojom"},"slanguage":{"value":"Besalisk"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Besalisk","mode":"=","targetSpecific":false,"id":1,"itemId":"OfqpLI0sAuyY7h9Q","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.str.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"OfqpLI0sAuyY7h9Q","active":false,"_targets":[],"label":"Abilities Strength"},{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"OfqpLI0sAuyY7h9Q","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"OfqpLI0sAuyY7h9Q","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"OfqpLI0sAuyY7h9Q","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":6,"itemId":"OfqpLI0sAuyY7h9Q","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"besalisk","mode":"+","targetSpecific":false,"id":7,"itemId":"OfqpLI0sAuyY7h9Q","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Besalisk.webp","effects":[{"_id":"Z2nTY93aynxgDvrZ","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Besalisk","mode":5,"priority":5},{"key":"data.abilities.str.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"besalisk","mode":0,"priority":0},{"key":"flags.sw5e.powerfulBuild","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.longlimbed","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.extraArms","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Besalisk.webp","label":"Besalisk","tint":"","transfer":true}]} -{"_id":"OKYCq6BHkYnx5Dhl","name":"Zeltron","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

Zeltrons are one of the few near-human species that differentiated from the baseline stock enough to be considered a new species of the Human genus, rather than simply a subspecies. They possess two biological traits of note. The first is that they all produce potent pheromones, similar to the Falleen species, which enhanced their attractiveness and likeability. The second is a limited telepathic ability, used to project emotions onto others, as well as allowing them to read and even feel the emotions of others; some Zeltrons have been hired by the Exchange for this ability. Because of their telepathic ability, positive emotions such as happiness, love and pleasure are very important to them, while negative ones such as anger, fear, or depression are shunned.

Society and Culture

Zeltron culture is highly influenced by sexuality and the pursuit of pleasure in general. Most of their art and literature is devoted to the subject, producing some of the raciest pieces in the galaxy. Zeltrons are known to dress in wildly colorful or revealing attire. It's common to see Zeltrons wearing shockingly bright shades of neon colors in wildly designed bikinis, or nearly skin tight clothing of other sorts with bizarre color designs, patterns, and symbols.

Names

Zeltron names often have an air of mystique to them, to evoke sensuality. For a Zeltron, a beautiful face is nothing without an equally beautiful name. It's not uncommon for a Zeltron to forsake their familial surname in favor of a more attractive-sounding one.

  Male Names. Marruc, Bahb, Rahulh, Demagol

  Female Names. Lyshaa, Dani, Vianna, Chantique

  Surnames. D'Pow, Blue, Duare, Sapphire","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Charisma score increases by 2, and your Constitution score increases by 1.

Age. Zeltron reach adulthood in their late teens and live about 80 years.

Alignment. Zeltron are a deeply sensual, hedonistic species, causing them to tend toward chaotic balanced or dark side alignments, though there are exceptions.

Size. Zeltron tend to be slender and statuesque, typically standing between 5 and 6 feet tall and rarely weighing more than 150 lb. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Charismatic. You have proficiency with Deception or Persuasion (your choice).

Enthralling Pheromones. You can use your pheromones to influence individuals of both sexes. Whenever you roll a 1 on a Charisma (Persuasion) check, you can reroll the die and must use the new roll. Additionally, once per short or long rest, you can treat a d20 roll of 9 or lower on a Charisma check as a 10. This feature has no effect on droids or constructs.

Natural Empathy. Zeltron's limited telepathy allow them to sense mood shifts in those around them. You have advantage on Wisdom (Insight) checks to determine emotions against humanoids and beasts within 10 feet of you.

Two Livered. Zeltron have two livers, which makes them adept at filtering toxins. You have advantage on saving throws against poison, and you have resistance against poison damage (explained in chapter 9).

Languages. You can speak, read, and write Galactic Basic and one language of your choice.

"},"skinColorOptions":{"value":"Light pink to deep crimson"},"hairColorOptions":{"value":"Blue, brown, pink, or red"},"eyeColorOptions":{"value":"Hazel, silver, amber"},"distinctions":{"value":"Capable of producing powerful pheromones"},"heightAverage":{"value":"4'8\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"90 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Zeltros"},"slanguage":{"value":"Galactic Basic"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Zeltron","mode":"=","targetSpecific":false,"id":1,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.cha.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.traits.dr.value","value":"poison","mode":"+","targetSpecific":false,"id":6,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Zeltron.webp","effects":[{"_id":"67J2jENh3a5uydk3","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Zeltron","mode":5,"priority":5},{"key":"data.abilities.cha.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.traits.dr.value","value":"poison","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"flags.sw5e.enthrallingPheromones","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Zeltron.webp","label":"Zeltron","tint":"","transfer":true}]} +{"_id":"OKYCq6BHkYnx5Dhl","name":"Zeltron","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

Zeltrons are one of the few near-human species that differentiated from the baseline stock enough to be considered a new species of the Human genus, rather than simply a subspecies. They possess two biological traits of note. The first is that they all produce potent pheromones, similar to the Falleen species, which enhanced their attractiveness and likeability. The second is a limited telepathic ability, used to project emotions onto others, as well as allowing them to read and even feel the emotions of others; some Zeltrons have been hired by the Exchange for this ability. Because of their telepathic ability, positive emotions such as happiness, love and pleasure are very important to them, while negative ones such as anger, fear, or depression are shunned.

Society and Culture

Zeltron culture is highly influenced by sexuality and the pursuit of pleasure in general. Most of their art and literature is devoted to the subject, producing some of the raciest pieces in the galaxy. Zeltrons are known to dress in wildly colorful or revealing attire. It's common to see Zeltrons wearing shockingly bright shades of neon colors in wildly designed bikinis, or nearly skin tight clothing of other sorts with bizarre color designs, patterns, and symbols.

Names

Zeltron names often have an air of mystique to them, to evoke sensuality. For a Zeltron, a beautiful face is nothing without an equally beautiful name. It's not uncommon for a Zeltron to forpake their familial surname in favor of a more attractive-sounding one.

  Male Names. Marruc, Bahb, Rahulh, Demagol

  Female Names. Lyshaa, Dani, Vianna, Chantique

  Surnames. D'Pow, Blue, Duare, Sapphire","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Charisma score increases by 2, and your Constitution score increases by 1.

Age. Zeltron reach adulthood in their late teens and live about 80 years.

Alignment. Zeltron are a deeply sensual, hedonistic species, causing them to tend toward chaotic balanced or dark side alignments, though there are exceptions.

Size. Zeltron tend to be slender and statuesque, typically standing between 5 and 6 feet tall and rarely weighing more than 150 lb. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Charismatic. You have proficiency with Deception or Persuasion (your choice).

Enthralling Pheromones. You can use your pheromones to influence individuals of both sexes. Whenever you roll a 1 on a Charisma (Persuasion) check, you can reroll the die and must use the new roll. Additionally, once per short or long rest, you can treat a d20 roll of 9 or lower on a Charisma check as a 10. This feature has no effect on droids or constructs.

Natural Empathy. Zeltron's limited telepathy allow them to sense mood shifts in those around them. You have advantage on Wisdom (Insight) checks to determine emotions against humanoids and beasts within 10 feet of you.

Two Livered. Zeltron have two livers, which makes them adept at filtering toxins. You have advantage on saving throws against poison, and you have resistance against poison damage (explained in chapter 9).

Languages. You can speak, read, and write Galactic Basic and one language of your choice.

"},"skinColorOptions":{"value":"Light pink to deep crimson"},"hairColorOptions":{"value":"Blue, brown, pink, or red"},"eyeColorOptions":{"value":"Hazel, silver, amber"},"distinctions":{"value":"Capable of producing powerful pheromones"},"heightAverage":{"value":"4'8\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"90 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Zeltros"},"slanguage":{"value":"Galactic Basic"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Zeltron","mode":"=","targetSpecific":false,"id":1,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.cha.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.traits.dr.value","value":"poison","mode":"+","targetSpecific":false,"id":6,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Zeltron.webp","effects":[{"_id":"67J2jENh3a5uydk3","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Zeltron","mode":5,"priority":5},{"key":"data.abilities.cha.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.traits.dr.value","value":"poison","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"flags.sw5e.enthrallingPheromones","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Zeltron.webp","label":"Zeltron","tint":"","transfer":true}]} {"_id":"QHVGvW0HeaVzMfin","name":"Chevin","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

\n

Chevin have long snouts which hang down nearly to their ankles. Combined with their intellect, this makes them skilled hunters of animals such as backshin, because they can smell out their prey or feed while keeping their eyes on the horizon. It is also their hunting prowess which allowed them to dominate their homeworld and conquer the Chevs. Chevin have thick legs, massive wide bodies, thin rope-like tails, and arms so long their three-fingered hands often brushed the ground.

\n

Society and Culture

\n

Chevin live in small, mobile communities, with homes mounted on great wheeled carts. Even after they gained access to galactic technology, they continued to live as nomads (though more affluent Chevin mounted their lodges on large repulsorlift vehicles instead.) Their Chev slaves are usually forced to follow on foot. Nomadic groups of Chevin keep in touch via comlinks, and often converge on a single location to deal with danger.

\n

The only Chevin settlements that stay in place for more than one standard month are the Government Villages, where Chevin dictators live with their hand-picked advisors. Even these settlements are movable when necessary. Each of the roughly two dozen Government Villages rules a Chevin nation.

\n

Names

\n

Chevin names do not vary significantly based on gender. Surnames are based on community.

\n

  First Names. Buula, Ephant, Perre, Phylus, Reseros

\n

  Surnames. Meh, Mon, Nen, Needmo, Phrusaani

","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Constitution score increases by 2, and your Wisdom score increases by 1.

Age. Chevin reach adulthood in their thirties and live up to 200 years.

Alignment. Chevin warmongering and slavetrading cause them to tend toward the dark side, though there are exceptions.

Size. Chevin stand between 6 and 8 feet tall and weigh up to 300 lbs. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Hide. You have a thick hide. While you are unarmored or wearing light armor, your AC is 13 + your Dexterity modifier. Additionally, your thick hide is naturally adapted to both hot and cold climates, as described in chapter 5 of the Dungeon Master's Guide.

Keen Hearing. You have advantage on Wisdom (Perception) checks that rely on hearing.

Nomadic. You are proficient in Survival.

Thick Skull. Your skull is a natural weapon, which you can use to make unarmed strikes. If you hit with it, you deal 1d6 + your Strength modifier kinetic damage.

Languages. You can speak, read, and write Galactic Basic and Chevin. The Chevin language is characterized by grunts and low-pitched rumblings. Chevin typically have deep voices, even when speaking Basic.

"},"skinColorOptions":{"value":"Grey"},"hairColorOptions":{"value":"Black, brown, blond, grey, or white (usually with age)"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Stocky build, large heads, long snouts, long arms, three-fingered hands, four-toed feet"},"heightAverage":{"value":"5'9\""},"heightRollMod":{"value":"+2d12\""},"weightAverage":{"value":"170 lb."},"weightRollMod":{"value":"x(2d6) lb."},"homeworld":{"value":"Vinsoth"},"slanguage":{"value":"Chevin"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Chevin","mode":"=","targetSpecific":false,"id":1,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.con.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"13","mode":"=","targetSpecific":false,"id":6,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.skills.sur.value","value":"1","mode":"+","targetSpecific":false,"id":7,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"chevin","mode":"+","targetSpecific":false,"id":9,"itemId":"3SeMWMEHYM8A74qG","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Chevin.webp","effects":[{"_id":"xyKlxEBAGLcMBv2n","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Chevin","mode":5,"priority":5},{"key":"data.abilities.con.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.attributes.ac.value","value":"13+@abilities.dex.mod","mode":5,"priority":1},{"key":"data.skills.sur.value","value":1,"mode":4,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"chevin","mode":0,"priority":0},{"key":"flags.sw5e.keenSenses","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Chevin.webp","label":"Chevin","tint":"","transfer":true}]} {"_id":"QOvjUOUaERMXgOdN","name":"Zygerrian","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

Biology and Appearance

\n

The Zygerrians are a bipedal, sentient humanoid species. Feline in appearance, the species possesses strong, angular features, with long fangs jutting from their jaws and claws extending from their hands. The Zygerrians' faces and their pointed ears are almost entirely covered with fur; males usually have more hair than females, with bands of fur growing on their cheeks. Male Zygerrians also display a number of bony spurs protruding from the chin, which females typically lack. Zygerrians usually have sallow complexions and are physically strong, but some suffer from obesity.

\n

Society and Culture

\n

A warlike species, the Zygerrians hold strength—both physical and mental—in great esteem, viewing it as a means to gain power and authority. They believe that it is the natural order of life for the strong to dominate the weak, so slavery is normal for the species, and a display of weakness could mean death or enslavement in their culture. Those who become their slaves are viewed as inferior by the Zygerrians. Zygerrian society is organized into clans and classes. They have a noble class, many members of which, despite their high status, pursue a career in the military. The Zygerrian government is a monarchy; female rulers hold the title of Queen, and males are addressed as Kings. The center of the Zygerrian society is the Zygerrian Slavers Guild, which focuses on the slave trade in the Outer Rim Territories.

\n

Names

\n

Zygerrian names are rather diverse, though shorter names are the most common. Surnames are familial.

\n

  Male Names. Agruss, Darts, Atai, Sono

\n

  Female Names. Miraj, Faralhi, Latrans, MaDall

\n

  Surnames. D'nar, Molec, Scientel, Thanda, Tyne

","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Charisma score increases by 2, and your Intelligence score increases by 1.

Age. Zygerrians reach adulthood in their late teens and live less than a century.

Alignment. Zygerrian culture's emphasis on subjugation and strength causes them to tend towards chaotic dark side, though there are exceptions.

Size. Zygerrians normally stand between 5 to 6 feet tall and weigh about 140 lbs. Regardless of your position in that range, your size is Medium.

Speed. Your base walking speed is 30 feet.

Acrobatic. You have proficiency in Acrobatics.

Claws. Your unarmed strikes deal 1d4 kinetic damage. You can use your choice of your Strength or Dexterity modifier for the attack and damage rolls. You must use the same modifier for both rolls.

Darkvision. You have a cat's keen senses, especially in the dark. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can't discern color in darkness, only shades of gray.

Notorious Slavers. Whenever you make an ability check related to the buying, selling, or controlling of slaves, you are considered proficient in the check. If you would already be proficient, you instead have expertise.

Reputation for Cruelty. You are proficient in Intimidation, as well as the saberwhip and vibrowhip.

Languages. You can speak, read, and write Galactic Basic and Zygerrian. Zygerrian is characterized by its subtle growls and purrs.

"},"skinColorOptions":{"value":"Light tones"},"hairColorOptions":{"value":"Black, brown, gray, or red"},"eyeColorOptions":{"value":"Blue or yellow"},"distinctions":{"value":"Large pointed ears, clawed hands, fur-covered faces, bony facial spurs"},"heightAverage":{"value":"5'1\""},"heightRollMod":{"value":"+2d8\""},"weightAverage":{"value":"120 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Zygerria"},"slanguage":{"value":"Zygerrian"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"Expanded Content"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Zygerrian","mode":"=","targetSpecific":false,"id":1,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.cha.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.abilities.int.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.skills.acr.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Skills Acrobatics"},{"modSpecKey":"data.traits.senses","value":"Darkvision (60 ft.)","mode":"+","targetSpecific":false,"id":7,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Traits Senses"},{"modSpecKey":"data.skills.itm.value","value":"1","mode":"+","targetSpecific":false,"id":8,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Skills Intimidation"},{"modSpecKey":"data.traits.weaponProf.custom","value":"saberwhip","mode":"+","targetSpecific":false,"id":9,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Traits Weapon Prof. Custom"},{"modSpecKey":"data.traits.weaponProf.custom","value":"vibrowhip","mode":"+","targetSpecific":false,"id":10,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[],"label":"Traits Weapon Prof. Custom"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":11,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"zygerrian","mode":"+","targetSpecific":false,"id":12,"itemId":"6MO90piX6tJOvvqL","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Zygerrian.webp","effects":[{"_id":"zFWMZ7TZhGP32ghr","flags":{"dae":{"transfer":true}},"changes":[{"key":"data.details.species","value":"Zygerrian","mode":5,"priority":5},{"key":"data.abilities.cha.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.int.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.skills.acr.value","value":1,"mode":4,"priority":20},{"key":"data.traits.senses","value":"Darkvision (60 ft.)","mode":2,"priority":20},{"key":"data.skills.itm.value","value":1,"mode":4,"priority":20},{"key":"data.traits.weaponProf.custom","value":"saberwhip","mode":0,"priority":0},{"key":"data.traits.weaponProf.custom","value":"vibrowhip","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"zygerrian","mode":0,"priority":0}],"disabled":false,"duration":{"startTime":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Zygerrian.webp","label":"Zygerrian","tint":"","transfer":true}]} {"_id":"Qhc2eCsVgdnPixsz","name":"Aing-Tii","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"

BIOLOGY AND APPEARANCE

\n

The aing-tii are a species of sentient, toothless mammals who stand on two clawed feet with two spindly arms, each with three large digits. Their bodies are covered in jointed white, bony plates covered in unique painted motifs. The aing-tii head is small and juts out perpendicularly from their chest, featuring two large eyes and six long, thin, green tongues extending from their mouths. They have a long, prehensile tail. The species is incapable of producing sound and conveys information via tasting, smelling and touching each other with their tongues.

\n

SOCIETY AND CULTURE

\n

The aing-tii are native to a planet whose location in the Kathol Rift is a closely guarded secret. Although in a dangerous area of space, the majority of Aing-Tii never leave their homeworld nor have any contact with the outside world. Those who do—commonly called aing-tii warrior monks—are often xenophobic and reclusive. The monks spend their entire lives performing errands for their gods, in the hope that they will receive \"an answer\" from them. The aing-tii hate slavery, and often attack slavers who roam the Kathol Outback.

\n

While the aing-tii are Force-sensitive, they avoid wielding the Force, which they see as sacred. The aing-tii believe that everything is somehow guided by the Force. They do not believe in the light or dark sides of the Force. Instead, they hold that there are many different aspects to the Force.

\n

NAMES

\n

Aing-tii names are, in reality, non-verbal and only truly understandable via taste, smell, and touch. The few aing-tii who have been known to the outside world have used translators to convey an auditory identifier.

\n

  Male Names. Ben'Sur, Looshen'Fel, Tadar'Ro

\n

  Female Names. Kulan'Pa, Laman'So, Te'Nuriel

","chat":"","unidentified":""},"traits":{"value":"

Ability Score Increase. Your Wisdom score increases by 2, and your Constitution score increases by 1.

\n

Age. Aing-tii reach adulthood in their late teens and live more than a century.

\n

Alignment. Aing-tii's foreign nature causes them to be hard to understand. Most aing-tii tend toward neutral light side, though there are exceptions.

\n

Size. Aing-tii typically stand 6 to 7 feet tall and generally weigh about 200 lbs. Regardless of your position in that range, your size is Medium.

\n

Speed. Your base walking speed is 30 feet.

\n

Armored Plates. You have thick armored plates. When you aren't wearing armor, your AC is 13 + your Dexterity modifier.

\n

Closed Mind. Aing-tii have a natural attunement for the Force, which makes them resistant to its powers. You have advantage on Wisdom and Charisma saving throws against force powers.

\n

Force-Sensitive. You know the force push/pull at-will force power. Wisdom or Charisma (your choice) is your forcecasting ability for this power.

\n

Prehensile Tail. You have supreme control over your tail and can use it to manipulate objects as well as your hands.

\n

Wisdom of the Elders. You are proficient in the Lore skill.

\n

Languages. You can understand, read, and write Galactic Basic, and the non-verbal communication of the aing-tii. However, you cannot speak or make noise verbally.

"},"skinColorOptions":{"value":"White"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Force-sensitivity, unique technology, six green tongues"},"heightAverage":{"value":"5'7\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"145 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Aing-Tii homeworld in the Kathol Rift"},"slanguage":{"value":"Non-verbal communication via taste, smell, and touch"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"Ability Score Increase":{"value":"Ability Score Increase"},"Your Wisdom score increases by 2, and your Constitution score increases by 1":{"":{"value":"Your Wisdom score increases by 2, and your Constitution score increases by 1."}},"Age":{"value":"Age"},"Aing-tii reach adulthood in their late teens and live more than a century":{"":{"value":"Aing-tii reach adulthood in their late teens and live more than a century."}},"Alignment":{"value":"Alignment"},"Aing-tii's foreign nature causes them to be hard to understand":{" Most aing-tii tend toward neutral light side, though there are exceptions":{"":{"value":"Aing-tii's foreign nature causes them to be hard to understand. Most aing-tii tend toward neutral light side, though there are exceptions."}}},"Size":{"value":"Size"},"Aing-tii typically stand 6 to 7 feet tall and generally weigh about 200 lbs":{" Regardless of your position in that range, your size is Medium":{"":{"value":"Aing-tii typically stand 6 to 7 feet tall and generally weigh about 200 lbs. Regardless of your position in that range, your size is Medium."}}},"Speed":{"value":"Speed"},"Your base walking speed is 30 feet":{"":{"value":"Your base walking speed is 30 feet."}},"Armored Plates":{"value":"Armored Plates"},"You have thick armored plates":{" When you aren't wearing armor, your AC is 13 + your Dexterity modifier":{"":{"value":"You have thick armored plates. When you aren't wearing armor, your AC is 13 + your Dexterity modifier."}}},"Closed Mind":{"value":"Closed Mind"},"Aing-tii have a natural attunement for the Force, which makes them resistant to its powers":{" You have advantage on Wisdom and Charisma saving throws against force powers":{"":{"value":"Aing-tii have a natural attunement for the Force, which makes them resistant to its powers. You have advantage on Wisdom and Charisma saving throws against force powers."}}},"Force-Sensitive":{"value":"Force-Sensitive"},"You know the force push/pull at-will force power":{" Wisdom or Charisma (your choice) is your forcecasting ability for this power":{"":{"value":"You know the force push/pull at-will force power. Wisdom or Charisma (your choice) is your forcecasting ability for this power."}}},"Prehensile Tail":{"value":"Prehensile Tail"},"You have supreme control over your tail and can use it to manipulate objects as well as your hands":{"":{"value":"You have supreme control over your tail and can use it to manipulate objects as well as your hands."}},"Wisdom of the Elders":{"value":"Wisdom of the Elders"},"You are proficient in the Lore skill":{"":{"value":"You are proficient in the Lore skill."}},"Languages":{"value":"Languages"},"You can understand, read, and write Galactic Basic, and the non-verbal communication of the aing-tii":{" However, you cannot speak or make noise verbally":{"":{"value":"You can understand, read, and write Galactic Basic, and the non-verbal communication of the aing-tii. However, you cannot speak or make noise verbally."}}},"source":"Expanded Content"},"flags":{"dynamiceffects":{"effects":[{"modSpecKey":"data.abilities.wis.value","value":"2","mode":"+","targetSpecific":false,"id":1,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":3,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.skills.lor.value","value":"1","mode":"+","targetSpecific":false,"id":5,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":6,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Traits Language"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":7,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.traits.languages.custom","value":"the non-verbal communication of the Aing-Tii","mode":"+","targetSpecific":false,"id":8,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Traits Language Custom"},{"modSpecKey":"data.details.species","value":"Aing-Tii","mode":"=","targetSpecific":false,"id":9,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.attributes.ac.min","value":"13","mode":"=","targetSpecific":false,"id":10,"itemId":"BvV56gDIilVwLcFE","active":false,"_targets":[],"label":"Attributes Armor Class Min"}],"equipActive":true,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Aing-Tii.webp","effects":[{"_id":"3aUdsUbBSwi6cZH0","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.abilities.wis.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.skills.lor.value","value":1,"mode":4,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.traits.languages.custom","value":"the non-verbal communication of the Aing-Tii","mode":0,"priority":0},{"key":"data.details.species","value":"Aing-Tii","mode":5,"priority":5},{"key":"data.attributes.ac.value","value":"13 + @abilities.dex.mod","mode":5,"priority":1},{"key":"flags.sw5e.closedMind","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Aing-Tii.webp","label":"Aing-Tii","tint":"","transfer":true}]} diff --git a/sw5e copy.css b/sw5e copy.css index 8417ca66..58d9546a 100644 --- a/sw5e copy.css +++ b/sw5e copy.css @@ -1370,7 +1370,7 @@ body { } .sw5e.chat-card .card-footer span { border-right: 2px groove #FFF; - padding: 0 5px 0 0; + padding: 0 3px 0 0; font-size: 10px; } .sw5e.chat-card .card-footer span:last-child { @@ -1784,4 +1784,4 @@ a.entity-link i::before { top: 2px; height: 15px; width: 15px; -} +} diff --git a/sw5e-update.css b/sw5e-update.css index 61dc98c1..c259503a 100644 --- a/sw5e-update.css +++ b/sw5e-update.css @@ -392,7 +392,7 @@ button:focus { } .sw5e.chat-card .card-footer span { border-right: 2px groove #FFF; - padding: 0 4px 0 0; + padding: 0 3px 0 0; font-size: 10px; } .sw5e.chat-card .card-footer span:last-child { diff --git a/sw5e.js b/sw5e.js index a5f8868f..a2c1389d 100644 --- a/sw5e.js +++ b/sw5e.js @@ -44,7 +44,7 @@ import * as migrations from "./module/migration.js"; /* -------------------------------------------- */ Hooks.once("init", function() { - console.log(`SW5e | Initializing Star Wars 5th Edition System\n${SW5E.ASCII}`); + console.log(`SW5e | Initializing SW5E System\n${SW5E.ASCII}`); // Create a SW5E namespace within the game global game.sw5e = { @@ -80,7 +80,10 @@ Hooks.once("init", function() { CONFIG.Actor.entityClass = Actor5e; CONFIG.Item.entityClass = Item5e; CONFIG.time.roundTime = 6; - + + // 5e cone RAW should be 53.13 degrees + CONFIG.MeasuredTemplate.defaults.angle = 53.13; + // Add DND5e namespace for module compatability game.dnd5e = game.sw5e; CONFIG.DND5E = CONFIG.SW5E; @@ -145,7 +148,7 @@ Hooks.once("setup", function() { "abilities", "abilityAbbreviations", "abilityActivationTypes", "abilityConsumptionTypes", "actorSizes", "alignments", "armorProficiencies", "armorPropertiesTypes", "conditionTypes", "consumableTypes", "cover", "currencies", "damageResistanceTypes", "damageTypes", "distanceUnits", "equipmentTypes", "healingTypes", "itemActionTypes", "languages", - "limitedUsePeriods", "movementUnits", "polymorphSettings", "proficiencyLevels", "senses", "skills", + "limitedUsePeriods", "movementTypes", "movementUnits", "polymorphSettings", "proficiencyLevels", "senses", "skills", "powerComponents", "powerLevels", "powerPreparationModes", "powerScalingModes", "powerSchools", "targetTypes", "timePeriods", "toolProficiencies", "weaponProficiencies", "weaponProperties", "weaponTypes" ]; @@ -187,7 +190,7 @@ Hooks.once("ready", function() { // Determine whether a system migration is required and feasible if ( !game.user.isGM ) return; const currentVersion = game.settings.get("sw5e", "systemMigrationVersion"); - const NEEDS_MIGRATION_VERSION = "1.2.0"; + const NEEDS_MIGRATION_VERSION = "1.2.1"; const COMPATIBLE_MIGRATION_VERSION = 0.80; const needsMigration = currentVersion && isNewerVersion(NEEDS_MIGRATION_VERSION, currentVersion); if ( !needsMigration ) return; diff --git a/system.json b/system.json index 630b177c..daa334a3 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "sw5e", "title": "SW 5th Edition", "description": "A comprehensive game system for running games of SW 5th Edition in the Foundry VTT environment.", - "version": "R1-A1", + "version": "1.2.2", "author": "Dev Team", "scripts": [], "esmodules": ["sw5e.js"], diff --git a/template.json b/template.json index e49c592b..84f6021c 100644 --- a/template.json +++ b/template.json @@ -43,6 +43,15 @@ "init": { "value": 0, "bonus": 0 + }, + "movement": { + "burrow": 0, + "climb": 0, + "fly": 0, + "swim": 0, + "walk": 30, + "units": "ft", + "hover": false } }, "details": { @@ -76,15 +85,6 @@ }, "creature": { "attributes": { - "movement": { - "burrow": 0, - "climb": 0, - "fly": 0, - "swim": 0, - "walk": 30, - "units": "ft", - "hover": false - }, "senses": { "darkvision": 0, "blindsight": 0, @@ -94,9 +94,6 @@ "special": "" }, "powercasting": "none", - "speed": { - "_deprecated": true - } }, "details": { "alignment": "", diff --git a/templates/actors/newActor/character-sheet.html b/templates/actors/newActor/character-sheet.html index c2eb7d93..95762cdc 100644 --- a/templates/actors/newActor/character-sheet.html +++ b/templates/actors/newActor/character-sheet.html @@ -6,7 +6,7 @@
-
+
{{ localize "SW5E.Level" }} {{data.details.level}} {{classLabels}}
{{#unless disableExperience}} diff --git a/templates/actors/newActor/npc-sheet.html b/templates/actors/newActor/npc-sheet.html index c5144990..8207fe83 100644 --- a/templates/actors/newActor/npc-sheet.html +++ b/templates/actors/newActor/npc-sheet.html @@ -44,6 +44,7 @@

Hit Points

+

{{ localize "SW5E.Health" }}

/ diff --git a/templates/actors/newActor/parts/swalt-traits.html b/templates/actors/newActor/parts/swalt-traits.html index 96544a56..7ffb16c4 100644 --- a/templates/actors/newActor/parts/swalt-traits.html +++ b/templates/actors/newActor/parts/swalt-traits.html @@ -12,7 +12,7 @@
diff --git a/templates/actors/oldActor/character-sheet.html b/templates/actors/oldActor/character-sheet.html index a28c2261..fe66b89b 100644 --- a/templates/actors/oldActor/character-sheet.html +++ b/templates/actors/oldActor/character-sheet.html @@ -10,7 +10,7 @@