diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 25963a6..75f79c8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,4 +20,6 @@ The workflow for creating and editing macros is as follows: - To edit an existing macro, edit the files in `packs_source/weaponfx.db/.[js|json]` - Then, compile the macro compendium with `npm run db:pack` -You can then copy the module files (or symlink the folder) into your Foundry modules directory to test in-game. +The `weaponfx` pack is the default. To create a macro in a different pack, use `--pack `, for example: `npm run new-effect "My Manual Name" -- --pack weaponfx_manual` + +You can then copy the module files (or symlink the folder) into your Foundry modules directory to test in-game. diff --git a/icons/PinakaArea.png b/icons/PinakaArea.png new file mode 100644 index 0000000..3ab4b94 Binary files /dev/null and b/icons/PinakaArea.png differ diff --git a/icons/SmokeArea.png b/icons/SmokeArea.png new file mode 100644 index 0000000..aca598f Binary files /dev/null and b/icons/SmokeArea.png differ diff --git a/icons/SmokeGrenadeArea.png b/icons/SmokeGrenadeArea.png new file mode 100644 index 0000000..66444a7 Binary files /dev/null and b/icons/SmokeGrenadeArea.png differ diff --git a/icons/bright-explosion.png b/icons/bright-explosion.png new file mode 100644 index 0000000..3020114 Binary files /dev/null and b/icons/bright-explosion.png differ diff --git a/icons/cluster-bomb.png b/icons/cluster-bomb.png new file mode 100644 index 0000000..28f1e8b Binary files /dev/null and b/icons/cluster-bomb.png differ diff --git a/icons/cracked-shield.png b/icons/cracked-shield.png new file mode 100644 index 0000000..d315369 Binary files /dev/null and b/icons/cracked-shield.png differ diff --git a/icons/explosion-rays.png b/icons/explosion-rays.png new file mode 100644 index 0000000..e964017 Binary files /dev/null and b/icons/explosion-rays.png differ diff --git a/icons/front-teeth.png b/icons/front-teeth.png new file mode 100644 index 0000000..331e408 Binary files /dev/null and b/icons/front-teeth.png differ diff --git a/icons/incoming-rocket.png b/icons/incoming-rocket.png new file mode 100644 index 0000000..18929a4 Binary files /dev/null and b/icons/incoming-rocket.png differ diff --git a/icons/mushroom-cloud.png b/icons/mushroom-cloud.png new file mode 100644 index 0000000..e4776a4 Binary files /dev/null and b/icons/mushroom-cloud.png differ diff --git a/icons/nexus.png b/icons/nexus.png new file mode 100644 index 0000000..4194ffe Binary files /dev/null and b/icons/nexus.png differ diff --git a/icons/on-target.png b/icons/on-target.png new file mode 100644 index 0000000..f5ff0c6 Binary files /dev/null and b/icons/on-target.png differ diff --git a/icons/war-pick.png b/icons/war-pick.png new file mode 100644 index 0000000..37ba946 Binary files /dev/null and b/icons/war-pick.png differ diff --git a/jest.config.json b/jest.config.json new file mode 100644 index 0000000..1a17fe6 --- /dev/null +++ b/jest.config.json @@ -0,0 +1,4 @@ +{ + "moduleFileExtensions": ["js"], + "transform": {} +} diff --git a/module.json b/module.json index 950eb67..bfe2100 100644 --- a/module.json +++ b/module.json @@ -15,35 +15,14 @@ "url": "https://github.com/Z3nner/lancer-weapon-fx", "manifest": "https://github.com/Z3nner/lancer-weapon-fx/releases/latest/download/module.json", "download": "https://github.com/Z3nner/lancer-weapon-fx/releases/download/1.6.0/module.zip", + "relationships": { - "requires": [ - { + "requires": { "id": "sequencer", "type": "module", "manifest": "https://github.com/fantasycalendar/FoundryVTT-Sequencer/releases/latest/download/module.json", - "compatibility": { - "minimum": "2.3.7" - } - }, - { - "id": "animated-spell-effects", - "type": "module", - "manifest": "https://github.com/jackkerouac/animated-spell-effects/releases/latest/download/module.json" - }, - { - "id": "animated-spell-effects-cartoon", - "type": "module", - "manifest": "https://github.com/jackkerouac/animated-spell-effects-cartoon/releases/download/latest/module.json", - "compatibility": { - "minimum": "0.2.0" - } - }, - { - "id": "tokenmagic", - "type": "module", - "manifest": "https://raw.githubusercontent.com/Feu-Secret/Tokenmagic/master/tokenmagic/module.json" - } - ] + "compatibility": {"minimum": "2.3.7"} + } }, "languages": [ { @@ -62,6 +41,20 @@ "path": "packs/weaponfx.db", "type": "Macro", "module": "lancer-weapon-fx" + }, + { + "name": "WeaponFXManual", + "label": "Lancer Weapon FX (Manual)", + "path": "packs/weaponfx_manual.db", + "type": "Macro", + "module": "lancer-weapon-fx" + }, + { + "name": "WeaponFXUtility", + "label": "Lancer Weapon FX (Utility)", + "path": "packs/utility.db", + "type": "Macro", + "module": "lancer-weapon-fx" } ] } diff --git a/package-lock.json b/package-lock.json index 559fc9e..8b95c31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,16 +6,3214 @@ "": { "devDependencies": { "commander": "^11.1.0", + "jest": "^29.7.0", "sanitize-filename": "^1.6.3" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001574", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz", + "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { - "node": ">=16" + "node": ">=16" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.623", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.623.tgz", + "integrity": "sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" } }, "node_modules/sanitize-filename": { @@ -27,6 +3225,228 @@ "truncate-utf8-bytes": "^1.0.0" } }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -36,11 +3456,196 @@ "utf8-byte-length": "^1.0.1" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 8f41481..30638c7 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,17 @@ { "type": "module", + "private": true, "scripts": { "db:unpack": "node tooling/unpack-macros.mjs", "db:pack": "node tooling/pack-macros.mjs", - "new-effect": "node tooling/create-new-effect.mjs ", - "test": "npm run test:packs", + "new-effect": "node tooling/create-new-effect.mjs", + "test": "npm run test:packs && npm run test:js", + "test:js": "node --experimental-vm-modules node_modules/jest/bin/jest.js", "test:packs": "npm run db:pack && git diff --no-patch --exit-code packs/weaponfx.db && echo 'Pack test passed!'" }, "devDependencies": { "commander": "^11.1.0", + "jest": "^29.7.0", "sanitize-filename": "^1.6.3" } } diff --git a/packs/utility.db b/packs/utility.db new file mode 100644 index 0000000..c63c0dc --- /dev/null +++ b/packs/utility.db @@ -0,0 +1 @@ +{"name":"Preload LancerWeaponFX","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/loadfx.png","scope":"global","_id":"7DO055aDh1QmVHby","command":"await Sequencer.Preloader.preloadForClients([\"jb2a.arrow.physical.blue\",\n \"jb2a.breath_weapons02.burst.line.fire.orange.01\",\n \"jb2a.breath_weapons02.burst.cone.fire.orange.02\",\n \"jb2a.bolt.physical.orange\",\n \"jb2a.bullet.01.orange\",\n \"jb2a.bullet.02.orange\",\n \"jb2a.bullet.Snipe.blue\",\n \"jb2a.burning_hands.01.orange\",\n \"jb2a.chain_lightning.primary.blue\",\n \"jb2a.claws.400px.red\",\n \"jb2a.dancing_light.purplegreen\",\n \"jb2a.disintegrate.green\",\n \"jb2a.divine_smite.caster.blueyellow\",\n \"jb2a.divine_smite.target.blueyellow\",\n \"jb2a.eldritch_blast.purple\",\n \"jb2a.energy_beam.normal.bluepink.02\",\n \"jb2a.energy_strands.complete.blue.01\",\n \"jb2a.energy_strands.range.multiple.purple.01.30ft\",\n \"jb2a.explosion.01.orange\",\n \"jb2a.explosion.02.blue\",\n \"jb2a.explosion.03.blueyellow\",\n \"jb2a.explosion.04.blue\",\n \"jb2a.fireball.beam.orange\",\n \"jb2a.fireball.explosion.orange\",\n \"jb2a.fire_jet.orange\",\n \"jb2a.fumes.steam.white\",\n \"jb2a.greataxe.melee.standard.white\",\n \"jb2a.healing_generic.400px.green\",\n \"jb2a.impact.004.blue\",\n \"jb2a.impact.blue\",\n \"jb2a.impact.ground_crack.orange\",\n \"jb2a.impact.orange.0\",\n \"jb2a.impact.orange.3\",\n \"jb2a.impact.yellow\",\n \"jb2a.lasershot.blue\",\n \"jb2a.lasershot.green\",\n \"jb2a.lasersword.melee.blue\",\n \"jb2a.lightning_ball.blue\",\n \"jb2a.lightning_bolt.narrow.blue\",\n \"jb2a.magic_missile.purple\",\n \"jb2a.pack_hound_missile\",\n \"jb2a.side_impact.part.smoke.blue\",\n \"jb2a.spear.melee.01.white.2\",\n \"jb2a.static_electricity\",\n \"jb2a.sword.melee.01.white\",\n \"jb2a.template_circle.vortex.loop.blue\",\n \"jb2a.throwable.launch.missile\",\n \"jb2a.toll_the_dead.green.shockwave\",\n \"jb2a.unarmed_strike.physical\",\n \"jb2a.warhammer.melee.01.white.4\",\n \"jb2a.zoning.inward.square.loop.bluegreen.01.01\",\n \"jb2a.zoning.inward.circle.loop\",\n \"modules/lancer-weapon-fx/icons/LatchDrone.png\",\n \"modules/animated-spell-effects/spell-effects/air/black_smoke_RAY_01.webm\",\n \"modules/animated-spell-effects/spell-effects/energy/energy_throw_RAY_10.webm\",\n \"modules/animated-spell-effects/spell-effects/energy/energy_explosion_CIRCLE_05.webm\",\n], true);"} diff --git a/packs/weaponfx.db b/packs/weaponfx.db index 8a2ed78..0a2000d 100644 --- a/packs/weaponfx.db +++ b/packs/weaponfx.db @@ -1,53 +1,59 @@ -{"_id":"RPjF4SvsMP3dolyX","name":"AMR","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/supersonic-bullet.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .filter(\"ColorMatrix\", {hue: 200})\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"_id":"XYVkQ3LALbGc6B7i","name":"Annihilator","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Cantrip/Eldritch_Blast/EldritchBlast_01_Regular_Purple_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.eldritch_blast.purple\")\n .startTime(900)\n .scale(.86)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-4000);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scale(1.0)\n .tint(\"#c91af9\")\n .atLocation(target)\n .waitUntilFinished(-400);\n }\n}\nsequence.play();\n"} -{"_id":"Ui60K7EYoOV23KNM","name":"Apocalypse Rail","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/target-laser.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Load.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .scale(2.0)\n .waitUntilFinished(-300);\n\nif (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.fireball.explosion.orange\")\n .atLocation(target)\n .zIndex(1)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n}\n\nsequence.play();\n"} -{"_id":"jIkBKLXsaxYq0GDS","name":"Apply Smoke Grenade","type":"script","author":"LancerWeaponFX00","img":"icons/svg/acid.svg","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet params =\n [{\n filterType: \"field\",\n filterId: \"mySmokeField\",\n shieldType: 3,\n gridPadding: 2.4,\n color: 0xA9A9A9,\n time: 0,\n blend: 0,\n intensity: 0.4,\n lightAlpha: 0.9,\n lightSize: 0.5,\n scale: 1,\n radius: 1,\n chromatic: false,\n zOrder: 512,\n animated:\n {\n time:\n {\n active: true,\n speed: 0.0015,\n animType: \"move\",\n },\n },\n }];\n\nTokenMagic.addUpdateFilters(sourceToken, params);\n"} -{"name":"ArcBow","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/lightning-bow.png","scope":"global","_id":"SvEgMaioDs6CiqaK","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/ArcBowFire.ogg\")\n .delay(800)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/veil_rifle.ogg\")\n .delay(1200)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.arrow.physical.blue\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.lightning_bolt.narrow.blue\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .delay(800);\n }\n}\nsequence.play();\n"} -{"_id":"R006179gUEan7xqn","name":"Assault Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/ak47.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n .repeats(4, 100)\n .waitUntilFinished();\n}\n\nsequence.play();\n"} -{"_id":"JMFCQVUjBc3QLBpS","name":"AutoPod","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/trefoil-shuriken.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AutoPod_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .effect()\n .file(\"jb2a.template_circle.vortex.loop.blue\")\n .endTime(4700)\n .scale(0.20)\n .tint(\"#787878\")\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished()\n\nif (!targetsMissed.has(target.id)) {\n sequence\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .effect()\n .file(\"jb2a.impact.yellow.1\")\n .scale(.6)\n .atLocation(target)\n}\n\nsequence.play();\n"} -{"name":"Bolt Thrower","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/fast-arrow.png","scope":"global","_id":"6lzGhwqHNYxXY25N","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_fire.ogg\")\n .delay(200)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bolt.physical.orange\")\n .atLocation(sourceToken)\n .startTime(500)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .delay(700)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(target)\n .delay(700)\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"_id":"qfPYlbW1NHKOEJXF","name":"Brood Siblings Molt","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/shining-claw.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.sword.melee.01.white\")\n .tint(\"#080303\")\n .scale(0.8)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .delay(900)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .delay(1000)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(1.2)\n .atLocation(target)\n .delay(1000)\n .waitUntilFinished(-1500);\n }\n}\nsequence.play();\n"} -{"name":"Burst Launcher","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/airburst.png","scope":"global","_id":"EHls7n7amW2fEZ97","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AutoPod_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .effect()\n .file(\"jb2a.lightning_ball.blue\")\n .endTime(1500)\n .scale(0.2)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished();\n\nif (!targetsMissed.has(target.id)) {\n sequence\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AirBurst.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.explosion.02.blue\")\n .scale(0.5)\n .atLocation(target)\n .waitUntilFinished();\n}\n\nsequence.play();\n"} -{"_id":"kozGi0iZPK18rFlI","name":"Charged Blade","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/shining-sword.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.lasersword.melee.blue\")\n .scale(1.1)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .delay(900)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Melee.ogg\")\n .delay(1200)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scale(1.2)\n .atLocation(target)\n .delay(1200)\n .waitUntilFinished(-900);\n }\n}\nsequence.play();\n"} -{"name":"Combat Drill","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/drill.png","scope":"global","_id":"Tyi49hWX1axZsrq2","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nlet gridsize = canvas.grid.grid.options.dimensions.size;\nlet gridscale = gridsize / 100;\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"modules/lancer-weapon-fx/sprites/DRILL.png\")\n .scale(0.6)\n\n .filter(\"Glow\", {color: 0xd7d23c})\n .atLocation(sourceToken)\n .spriteOffset({x: -10 * gridscale, y: 10 * gridscale})\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .moveSpeed(100)\n .rotate(140);\n\n sequence.effect()\n .file(\"jb2a.gust_of_wind.veryfast\")\n .scale(0.2)\n .atLocation(sourceToken)\n .moveTowards(target)\n .zIndex(2)\n .delay(50);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .repeats(8, 125)\n .delay(200);\n\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.yellow\")\n .scale(.4)\n .delay(200)\n .zIndex(1)\n .atLocation(target, {randomOffset: 0.4})\n .repeats(8, 125)\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"_id":"1me7RVE8gdTnu9lk","name":"Cyclone Pulse Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/1st_Level/Magic_Missile/MagicMissile_01_Regular_Purple_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/CPR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(5, 125);\n\n sequence.effect()\n .file(\"jb2a.magic_missile.purple\")\n .filter(\"ColorMatrix\", {hue: 220})\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n .repeats(5, 125)\n .waitUntilFinished(-1600);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/CPR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(5, 125)\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"_id":"XVCMT31Y9x5NgCf6","name":"DD 288","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/punch-blast.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet gridsize = canvas.grid.grid.options.dimensions.size;\nlet gridscale = gridsize / 100;\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.unarmed_strike\")\n .scale(0.8)\n .atLocation(sourceToken)\n .rotateTowards(target)\n .missed(targetsMissed.has(target.id))\n .spriteOffset({x: -170 * gridscale})\n .repeats(6, 200);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .repeats(6, 300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.6));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .delay(300)\n .repeats(5, 300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(0.4)\n .atLocation(target, {randomOffset: 1})\n .repeats(4, 90)\n .delay(1900)\n .waitUntilFinished(-500);\n }\n}\nsequence.play();\n"} -{"_id":"JRAC43fdq4sRWQl8","name":"DefaultMelee","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/mailed-fist.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nlet gridsize = canvas.grid.grid.options.dimensions.size;\nlet gridscale = gridsize / 100;\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.divine_smite.target.blueyellow\")\n .scale(0.8)\n .atLocation(sourceToken)\n .rotateTowards(target)\n .missed(targetsMissed.has(target.id))\n .spriteOffset({x: -160 * gridscale, y: 90 * gridscale})\n .rotate(90);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .delay(300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(0.4)\n .atLocation(target, {randomOffset: 1})\n .repeats(4, 80)\n .delay(700)\n .waitUntilFinished(-1500);\n }\n}\nsequence.play();\n"} -{"_id":"nCYIyBz5RESLVDdt","name":"DefaultTech","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/processor.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\ntargetTokens.forEach(target => {\n let sequence = new Sequence()\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Nexus_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .effect()\n .file(\"jb2a.energy_strands.range.multiple.purple.01.30ft\")\n .scale(1.4)\n .playbackRate(1.5)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-800);\n\n if (!targetsMissed.has(target.id)) {\n sequence\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/PPC2.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.static_electricity.02.blue\")\n .scale(0.5)\n .atLocation(target)\n .waitUntilFinished()\n }\n\n sequence.play();\n});\n"} -{"_id":"nT1EAqOceCXvrRFi","name":"Deploy Smoke Mine","type":"script","author":"LancerWeaponFX00","img":"icons/svg/acid.svg","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet params =\n [{\n filterType: \"field\",\n filterId: \"mySmokeField\",\n shieldType: 3,\n gridPadding: 3.2,\n color: 0xA9A9A9,\n time: 0,\n blend: 0,\n intensity: 0.4,\n lightAlpha: 1,\n lightSize: 0.5,\n scale: 1,\n radius: 1,\n chromatic: false,\n zOrder: 512,\n animated:\n {\n time:\n {\n active: true,\n speed: 0.0015,\n animType: \"move\",\n },\n },\n }];\n\nTokenMagic.addUpdateFilters(sourceToken, params);\n"} -{"_id":"IrU7oILyUlyEecJs","name":"Displacer","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hole.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\nlet scale = 0.1 * target.actor.data.data.derived.mm.Size;\nlet gridsize = canvas.grid.grid.options.dimensions.size;\nlet gridscale = gridsize / 100;\n\nlet sequence = new Sequence()\n\n .sound()\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg\")\n .startTime(900)\n .fadeInAudio(500)\n .effect()\n .file(\"jb2a.dancing_light.purplegreen\")\n .tint(\"#2d0a3d\")\n .endTime(3000)\n .scale(0.40)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(200);\nsequence.effect()\n .file(\"jb2a.fumes.steam.white\")\n .atLocation(sourceToken, {offset: {x: (50 * gridscale), y: (-50 * gridscale)}})\n .scale(scale)\n .scaleOut(3, 6000)\n .opacity(0.8);\n\nif (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerHit1.ogg\")\n .repeats(6, 200)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.6));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .tint(\"#2d0a3d\")\n .scale(0.3)\n .atLocation(target, {randomOffset: 0.9})\n .repeats(6, 200)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerHit2.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .delay(600)\n .effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .tint(\"#2d0a3d\")\n .delay(300)\n .scale(.9)\n .atLocation(target)\n .waitUntilFinished(-1000)\n}\n\nsequence.play();\n"} -{"_id":"uOyi8zHzCseXGQSR","name":"Flamethrower","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/flamethrower-soldier.png","scope":"global","command":"const {sourceToken, targetTokens} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst findCenterOfTargetGroup = function (targetTokens) {\n let total_x = 0;\n let total_y = 0;\n const numTargets = targetTokens.length;\n targetTokens.forEach(t => {\n let center = t.getCenter(t.position.x, t.position.y);\n total_x = total_x + center.x;\n total_y = total_y + center.y;\n });\n return {x: (total_x / numTargets), y: (total_y / numTargets)};\n};\n\nconst target = findCenterOfTargetGroup(targetTokens);\n\nlet sequence = new Sequence()\n .effect()\n .file(\"jb2a.burning_hands.01.orange\")\n .atLocation(sourceToken)\n .rotateTowards(target)\n .scale({x: 0.9, y: 1.2})\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .play();\n"} -{"name":"Flechette Launcher","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/crowned-explosion.png","scope":"global","_id":"4znqR8pQvSs3KpZo","command":"const {sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Flechette.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.explosion.04.blue\")\n .playbackRate(2)\n .atLocation(sourceToken)\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.impact.yellow\")\n .scale(0.5)\n .repeats(6, 20)\n .atLocation(sourceToken, {randomOffset: 2.2})\n .play();\n"} -{"_id":"5B4QaBx52NzRhdum","name":"Fuel Rod Gun","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/radiations.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Load.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.lasershot.green\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .scale(2.0)\n .waitUntilFinished(-300)\nif (!targetsMissed.has(target.id)) {\n sequence\n .effect()\n .file(\"jb2a.toll_the_dead.green.shockwave\")\n .atLocation(target)\n .scale(0.7)\n .zIndex(1)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n}\n\nsequence.play();\n"} -{"_id":"uIr2lCpJWXbDaowG","name":"Hammer","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hammer-drop.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.warhammer.melee.01.white.4\")\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .delay(1300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/HammerImpact.ogg\")\n .delay(1350)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.9));\n sequence.effect()\n .file(\"jb2a.impact.ground_crack.orange\")\n .atLocation(target)\n .scale(0.5)\n .delay(1250)\n .waitUntilFinished(-800);\n }\n}\nsequence.play();\n"} -{"_id":"X6m0372eLE56NK6l","name":"HMG","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/machine-gun.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AssaultCannonFire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.3})\n .missed(targetsMissed.has(target.id))\n .repeats(7, 50)\n .scale(0.5)\n .waitUntilFinished();\n}\n\nsequence.play();\n"} -{"name":"Impact Lance","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/6th_Level/Disintegrate/Disintegrate_01_Regular_Green01_Thumb.webp","scope":"global","_id":"gciDprfhVSDqYDPd","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.disintegrate.green\")\n .startTime(900)\n .scale(.86)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-4000);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scale(1.0)\n .atLocation(target)\n .waitUntilFinished(-400);\n }\n}\nsequence.play();\n"} -{"_id":"eyeOAl8lFp0w3Hfd","name":"Kraul Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/harpoon-chain.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .tint(\"#9d9595\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-1200)\nif (!targetsMissed.has(target.id)) {\n sequence\n .effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n}\n\nsequence.play();\n"} -{"_id":"hWPrLPzlj6Y5RvC5","name":"Lasers","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/LaserShot_01_Regular_Blue_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst random = Sequencer.Helpers.random_float_between(200, 300);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.lasershot.blue\")\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n .repeats(4, random);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Laser_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(4, random);\n\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.blue.2\")\n .atLocation(target, {randomOffset: 0.4})\n .scale(0.8)\n .delay(250)\n .repeats(4, random)\n .waitUntilFinished(-1000);\n }\n}\nsequence.play();\n"} -{"_id":"zf87PAIPccMpxnYn","name":"Latch Drone","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/LatchDrone.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"modules/lancer-weapon-fx/sprites/LatchDrone.png\")\n .rotate(260)\n .atLocation(sourceToken)\n .rotateTowards(target)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .moveSpeed(1200);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Mortar_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .waitUntilFinished()\n if (!targetsMissed.has(target.id)) {\n sequence\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Stabilize.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.9))\n .delay(200)\n .effect()\n .file(\"jb2a.healing_generic.400px.green\")\n .atLocation(target)\n .scale(0.5)\n .delay(200)\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"name":"LockOn","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/crosshair.png","scope":"global","_id":"k5UDriYBR2pnAUjn","command":"const {targetTokens} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n let scale = 0.25 * target.actor.system.derived.mm.Size;\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/LockOn.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8));\n sequence.effect()\n .file(\"jb2a.zoning.inward.square.loop.bluegreen.01.01\")\n .atLocation(target)\n .scale(scale);\n}\n\nsequence.play();\n"} -{"_id":"4M655uuaKwHfZJfZ","name":"Missile","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/missile-swarm.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"modules/animated-spell-effects/spell-effects/air/black_smoke_RAY_01.webm\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .scale({x: 1.0, y: .5})\n .waitUntilFinished(-3700);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(target)\n .scale(1.3)\n .zIndex(1)\n .waitUntilFinished(-1200);\n }\n}\nsequence.play();\n"} -{"_id":"sSGstellhxzWUTXd","name":"Mortar","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/mortar.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"modules/animated-spell-effects-cartoon/spell-effects/cartoon/mix/fire_earth_explosion_SQUARE_02.webm\")\n .atLocation(sourceToken)\n .rotateTowards(target)\n .missed(targetsMissed.has(target.id))\n .scale(0.5);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Mortar_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.explosion.03.blueyellow\")\n .atLocation(target, {randomOffset: true})\n .missed(targetsMissed.has(target.id))\n .repeats(3, 125)\n .delay(900);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Mortar_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(900);\n}\nsequence.play();\n"} -{"_id":"jHll38UQ9hHzwsf3","name":"Nanobot Whip","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/electric-whip.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nlet gridsize = canvas.grid.grid.options.dimensions.size;\nlet gridscale = gridsize / 100;\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.divine_smite.target.blueyellow\")\n .scale(0.8)\n .tint(\"#066605\")\n .atLocation(sourceToken)\n .rotateTowards(target)\n .missed(targetsMissed.has(target.id))\n .spriteOffset({x: -160 * gridscale, y: 90 * gridscale})\n .rotate(90);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .delay(300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(0.4)\n .tint(\"#066605\")\n .atLocation(target, {randomOffset: 1})\n .repeats(4, 80)\n .delay(700)\n .waitUntilFinished(-1500);\n }\n}\nsequence.play();\n"} -{"_id":"Aj3QspxsjcnNjfol","name":"Needle Beam","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/LaserShot_01_Regular_Green_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-1200);\n sequence.effect()\n .file(\"jb2a.lasershot.green\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .repeats(2, 300);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(2, 300);\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n .waitUntilFinished()\n .tint(\"#1aff34\")\n .scale(0.8)\n .delay(400)\n .waitUntilFinished(-1800);\n }\n}\nsequence.play();\n"} -{"_id":"RmFiCRMoSOku7G5g","name":"Nexus","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/nano-bot.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Nexus_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"modules/animated-spell-effects/spell-effects/energy/energy_throw_RAY_10.webm\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .scale({x: 1.0, y: .5})\n .waitUntilFinished(-1300);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Nexus_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.4));\n sequence.effect()\n .file(\"modules/animated-spell-effects/spell-effects/energy/energy_explosion_CIRCLE_05.webm\")\n .atLocation(target)\n .scale(1.3)\n .zIndex(1)\n .waitUntilFinished(-1700);\n }\n}\nsequence.play();\n"} -{"_id":"OSMfNiiu5XtzacAJ","name":"Pistol","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/pistol-gun.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst random = Sequencer.Helpers.random_float_between(200, 500);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/pistol_fire.ogg\")\n .repeats(3, random)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .scale(0.5)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n .repeats(3, random)\n .waitUntilFinished(-600);\n}\nsequence.play();\n"} -{"name":"Plasma Maul","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hammer-drop.png","scope":"global","_id":"gBqPs99uLDUAroZu","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.warhammer.melee.01.white.4\")\n .tint(\"#18f014\")\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .delay(1300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_Hit.ogg\")\n .delay(1550)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scale(1.2)\n .tint(\"#18f014\")\n .atLocation(target)\n .delay(1550)\n .waitUntilFinished(-1000);\n }\n}\nsequence.play();\n"} -{"_id":"noDQfz2lYaqIc1ii","name":"Plasma Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/LaserShot_01_Regular_Green_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.lasershot.green\")\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n .repeats(3, 300);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(3, 300);\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.004.blue\")\n .atLocation(target, {randomOffset: 0.4})\n .tint(\"#1aff34\")\n .scale(0.6)\n .repeats(3, 300)\n .delay(400)\n .waitUntilFinished(-1800);\n }\n}\nsequence.play();\n"} -{"_id":"ui1a07lCGBOk4Rp7","name":"Plasma Talons","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/claw-slashes.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.effect()\n .file(\"jb2a.claws.400px.red\")\n .tint(\"#720d87\")\n .scale(0.8)\n .atLocation(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Melee.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(2, 200);\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.blue.2\")\n .scale(1.5)\n .tint(\"#c91af9\")\n .atLocation(target)\n .delay(600)\n .waitUntilFinished(-1000);\n }\n}\nsequence.play();\n"} -{"_id":"e5XwWrHsiRKrgh7S","name":"Plasma Thrower","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/lightning-flame.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .effect()\n .file(\"jb2a.breath_weapons02.burst.line.fire.orange.01\")\n .atLocation(sourceToken)\n .rotateTowards(target)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .play();\n"} -{"_id":"UL0licrIIu44WXnO","name":"Plasma Torch","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/laserburn.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .effect()\n .file(\"jb2a.fire_jet.orange\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .play();\n"} -{"_id":"oGArtZBtIRBcRHCh","name":"Power Knuckle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/thor-fist.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.unarmed_strike.physical.02.blue\")\n .scale(0.9)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/knuckleswing.ogg\")\n .delay(300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/knucklehit.ogg\")\n .delay(600)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .waitUntilFinished(-100);\n }\n}\nsequence.play();\n"} -{"_id":"LxQMeItXellYRt3b","name":"PPC","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/6th_Level/Chain_Lightning/ChainLightning_01_Regular_Blue_Primary_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/PPC2.ogg\")\n .delay(400)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.chain_lightning.primary.blue\")\n .scale(0.7)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n}\nsequence.play();\n"} -{"name":"Preload LancerWeaponFX","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/loadfx.png","scope":"global","_id":"7DO055aDh1QmVHby","command":"await Sequencer.Preloader.preloadForClients([\"jb2a.arrow.physical.blue\",\n \"jb2a.breath_weapons02.burst.line.fire.orange.01\",\n \"jb2a.bolt.physical.orange\",\n \"jb2a.bullet.01.orange\",\n \"jb2a.bullet.Snipe.blue\",\n \"jb2a.burning_hands.01.orange\",\n \"jb2a.chain_lightning.primary.blue\",\n \"jb2a.claws.400px.red\",\n \"jb2a.dancing_light.purplegreen\",\n \"jb2a.disintegrate.green\",\n \"jb2a.divine_smite.caster.blueyellow\",\n \"jb2a.divine_smite.target.blueyellow\",\n \"jb2a.eldritch_blast.purple\",\n \"jb2a.energy_beam.normal.bluepink.02\",\n \"jb2a.energy_strands.complete.blue.01\",\n \"jb2a.energy_strands.range.multiple.purple.01.30ft\",\n \"jb2a.explosion.01.orange\",\n \"jb2a.explosion.02.blue\",\n \"jb2a.explosion.03.blueyellow\",\n \"jb2a.explosion.04.blue\",\n \"jb2a.fireball.beam.orange\",\n \"jb2a.fireball.explosion.orange\",\n \"jb2a.fire_jet.orange\",\n \"jb2a.fumes.steam.white\",\n \"jb2a.greataxe.melee.standard.white\",\n \"jb2a.healing_generic.400px.green\",\n \"jb2a.impact.004.blue\",\n \"jb2a.impact.blue\",\n \"jb2a.impact.ground_crack.orange\",\n \"jb2a.impact.orange.0\",\n \"jb2a.impact.orange.3\",\n \"jb2a.impact.yellow\",\n \"jb2a.lasershot.blue\",\n \"jb2a.lasershot.green\",\n \"jb2a.lasersword.melee.blue\",\n \"jb2a.lightning_ball.blue\",\n \"jb2a.lightning_bolt.narrow.blue\",\n \"jb2a.magic_missile.purple\",\n \"jb2a.spear.melee.01.white.2\",\n \"jb2a.static_electricity.02.blue\",\n \"jb2a.sword.melee.01.white\",\n \"jb2a.template_circle.vortex.loop.blue\",\n \"jb2a.toll_the_dead.green.shockwave\",\n \"jb2a.unarmed_strike\",\n \"jb2a.warhammer.melee.01.white.4\",\n \"jb2a.zoning.inward.square.loop.bluegreen.01.01\",\n \"modules/lancer-weapon-fx/icons/LatchDrone.png\",\n \"modules/animated-spell-effects/spell-effects/air/black_smoke_RAY_01.webm\",\n \"modules/animated-spell-effects/spell-effects/energy/energy_throw_RAY_10.webm\",\n \"modules/animated-spell-effects/spell-effects/energy/energy_explosion_CIRCLE_05.webm\",\n], true);\n"} -{"name":"Railgun","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/supersonic-bullet.png","scope":"global","_id":"iOD860W9KokfR3Hy","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-500);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"name":"Retort Loop","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Energy/EnergyBeam_02_Regular_BluePink_Thumb.webp","scope":"global","_id":"NbTm6IW88EKyM6sN","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/RetortLoop.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8));\n sequence.effect()\n .file(\"jb2a.energy_beam.normal.bluepink.02\")\n .scale(0.7)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .delay(200);\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(0.3)\n .atLocation(target, {randomOffset: 0.9})\n .repeats(8, 300)\n .delay(500)\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"_id":"NMU9syMKa0dTsINf","name":"Shotgun","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/shotgun-rounds.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor)\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_cycle.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(500);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(800);\n }\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .scale(0.9)\n .stretchTo(target, {randomOffset: 0.7})\n .missed(targetsMissed.has(target.id))\n .repeats(6)\n .delay(500)\n .waitUntilFinished(-100);\n}\nsequence.play();\n"} -{"name":"Slag Cannon","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/rock.png","scope":"global","_id":"OAs6mALoTynun3lM","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\nlet scale = 0.1 * target.actor.system.derived.mm.Size;\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/CPR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .effect()\n .file(\"jb2a.energy_strands.complete.blue.01\")\n .tint(\"#ceb673\")\n .endTime(1500)\n .scale(0.10)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(200);\n\nif (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerHit1.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .repeats(3, 100)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.6));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .tint(\"#ceb673\")\n .scale(0.3)\n .atLocation(target, {randomOffset: 0.9})\n .repeats(3, 100)\n}\n\nsequence.play();\n"} +{"_id":"RPjF4SvsMP3dolyX","name":"AMR","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/supersonic-bullet.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/WeaponClick.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(200)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .filter(\"ColorMatrix\", {hue: 200})\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(75);\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n .delay(75)\n .waitUntilFinished();\n }\n}\nsequence.play();"} +{"_id":"XYVkQ3LALbGc6B7i","name":"Annihilator","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Cantrip/Eldritch_Blast/EldritchBlast_01_Regular_Purple_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.eldritch_blast.purple\")\n .startTime(900)\n .scale(.86)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .name(\"impact\")\n .waitUntilFinished(-4000);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scale(1.0)\n .tint(\"#c91af9\")\n .atLocation(target)\n .waitUntilFinished(-400);\n } else {\n\t\tsequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scale(1.0)\n .tint(\"#c91af9\")\n .atLocation(\"impact\")\n .waitUntilFinished(-400);\n\t}\t\n}\nsequence.play();"} +{"_id":"Ui60K7EYoOV23KNM","name":"Apocalypse Rail","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/target-laser.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Load.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished()\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n\n .effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .scale(2.0)\n .waitUntilFinished(-300);\n\n sequence.effect()\n .file(\"jb2a.fireball.explosion.orange\")\n .atLocation(target)\n .zIndex(1)\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n ;\n\nsequence.play();"} +{"name":"ArcBow","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/lightning-bow.png","scope":"global","_id":"SvEgMaioDs6CiqaK","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst findFarthestTargetOfGroup = function (targetTokens) {\n let farthestToken = null;\n let farthestTokenDistance = 0;\n targetTokens.forEach(t => {\n let distance = canvas.grid.measureDistance(sourceToken, t);\n if (distance > farthestTokenDistance) {\n farthestToken = t;\n farthestTokenDistance = distance;\n }\n });\n\n return farthestToken;\n\t\n};\n\nconst farthest = findFarthestTargetOfGroup(targetTokens);\n\nfunction findNearestTargetOfGroup(targetTokens) {\n let nearestToken = null;\n let nearestTokenDistance = Infinity;\n targetTokens.forEach(n => {\n let distance = canvas.grid.measureDistance(sourceToken, n);\n if (distance < nearestTokenDistance) {\n nearestToken = n;\n nearestTokenDistance = distance;\n }\n });\n return nearestToken;\n};\n\nconst nearest = findNearestTargetOfGroup(targetTokens);\n\t\nconst repeatImpactAnimationForEachTarget = function (sequence, targets) {\n targets.forEach(t => {\n if (!targetsMissed.has(t.id)) {\n sequence.effect()\n .file(\"jb2a.chain_lightning.secondary\")\n .atLocation(farthest)\n .stretchTo(t, {randomOffset: 0.5})\n .delay(800)\n }\n });\n return sequence;\n}\n\n\nlet sequence = new Sequence()\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/ArcBowFire.ogg\")\n .delay(800)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/veil_rifle.ogg\")\n .delay(1200)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.arrow.physical.blue\")\n .atLocation(sourceToken)\n .stretchTo(farthest)\n\t\t.waitUntilFinished(-1000)\n\t.effect()\n .file(\"jb2a.chain_lightning.primary\")\n .atLocation(sourceToken)\n .stretchTo(farthest)\n\t\t.opacity(0.6)\n\t\t.scale(0.6);\n\nsequence = repeatImpactAnimationForEachTarget(sequence, targetTokens);\n\nsequence.play();"} +{"_id":"R006179gUEan7xqn","name":"Assault Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/ak47.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .name(\"impact\")\n .waitUntilFinished(-550);\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(\"impact\", {randomOffset: 0.4, gridUnits: true})\n .repeats(3, 100)\n .waitUntilFinished();\n}\n\nsequence.play();"} +{"_id":"JDu8MtHJgZSjN6TQ","name":"AssimilationMaw","img":"modules/lancer-weapon-fx/icons/front-teeth.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Melee.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bite\")\n .atLocation(target)\n .filter(\"ColorMatrix\", {hue: 270})\n .filter(\"Glow\", {color: 0x8a0303, distance: 2, innerStrength: 2})\n .zIndex(1)\n .opacity(0.7)\n .scaleToObject(3)\n .waitUntilFinished(targetsMissed.has(target.id) ? 0 : -1000);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/HeavyImpact.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .playIf(!targetsMissed.has(target.id))\n .playbackRate(2.2)\n .scaleToObject(1.7)\n .filter(\"Glow\", {color: 0x8a0303, distance: 2, innerStrength: 2})\n .filter(\"ColorMatrix\", {hue: 300})\n .atLocation(target)\n .waitUntilFinished(-1000);\n\n}\nsequence.play();"} +{"_id":"JMFCQVUjBc3QLBpS","name":"AutoPod","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/trefoil-shuriken.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AutoPod_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.template_circle.vortex.loop.blue\")\n .endTime(4700)\n .scale(0.20)\n .tint(\"#787878\")\n .atLocation(sourceToken)\n .moveTowards(target)\n .waitUntilFinished();\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg\")\n .volume(0.7);\n sequence.effect()\n .file(\"jb2a.impact.yellow.1\")\n .scale(.6)\n .atLocation(target);\n}\nsequence.play();"} +{"_id":"DdNSH1DTIsRyJCK9","name":"BattleRifle","img":"modules/lancer-weapon-fx/icons/on-target.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/BR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .duration(933)\n .delay(500)\n .effect()\n .file(\"jb2a.bullet.03.blue\")\n .atLocation(sourceToken)\n .scale(0.7)\n .playbackRate(1.5)\n .stretchTo(target, {randomOffset: 0.6, gridUnits: true})\n .missed(targetsMissed.has(target.id))\n .name('hitLocation${i}')\n .delay(500)\n .waitUntilFinished(-600)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/KineticImpact.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(150)\n .effect()\n .file(\"jb2a.impact.orange.0\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(1.5)\n .atLocation('hitLocation${i}')\n .rotateTowards(sourceToken)\n .rotate(230)\n .delay(150)\n .center();\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/BR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .duration(933)\n .delay(500)\n .effect()\n .file(\"jb2a.bullet.03.blue\")\n .atLocation(sourceToken)\n .scale(0.7)\n .playbackRate(1.5)\n .stretchTo(target, {randomOffset: 0.6, gridUnits: true})\n .missed(targetsMissed.has(target.id))\n .name('hitLocation${i}')\n .delay(500)\n .waitUntilFinished(-600)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/KineticImpact.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(150)\n .effect()\n .file(\"jb2a.impact.orange.0\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(1.5)\n .atLocation('hitLocation${i}')\n .rotateTowards(sourceToken)\n .delay(150)\n .rotate(230)\n .center();\n}\nsequence.play();"} +{"_id":"blc8AUjYhehKKhc5","name":"BlastPick","img":"modules/lancer-weapon-fx/icons/war-pick.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.melee_generic.slash.01.orange\")\n .scaleToObject(4)\n .atLocation(sourceToken)\n .spriteOffset({x: -1.5}, {gridUnits:true})\n .rotateTowards(target)\n .delay(500)\n .missed(targetsMissed.has(target.id))\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .delay(500)\n .waitUntilFinished(-1300);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Mortar_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.explosion.01\")\n .scale(1)\n .zIndex(2)\n .atLocation(target, {randomOffset: 0.5, gridUnits: true})\n sequence.effect()\n .file(\"jb2a.static_electricity.03.blue\")\n .scale(0.4)\n .atLocation(target, {randomOffset: 1, gridUnits: true})\n .repeats(2, 80)\n .waitUntilFinished(-800);\n }\n}\nsequence.play();"} +{"name":"Bolt Thrower","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/fast-arrow.png","scope":"global","_id":"6lzGhwqHNYxXY25N","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_fire.ogg\")\n .delay(200)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bolt.physical.orange\")\n .atLocation(sourceToken)\n .startTime(500)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .name(\"bolt\")\n .waitUntilFinished(-900)\n .effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(\"bolt\");\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .delay(50)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n }\n}\nsequence.play();"} +{"_id":"qfPYlbW1NHKOEJXF","name":"Brood Siblings Molt","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/shining-claw.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.melee_attack.03.trail.greatsword\")\n .tint(\"#080303\")\n\t.filter(\"Glow\", {color: 0x8f0f0f})\n .scaleToObject(4.5)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n\t.waitUntilFinished(-2500);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .delay(500)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n\t.waitUntilFinished(-1350);\n\n if (!targetsMissed.has(target.id)) {\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scaleToObject(2)\n .atLocation(target)\n .waitUntilFinished(-1500);\n }\n}\nsequence.play();"} +{"name":"Burst Launcher","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/airburst.png","scope":"global","_id":"EHls7n7amW2fEZ97","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AutoPod_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .effect()\n .file(\"jb2a.lightning_ball.blue\")\n .endTime(1500)\n .scale(0.2)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished();\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AirBurst.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.explosion.02.blue\")\n .playIf(!targetsMissed.has(target.id))\n .scale(0.5)\n .atLocation(target)\n .waitUntilFinished();\n\nsequence.play();"} +{"_id":"FL83T6qsM9zFOdAQ","name":"CannonAirburst","img":"modules/lancer-weapon-fx/icons/cluster-bomb.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst pTarget = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\n// Calculate the point 60% of the distance between sourceToken and pTarget\nconst pBlast = {\n x: sourceToken.position.x + 0.6 * (pTarget.x - sourceToken.position.x),\n y: sourceToken.position.y + 0.6 * (pTarget.y - sourceToken.position.y),\n};\n\n\nlet sequence = new Sequence()\n\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .from(sourceToken)\n .stretchTo(pBlast)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.08\")\n .atLocation(pBlast)\n .name(\"impact\")\n .scale(0.8)\n .zIndex(1)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Flechette.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\t\t\n\n sequence.effect()\n .file(\"jb2a.bullet.02.orange\")\n .playIf(!targetsMissed.has(target.id))\n .scale(0.5)\n .atLocation(pBlast)\n .stretchTo(target)\n .effect()\n .file(\"jb2a.explosion_side.01\")\n\t.playIf(!targetsMissed.has(target.id))\n .atLocation(target)\n .rotateTowards(pBlast)\n .center()\n .delay(350)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n\t.delay(350);\n}\nsequence.play();"} +{"_id":"kozGi0iZPK18rFlI","name":"Charged Blade","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/shining-sword.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.melee_attack.01.magic_sword.yellow\")\n .filter(\"ColorMatrix\", {hue: 180})\n .delay(500)\n .scaleToObject(4.5)\n .atLocation(sourceToken)\n .moveTowards(target)\n .waitUntilFinished(-1000)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-1450);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Melee.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(2)\n .atLocation(target)\n .waitUntilFinished(-1200);\n}\nsequence.play();"} +{"name":"Combat Drill","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/drill.png","scope":"global","_id":"Tyi49hWX1axZsrq2","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nlet gridsize = canvas.grid.grid.options.dimensions.size;\nlet gridscale = gridsize / 100;\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"modules/lancer-weapon-fx/sprites/DRILL.png\")\n .scale(0.6)\n .filter(\"Glow\", {color: 0xd7d23c})\n .atLocation(sourceToken)\n .spriteOffset({x: -10 * gridscale, y: 10 * gridscale})\n .moveTowards(target)\n\t.missed(targetsMissed.has(target.id))\n .moveSpeed(100)\n .rotate(140)\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .repeats(8, 125)\n .delay(200)\n .effect()\n .file(\"jb2a.gust_of_wind.veryfast\")\n .scale(0.2)\n .atLocation(sourceToken)\n .moveTowards(target)\n\t\t .zIndex(2)\n .delay(50)\n .effect()\n .file(\"jb2a.impact.yellow\")\n .scale(.4)\n .delay(200)\n .zIndex(1)\n .atLocation(target, {randomOffset: 0.4})\n .repeats(8, 125)\n .waitUntilFinished();\n }\n\telse {\n\t sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .repeats(2, 170)\n .delay(200)\n\t\t}\n}\nsequence.play();"} +{"_id":"1me7RVE8gdTnu9lk","name":"Cyclone Pulse Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/1st_Level/Magic_Missile/MagicMissile_01_Regular_Purple_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/CPR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(5, 125);\n\n sequence.effect()\n .file(\"jb2a.magic_missile.purple\")\n .filter(\"ColorMatrix\", {hue: 220})\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n .repeats(5, 125)\n .waitUntilFinished(-1600);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/CPR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(5, 125)\n .waitUntilFinished();\n }\n}\nsequence.play();"} +{"_id":"XVCMT31Y9x5NgCf6","name":"DD 288","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/punch-blast.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n \n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DD288Full.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.6))\n .waitUntilFinished(-3400); \n sequence.effect()\n .file(\"jb2a.unarmed_strike.physical.01.blue\")\n\t.filter(\"ColorMatrix\", {hue: 000, brightness: 0.5})\n .filter(\"Glow\", {distance: 3, color: 0xe99649, innerStrength: 2})\n .atLocation(sourceToken)\n .playbackRate(0.7)\n .scale(8)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .name(\"impact\")\n .waitUntilFinished(-650);\n\n\n sequence.effect()\n .file(\"jb2a.explosion_side.01.orange\")\n .scaleToObject(6)\n .atLocation(\"impact\")\n .rotateTowards(sourceToken)\n .rotate(180)\n .spriteOffset({x: -2.9}, {gridUnits:true})\n .zIndex(1);\n sequence.effect()\n .file(\"jb2a.explosion.side_fracture.flask.01\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(3)\n .atLocation(\"impact\")\n .rotateTowards(sourceToken)\n .rotate(180)\n .delay(200);\n}\nsequence.play();"} +{"_id":"JRAC43fdq4sRWQl8","name":"DefaultMelee","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/mailed-fist.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.melee_generic.slash.01.orange\")\n\n .atLocation(sourceToken)\n .spriteOffset({x: -0.2}, {gridUnits:true})\n .stretchTo(target)\n .delay(500)\n .missed(targetsMissed.has(target.id))\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .delay(500)\n .waitUntilFinished(-1300);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.static_electricity.03.blue\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(0.5)\n .atLocation(target, {randomOffset: 0.8, gridUnits: true})\n .repeats(2, 80)\n .waitUntilFinished(-2200);\n}\nsequence.play();"} +{"_id":"nCYIyBz5RESLVDdt","name":"DefaultTech","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/processor.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\ntargetTokens.forEach(target => {\n let sequence = new Sequence()\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/TechPrepare.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n\n .effect()\n .file(\"jb2a.extras.tmfx.outpulse.circle.02\")\n .scaleToObject(2.5)\n .filter(\"Glow\", {color: 0x36c11a})\n .playbackRate(1.3)\n .atLocation(sourceToken)\n\t .waitUntilFinished(-400)\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/TechWarn.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n\t\t\n .effect()\n .file(\"jb2a.extras.tmfx.inpulse.circle.02\")\n .scaleToObject()\n .repeats (3, 75)\n .playbackRate(1.5)\n .atLocation(target, {randomOffset: 0.7, gridUnits: true})\n .filter(\"Glow\", {color: 0x36c11a})\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished()\t\t\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/NexusConfirm.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .playIf(!targetsMissed.has(target.id))\n .effect()\n .file(\"jb2a.zoning.inward.circle.loop\")\n\t .playIf(!targetsMissed.has(target.id))\n .scale(0.4)\n .fadeOut(3800, {ease: \"easeOutBack\"})\n .belowTokens()\n .atLocation(target)\n .waitUntilFinished(-2200)\n .effect()\n .file(\"jb2a.static_electricity\")\n .scaleToObject(1.1)\n .atLocation(target)\n .playIf(!targetsMissed.has(target.id))\n\n sequence.play();\n\t});"} +{"_id":"IrU7oILyUlyEecJs","name":"Displacer","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hole.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst pTarget = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\nlet sequence = new Sequence()\n\n .sound()\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg\")\n .startTime(900)\n .fadeInAudio(300)\n\n .effect()\n .file(\"jb2a.dancing_light.purplegreen\")\n .tint(\"#2d0a3d\")\n .filter(\"Glow\", {strength: 1, color: 0x34e5d0})\n .endTime(3000)\n .scale(0.40)\n .atLocation(sourceToken)\n .moveTowards(pTarget)\n .waitUntilFinished();\n\n sequence.effect()\n .file(\"jb2a.fumes.steam.white\")\n .fadeIn(1500)\n .fadeOut(1500)\n .atLocation(sourceToken)\n .spriteAnchor({ x: 0.2, y: 1.2 })\n .scaleToObject()\n .opacity(0.7);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerHit2.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8));\n sequence.effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .tint(\"#2d0a3d\")\n .filter(\"Glow\", {strength: 1, color: 0x34e5d0})\n .scale(.9)\n .atLocation(pTarget)\n .waitUntilFinished(-1500);\n\n\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n\n if (!targetsMissed.has(target.id)) {\n\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerHit1.ogg\")\n .repeats(6, 200)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.6));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .tint(\"#2d0a3d\")\n\t.filter(\"Glow\", {strength: 2, color: 0x34e5d0})\n .scaleToObject(2)\n .atLocation(target, {randomOffset: 0.9})\n .repeats(6, 200);\n }\n}\n\nsequence.play();"} +{"_id":"sdz6igpK2LGYTJfY","name":"DisruptorWhip","img":"modules/lancer-weapon-fx/icons/electric-whip.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.divine_smite.target.blueyellow\")\n .scale(0.9)\n .tint(\"#8c0353\")\n .atLocation(sourceToken)\n .moveTowards(target)\n .moveSpeed(175)\n .spriteOffset({x: 0, y: 100, gridUnits: true})\n .missed(targetsMissed.has(target.id))\n .rotate(90)\n .delay(500)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .delay(500)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .delay(800)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.extras.tmfx.outpulse.circle.01.normal\")\n .atLocation(target, {randomOffset: 0.7, gridUnits: true})\n .scaleToObject(1.2)\n .tint(\"#8c0353\")\n .filter(\"Glow\", {color: 0x8a0303, distance: 1})\n .repeats(3,200)\n .playbackRate(2)\n .belowTokens()\n .delay(800)\n \n sequence.effect()\n .file(\"jb2a.impact.001\")\n .scaleToObject(1.2)\n .tint(\"#8c0353\")\n .filter(\"Glow\", {color: 0x8a0303, distance: 1})\n .atLocation(target, {randomOffset: 0.9, gridUnits: true})\n .repeats(6, 120)\n .delay(1200)\n .waitUntilFinished(-1500);\n }\n}\nsequence.play();"} +{"_id":"uOyi8zHzCseXGQSR","name":"Flamethrower","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/flamethrower-soldier.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\nlet sequence = new Sequence()\n .effect()\n .file(\"jb2a.burning_hands.01.orange\")\n .atLocation(sourceToken)\n .rotateTowards(target)\n .scale({x: 0.75, y: 1.0})\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-3000)\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.flames.02.orange\")\n .opacity(0.7)\n .fadeIn(800)\n .fadeOut(800)\n .atLocation(target)\n\t .scaleToObject(1.2);\n }\n}\n sequence.play();"} +{"name":"Flechette Launcher","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/crowned-explosion.png","scope":"global","_id":"4znqR8pQvSs3KpZo","command":"const {sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Flechette.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.explosion.04.blue\")\n .playbackRate(2)\n .atLocation(sourceToken)\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.impact.yellow\")\n .scale(0.5)\n .repeats(6, 20)\n .atLocation(sourceToken, {randomOffset: 2.2, gridUnits: true})\n .play();"} +{"_id":"5B4QaBx52NzRhdum","name":"Fuel Rod Gun","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/radiations.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Load.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.lasershot.green\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .scale(2.0)\n .waitUntilFinished(-300)\nif (!targetsMissed.has(target.id)) {\n sequence\n .effect()\n .file(\"jb2a.toll_the_dead.green.shockwave\")\n .atLocation(target)\n .scale(0.7)\n .zIndex(1)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/APR2_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n}\n\nsequence.play();"} +{"_id":"uIr2lCpJWXbDaowG","name":"Hammer","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hammer-drop.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.warhammer.melee.01.white.4\")\n .atLocation(sourceToken)\n .spriteOffset({x: -0.3}, {gridUnits:true})\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-1400);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .waitUntilFinished(-1800);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/HammerImpact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.9));\n sequence.effect()\n .file(\"jb2a.impact.ground_crack.orange\")\n .atLocation(target)\n .belowTokens()\n .scaleToObject(3)\n .waitUntilFinished(-6000);\n }\n}\nsequence.play();"} +{"_id":"X6m0372eLE56NK6l","name":"HMG","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/machine-gun.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AssaultCannonFire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .name(\"impact\")\n .scale(0.5)\n .waitUntilFinished(-800);\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(\"impact\", {randomOffset: 0.4, gridUnits: true})\n .repeats(7, 50)\n .scale(0.5)\n .waitUntilFinished();\n}\n\nsequence.play();"} +{"name":"Impact Lance","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/6th_Level/Disintegrate/Disintegrate_01_Regular_Green01_Thumb.webp","scope":"global","_id":"gciDprfhVSDqYDPd","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.disintegrate.green\")\n .startTime(900)\n .scale(.86)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-4000)\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));;\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scaleToObject(2)\n .atLocation(target)\n .waitUntilFinished(-400);\n }\n}\nsequence.play();"} +{"_id":"eyeOAl8lFp0w3Hfd","name":"Kraul Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/harpoon-chain.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .tint(\"#9d9595\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-1200)\nif (!targetsMissed.has(target.id)) {\n sequence\n .effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n}\n\nsequence.play();"} +{"_id":"hWPrLPzlj6Y5RvC5","name":"Lasers","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/LaserShot_01_Regular_Blue_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst random = Sequencer.Helpers.random_float_between(200, 300);\n\nlet sequence = new Sequence();\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n\tsequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Laser_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n\t\t.duration(633)\n .repeats(3, random);\n\tsequence.effect()\n .file(\"jb2a.impact.blue.2\")\n\t\t.playIf(!targetsMissed.has(target.id))\n .atLocation(`impact${i}`)\n .scaleToObject(2)\n .repeats(3, random)\n\t\t.delay(300);\n sequence.effect()\n .file(\"jb2a.lasershot.blue\")\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n\t .name(`impact${i}`)\n .repeats(3, random)\n\t\t.waitUntilFinished();\n}\nsequence.play();"} +{"_id":"zf87PAIPccMpxnYn","name":"Latch Drone","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/LatchDrone.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"modules/lancer-weapon-fx/sprites/LatchDrone.png\")\n .rotate(260)\n .atLocation(sourceToken)\n .rotateTowards(target)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .moveSpeed(1200);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Mortar_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .waitUntilFinished()\n if (!targetsMissed.has(target.id)) {\n sequence\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Stabilize.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.9))\n .delay(200)\n .effect()\n .file(\"jb2a.healing_generic.400px.green\")\n .atLocation(target)\n .scale(0.5)\n .delay(200)\n .waitUntilFinished();\n }\n}\nsequence.play();"} +{"_id":"UhdlCUxGv5UJGPQG","name":"Leviathan","img":"modules/lancer-weapon-fx/icons/machine-gun.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Leviathan.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(500)\n .waitUntilFinished(-2100);\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.3})\n .missed(targetsMissed.has(target.id))\n .name(\"impact\")\n .scale(0.5)\n\t.waitUntilFinished(-775)\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .stretchTo(\"impact\", {randomOffset: 0.6, gridUnits: true})\n .repeats(7, 30)\n .scale(0.5)\n .waitUntilFinished();\n}\n\nsequence.play();"} +{"name":"LockOn","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/crosshair.png","scope":"global","_id":"k5UDriYBR2pnAUjn","command":"const {targetTokens} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/LockOn.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8));\n sequence.effect()\n .file(\"jb2a.zoning.inward.square.loop.bluegreen.01.01\")\n .atLocation(target)\n .scaleToObject(1.6);\n}\n\nsequence.play();"} +{"_id":"4M655uuaKwHfZJfZ","name":"Missile","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/missile-swarm.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\n\nlet sequence = new Sequence()\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .timeRange(700, 2000);\n sequence.effect()\n .file(\"jb2a.pack_hound_missile\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .waitUntilFinished(-3200);\n sequence.effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(target)\n .scale(1.2)\n .zIndex(1)\n .waitUntilFinished(-1300);\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n\n }\nsequence.play();"} +{"_id":"nigj4bbJZOVrFf0u","name":"MissilePinaka","img":"modules/lancer-weapon-fx/icons/rocket.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\n// Pinaka wants 2 missiles, so get 2 groups\nconst targetPoints = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 2);\n\nlet sequence = new Sequence();\n\nfor (const targetPoint of targetPoints) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .timeRange(700, 2000);\n sequence.effect()\n .file(\"jb2a.throwable.launch.missile\")\n .atLocation(sourceToken)\n .stretchTo(targetPoint)\n .waitUntilFinished();\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(targetPoint)\n .scale(1.2)\n .zIndex(2);\n sequence.effect()\n .file(\"jb2a.explosion.08.orange\")\n .atLocation(targetPoint)\n .scale(1.2)\n .zIndex(1);\n}\nsequence.play();"} +{"_id":"bfFuD6eL09TcBLIN","name":"Missiles","img":"modules/lancer-weapon-fx/icons/missile-swarm.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .timeRange(700, 2000);\n sequence.effect()\n .file(\"jb2a.pack_hound_missile\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .name(`impact${i}`)\n .waitUntilFinished(-3200);\n sequence.effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(`impact${i}`)\n .scale(0.8)\n .zIndex(1)\n .waitUntilFinished(-1300);\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n\t\t\t.waitUntilFinished(-8000);\n\n }\n}\nsequence.play();"} +{"_id":"sSGstellhxzWUTXd","name":"Mortar","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/mortar.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst centerMass = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\nconst repeatImpactAnimationForEachTarget = function (sequence, targetTokens) {\n targetTokens.forEach(t => {\n if (!targetsMissed.has(t.id)) {\n sequence.effect()\n .file(\"jb2a.explosion_side.01.orange\")\n .atLocation(t)\n .rotateTowards(centerMass)\n .scale(0.7)\n .center()\n }\n });\n return sequence;\n}\n\nlet sequence = new Sequence();\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Mortar_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.smoke.puff.side.02.white\")\n .atLocation(sourceToken)\n .rotateTowards(centerMass)\n .scale({y: 0.5});\n\tsequence.effect()\n .file(\"jb2a.bullet.02.orange\")\n .atLocation(sourceToken)\n .stretchTo(centerMass)\n\t.playbackRate(0.7)\n\t.waitUntilFinished(-650)\n\n sequence.effect()\n .file(\"jb2a.explosion.shrapnel.bomb.01.black\")\n .atLocation(centerMass)\n .scale(0.5);\n sequence.effect()\n .file(\"jb2a.explosion.08.orange\")\n .atLocation(centerMass)\n\t.rotateTowards(sourceToken)\n .rotate(180)\n .center();\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Mortar_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n\nsequence = repeatImpactAnimationForEachTarget(sequence, targetTokens);\n\nsequence.play();"} +{"_id":"jHll38UQ9hHzwsf3","name":"Nanobot Whip","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/electric-whip.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.divine_smite.target.blueyellow\")\n .scale(0.9)\n .tint(\"#066605\")\n .atLocation(sourceToken)\n .moveTowards(target)\n .moveSpeed(175)\n .spriteOffset({x: 0, y: 100, gridUnits: true})\n .missed(targetsMissed.has(target.id))\n .rotate(90)\n .delay(500)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .delay(500)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .delay(800)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(0.5)\n .tint(\"#066605\")\n .atLocation(target, {randomOffset: 1})\n .repeats(4, 80)\n .delay(1200)\n .waitUntilFinished(-1500);\n }\n}\nsequence.play();"} +{"_id":"Aj3QspxsjcnNjfol","name":"Needle Beam","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/LaserShot_01_Regular_Green_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-1200)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(2, 225)\n\n .effect()\n .file(\"jb2a.lasershot.green\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .repeats(2, 225)\n .waitUntilFinished(-350)\n;\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n .tint(\"#1aff34\")\n .scale(0.8);\n }\n}\nsequence.play();"} +{"_id":"RmFiCRMoSOku7G5g","name":"Nexus","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/nano-bot.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst pTarget = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\n// Calculate the point 70% of the distance between sourceToken and pTarget\nconst pBlast = {\n x: sourceToken.position.x + 0.7 * (pTarget.x - sourceToken.position.x),\n y: sourceToken.position.y + 0.7 * (pTarget.y - sourceToken.position.y),\n};\n\n\nlet sequence = new Sequence()\n\n\t.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/NexusReady.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished();\n\tsequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/NexusFire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(3, 150);\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .filter(\"ColorMatrix\", {hue: 070})\n .filter(\"Blur\", {blur: 8, strength: 10, blurX: 4})\n .atLocation(sourceToken)\n .stretchTo(pBlast, {randomOffset: 0.6})\n .repeats(3, 150)\n .waitUntilFinished(-800);\n sequence.effect()\n .file(\"jb2a.side_impact.part.smoke.blue\")\n .filter(\"ColorMatrix\", {hue: 230, brightness: 0.5})\n .scale(0.8)\n .atLocation(pBlast, {randomOffset: 0.1})\n\t.rotateTowards(pTarget)\n .repeats(3, 150)\n .waitUntilFinished(-2200);\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n\n sequence.effect()\n .file(\"jb2a.impact.004.blue\")\n .playIf(!targetsMissed.has(target.id))\n .filter(\"ColorMatrix\", {hue: 235, brightness: 0.5})\n .scale(0.5)\n\t.zIndex(1)\n .atLocation(target, {randomOffset: 0.5, gridUnits: true})\n .repeats(3, 100);\n sequence.effect()\n .file(\"jb2a.zoning.inward.circle.loop\")\n\t.playIf(!targetsMissed.has(target.id))\n .scale(0.4)\n .fadeOut(3800, {ease: \"easeOutBack\"})\n .belowTokens()\n .atLocation(target);\n sequence.sound()\n\t.file(\"modules/lancer-weapon-fx/soundfx/NexusConfirm.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .playIf(!targetsMissed.has(target.id));\n}\nsequence.play();"} +{"_id":"OSMfNiiu5XtzacAJ","name":"Pistol","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/pistol-gun.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst random = Sequencer.Helpers.random_float_between(200, 500);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/pistol_fire.ogg\")\n .repeats(3, random)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .scale(0.5)\n .stretchTo(target, {randomOffset: 0.4})\n .missed(targetsMissed.has(target.id))\n .repeats(3, random)\n .waitUntilFinished(-600);\n}\nsequence.play();"} +{"name":"Plasma Maul","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hammer-drop.png","scope":"global","_id":"gBqPs99uLDUAroZu","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.warhammer.melee.01.white.4\")\n .filter(\"Glow\", {color: 0x18f014, innerStrength: 1.5, knockout: true, quality: 0.1, distance: 50})\n\t.tint(\"#18f014\")\n .atLocation(sourceToken)\n .spriteOffset({x: -0.3}, {gridUnits:true})\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n\t\t.waitUntilFinished(-1400);\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n\t\t.waitUntilFinished(-1800);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/HammerImpact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.9));\n sequence.effect()\n .file(\"jb2a.impact.ground_crack.orange\")\n\t .tint(\"#18f014\")\n .atLocation(target)\n .belowTokens()\n .scaleToObject(3)\n .waitUntilFinished(-6000);\n }\n}\nsequence.play();"} +{"_id":"noDQfz2lYaqIc1ii","name":"Plasma Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/LaserShot_01_Regular_Green_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst random = Sequencer.Helpers.random_float_between(300, 400);\n\nlet sequence = new Sequence();\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .duration(633)\n .repeats(2, random);\n sequence.effect()\n .file(\"jb2a.impact.004.blue\")\n .playIf(!targetsMissed.has(target.id))\n .atLocation(`impact${i}`)\n .tint(\"#1aff34\")\n .scaleToObject(2)\n .repeats(2, random)\n .delay(300)\n .playbackRate(1.5);\n sequence.effect()\n .file(\"jb2a.lasershot.green\")\n .atLocation(sourceToken)\n .stretchTo(target, {randomOffset: 0.3, gridUnits: true})\n .missed(targetsMissed.has(target.id))\n\t.name(`impact${i}`)\n .repeats(2, random)\n .waitUntilFinished();\n\n\n}\nsequence.play();"} +{"_id":"ui1a07lCGBOk4Rp7","name":"Plasma Talons","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/claw-slashes.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n\n sequence.effect()\n .file(\"jb2a.claws.400px.red\")\n .tint(\"#720d87\")\n .scale(0.8)\n .zIndex(1)\n .opacity(0.6)\n .atLocation(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Melee.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .repeats(2, 250);\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.blue.2\")\n .scale(1.0)\n .tint(\"#c91af9\")\n .atLocation(target, {randomOffset:0.1|true})\n .delay(200)\n .repeats(2, 250);\n }\n}\nsequence.play();"} +{"_id":"e5XwWrHsiRKrgh7S","name":"Plasma Thrower","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/lightning-flame.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\nlet sequence = new Sequence()\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n sequence.effect()\n .file(\"jb2a.breath_weapons02.burst.cone.fire.orange.02\")\n .atLocation(sourceToken)\n\t.filter(\"ColorMatrix\", {hue: 270})\n .filter(\"Glow\", {distance: 3, color: 0xe99649, innerStrength: 2})\n .scale({x: 0.9})\n .playbackRate(1.6)\n .rotateTowards(target)\n .waitUntilFinished(-3500);\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.flames.02.orange\")\n\t .filter(\"ColorMatrix\", {hue: 270})\n .filter(\"Glow\", {distance: 3, color: 0xe99649, innerStrength: 2})\n .opacity(0.7)\n .fadeIn(800)\n .fadeOut(800)\n .atLocation(target)\n\t .scaleToObject(1.2);\n }\n}\n sequence.play();"} +{"_id":"UL0licrIIu44WXnO","name":"Plasma Torch","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/laserburn.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .effect()\n .file(\"jb2a.fire_jet.orange\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .play();"} +{"_id":"LxQMeItXellYRt3b","name":"PPC","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/6th_Level/Chain_Lightning/ChainLightning_01_Regular_Blue_Primary_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/PPC2.ogg\")\n .delay(400)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.chain_lightning.primary.blue\")\n .scale(0.7)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n}\nsequence.play();"} +{"name":"Railgun","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/supersonic-bullet.png","scope":"global","_id":"iOD860W9KokfR3Hy","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst findFarthestTargetOfGroup = function (targetTokens) {\n let farthestToken = null;\n let farthestTokenDistance = 0;\n targetTokens.forEach(t => {\n let distance = canvas.grid.measureDistance(sourceToken, t);\n if (distance > farthestTokenDistance) {\n farthestToken = t;\n farthestTokenDistance = distance;\n }\n });\n\n return farthestToken;\n};\n\nconst target = findFarthestTargetOfGroup(targetTokens);\n\nconst repeatImpactAnimationForEachTarget = function (sequence, targets) {\n targets.forEach(t => {\n if (!targetsMissed.has(t.id)) {\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(t)\n .rotateTowards(sourceToken)\n .rotate(230)\n .center()\n }\n });\n return sequence;\n}\n\n\nlet sequence = new Sequence()\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-500);\n\n sequence.effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .atLocation(sourceToken)\n .stretchTo(target)\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n \n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n ;\n\nsequence = repeatImpactAnimationForEachTarget(sequence, targetTokens);\n\nsequence.play();"} +{"name":"Retort Loop","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Energy/EnergyBeam_02_Regular_BluePink_Thumb.webp","scope":"global","_id":"NbTm6IW88EKyM6sN","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/RetortLoop.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8));\n sequence.effect()\n .file(\"jb2a.energy_beam.normal.bluepink.02\")\n .scale(0.7)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .name(\"impact\")\n .delay(200);\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(0.3)\n .atLocation(target, {randomOffset: 0.9})\n .repeats(8, 200)\n .delay(700);\n }\n else {\n sequence.effect()\n .file(\"jb2a.impact.blue\")\n .scale(0.3)\n .atLocation(\"impact\", {randomOffset: 0.9})\n .repeats(8, 200)\n .delay(700);\n }\n}\nsequence.play();"} +{"_id":"POS2lrr0O83sNweN","name":"ShockBaton","img":"modules/lancer-weapon-fx/icons/shining-sword.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.melee_attack.01.magic_sword.yellow\")\n .delay(500)\n .scaleToObject(3)\n .filter(\"ColorMatrix\", {hue: 180})\n .atLocation(sourceToken)\n .moveTowards(target)\n .waitUntilFinished(-1000)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-1450);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Melee.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue.2\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject()\n .atLocation(target, {randomOffset: 0.5, gridUnits:true})\n .waitUntilFinished(-1200);\n sequence.effect()\n .file(\"jb2a.static_electricity.03\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(0.7)\n .atLocation(target, {randomOffset: 0.6, gridUnits: true})\n .repeats(3, 75)\n .waitUntilFinished(-1200);\n}\nsequence.play();"} +{"_id":"NMU9syMKa0dTsINf","name":"Shotgun","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/shotgun-rounds.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor)\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_cycle.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_fire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(500);\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/shotgun_impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .delay(800);\n }\n sequence.effect()\n .file(\"jb2a.bullet.01.orange\")\n .atLocation(sourceToken)\n .scale(0.9)\n .stretchTo(target, {randomOffset: 0.7})\n .missed(targetsMissed.has(target.id))\n .repeats(6)\n .delay(500)\n .waitUntilFinished(-100);\n}\nsequence.play();"} +{"name":"Slag Cannon","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/rock.png","scope":"global","_id":"OAs6mALoTynun3lM","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\nlet sequence = new Sequence()\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/RetortLoop.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n sequence.effect()\n .file(\"jb2a.breath_weapons02.burst.line\")\n .atLocation(sourceToken)\n .filter(\"ColorMatrix\", {hue: 180, brightness: 0.2, contrast: 0.5})\n .filter(\"Glow\", {distance: 0.5, color: 0xd6c194, innerStrength: 2})\n .stretchTo(target)\n .playbackRate(1.5)\n .waitUntilFinished(-3500);\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n\n if (!targetsMissed.has(target.id)) {\n sequence.effect()\n .file(\"jb2a.grease.dark_brown.loop\")\n .opacity(0.8)\n .fadeIn(800)\n .fadeOut(800)\n .atLocation(target, {randomOffset: 2, gridUnits: true})\n .belowTokens()\n .repeats(3)\n .scaleToObject(1);\n }\n}\n sequence.play();"} {"_id":"77szM2o5ThaLsJax","name":"Stabilize","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Healing/HealingAbility_01_Green_Thumb.webp","scope":"global","command":"const {sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Stabilize.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .effect()\n .file(\"jb2a.healing_generic.400px.green\")\n .atLocation(sourceToken)\n .play();\n"} -{"name":"Tachyon Lance","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/Bullet_03_Regular_Blue_Thumb.webp","scope":"global","_id":"BkYGErIuWCVcF4rS","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished();\n\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target, {randomOffset: 0.7})\n .rotateTowards(sourceToken)\n .missed(targetsMissed.has(target.id))\n .repeats(3, 100)\n .rotate(230)\n .center();\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-400);\n}\nsequence.play();\n"} -{"_id":"LixHY6HTrY7D3b7S","name":"Thermal Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/3rd_Level/Fireball/FireballBeam_01_Orange_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Thermal_Rifle_Fire.ogg\")\n .delay(400)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.fireball.beam.orange\")\n .scale(1.25)\n .startTime(1500)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Thermal_Rifle_Hit.ogg\")\n .delay(700)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.orange.3\")\n .atLocation(target)\n .delay(700)\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"_id":"zsccsSD1tOOqRc5Q","name":"Torch","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/axe-swing.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.greataxe.melee.standard.white\")\n .tint(\"#c91af9\")\n .scale(0.8)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .delay(1300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_Hit.ogg\")\n .delay(1550)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .scale(1.2)\n .tint(\"#c91af9\")\n .atLocation(target)\n .delay(1550)\n .waitUntilFinished(-1000);\n }\n}\nsequence.play();\n"} -{"_id":"6vtYP47LXaX5POYB","name":"Veil Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/laser-blast.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .filter(\"ColorMatrix\", {hue: 60})\n .filter(\"Glow\", {distance: 3})\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/veil_rifle.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n}\nsequence.play();\n"} -{"_id":"CqlCKrYyJCYdmLks","name":"War Pike","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/barbed-spear.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.spear.melee.01.white.2\")\n .filter(\"Glow\", {color: 0x8D918D})\n .scale(0.8)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .delay(1000)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .delay(1150)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.orange.3\")\n .scale(0.8)\n .atLocation(target)\n .delay(1100)\n .waitUntilFinished();\n }\n}\nsequence.play();\n"} -{"_id":"jGNjJXWRQMh7jPhA","name":"Warp Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hole.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\nlet scale = 0.1 * target.actor.system.derived.mm.Size;\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .startTime(900)\n .fadeInAudio(500)\n .effect()\n .file(\"jb2a.energy_strands.range.multiple.purple.01\")\n .scale(0.40)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-1100)\n\nif (!targetsMissed.has(target.id)) {\n sequence\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerHit2.ogg\")\n .delay(300)\n .effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .scale(.9)\n .tint(\"#9523e1\")\n .atLocation(target)\n .waitUntilFinished(-1000)\n}\n\nsequence.play();\n"} +{"name":"Tachyon Lance","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/Generic/Weapon_Attacks/Ranged/Bullet_03_Regular_Blue_Thumb.webp","scope":"global","_id":"BkYGErIuWCVcF4rS","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished();\n\n sequence.effect()\n .file(\"jb2a.impact.orange.0\")\n .atLocation(target, {randomOffset: 0.7})\n .rotateTowards(sourceToken)\n .missed(targetsMissed.has(target.id))\n .repeats(3, 100)\n .rotate(230)\n .center();\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Annihilator.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-400);\n}\nsequence.play();"} +{"_id":"hI3KpcI1IYKR43lF","name":"TempestBlade","img":"modules/lancer-weapon-fx/icons/shining-sword.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.melee_attack.01.magic_sword.yellow\")\n .delay(500)\n .scaleToObject(6)\n .filter(\"ColorMatrix\", {hue: 180})\n .atLocation(sourceToken)\n .moveTowards(target)\n .waitUntilFinished(-1000)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .waitUntilFinished(-1450);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Melee.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(2)\n .atLocation(target)\n .waitUntilFinished(-1200);\n sequence.effect()\n .file(\"jb2a.static_electricity.03\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject()\n .atLocation(target, {randomOffset: 0.8, gridUnits: true})\n .repeats(3, 75)\n .opacity(0.8)\n .waitUntilFinished(-1200);\n}\nsequence.play();"} +{"_id":"LixHY6HTrY7D3b7S","name":"Thermal Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/JB2A_DnD5e/Library/3rd_Level/Fireball/FireballBeam_01_Orange_Thumb.webp","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/WeaponBeep.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Thermal_Rifle_Fire.ogg\")\n .delay(400)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.fireball.beam.orange\")\n .scale(1.25)\n .startTime(1500)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Thermal_Rifle_Hit.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .delay(700)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.effect()\n .file(\"jb2a.impact.orange.3\")\n .playIf(!targetsMissed.has(target.id))\n .atLocation(target)\n .delay(700)\n .waitUntilFinished();\n}\nsequence.play();"} +{"_id":"zsccsSD1tOOqRc5Q","name":"Torch","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/axe-swing.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.greataxe.melee.standard.white\")\n .tint(\"#c91af9\")\n .scale(0.8)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-1200)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_swing.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n \n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Axe_Hit.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .delay(275)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.blue.3\")\n .playIf(!targetsMissed.has(target.id))\n .delay(275)\n .scaleToObject(2)\n .tint(\"#c91af9\")\n .atLocation(target)\n .waitUntilFinished(-1000);\n\n}\nsequence.play();"} +{"_id":"6vtYP47LXaX5POYB","name":"Veil Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/laser-blast.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.bullet.Snipe.blue\")\n .filter(\"ColorMatrix\", {hue: 60})\n .filter(\"Glow\", {distance: 3})\n .atLocation(sourceToken)\n .scale(0.8)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/veil_rifle.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n}\nsequence.play();"} +{"_id":"CqlCKrYyJCYdmLks","name":"War Pike","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/barbed-spear.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.spear.melee.01.white.2\")\n .filter(\"Glow\", {color: 0x5f5858, innerStrength: 2, knockout: true, distance: 20})\n .scale(0.8)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladeswing.ogg\")\n .delay(950)\n .endTime(600)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n\t.waitUntilFinished(-800);\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/bladehit.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n sequence.effect()\n .file(\"jb2a.impact.orange.3\")\n .playIf(!targetsMissed.has(target.id))\n .scaleToObject(2)\n .atLocation(target)\n .waitUntilFinished();\n}\nsequence.play();"} +{"_id":"jGNjJXWRQMh7jPhA","name":"Warp Rifle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/hole.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nlet sequence = new Sequence()\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .startTime(900)\n .fadeInAudio(500)\n .effect()\n .file(\"jb2a.energy_strands.range.multiple.purple.01\")\n .scale(0.40)\n .atLocation(sourceToken)\n .stretchTo(target)\n .missed(targetsMissed.has(target.id))\n .waitUntilFinished(-1100)\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/DisplacerHit2.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .delay(300)\n .effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .scaleToObject(3)\n .tint(\"#9523e1\")\n .filter(\"Glow\", {color: 0xffffff, distance: 1})\n .atLocation(target)\n .waitUntilFinished(-1000)\n\nsequence.play();"} diff --git a/packs/weaponfx_manual.db b/packs/weaponfx_manual.db new file mode 100644 index 0000000..10b63fd --- /dev/null +++ b/packs/weaponfx_manual.db @@ -0,0 +1,14 @@ +{"_id":"LGPQdA8CUpcw5wNR","name":"AegisDefenseNet","img":"icons/svg/ice-shield.svg","type":"script","scope":"global","author":"LancerWeaponFX00","command":"//This macro is not linked to any weapon or system and must be applied manually. It can be removed with the accompanying 'EndDefenseNet' macro, or through the Sequencer Manager\n\nnew Sequence()\n\t.effect(\"jb2a.shield.01.intro\")\n .atLocation(token)\n .waitUntilFinished(-700)\n .scaleToObject(9.5)\n .effect(\"jb2a.shield.01.loop.blue\")\n .fadeIn(300)\n .persist()\n .attachTo(token, { bindVisibility: true })\n .scaleToObject(9.5) \n.play()"} +{"_id":"D8E9YpHQsJhxBLvs","name":"Designate Pinaka Area","img":"modules/lancer-weapon-fx/icons/PinakaArea.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"// This will lay down a template suitable for designating the location of a delayed Pinaka Missile strike.\n\ngame.lancer.canvas.WeaponRangeTemplate.fromRange({\n type: \"Blast\",\n val: 2,\n}).placeTemplate()\n .then(t => {\n if (t) {\n t.update({texture: \"modules/JB2A_DnD5e/Library/Generic/Zoning/ZoningSquare01In_01_Regular_BlueGreen_Loop_600x600.webm\", distance: 1, fillColor: \"#FF0000\" });\n };\n }\n)"} +{"_id":"ZNQDndUit13iQDfV","name":"Designate Smoke Grenade","img":"modules/lancer-weapon-fx/icons/SmokeGrenadeArea.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"// This will lay down a template suitable for designating the location of a delayed Pinaka Missile strike.\n\ngame.lancer.canvas.WeaponRangeTemplate.fromRange({\n type: \"Blast\",\n val: 2.0,\n}).placeTemplate()\n .then(t => {\n if (t) {\n t.update({texture: \"modules/JB2A_DnD5e/Library/Generic/Smoke/SmokePlumes01_03_Regular_Grey_400x400.webm\", distance: 1.8, fillColor: \"#756c6c\" });\n };\n }\n)"} +{"_id":"EiG9UfyeoHsXCX3L","name":"Designate Smoke Mine","img":"modules/lancer-weapon-fx/icons/SmokeArea.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"// This will lay down a template suitable for designating the location of a delayed Pinaka Missile strike.\n\ngame.lancer.canvas.WeaponRangeTemplate.fromRange({\n type: \"Blast\",\n val: 3.0,\n}).placeTemplate()\n .then(t => {\n if (t) {\n t.update({texture: \"modules/JB2A_DnD5e/Library/Generic/Smoke/SmokePlumes01_03_Regular_Grey_400x400.webm\", distance: 2.8, fillColor: \"#756c6c\" });\n };\n }\n)"} +{"_id":"Hlf1weIjm3FsVE9Z","name":"ElectricExplodeOnClick","img":"modules/lancer-weapon-fx/icons/crowned-explosion.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"//This Macro requires Warpgate module to function. When executed, the macro will play the explosion fx on the clicked location. Useful for grenades or any other occurance where something needs to explode.\n\nif (typeof warpgate === \"undefined\") ui.notifications.error(\"This macro requires the Warpgate module to be installed!\");\n\nlet config = {\n size:2,\n icon: 'icons/White/crowned-explosion.png',\n label: 'EGrenade',\n interval: 1\n}\n\nlet position = await warpgate.crosshairs.show(config);\n\nlet sequence = new Sequence()\n\n\n .effect()\n .file(\"jb2a.explosion.02.blue\")\n .atLocation(position)\n .scale(0.8)\n .name(\"impact\")\n .delay(500)\n .opacity(0.8)\n .effect()\n .file(\"jb2a.thunderwave.center.blue\")\n .atLocation(position)\n .name(\"impact\")\n .scale(0.6)\n .delay(600)\n .sound(\"modules/lancer-weapon-fx/soundfx/AirBurst.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .delay(500)\n\n\n.play();\n"} +{"_id":"XYuNCvqqzUsq5XkK","name":"EndDefenseNet","img":"modules/lancer-weapon-fx/icons/cracked-shield.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"//This macro is not linked to any weapon or system and must be triggered manually. Use this macro, or the Sequencer Manager, to end the 'AegisDefenseNet' effect.\n\nlet sequence = new Sequence();\n\nnew Sequence()\n .effect(\"jb2a.shield.01.outro_explode.blue\")\n .atLocation(token)\n .scaleToObject(9.5)\n .waitUntilFinished(-400)\n .thenDo(endFX)\n.play()\n\n function endFX() {\n Sequencer.EffectManager.endEffects({ object: token})\n\n }\n\nsequence.play();"} +{"_id":"BHTzvudu6KcxJI7p","name":"ExplodeOnClick","img":"modules/lancer-weapon-fx/icons/bright-explosion.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"//This Macro requires Warpgate module to function. When executed, the macro will play the explosion fx on the clicked location. Useful for grenades or any other occurance where something needs to explode.\n\nif (typeof warpgate === \"undefined\") ui.notifications.error(\"This macro requires the Warpgate module to be installed!\");\n\nlet config = {\n size:1,\n icon: 'icons/White/bright-explosion.png',\n label: 'Grenade',\n interval: 1\n}\n\nlet position = await warpgate.crosshairs.show(config);\n\nlet sequence = new Sequence()\n\n\n .effect()\n .file(\"jb2a.explosion.08.orange\")\n .atLocation(position)\n .name(\"impact\")\n .delay(500)\n .effect()\n .file(\"jb2a.explosion.shrapnel.bomb.01.black\")\n .atLocation(position)\n .name(\"impact\")\n .scale(0.6)\n .delay(600)\n .sound(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7))\n .delay(500)\n\n\n.play();\n"} +{"_id":"WjxNFb3JQBla9BBC","name":"JetLancerExplosion","img":"modules/lancer-weapon-fx/icons/explosion-rays.png","type":"script","scope":"global","author":"fpthefluffypawed","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nnew Sequence()\n\t.sound(\"modules/lancer-weapon-fx/soundfx/dramaticSparkles.ogg\")\n\t\t.fadeInAudio(4000)\n\t\t.volume(0.3)\n\t\t.duration(5000)\n\t.effect(\"jb2a.static_electricity.03.blue\")\n\t\t.atLocation(sourceToken)\n\t\t.scaleToObject(1)\n\t\t.duration(5000)\n\t.canvasPan()\n\t\t.atLocation(sourceToken)\n\t\t.duration(5000)\n\t\t.scale(1)\n\t\t.waitUntilFinished()\n\t.canvasPan()\n\t\t.atLocation(sourceToken)\n\t\t.duration(100)\n\t\t.scale(2)\n\t.sound(\"modules/lancer-weapon-fx/soundfx/jetlancerSound.ogg\")\n\t.effect(\"modules/lancer-weapon-fx/video/jetlancer_explosion_1000.webm\")\n\t\t.aboveInterface()\n\t\t.atLocation(sourceToken)\n\t\t.scale(1)\n\t.canvasPan()\n\t\t.shake({duration: 5000, strength: 10, rotation: false, fadeOutDuration: 500})\n\t\t.thenDo(remainsAftermath)\n\t\t.waitUntilFinished()\n\t.effect(\"modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png\")\n\t\t.delay(3600)\n\t\t.aboveInterface()\n\t\t.atLocation(sourceToken)\n\t\t.duration(1700)\n\t\t.fadeOut(300)\n\t.play()\n\nfunction remainsAftermath() {\n\tconsole.log(\"AFTERMATH\");\n\tconsole.log(sourceToken);\n\tconsole.log(canvas)\n\ttoken.document.update({hidden: true});\n\tcanvas.scene.createEmbeddedDocuments(\"Tile\", [{ \n\t\ttexture: { src: \"modules/lancer-weapon-fx/sprites/RETROGRADE-crater.png\" }, \n\t\tx: token.document.x - canvas.dimensions.size,\n\t\ty: token.document.y - (canvas.dimensions.size + (canvas.dimensions.size / 2)),\n\t\theight: canvas.dimensions.size * (token.document.width + 2),\n\t\twidth: canvas.dimensions.size * (token.document.width + 2),\n\t\ttint: \"#464646\"\n\t }]);\n}\n\n\n\nsequence.play();"} +{"_id":"1ntDWMtnxAA1uZMH","name":"MissileAirBurst","img":"modules/lancer-weapon-fx/icons/incoming-rocket.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst pTarget = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\n// Calculate the point 70% of the distance between sourceToken and pTarget\nconst pBlast = {\n x: sourceToken.position.x + 0.6 * (pTarget.x - sourceToken.position.x),\n y: sourceToken.position.y + 0.6 * (pTarget.y - sourceToken.position.y),\n};\n\n\nlet sequence = new Sequence()\n\n\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .timeRange(700, 2000);\n sequence.effect()\n .file(\"jb2a.throwable.launch.missile\")\n .scale(0.7)\n .from(sourceToken)\n .stretchTo(pBlast)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.08\")\n .atLocation(pBlast)\n .name(\"impact\")\n .scale(0.8)\n .zIndex(1)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Flechette.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n\nfor (let i=0; i < targetTokens.length; i++) {\n let target = targetTokens[i];\n\n sequence.effect()\n .file(\"jb2a.bullet.02.orange\")\n\t.playIf(!targetsMissed.has(target.id))\n .scale(0.5)\n\t .atLocation(pBlast)\n\t .stretchTo(target)\n .effect()\n .file(\"jb2a.explosion_side.01\")\n\t.playIf(!targetsMissed.has(target.id))\n .atLocation(target)\n\t.rotateTowards(pBlast)\n\t.center()\n .delay(350)\n .sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .playIf(!targetsMissed.has(target.id))\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n\t.delay(350);\n}\nsequence.play();"} +{"_id":"HOn4Xub4x5q0AmPw","name":"MissileAoE","img":"modules/lancer-weapon-fx/icons/rocket.png","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = game.modules.get(\"lancer-weapon-fx\").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0];\n\n\nlet sequence = new Sequence()\n\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5))\n .timeRange(700, 2000);\n sequence.effect()\n .file(\"jb2a.pack_hound_missile\")\n .atLocation(sourceToken)\n .stretchTo(target)\n .waitUntilFinished(-3200);\n sequence.effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(target)\n .scale(1.2)\n .zIndex(1)\n .waitUntilFinished(-1300);\n\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg\")\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.5));\n\n }\nsequence.play();"} +{"_id":"Nsmpx88frJTCU0Ax","name":"NuclearExplosionSFC","img":"modules/lancer-weapon-fx/icons/mushroom-cloud.png","type":"script","scope":"global","author":"fpthefluffypawed","command":"new Sequence()\n\t.effect(\"modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png\")\n\t\t.fadeIn(100)\n\t\t.duration(6000)\n\t\t.fadeOut(3000)\n\t\t.screenSpace()\n\t.effect(\"modules/lancer-weapon-fx/sprites/shockwave.png\")\n\t\t.atLocation(token)\n\t\t.duration(7000)\n\t\t.scale(0.2)\n\t\t.scaleOut(12, 7000)\n\t\t.fadeOut(7000)\n\t\t.delay(3000)\n\t.sound(\"modules/lancer-weapon-fx/soundfx/pw_nuke.ogg\")\n\t\t.startTime(800)\n\t\t.delay(1000)\n\t.effect(\"modules/lancer-weapon-fx/video/pw_nuke_effect.webm\")\n\t\t.delay(1000)\n\t\t.atLocation(token)\n\t\t.aboveLighting()\n\t\t.xray()\n\t\t.scale(1)\n\t\t.zIndex(100)\n\t\t.thenDo(remainsAftermath)\n\t/*\n\t\tCRATER EFFECT PERSISTENT AFTERWARDS:\n\t\t- Both following effects are entirely for the crater, remove\n\t\t- or comment it out as needed. Light included.\n\t*/\n\t.effect(\"jb2a.ground_cracks.01.orange\")\n\t\t.persist()\n\t\t.belowTokens()\n\t\t.aboveLighting()\n\t\t.zIndex(1)\n\t\t.xray()\n\t\t.randomRotation()\n\t\t.atLocation(token)\n\t\t.scale(2)\n\t\t.thenDo(createLight)\n\t.effect(\"modules/lancer-weapon-fx/sprites/scorch_mark_hires.png\")\n\t\t.atLocation(token)\n\t\t.scale(2.2)\n\t\t.persist()\n\t\t.belowTokens()\n\t\t.zIndex(0)\n\t\t.randomRotation()\n\t\t.xray()\n\t.canvasPan()\n\t\t.delay(1000)\n .atLocation(token)\n .scale(0.5)\n\t\t.shake({\n\t\t\tduration: 20000,\n\t\t\tstrength: 15,\n\t\t\tfadeOutDuration: 10000,\n\t\t\trotation: true\n\t\t})\n.play()\n\nasync function remainsAftermath() {\n\tconsole.log(\"AFTERMATH\");\n\ttoken.document.update({hidden: true});\n}\n\nasync function createLight() {\n\tawait canvas.scene.createEmbeddedDocuments(\"AmbientLight\", [{\n\t\tx: token.document.x + (canvas.dimensions.size / 2),\n\t\ty: token.document.y + (canvas.dimensions.size / 2),\n\t\tconfig: {\n\t\t\tcolor: \"#ff9117\",\n\t\t\tdim: 10,\n\t\t\tbright: 5,\n\t\t\tanimation: {\n\t\t\t\ttype: \"pulse\",\n\t\t\t},\n\t\t}\n\t}]);\n}"} +{"_id":"tzS44LYDm9vRB0HP","name":"NuclearExplosionSpace","img":"modules/lancer-weapon-fx/icons/mushroom-cloud.png","type":"script","scope":"global","author":"fpthefluffypawed","command":"new Sequence()\n\t.effect(\"modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png\")\n\t\t.fadeIn(100)\n\t\t.duration(6000)\n\t\t.fadeOut(3000)\n\t\t.screenSpace()\n\t.effect(\"modules/lancer-weapon-fx/sprites/shockwave.png\")\n\t\t.atLocation(token)\n\t\t.duration(7000)\n\t\t.scale(0.2)\n\t\t.scaleOut(12, 7000)\n\t\t.fadeOut(7000)\n\t\t.delay(3000)\n\t.sound(\"modules/lancer-weapon-fx/soundfx/pw_nuke.ogg\")\n\t\t.startTime(800)\n\t\t.delay(1000)\n\t.effect(\"modules/lancer-weapon-fx/video/pw_nuke_effect.webm\")\n\t\t.delay(1000)\n\t\t.atLocation(token)\n\t\t.aboveLighting()\n\t\t.xray()\n\t\t.scale(1)\n\t\t.zIndex(100)\n\t\t.thenDo(remainsAftermath)\n\t.canvasPan()\n\t\t.delay(1000)\n .atLocation(token)\n .scale(0.5)\n\t\t.shake({\n\t\t\tduration: 20000,\n\t\t\tstrength: 15,\n\t\t\tfadeOutDuration: 10000,\n\t\t\trotation: true\n\t\t})\n.play()\n\nasync function remainsAftermath() {\n\tconsole.log(\"AFTERMATH\");\n\ttoken.document.update({hidden: true});\n}\n\nasync function createLight() {\n\tawait canvas.scene.createEmbeddedDocuments(\"AmbientLight\", [{\n\t\tx: token.document.x + (canvas.dimensions.size / 2),\n\t\ty: token.document.y + (canvas.dimensions.size / 2),\n\t\tconfig: {\n\t\t\tcolor: \"#ff9117\",\n\t\t\tdim: 10,\n\t\t\tbright: 5,\n\t\t\tanimation: {\n\t\t\t\ttype: \"pulse\",\n\t\t\t},\n\t\t}\n\t}]);\n}"} +{"_id":"7S31ONuehIUe8R0Q","name":"PlasmaProjector","img":"modules/JB2A_DnD5e/Library/6th_Level/Disintegrate/Disintegrate_01_Regular_Green01_Thumb.webp","type":"script","scope":"global","author":"LancerWeaponFX00","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nconst target = targetTokens[0];\n\nnew Sequence()\n\n .canvasPan()\n .duration(1000)\n .atLocation(sourceToken)\n .scale(0.25)\n .effect()\n .file(\"jb2a.disintegrate.green\")\n .delay(1000)\n .startTime(1)\n .scale(2)\n .playbackRate(0.6)\n .filter(\"Glow\", {distance: 3, color: 0x98ec5f, innerStrength: 2})\n .atLocation(sourceToken)\n .stretchTo(target)\n .waitUntilFinished(-3400)\n .canvasPan()\n\t.duration(2000)\n .atLocation(target)\n .scale(0.4)\n .waitUntilFinished(-500)\n .effect()\n .file(\"jb2a.impact.blue\")\n .filter(\"ColorMatrix\", {hue: 270})\n .scaleToObject()\n .atLocation(target, {randomOffset: 1.2, gridUnits: true})\n .repeats(10, 200, 700)\n .waitUntilFinished(-500)\n\t.effect(\"modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png\")\n\t\t.fadeIn(100)\n\t\t.duration(6000)\n\t\t.fadeOut(3000)\n\t\t.screenSpace()\n\t.effect(\"modules/lancer-weapon-fx/sprites/shockwave.png\")\n\t\t.atLocation(target)\n .filter(\"ColorMatrix\", {hue: 090})\n\t\t.duration(7000)\n\t\t.scale(0.2)\n\t\t.scaleOut(12, 7000)\n\t\t.fadeOut(7000)\n\t\t.delay(3000)\n\t.sound(\"modules/lancer-weapon-fx/soundfx/pw_nuke.ogg\")\n\t\t.startTime(800)\n\t\t.delay(1000)\n\t.effect(\"modules/lancer-weapon-fx/video/pw_nuke_effect.webm\")\n .filter(\"ColorMatrix\", {hue: 090})\n\t\t.delay(1000)\n\t\t.atLocation(target)\n\t\t.aboveLighting()\n\t\t.xray()\n\t\t.scale(1)\n\t\t.zIndex(100)\n\t\t.thenDo(remainsAftermath)\n\t.canvasPan()\n\t\t.delay(1000)\n .atLocation(target)\n .scale(0.5)\n\t\t.shake({\n\t\t\tduration: 20000,\n\t\t\tstrength: 15,\n\t\t\tfadeOutDuration: 10000,\n\t\t\trotation: true\n\t\t})\n\n.play();\n\nfunction remainsAftermath() {\n\tconsole.log(\"AFTERMATH\");\n\ttargetTokens[0].document.update({hidden: true});\n}"} +{"_id":"oGArtZBtIRBcRHCh","name":"Power Knuckle","type":"script","author":"LancerWeaponFX00","img":"modules/lancer-weapon-fx/icons/thor-fist.png","scope":"global","command":"const {targetsMissed, targetTokens, sourceToken} = game.modules.get(\"lancer-weapon-fx\").api.getMacroVariables(typeof messageId === \"undefined\" ? null : messageId, actor);\n\nlet sequence = new Sequence();\n\nfor (const target of targetTokens) {\n sequence.effect()\n .file(\"jb2a.unarmed_strike.physical.02.blue\")\n .scale(0.9)\n .atLocation(sourceToken)\n .moveTowards(target)\n .missed(targetsMissed.has(target.id));\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/knuckleswing.ogg\")\n .delay(300)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.7));\n if (!targetsMissed.has(target.id)) {\n sequence.sound()\n .file(\"modules/lancer-weapon-fx/soundfx/knucklehit.ogg\")\n .delay(600)\n .volume(game.modules.get(\"lancer-weapon-fx\").api.getEffectVolume(0.8))\n .waitUntilFinished(-100);\n }\n}\nsequence.play();"} diff --git a/packs_source/weaponfx.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.js b/packs_source/utility.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.js similarity index 86% rename from packs_source/weaponfx.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.js rename to packs_source/utility.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.js index 75c00ac..9cf7341 100644 --- a/packs_source/weaponfx.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.js +++ b/packs_source/utility.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.js @@ -1,7 +1,9 @@ await Sequencer.Preloader.preloadForClients(["jb2a.arrow.physical.blue", "jb2a.breath_weapons02.burst.line.fire.orange.01", + "jb2a.breath_weapons02.burst.cone.fire.orange.02", "jb2a.bolt.physical.orange", "jb2a.bullet.01.orange", + "jb2a.bullet.02.orange", "jb2a.bullet.Snipe.blue", "jb2a.burning_hands.01.orange", "jb2a.chain_lightning.primary.blue", @@ -36,16 +38,20 @@ await Sequencer.Preloader.preloadForClients(["jb2a.arrow.physical.blue", "jb2a.lightning_ball.blue", "jb2a.lightning_bolt.narrow.blue", "jb2a.magic_missile.purple", + "jb2a.pack_hound_missile", + "jb2a.side_impact.part.smoke.blue", "jb2a.spear.melee.01.white.2", - "jb2a.static_electricity.02.blue", + "jb2a.static_electricity", "jb2a.sword.melee.01.white", "jb2a.template_circle.vortex.loop.blue", + "jb2a.throwable.launch.missile", "jb2a.toll_the_dead.green.shockwave", - "jb2a.unarmed_strike", + "jb2a.unarmed_strike.physical", "jb2a.warhammer.melee.01.white.4", "jb2a.zoning.inward.square.loop.bluegreen.01.01", + "jb2a.zoning.inward.circle.loop", "modules/lancer-weapon-fx/icons/LatchDrone.png", "modules/animated-spell-effects/spell-effects/air/black_smoke_RAY_01.webm", "modules/animated-spell-effects/spell-effects/energy/energy_throw_RAY_10.webm", "modules/animated-spell-effects/spell-effects/energy/energy_explosion_CIRCLE_05.webm", -], true); +], true); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.json b/packs_source/utility.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.json similarity index 100% rename from packs_source/weaponfx.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.json rename to packs_source/utility.db/Preload LancerWeaponFX.7DO055aDh1QmVHby.json diff --git a/packs_source/weaponfx.db/AMR.RPjF4SvsMP3dolyX.js b/packs_source/weaponfx.db/AMR.RPjF4SvsMP3dolyX.js index 731795f..6ea5554 100644 --- a/packs_source/weaponfx.db/AMR.RPjF4SvsMP3dolyX.js +++ b/packs_source/weaponfx.db/AMR.RPjF4SvsMP3dolyX.js @@ -4,6 +4,10 @@ let sequence = new Sequence(); for (const target of targetTokens) { sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/WeaponClick.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(200) + .sound() .file("modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); sequence.effect() @@ -15,14 +19,16 @@ for (const target of targetTokens) { if (!targetsMissed.has(target.id)) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .delay(75); sequence.effect() .file("jb2a.impact.orange.0") .atLocation(target) .rotateTowards(sourceToken) .rotate(230) .center() + .delay(75) .waitUntilFinished(); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Annihilator.XYVkQ3LALbGc6B7i.js b/packs_source/weaponfx.db/Annihilator.XYVkQ3LALbGc6B7i.js index 314cca8..a66bb7d 100644 --- a/packs_source/weaponfx.db/Annihilator.XYVkQ3LALbGc6B7i.js +++ b/packs_source/weaponfx.db/Annihilator.XYVkQ3LALbGc6B7i.js @@ -13,6 +13,7 @@ for (const target of targetTokens) { .atLocation(sourceToken) .stretchTo(target) .missed(targetsMissed.has(target.id)) + .name("impact") .waitUntilFinished(-4000); if (!targetsMissed.has(target.id)) { sequence.sound() @@ -24,6 +25,16 @@ for (const target of targetTokens) { .tint("#c91af9") .atLocation(target) .waitUntilFinished(-400); - } + } else { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Annihilator.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + sequence.effect() + .file("jb2a.impact.blue.3") + .scale(1.0) + .tint("#c91af9") + .atLocation("impact") + .waitUntilFinished(-400); + } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Apocalypse Rail.Ui60K7EYoOV23KNM.js b/packs_source/weaponfx.db/Apocalypse Rail.Ui60K7EYoOV23KNM.js index 49ebb46..01c55ac 100644 --- a/packs_source/weaponfx.db/Apocalypse Rail.Ui60K7EYoOV23KNM.js +++ b/packs_source/weaponfx.db/Apocalypse Rail.Ui60K7EYoOV23KNM.js @@ -1,31 +1,32 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -const target = targetTokens[0]; +const target = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; let sequence = new Sequence() .sound() .file("modules/lancer-weapon-fx/soundfx/APR2_Load.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) .waitUntilFinished() + .sound() .file("modules/lancer-weapon-fx/soundfx/APR2_Fire.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .effect() .file("jb2a.bullet.01.orange") .atLocation(sourceToken) .stretchTo(target) - .missed(targetsMissed.has(target.id)) .scale(2.0) .waitUntilFinished(-300); -if (!targetsMissed.has(target.id)) { sequence.effect() - .file("jb2a.fireball.explosion.orange") - .atLocation(target) - .zIndex(1) - .sound() - .file("modules/lancer-weapon-fx/soundfx/APR2_Impact.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); -} + .file("jb2a.fireball.explosion.orange") + .atLocation(target) + .zIndex(1) + + .sound() + .file("modules/lancer-weapon-fx/soundfx/APR2_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + ; -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Apply Smoke Grenade.jIkBKLXsaxYq0GDS.js b/packs_source/weaponfx.db/Apply Smoke Grenade.jIkBKLXsaxYq0GDS.js deleted file mode 100644 index 1142c9d..0000000 --- a/packs_source/weaponfx.db/Apply Smoke Grenade.jIkBKLXsaxYq0GDS.js +++ /dev/null @@ -1,30 +0,0 @@ -const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); - -let params = - [{ - filterType: "field", - filterId: "mySmokeField", - shieldType: 3, - gridPadding: 2.4, - color: 0xA9A9A9, - time: 0, - blend: 0, - intensity: 0.4, - lightAlpha: 0.9, - lightSize: 0.5, - scale: 1, - radius: 1, - chromatic: false, - zOrder: 512, - animated: - { - time: - { - active: true, - speed: 0.0015, - animType: "move", - }, - }, - }]; - -TokenMagic.addUpdateFilters(sourceToken, params); diff --git a/packs_source/weaponfx.db/Apply Smoke Grenade.jIkBKLXsaxYq0GDS.json b/packs_source/weaponfx.db/Apply Smoke Grenade.jIkBKLXsaxYq0GDS.json deleted file mode 100644 index c5939f1..0000000 --- a/packs_source/weaponfx.db/Apply Smoke Grenade.jIkBKLXsaxYq0GDS.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "_id": "jIkBKLXsaxYq0GDS", - "name": "Apply Smoke Grenade", - "type": "script", - "author": "LancerWeaponFX00", - "img": "icons/svg/acid.svg", - "scope": "global" -} \ No newline at end of file diff --git a/packs_source/weaponfx.db/ArcBow.SvEgMaioDs6CiqaK.js b/packs_source/weaponfx.db/ArcBow.SvEgMaioDs6CiqaK.js index 0ad6b14..eec55e7 100644 --- a/packs_source/weaponfx.db/ArcBow.SvEgMaioDs6CiqaK.js +++ b/packs_source/weaponfx.db/ArcBow.SvEgMaioDs6CiqaK.js @@ -1,8 +1,53 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -let sequence = new Sequence(); +const findFarthestTargetOfGroup = function (targetTokens) { + let farthestToken = null; + let farthestTokenDistance = 0; + targetTokens.forEach(t => { + let distance = canvas.grid.measureDistance(sourceToken, t); + if (distance > farthestTokenDistance) { + farthestToken = t; + farthestTokenDistance = distance; + } + }); + + return farthestToken; + +}; + +const farthest = findFarthestTargetOfGroup(targetTokens); + +function findNearestTargetOfGroup(targetTokens) { + let nearestToken = null; + let nearestTokenDistance = Infinity; + targetTokens.forEach(n => { + let distance = canvas.grid.measureDistance(sourceToken, n); + if (distance < nearestTokenDistance) { + nearestToken = n; + nearestTokenDistance = distance; + } + }); + return nearestToken; +}; + +const nearest = findNearestTargetOfGroup(targetTokens); + +const repeatImpactAnimationForEachTarget = function (sequence, targets) { + targets.forEach(t => { + if (!targetsMissed.has(t.id)) { + sequence.effect() + .file("jb2a.chain_lightning.secondary") + .atLocation(farthest) + .stretchTo(t, {randomOffset: 0.5}) + .delay(800) + } + }); + return sequence; +} + + +let sequence = new Sequence() -for (const target of targetTokens) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/ArcBowFire.ogg") .delay(800) @@ -14,14 +59,15 @@ for (const target of targetTokens) { sequence.effect() .file("jb2a.arrow.physical.blue") .atLocation(sourceToken) - .stretchTo(target) - .missed(targetsMissed.has(target.id)); - if (!targetsMissed.has(target.id)) { - sequence.effect() - .file("jb2a.lightning_bolt.narrow.blue") - .atLocation(sourceToken) - .stretchTo(target) - .delay(800); - } -} -sequence.play(); + .stretchTo(farthest) + .waitUntilFinished(-1000) + .effect() + .file("jb2a.chain_lightning.primary") + .atLocation(sourceToken) + .stretchTo(farthest) + .opacity(0.6) + .scale(0.6); + +sequence = repeatImpactAnimationForEachTarget(sequence, targetTokens); + +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Assault Rifle.R006179gUEan7xqn.js b/packs_source/weaponfx.db/Assault Rifle.R006179gUEan7xqn.js index 5985e19..f73658f 100644 --- a/packs_source/weaponfx.db/Assault Rifle.R006179gUEan7xqn.js +++ b/packs_source/weaponfx.db/Assault Rifle.R006179gUEan7xqn.js @@ -9,10 +9,16 @@ for (const target of targetTokens) { sequence.effect() .file("jb2a.bullet.01.orange") .atLocation(sourceToken) - .stretchTo(target, {randomOffset: 0.4}) + .stretchTo(target) .missed(targetsMissed.has(target.id)) - .repeats(4, 100) + .name("impact") + .waitUntilFinished(-550); + sequence.effect() + .file("jb2a.bullet.01.orange") + .atLocation(sourceToken) + .stretchTo("impact", {randomOffset: 0.4, gridUnits: true}) + .repeats(3, 100) .waitUntilFinished(); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/AssimilationMaw.JDu8MtHJgZSjN6TQ.js b/packs_source/weaponfx.db/AssimilationMaw.JDu8MtHJgZSjN6TQ.js new file mode 100644 index 0000000..e1f264e --- /dev/null +++ b/packs_source/weaponfx.db/AssimilationMaw.JDu8MtHJgZSjN6TQ.js @@ -0,0 +1,34 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + +for (const target of targetTokens) { + + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Melee.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + sequence.effect() + .file("jb2a.bite") + .atLocation(target) + .filter("ColorMatrix", {hue: 270}) + .filter("Glow", {color: 0x8a0303, distance: 2, innerStrength: 2}) + .zIndex(1) + .opacity(0.7) + .scaleToObject(3) + .waitUntilFinished(targetsMissed.has(target.id) ? 0 : -1000); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/HeavyImpact.ogg") + .playIf(!targetsMissed.has(target.id)) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + sequence.effect() + .file("jb2a.divine_smite.caster.blueyellow") + .playIf(!targetsMissed.has(target.id)) + .playbackRate(2.2) + .scaleToObject(1.7) + .filter("Glow", {color: 0x8a0303, distance: 2, innerStrength: 2}) + .filter("ColorMatrix", {hue: 300}) + .atLocation(target) + .waitUntilFinished(-1000); + +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/AssimilationMaw.JDu8MtHJgZSjN6TQ.json b/packs_source/weaponfx.db/AssimilationMaw.JDu8MtHJgZSjN6TQ.json new file mode 100644 index 0000000..9523719 --- /dev/null +++ b/packs_source/weaponfx.db/AssimilationMaw.JDu8MtHJgZSjN6TQ.json @@ -0,0 +1,8 @@ +{ + "_id": "JDu8MtHJgZSjN6TQ", + "name": "AssimilationMaw", + "img": "modules/lancer-weapon-fx/icons/front-teeth.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/AutoPod.JMFCQVUjBc3QLBpS.js b/packs_source/weaponfx.db/AutoPod.JMFCQVUjBc3QLBpS.js index 5f80dbf..3178974 100644 --- a/packs_source/weaponfx.db/AutoPod.JMFCQVUjBc3QLBpS.js +++ b/packs_source/weaponfx.db/AutoPod.JMFCQVUjBc3QLBpS.js @@ -1,30 +1,25 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -const target = targetTokens[0]; +let sequence = new Sequence(); -let sequence = new Sequence() - .sound() - .file("modules/lancer-weapon-fx/soundfx/AutoPod_Fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) - .effect() - .file("jb2a.template_circle.vortex.loop.blue") - .endTime(4700) - .scale(0.20) - .tint("#787878") - .atLocation(sourceToken) - .moveTowards(target) - .missed(targetsMissed.has(target.id)) - .waitUntilFinished() - -if (!targetsMissed.has(target.id)) { - sequence - .sound() +for (const target of targetTokens) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/AutoPod_Fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + sequence.effect() + .file("jb2a.template_circle.vortex.loop.blue") + .endTime(4700) + .scale(0.20) + .tint("#787878") + .atLocation(sourceToken) + .moveTowards(target) + .waitUntilFinished(); + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) - .effect() - .file("jb2a.impact.yellow.1") - .scale(.6) - .atLocation(target) + .volume(0.7); + sequence.effect() + .file("jb2a.impact.yellow.1") + .scale(.6) + .atLocation(target); } - -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/BattleRifle.DdNSH1DTIsRyJCK9.js b/packs_source/weaponfx.db/BattleRifle.DdNSH1DTIsRyJCK9.js new file mode 100644 index 0000000..8448c42 --- /dev/null +++ b/packs_source/weaponfx.db/BattleRifle.DdNSH1DTIsRyJCK9.js @@ -0,0 +1,66 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/BR_Fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .duration(933) + .delay(500) + .effect() + .file("jb2a.bullet.03.blue") + .atLocation(sourceToken) + .scale(0.7) + .playbackRate(1.5) + .stretchTo(target, {randomOffset: 0.6, gridUnits: true}) + .missed(targetsMissed.has(target.id)) + .name('hitLocation${i}') + .delay(500) + .waitUntilFinished(-600) + .sound() + .file("modules/lancer-weapon-fx/soundfx/KineticImpact.ogg") + .playIf(!targetsMissed.has(target.id)) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .delay(150) + .effect() + .file("jb2a.impact.orange.0") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(1.5) + .atLocation('hitLocation${i}') + .rotateTowards(sourceToken) + .rotate(230) + .delay(150) + .center(); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/BR_Fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .duration(933) + .delay(500) + .effect() + .file("jb2a.bullet.03.blue") + .atLocation(sourceToken) + .scale(0.7) + .playbackRate(1.5) + .stretchTo(target, {randomOffset: 0.6, gridUnits: true}) + .missed(targetsMissed.has(target.id)) + .name('hitLocation${i}') + .delay(500) + .waitUntilFinished(-600) + .sound() + .file("modules/lancer-weapon-fx/soundfx/KineticImpact.ogg") + .playIf(!targetsMissed.has(target.id)) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .delay(150) + .effect() + .file("jb2a.impact.orange.0") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(1.5) + .atLocation('hitLocation${i}') + .rotateTowards(sourceToken) + .delay(150) + .rotate(230) + .center(); +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/BattleRifle.DdNSH1DTIsRyJCK9.json b/packs_source/weaponfx.db/BattleRifle.DdNSH1DTIsRyJCK9.json new file mode 100644 index 0000000..98513a1 --- /dev/null +++ b/packs_source/weaponfx.db/BattleRifle.DdNSH1DTIsRyJCK9.json @@ -0,0 +1,8 @@ +{ + "_id": "DdNSH1DTIsRyJCK9", + "name": "BattleRifle", + "img": "modules/lancer-weapon-fx/icons/on-target.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/BlastPick.blc8AUjYhehKKhc5.js b/packs_source/weaponfx.db/BlastPick.blc8AUjYhehKKhc5.js new file mode 100644 index 0000000..7e8174d --- /dev/null +++ b/packs_source/weaponfx.db/BlastPick.blc8AUjYhehKKhc5.js @@ -0,0 +1,37 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + + +for (const target of targetTokens) { + sequence.effect() + .file("jb2a.melee_generic.slash.01.orange") + .scaleToObject(4) + .atLocation(sourceToken) + .spriteOffset({x: -1.5}, {gridUnits:true}) + .rotateTowards(target) + .delay(500) + .missed(targetsMissed.has(target.id)) + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/bladeswing.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .delay(500) + .waitUntilFinished(-1300); + if (!targetsMissed.has(target.id)) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Mortar_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + sequence.effect() + .file("jb2a.explosion.01") + .scale(1) + .zIndex(2) + .atLocation(target, {randomOffset: 0.5, gridUnits: true}) + sequence.effect() + .file("jb2a.static_electricity.03.blue") + .scale(0.4) + .atLocation(target, {randomOffset: 1, gridUnits: true}) + .repeats(2, 80) + .waitUntilFinished(-800); + } +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/BlastPick.blc8AUjYhehKKhc5.json b/packs_source/weaponfx.db/BlastPick.blc8AUjYhehKKhc5.json new file mode 100644 index 0000000..56ff215 --- /dev/null +++ b/packs_source/weaponfx.db/BlastPick.blc8AUjYhehKKhc5.json @@ -0,0 +1,8 @@ +{ + "_id": "blc8AUjYhehKKhc5", + "name": "BlastPick", + "img": "modules/lancer-weapon-fx/icons/war-pick.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Bolt Thrower.6lzGhwqHNYxXY25N.js b/packs_source/weaponfx.db/Bolt Thrower.6lzGhwqHNYxXY25N.js index 334a597..63f1a28 100644 --- a/packs_source/weaponfx.db/Bolt Thrower.6lzGhwqHNYxXY25N.js +++ b/packs_source/weaponfx.db/Bolt Thrower.6lzGhwqHNYxXY25N.js @@ -12,17 +12,18 @@ for (const target of targetTokens) { .atLocation(sourceToken) .startTime(500) .stretchTo(target) - .missed(targetsMissed.has(target.id)); + .missed(targetsMissed.has(target.id)) + .name("bolt") + .waitUntilFinished(-900) + .effect() + .file("jb2a.explosion.01.orange") + .atLocation("bolt"); + if (!targetsMissed.has(target.id)) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") - .delay(700) + .delay(50) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); - sequence.effect() - .file("jb2a.explosion.01.orange") - .atLocation(target) - .delay(700) - .waitUntilFinished(); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Brood Siblings Molt.qfPYlbW1NHKOEJXF.js b/packs_source/weaponfx.db/Brood Siblings Molt.qfPYlbW1NHKOEJXF.js index 9fcc1b2..d20431a 100644 --- a/packs_source/weaponfx.db/Brood Siblings Molt.qfPYlbW1NHKOEJXF.js +++ b/packs_source/weaponfx.db/Brood Siblings Molt.qfPYlbW1NHKOEJXF.js @@ -4,27 +4,32 @@ let sequence = new Sequence(); for (const target of targetTokens) { sequence.effect() - .file("jb2a.sword.melee.01.white") + .file("jb2a.melee_attack.03.trail.greatsword") .tint("#080303") - .scale(0.8) + .filter("Glow", {color: 0x8f0f0f}) + .scaleToObject(4.5) .atLocation(sourceToken) .moveTowards(target) - .missed(targetsMissed.has(target.id)); + .missed(targetsMissed.has(target.id)) + .waitUntilFinished(-2500); + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/bladeswing.ogg") - .delay(900) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + .delay(500) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .waitUntilFinished(-1350); + if (!targetsMissed.has(target.id)) { + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/bladehit.ogg") - .delay(1000) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + sequence.effect() .file("jb2a.impact.blue") - .scale(1.2) + .scaleToObject(2) .atLocation(target) - .delay(1000) .waitUntilFinished(-1500); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Burst Launcher.EHls7n7amW2fEZ97.js b/packs_source/weaponfx.db/Burst Launcher.EHls7n7amW2fEZ97.js index 92fbac2..6dcc4c3 100644 --- a/packs_source/weaponfx.db/Burst Launcher.EHls7n7amW2fEZ97.js +++ b/packs_source/weaponfx.db/Burst Launcher.EHls7n7amW2fEZ97.js @@ -15,16 +15,15 @@ let sequence = new Sequence() .missed(targetsMissed.has(target.id)) .waitUntilFinished(); -if (!targetsMissed.has(target.id)) { - sequence - .sound() + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/AirBurst.ogg") + .playIf(!targetsMissed.has(target.id)) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .effect() + .effect() .file("jb2a.explosion.02.blue") + .playIf(!targetsMissed.has(target.id)) .scale(0.5) .atLocation(target) .waitUntilFinished(); -} -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/CannonAirburst.FL83T6qsM9zFOdAQ.js b/packs_source/weaponfx.db/CannonAirburst.FL83T6qsM9zFOdAQ.js new file mode 100644 index 0000000..889e018 --- /dev/null +++ b/packs_source/weaponfx.db/CannonAirburst.FL83T6qsM9zFOdAQ.js @@ -0,0 +1,55 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +const pTarget = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; + +// Calculate the point 60% of the distance between sourceToken and pTarget +const pBlast = { + x: sourceToken.position.x + 0.6 * (pTarget.x - sourceToken.position.x), + y: sourceToken.position.y + 0.6 * (pTarget.y - sourceToken.position.y), +}; + + +let sequence = new Sequence() + + + .sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + sequence.effect() + .file("jb2a.bullet.01.orange") + .from(sourceToken) + .stretchTo(pBlast) + .waitUntilFinished(-200) + .effect() + .file("jb2a.explosion.08") + .atLocation(pBlast) + .name("impact") + .scale(0.8) + .zIndex(1) + .sound() + .file("modules/lancer-weapon-fx/soundfx/Flechette.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + + sequence.effect() + .file("jb2a.bullet.02.orange") + .playIf(!targetsMissed.has(target.id)) + .scale(0.5) + .atLocation(pBlast) + .stretchTo(target) + .effect() + .file("jb2a.explosion_side.01") + .playIf(!targetsMissed.has(target.id)) + .atLocation(target) + .rotateTowards(pBlast) + .center() + .delay(350) + .sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") + .playIf(!targetsMissed.has(target.id)) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .delay(350); +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/CannonAirburst.FL83T6qsM9zFOdAQ.json b/packs_source/weaponfx.db/CannonAirburst.FL83T6qsM9zFOdAQ.json new file mode 100644 index 0000000..9a69ae4 --- /dev/null +++ b/packs_source/weaponfx.db/CannonAirburst.FL83T6qsM9zFOdAQ.json @@ -0,0 +1,8 @@ +{ + "_id": "FL83T6qsM9zFOdAQ", + "name": "CannonAirburst", + "img": "modules/lancer-weapon-fx/icons/cluster-bomb.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Charged Blade.kozGi0iZPK18rFlI.js b/packs_source/weaponfx.db/Charged Blade.kozGi0iZPK18rFlI.js index a63d6e2..66e115d 100644 --- a/packs_source/weaponfx.db/Charged Blade.kozGi0iZPK18rFlI.js +++ b/packs_source/weaponfx.db/Charged Blade.kozGi0iZPK18rFlI.js @@ -4,26 +4,28 @@ let sequence = new Sequence(); for (const target of targetTokens) { sequence.effect() - .file("jb2a.lasersword.melee.blue") - .scale(1.1) + .file("jb2a.melee_attack.01.magic_sword.yellow") + .filter("ColorMatrix", {hue: 180}) + .delay(500) + .scaleToObject(4.5) .atLocation(sourceToken) .moveTowards(target) + .waitUntilFinished(-1000) .missed(targetsMissed.has(target.id)); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Axe_swing.ogg") - .delay(900) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); - if (!targetsMissed.has(target.id)) { + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(-1450); + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Melee.ogg") - .delay(1200) + .playIf(!targetsMissed.has(target.id)) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); sequence.effect() .file("jb2a.impact.blue.3") - .scale(1.2) + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(2) .atLocation(target) - .delay(1200) - .waitUntilFinished(-900); - } + .waitUntilFinished(-1200); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Combat Drill.Tyi49hWX1axZsrq2.js b/packs_source/weaponfx.db/Combat Drill.Tyi49hWX1axZsrq2.js index 167b0f4..20ee698 100644 --- a/packs_source/weaponfx.db/Combat Drill.Tyi49hWX1axZsrq2.js +++ b/packs_source/weaponfx.db/Combat Drill.Tyi49hWX1axZsrq2.js @@ -9,31 +9,28 @@ for (const target of targetTokens) { sequence.effect() .file("modules/lancer-weapon-fx/sprites/DRILL.png") .scale(0.6) - .filter("Glow", {color: 0xd7d23c}) .atLocation(sourceToken) .spriteOffset({x: -10 * gridscale, y: 10 * gridscale}) .moveTowards(target) - .missed(targetsMissed.has(target.id)) + .missed(targetsMissed.has(target.id)) .moveSpeed(100) - .rotate(140); - - sequence.effect() - .file("jb2a.gust_of_wind.veryfast") - .scale(0.2) - .atLocation(sourceToken) - .moveTowards(target) - .zIndex(2) - .delay(50); - - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) - .repeats(8, 125) - .delay(200); + .rotate(140) if (!targetsMissed.has(target.id)) { - sequence.effect() + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .repeats(8, 125) + .delay(200) + .effect() + .file("jb2a.gust_of_wind.veryfast") + .scale(0.2) + .atLocation(sourceToken) + .moveTowards(target) + .zIndex(2) + .delay(50) + .effect() .file("jb2a.impact.yellow") .scale(.4) .delay(200) @@ -42,5 +39,12 @@ for (const target of targetTokens) { .repeats(8, 125) .waitUntilFinished(); } + else { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Autopod_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .repeats(2, 170) + .delay(200) + } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Cyclone Pulse Rifle.1me7RVE8gdTnu9lk.js b/packs_source/weaponfx.db/Cyclone Pulse Rifle.1me7RVE8gdTnu9lk.js index fd059ad..8f0e1a4 100644 --- a/packs_source/weaponfx.db/Cyclone Pulse Rifle.1me7RVE8gdTnu9lk.js +++ b/packs_source/weaponfx.db/Cyclone Pulse Rifle.1me7RVE8gdTnu9lk.js @@ -25,4 +25,4 @@ for (const target of targetTokens) { .waitUntilFinished(); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/DD 288.XVCMT31Y9x5NgCf6.js b/packs_source/weaponfx.db/DD 288.XVCMT31Y9x5NgCf6.js index eb82ce1..df318fb 100644 --- a/packs_source/weaponfx.db/DD 288.XVCMT31Y9x5NgCf6.js +++ b/packs_source/weaponfx.db/DD 288.XVCMT31Y9x5NgCf6.js @@ -1,37 +1,41 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -let gridsize = canvas.grid.grid.options.dimensions.size; -let gridscale = gridsize / 100; - let sequence = new Sequence(); for (const target of targetTokens) { + + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/DD288Full.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.6)) + .waitUntilFinished(-3400); sequence.effect() - .file("jb2a.unarmed_strike") - .scale(0.8) + .file("jb2a.unarmed_strike.physical.01.blue") + .filter("ColorMatrix", {hue: 000, brightness: 0.5}) + .filter("Glow", {distance: 3, color: 0xe99649, innerStrength: 2}) .atLocation(sourceToken) - .rotateTowards(target) + .playbackRate(0.7) + .scale(8) + .stretchTo(target) .missed(targetsMissed.has(target.id)) - .spriteOffset({x: -170 * gridscale}) - .repeats(6, 200); + .name("impact") + .waitUntilFinished(-650); + - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/bladeswing.ogg") - .repeats(6, 300) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.6)); - if (!targetsMissed.has(target.id)) { - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/bladehit.ogg") - .delay(300) - .repeats(5, 300) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)); sequence.effect() - .file("jb2a.impact.blue") - .scale(0.4) - .atLocation(target, {randomOffset: 1}) - .repeats(4, 90) - .delay(1900) - .waitUntilFinished(-500); - } + .file("jb2a.explosion_side.01.orange") + .scaleToObject(6) + .atLocation("impact") + .rotateTowards(sourceToken) + .rotate(180) + .spriteOffset({x: -2.9}, {gridUnits:true}) + .zIndex(1); + sequence.effect() + .file("jb2a.explosion.side_fracture.flask.01") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(3) + .atLocation("impact") + .rotateTowards(sourceToken) + .rotate(180) + .delay(200); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/DefaultMelee.JRAC43fdq4sRWQl8.js b/packs_source/weaponfx.db/DefaultMelee.JRAC43fdq4sRWQl8.js index 99776ee..e849468 100644 --- a/packs_source/weaponfx.db/DefaultMelee.JRAC43fdq4sRWQl8.js +++ b/packs_source/weaponfx.db/DefaultMelee.JRAC43fdq4sRWQl8.js @@ -2,35 +2,32 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weap let sequence = new Sequence(); -let gridsize = canvas.grid.grid.options.dimensions.size; -let gridscale = gridsize / 100; for (const target of targetTokens) { sequence.effect() - .file("jb2a.divine_smite.target.blueyellow") - .scale(0.8) + .file("jb2a.melee_generic.slash.01.orange") + .atLocation(sourceToken) - .rotateTowards(target) + .spriteOffset({x: -0.2}, {gridUnits:true}) + .stretchTo(target) + .delay(500) .missed(targetsMissed.has(target.id)) - .spriteOffset({x: -160 * gridscale, y: 90 * gridscale}) - .rotate(90); - sequence.sound() .file("modules/lancer-weapon-fx/soundfx/bladeswing.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .delay(500) + .waitUntilFinished(-1300); - if (!targetsMissed.has(target.id)) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/bladehit.ogg") - .delay(300) + .playIf(!targetsMissed.has(target.id)) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); sequence.effect() - .file("jb2a.impact.blue") - .scale(0.4) - .atLocation(target, {randomOffset: 1}) - .repeats(4, 80) - .delay(700) - .waitUntilFinished(-1500); - } + .file("jb2a.static_electricity.03.blue") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(0.5) + .atLocation(target, {randomOffset: 0.8, gridUnits: true}) + .repeats(2, 80) + .waitUntilFinished(-2200); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/DefaultTech.nCYIyBz5RESLVDdt.js b/packs_source/weaponfx.db/DefaultTech.nCYIyBz5RESLVDdt.js index c44745e..7727fab 100644 --- a/packs_source/weaponfx.db/DefaultTech.nCYIyBz5RESLVDdt.js +++ b/packs_source/weaponfx.db/DefaultTech.nCYIyBz5RESLVDdt.js @@ -3,29 +3,49 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weap targetTokens.forEach(target => { let sequence = new Sequence() - .sound() - .file("modules/lancer-weapon-fx/soundfx/Nexus_Fire.ogg") + .sound() + .file("modules/lancer-weapon-fx/soundfx/TechPrepare.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) - .effect() - .file("jb2a.energy_strands.range.multiple.purple.01.30ft") - .scale(1.4) - .playbackRate(1.5) + + .effect() + .file("jb2a.extras.tmfx.outpulse.circle.02") + .scaleToObject(2.5) + .filter("Glow", {color: 0x36c11a}) + .playbackRate(1.3) .atLocation(sourceToken) - .stretchTo(target) + .waitUntilFinished(-400) + + .sound() + .file("modules/lancer-weapon-fx/soundfx/TechWarn.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + + .effect() + .file("jb2a.extras.tmfx.inpulse.circle.02") + .scaleToObject() + .repeats (3, 75) + .playbackRate(1.5) + .atLocation(target, {randomOffset: 0.7, gridUnits: true}) + .filter("Glow", {color: 0x36c11a}) .missed(targetsMissed.has(target.id)) - .waitUntilFinished(-800); + .waitUntilFinished() - if (!targetsMissed.has(target.id)) { - sequence - .sound() - .file("modules/lancer-weapon-fx/soundfx/PPC2.ogg") + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/NexusConfirm.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .effect() - .file("jb2a.static_electricity.02.blue") - .scale(0.5) + .playIf(!targetsMissed.has(target.id)) + .effect() + .file("jb2a.zoning.inward.circle.loop") + .playIf(!targetsMissed.has(target.id)) + .scale(0.4) + .fadeOut(3800, {ease: "easeOutBack"}) + .belowTokens() + .atLocation(target) + .waitUntilFinished(-2200) + .effect() + .file("jb2a.static_electricity") + .scaleToObject(1.1) .atLocation(target) - .waitUntilFinished() - } + .playIf(!targetsMissed.has(target.id)) sequence.play(); -}); + }); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Deploy Smoke Mine.nT1EAqOceCXvrRFi.js b/packs_source/weaponfx.db/Deploy Smoke Mine.nT1EAqOceCXvrRFi.js deleted file mode 100644 index 6626885..0000000 --- a/packs_source/weaponfx.db/Deploy Smoke Mine.nT1EAqOceCXvrRFi.js +++ /dev/null @@ -1,30 +0,0 @@ -const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); - -let params = - [{ - filterType: "field", - filterId: "mySmokeField", - shieldType: 3, - gridPadding: 3.2, - color: 0xA9A9A9, - time: 0, - blend: 0, - intensity: 0.4, - lightAlpha: 1, - lightSize: 0.5, - scale: 1, - radius: 1, - chromatic: false, - zOrder: 512, - animated: - { - time: - { - active: true, - speed: 0.0015, - animType: "move", - }, - }, - }]; - -TokenMagic.addUpdateFilters(sourceToken, params); diff --git a/packs_source/weaponfx.db/Deploy Smoke Mine.nT1EAqOceCXvrRFi.json b/packs_source/weaponfx.db/Deploy Smoke Mine.nT1EAqOceCXvrRFi.json deleted file mode 100644 index 87b4164..0000000 --- a/packs_source/weaponfx.db/Deploy Smoke Mine.nT1EAqOceCXvrRFi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "_id": "nT1EAqOceCXvrRFi", - "name": "Deploy Smoke Mine", - "type": "script", - "author": "LancerWeaponFX00", - "img": "icons/svg/acid.svg", - "scope": "global" -} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Displacer.IrU7oILyUlyEecJs.js b/packs_source/weaponfx.db/Displacer.IrU7oILyUlyEecJs.js index 8421d8b..cceb914 100644 --- a/packs_source/weaponfx.db/Displacer.IrU7oILyUlyEecJs.js +++ b/packs_source/weaponfx.db/Displacer.IrU7oILyUlyEecJs.js @@ -1,34 +1,53 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -const target = targetTokens[0]; -let scale = 0.1 * target.actor.data.data.derived.mm.Size; -let gridsize = canvas.grid.grid.options.dimensions.size; -let gridscale = gridsize / 100; +const pTarget = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; let sequence = new Sequence() .sound() - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) - .file("modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg") - .startTime(900) - .fadeInAudio(500) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) + .file("modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg") + .startTime(900) + .fadeInAudio(300) + .effect() - .file("jb2a.dancing_light.purplegreen") - .tint("#2d0a3d") - .endTime(3000) - .scale(0.40) - .atLocation(sourceToken) - .moveTowards(target) - .missed(targetsMissed.has(target.id)) - .waitUntilFinished(200); -sequence.effect() - .file("jb2a.fumes.steam.white") - .atLocation(sourceToken, {offset: {x: (50 * gridscale), y: (-50 * gridscale)}}) - .scale(scale) - .scaleOut(3, 6000) - .opacity(0.8); - -if (!targetsMissed.has(target.id)) { + .file("jb2a.dancing_light.purplegreen") + .tint("#2d0a3d") + .filter("Glow", {strength: 1, color: 0x34e5d0}) + .endTime(3000) + .scale(0.40) + .atLocation(sourceToken) + .moveTowards(pTarget) + .waitUntilFinished(); + + sequence.effect() + .file("jb2a.fumes.steam.white") + .fadeIn(1500) + .fadeOut(1500) + .atLocation(sourceToken) + .spriteAnchor({ x: 0.2, y: 1.2 }) + .scaleToObject() + .opacity(0.7); + + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/DisplacerHit2.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)); + sequence.effect() + .file("jb2a.divine_smite.caster.blueyellow") + .tint("#2d0a3d") + .filter("Glow", {strength: 1, color: 0x34e5d0}) + .scale(.9) + .atLocation(pTarget) + .waitUntilFinished(-1500); + + + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + + if (!targetsMissed.has(target.id)) { + + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/DisplacerHit1.ogg") .repeats(6, 200) @@ -36,20 +55,11 @@ if (!targetsMissed.has(target.id)) { sequence.effect() .file("jb2a.impact.blue") .tint("#2d0a3d") - .scale(0.3) + .filter("Glow", {strength: 2, color: 0x34e5d0}) + .scaleToObject(2) .atLocation(target, {randomOffset: 0.9}) - .repeats(6, 200) - .sound() - .file("modules/lancer-weapon-fx/soundfx/DisplacerHit2.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) - .delay(600) - .effect() - .file("jb2a.divine_smite.caster.blueyellow") - .tint("#2d0a3d") - .delay(300) - .scale(.9) - .atLocation(target) - .waitUntilFinished(-1000) + .repeats(6, 200); + } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/DisruptorWhip.sdz6igpK2LGYTJfY.js b/packs_source/weaponfx.db/DisruptorWhip.sdz6igpK2LGYTJfY.js new file mode 100644 index 0000000..9882a25 --- /dev/null +++ b/packs_source/weaponfx.db/DisruptorWhip.sdz6igpK2LGYTJfY.js @@ -0,0 +1,49 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + +for (const target of targetTokens) { + sequence.effect() + .file("jb2a.divine_smite.target.blueyellow") + .scale(0.9) + .tint("#8c0353") + .atLocation(sourceToken) + .moveTowards(target) + .moveSpeed(175) + .spriteOffset({x: 0, y: 100, gridUnits: true}) + .missed(targetsMissed.has(target.id)) + .rotate(90) + .delay(500) + .sound() + .file("modules/lancer-weapon-fx/soundfx/bladeswing.ogg") + .delay(500) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + + if (!targetsMissed.has(target.id)) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/bladehit.ogg") + .delay(800) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + sequence.effect() + .file("jb2a.extras.tmfx.outpulse.circle.01.normal") + .atLocation(target, {randomOffset: 0.7, gridUnits: true}) + .scaleToObject(1.2) + .tint("#8c0353") + .filter("Glow", {color: 0x8a0303, distance: 1}) + .repeats(3,200) + .playbackRate(2) + .belowTokens() + .delay(800) + + sequence.effect() + .file("jb2a.impact.001") + .scaleToObject(1.2) + .tint("#8c0353") + .filter("Glow", {color: 0x8a0303, distance: 1}) + .atLocation(target, {randomOffset: 0.9, gridUnits: true}) + .repeats(6, 120) + .delay(1200) + .waitUntilFinished(-1500); + } +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/DisruptorWhip.sdz6igpK2LGYTJfY.json b/packs_source/weaponfx.db/DisruptorWhip.sdz6igpK2LGYTJfY.json new file mode 100644 index 0000000..39550ae --- /dev/null +++ b/packs_source/weaponfx.db/DisruptorWhip.sdz6igpK2LGYTJfY.json @@ -0,0 +1,8 @@ +{ + "_id": "sdz6igpK2LGYTJfY", + "name": "DisruptorWhip", + "img": "modules/lancer-weapon-fx/icons/electric-whip.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Flamethrower.uOyi8zHzCseXGQSR.js b/packs_source/weaponfx.db/Flamethrower.uOyi8zHzCseXGQSR.js index df107b3..59f64f4 100644 --- a/packs_source/weaponfx.db/Flamethrower.uOyi8zHzCseXGQSR.js +++ b/packs_source/weaponfx.db/Flamethrower.uOyi8zHzCseXGQSR.js @@ -1,26 +1,29 @@ -const {sourceToken, targetTokens} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -const findCenterOfTargetGroup = function (targetTokens) { - let total_x = 0; - let total_y = 0; - const numTargets = targetTokens.length; - targetTokens.forEach(t => { - let center = t.getCenter(t.position.x, t.position.y); - total_x = total_x + center.x; - total_y = total_y + center.y; - }); - return {x: (total_x / numTargets), y: (total_y / numTargets)}; -}; - -const target = findCenterOfTargetGroup(targetTokens); +const target = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; let sequence = new Sequence() .effect() - .file("jb2a.burning_hands.01.orange") - .atLocation(sourceToken) - .rotateTowards(target) - .scale({x: 0.9, y: 1.2}) - .sound() - .file("modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .play(); + .file("jb2a.burning_hands.01.orange") + .atLocation(sourceToken) + .rotateTowards(target) + .scale({x: 0.75, y: 1.0}) + .sound() + .file("modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(-3000) + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + + if (!targetsMissed.has(target.id)) { + sequence.effect() + .file("jb2a.flames.02.orange") + .opacity(0.7) + .fadeIn(800) + .fadeOut(800) + .atLocation(target) + .scaleToObject(1.2); + } +} + sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Flechette Launcher.4znqR8pQvSs3KpZo.js b/packs_source/weaponfx.db/Flechette Launcher.4znqR8pQvSs3KpZo.js index 8500ff6..92b984a 100644 --- a/packs_source/weaponfx.db/Flechette Launcher.4znqR8pQvSs3KpZo.js +++ b/packs_source/weaponfx.db/Flechette Launcher.4znqR8pQvSs3KpZo.js @@ -13,5 +13,5 @@ let sequence = new Sequence() .file("jb2a.impact.yellow") .scale(0.5) .repeats(6, 20) - .atLocation(sourceToken, {randomOffset: 2.2}) - .play(); + .atLocation(sourceToken, {randomOffset: 2.2, gridUnits: true}) + .play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Fuel Rod Gun.5B4QaBx52NzRhdum.js b/packs_source/weaponfx.db/Fuel Rod Gun.5B4QaBx52NzRhdum.js index c268584..f3cc691 100644 --- a/packs_source/weaponfx.db/Fuel Rod Gun.5B4QaBx52NzRhdum.js +++ b/packs_source/weaponfx.db/Fuel Rod Gun.5B4QaBx52NzRhdum.js @@ -29,4 +29,4 @@ if (!targetsMissed.has(target.id)) { .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/HMG.X6m0372eLE56NK6l.js b/packs_source/weaponfx.db/HMG.X6m0372eLE56NK6l.js index 38aaec9..299e739 100644 --- a/packs_source/weaponfx.db/HMG.X6m0372eLE56NK6l.js +++ b/packs_source/weaponfx.db/HMG.X6m0372eLE56NK6l.js @@ -9,11 +9,18 @@ for (const target of targetTokens) { sequence.effect() .file("jb2a.bullet.01.orange") .atLocation(sourceToken) - .stretchTo(target, {randomOffset: 0.3}) + .stretchTo(target) .missed(targetsMissed.has(target.id)) + .name("impact") + .scale(0.5) + .waitUntilFinished(-800); + sequence.effect() + .file("jb2a.bullet.01.orange") + .atLocation(sourceToken) + .stretchTo("impact", {randomOffset: 0.4, gridUnits: true}) .repeats(7, 50) .scale(0.5) .waitUntilFinished(); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Hammer.uIr2lCpJWXbDaowG.js b/packs_source/weaponfx.db/Hammer.uIr2lCpJWXbDaowG.js index 6bc9496..e7f7a80 100644 --- a/packs_source/weaponfx.db/Hammer.uIr2lCpJWXbDaowG.js +++ b/packs_source/weaponfx.db/Hammer.uIr2lCpJWXbDaowG.js @@ -6,23 +6,24 @@ for (const target of targetTokens) { sequence.effect() .file("jb2a.warhammer.melee.01.white.4") .atLocation(sourceToken) + .spriteOffset({x: -0.3}, {gridUnits:true}) .moveTowards(target) - .missed(targetsMissed.has(target.id)); + .missed(targetsMissed.has(target.id)) + .waitUntilFinished(-1400); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Axe_swing.ogg") - .delay(1300) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .waitUntilFinished(-1800); if (!targetsMissed.has(target.id)) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/HammerImpact.ogg") - .delay(1350) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.9)); sequence.effect() .file("jb2a.impact.ground_crack.orange") .atLocation(target) - .scale(0.5) - .delay(1250) - .waitUntilFinished(-800); + .belowTokens() + .scaleToObject(3) + .waitUntilFinished(-6000); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Impact Lance.gciDprfhVSDqYDPd.js b/packs_source/weaponfx.db/Impact Lance.gciDprfhVSDqYDPd.js index e5caf1c..67a888d 100644 --- a/packs_source/weaponfx.db/Impact Lance.gciDprfhVSDqYDPd.js +++ b/packs_source/weaponfx.db/Impact Lance.gciDprfhVSDqYDPd.js @@ -13,16 +13,16 @@ for (const target of targetTokens) { .atLocation(sourceToken) .stretchTo(target) .missed(targetsMissed.has(target.id)) - .waitUntilFinished(-4000); + .waitUntilFinished(-4000) + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Annihilator.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5));; if (!targetsMissed.has(target.id)) { - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Annihilator.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); sequence.effect() .file("jb2a.impact.blue.3") - .scale(1.0) + .scaleToObject(2) .atLocation(target) .waitUntilFinished(-400); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Kraul Rifle.eyeOAl8lFp0w3Hfd.js b/packs_source/weaponfx.db/Kraul Rifle.eyeOAl8lFp0w3Hfd.js index 4860161..0a0482b 100644 --- a/packs_source/weaponfx.db/Kraul Rifle.eyeOAl8lFp0w3Hfd.js +++ b/packs_source/weaponfx.db/Kraul Rifle.eyeOAl8lFp0w3Hfd.js @@ -26,4 +26,4 @@ if (!targetsMissed.has(target.id)) { .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Lasers.hWPrLPzlj6Y5RvC5.js b/packs_source/weaponfx.db/Lasers.hWPrLPzlj6Y5RvC5.js index ec6e8b0..899e36d 100644 --- a/packs_source/weaponfx.db/Lasers.hWPrLPzlj6Y5RvC5.js +++ b/packs_source/weaponfx.db/Lasers.hWPrLPzlj6Y5RvC5.js @@ -4,27 +4,27 @@ const random = Sequencer.Helpers.random_float_between(200, 300); let sequence = new Sequence(); -for (const target of targetTokens) { +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Laser_Fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .duration(633) + .repeats(3, random); + sequence.effect() + .file("jb2a.impact.blue.2") + .playIf(!targetsMissed.has(target.id)) + .atLocation(`impact${i}`) + .scaleToObject(2) + .repeats(3, random) + .delay(300); sequence.effect() .file("jb2a.lasershot.blue") .atLocation(sourceToken) .stretchTo(target, {randomOffset: 0.4}) .missed(targetsMissed.has(target.id)) - .repeats(4, random); - - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Laser_Fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .repeats(4, random); - - if (!targetsMissed.has(target.id)) { - sequence.effect() - .file("jb2a.impact.blue.2") - .atLocation(target, {randomOffset: 0.4}) - .scale(0.8) - .delay(250) - .repeats(4, random) - .waitUntilFinished(-1000); - } + .name(`impact${i}`) + .repeats(3, random) + .waitUntilFinished(); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Latch Drone.zf87PAIPccMpxnYn.js b/packs_source/weaponfx.db/Latch Drone.zf87PAIPccMpxnYn.js index 7583d30..903bd4a 100644 --- a/packs_source/weaponfx.db/Latch Drone.zf87PAIPccMpxnYn.js +++ b/packs_source/weaponfx.db/Latch Drone.zf87PAIPccMpxnYn.js @@ -29,4 +29,4 @@ for (const target of targetTokens) { .waitUntilFinished(); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Leviathan.UhdlCUxGv5UJGPQG.js b/packs_source/weaponfx.db/Leviathan.UhdlCUxGv5UJGPQG.js new file mode 100644 index 0000000..64829db --- /dev/null +++ b/packs_source/weaponfx.db/Leviathan.UhdlCUxGv5UJGPQG.js @@ -0,0 +1,28 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + +for (const target of targetTokens) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Leviathan.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .delay(500) + .waitUntilFinished(-2100); + sequence.effect() + .file("jb2a.bullet.01.orange") + .atLocation(sourceToken) + .stretchTo(target, {randomOffset: 0.3}) + .missed(targetsMissed.has(target.id)) + .name("impact") + .scale(0.5) + .waitUntilFinished(-775) + sequence.effect() + .file("jb2a.bullet.01.orange") + .atLocation(sourceToken) + .stretchTo("impact", {randomOffset: 0.6, gridUnits: true}) + .repeats(7, 30) + .scale(0.5) + .waitUntilFinished(); +} + +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Leviathan.UhdlCUxGv5UJGPQG.json b/packs_source/weaponfx.db/Leviathan.UhdlCUxGv5UJGPQG.json new file mode 100644 index 0000000..4f4afd5 --- /dev/null +++ b/packs_source/weaponfx.db/Leviathan.UhdlCUxGv5UJGPQG.json @@ -0,0 +1,8 @@ +{ + "_id": "UhdlCUxGv5UJGPQG", + "name": "Leviathan", + "img": "modules/lancer-weapon-fx/icons/machine-gun.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/LockOn.k5UDriYBR2pnAUjn.js b/packs_source/weaponfx.db/LockOn.k5UDriYBR2pnAUjn.js index 485f762..8744d0a 100644 --- a/packs_source/weaponfx.db/LockOn.k5UDriYBR2pnAUjn.js +++ b/packs_source/weaponfx.db/LockOn.k5UDriYBR2pnAUjn.js @@ -3,14 +3,14 @@ const {targetTokens} = game.modules.get("lancer-weapon-fx").api.getMacroVariable let sequence = new Sequence(); for (const target of targetTokens) { - let scale = 0.25 * target.actor.system.derived.mm.Size; + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/LockOn.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)); sequence.effect() .file("jb2a.zoning.inward.square.loop.bluegreen.01.01") .atLocation(target) - .scale(scale); + .scaleToObject(1.6); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Missile.4M655uuaKwHfZJfZ.js b/packs_source/weaponfx.db/Missile.4M655uuaKwHfZJfZ.js index d103f5e..7e28ab6 100644 --- a/packs_source/weaponfx.db/Missile.4M655uuaKwHfZJfZ.js +++ b/packs_source/weaponfx.db/Missile.4M655uuaKwHfZJfZ.js @@ -1,31 +1,33 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -let sequence = new Sequence(); +const target = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; + + +let sequence = new Sequence() -for (const target of targetTokens) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .timeRange(700, 2000); sequence.effect() - .file("modules/animated-spell-effects/spell-effects/air/black_smoke_RAY_01.webm") + .file("jb2a.pack_hound_missile") .atLocation(sourceToken) .stretchTo(target) - .missed(targetsMissed.has(target.id)) - .scale({x: 1.0, y: .5}) - .waitUntilFinished(-3700); + .waitUntilFinished(-3200); + sequence.effect() + .file("jb2a.explosion.01.orange") + .atLocation(target) + .scale(1.2) + .zIndex(1) + .waitUntilFinished(-1300); + if (!targetsMissed.has(target.id)) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); - sequence.effect() - .file("jb2a.explosion.01.orange") - .atLocation(target) - .scale(1.3) - .zIndex(1) - .waitUntilFinished(-1200); + } -} -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/MissilePinaka.nigj4bbJZOVrFf0u.js b/packs_source/weaponfx.db/MissilePinaka.nigj4bbJZOVrFf0u.js new file mode 100644 index 0000000..a54e3d8 --- /dev/null +++ b/packs_source/weaponfx.db/MissilePinaka.nigj4bbJZOVrFf0u.js @@ -0,0 +1,35 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +// Pinaka wants 2 missiles, so get 2 groups +const targetPoints = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 2); + +let sequence = new Sequence(); + +for (const targetPoint of targetPoints) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .timeRange(700, 2000); + sequence.effect() + .file("jb2a.throwable.launch.missile") + .atLocation(sourceToken) + .stretchTo(targetPoint) + .waitUntilFinished(); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + sequence.effect() + .file("jb2a.explosion.01.orange") + .atLocation(targetPoint) + .scale(1.2) + .zIndex(2); + sequence.effect() + .file("jb2a.explosion.08.orange") + .atLocation(targetPoint) + .scale(1.2) + .zIndex(1); +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/MissilePinaka.nigj4bbJZOVrFf0u.json b/packs_source/weaponfx.db/MissilePinaka.nigj4bbJZOVrFf0u.json new file mode 100644 index 0000000..3c058af --- /dev/null +++ b/packs_source/weaponfx.db/MissilePinaka.nigj4bbJZOVrFf0u.json @@ -0,0 +1,8 @@ +{ + "_id": "nigj4bbJZOVrFf0u", + "name": "MissilePinaka", + "img": "modules/lancer-weapon-fx/icons/rocket.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Missiles.bfFuD6eL09TcBLIN.js b/packs_source/weaponfx.db/Missiles.bfFuD6eL09TcBLIN.js new file mode 100644 index 0000000..660d13f --- /dev/null +++ b/packs_source/weaponfx.db/Missiles.bfFuD6eL09TcBLIN.js @@ -0,0 +1,35 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .timeRange(700, 2000); + sequence.effect() + .file("jb2a.pack_hound_missile") + .atLocation(sourceToken) + .stretchTo(target) + .missed(targetsMissed.has(target.id)) + .name(`impact${i}`) + .waitUntilFinished(-3200); + sequence.effect() + .file("jb2a.explosion.01.orange") + .atLocation(`impact${i}`) + .scale(0.8) + .zIndex(1) + .waitUntilFinished(-1300); + + if (!targetsMissed.has(target.id)) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(-8000); + + } +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Missiles.bfFuD6eL09TcBLIN.json b/packs_source/weaponfx.db/Missiles.bfFuD6eL09TcBLIN.json new file mode 100644 index 0000000..c03fb97 --- /dev/null +++ b/packs_source/weaponfx.db/Missiles.bfFuD6eL09TcBLIN.json @@ -0,0 +1,8 @@ +{ + "_id": "bfFuD6eL09TcBLIN", + "name": "Missiles", + "img": "modules/lancer-weapon-fx/icons/missile-swarm.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Mortar.sSGstellhxzWUTXd.js b/packs_source/weaponfx.db/Mortar.sSGstellhxzWUTXd.js index 12de1f4..bcacefb 100644 --- a/packs_source/weaponfx.db/Mortar.sSGstellhxzWUTXd.js +++ b/packs_source/weaponfx.db/Mortar.sSGstellhxzWUTXd.js @@ -1,26 +1,52 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); +const centerMass = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; + +const repeatImpactAnimationForEachTarget = function (sequence, targetTokens) { + targetTokens.forEach(t => { + if (!targetsMissed.has(t.id)) { + sequence.effect() + .file("jb2a.explosion_side.01.orange") + .atLocation(t) + .rotateTowards(centerMass) + .scale(0.7) + .center() + } + }); + return sequence; +} + let sequence = new Sequence(); -for (const target of targetTokens) { - sequence.effect() - .file("modules/animated-spell-effects-cartoon/spell-effects/cartoon/mix/fire_earth_explosion_SQUARE_02.webm") - .atLocation(sourceToken) - .rotateTowards(target) - .missed(targetsMissed.has(target.id)) - .scale(0.5); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Mortar_Launch.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); sequence.effect() - .file("jb2a.explosion.03.blueyellow") - .atLocation(target, {randomOffset: true}) - .missed(targetsMissed.has(target.id)) - .repeats(3, 125) - .delay(900); + .file("jb2a.smoke.puff.side.02.white") + .atLocation(sourceToken) + .rotateTowards(centerMass) + .scale({y: 0.5}); + sequence.effect() + .file("jb2a.bullet.02.orange") + .atLocation(sourceToken) + .stretchTo(centerMass) + .playbackRate(0.7) + .waitUntilFinished(-650) + + sequence.effect() + .file("jb2a.explosion.shrapnel.bomb.01.black") + .atLocation(centerMass) + .scale(0.5); + sequence.effect() + .file("jb2a.explosion.08.orange") + .atLocation(centerMass) + .rotateTowards(sourceToken) + .rotate(180) + .center(); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Mortar_Impact.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .delay(900); -} -sequence.play(); + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + +sequence = repeatImpactAnimationForEachTarget(sequence, targetTokens); + +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Nanobot Whip.jHll38UQ9hHzwsf3.js b/packs_source/weaponfx.db/Nanobot Whip.jHll38UQ9hHzwsf3.js index 190550b..d8b8901 100644 --- a/packs_source/weaponfx.db/Nanobot Whip.jHll38UQ9hHzwsf3.js +++ b/packs_source/weaponfx.db/Nanobot Whip.jHll38UQ9hHzwsf3.js @@ -2,37 +2,36 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weap let sequence = new Sequence(); -let gridsize = canvas.grid.grid.options.dimensions.size; -let gridscale = gridsize / 100; - for (const target of targetTokens) { sequence.effect() .file("jb2a.divine_smite.target.blueyellow") - .scale(0.8) + .scale(0.9) .tint("#066605") .atLocation(sourceToken) - .rotateTowards(target) + .moveTowards(target) + .moveSpeed(175) + .spriteOffset({x: 0, y: 100, gridUnits: true}) .missed(targetsMissed.has(target.id)) - .spriteOffset({x: -160 * gridscale, y: 90 * gridscale}) - .rotate(90); - - sequence.sound() + .rotate(90) + .delay(500) + .sound() .file("modules/lancer-weapon-fx/soundfx/bladeswing.ogg") + .delay(500) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); if (!targetsMissed.has(target.id)) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/bladehit.ogg") - .delay(300) + .delay(800) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); sequence.effect() .file("jb2a.impact.blue") - .scale(0.4) + .scale(0.5) .tint("#066605") .atLocation(target, {randomOffset: 1}) .repeats(4, 80) - .delay(700) + .delay(1200) .waitUntilFinished(-1500); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Needle Beam.Aj3QspxsjcnNjfol.js b/packs_source/weaponfx.db/Needle Beam.Aj3QspxsjcnNjfol.js index 099193c..6730125 100644 --- a/packs_source/weaponfx.db/Needle Beam.Aj3QspxsjcnNjfol.js +++ b/packs_source/weaponfx.db/Needle Beam.Aj3QspxsjcnNjfol.js @@ -7,17 +7,20 @@ for (const target of targetTokens) { sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .waitUntilFinished(-1200); - sequence.effect() + .waitUntilFinished(-1200) + .sound() + .file("modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .repeats(2, 225) + + .effect() .file("jb2a.lasershot.green") .atLocation(sourceToken) .stretchTo(target) .missed(targetsMissed.has(target.id)) - .repeats(2, 300); - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .repeats(2, 300); + .repeats(2, 225) + .waitUntilFinished(-350) +; if (!targetsMissed.has(target.id)) { sequence.effect() .file("jb2a.impact.orange.0") @@ -25,11 +28,8 @@ for (const target of targetTokens) { .rotateTowards(sourceToken) .rotate(230) .center() - .waitUntilFinished() .tint("#1aff34") - .scale(0.8) - .delay(400) - .waitUntilFinished(-1800); + .scale(0.8); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Nexus.RmFiCRMoSOku7G5g.js b/packs_source/weaponfx.db/Nexus.RmFiCRMoSOku7G5g.js index 3267336..3ce7cbb 100644 --- a/packs_source/weaponfx.db/Nexus.RmFiCRMoSOku7G5g.js +++ b/packs_source/weaponfx.db/Nexus.RmFiCRMoSOku7G5g.js @@ -1,28 +1,62 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -let sequence = new Sequence(); +const pTarget = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; -for (const target of targetTokens) { - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Nexus_Fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); +// Calculate the point 70% of the distance between sourceToken and pTarget +const pBlast = { + x: sourceToken.position.x + 0.7 * (pTarget.x - sourceToken.position.x), + y: sourceToken.position.y + 0.7 * (pTarget.y - sourceToken.position.y), +}; + + +let sequence = new Sequence() + + .sound() + .file("modules/lancer-weapon-fx/soundfx/NexusReady.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/NexusFire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .repeats(3, 150); sequence.effect() - .file("modules/animated-spell-effects/spell-effects/energy/energy_throw_RAY_10.webm") + .file("jb2a.bullet.01.orange") + .filter("ColorMatrix", {hue: 070}) + .filter("Blur", {blur: 8, strength: 10, blurX: 4}) .atLocation(sourceToken) - .stretchTo(target) - .missed(targetsMissed.has(target.id)) - .scale({x: 1.0, y: .5}) - .waitUntilFinished(-1300); - if (!targetsMissed.has(target.id)) { - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Nexus_Impact.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.4)); - sequence.effect() - .file("modules/animated-spell-effects/spell-effects/energy/energy_explosion_CIRCLE_05.webm") - .atLocation(target) - .scale(1.3) - .zIndex(1) - .waitUntilFinished(-1700); - } + .stretchTo(pBlast, {randomOffset: 0.6}) + .repeats(3, 150) + .waitUntilFinished(-800); + sequence.effect() + .file("jb2a.side_impact.part.smoke.blue") + .filter("ColorMatrix", {hue: 230, brightness: 0.5}) + .scale(0.8) + .atLocation(pBlast, {randomOffset: 0.1}) + .rotateTowards(pTarget) + .repeats(3, 150) + .waitUntilFinished(-2200); + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + + sequence.effect() + .file("jb2a.impact.004.blue") + .playIf(!targetsMissed.has(target.id)) + .filter("ColorMatrix", {hue: 235, brightness: 0.5}) + .scale(0.5) + .zIndex(1) + .atLocation(target, {randomOffset: 0.5, gridUnits: true}) + .repeats(3, 100); + sequence.effect() + .file("jb2a.zoning.inward.circle.loop") + .playIf(!targetsMissed.has(target.id)) + .scale(0.4) + .fadeOut(3800, {ease: "easeOutBack"}) + .belowTokens() + .atLocation(target); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/NexusConfirm.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .playIf(!targetsMissed.has(target.id)); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/PPC.LxQMeItXellYRt3b.js b/packs_source/weaponfx.db/PPC.LxQMeItXellYRt3b.js index c2b73e3..a4b0c35 100644 --- a/packs_source/weaponfx.db/PPC.LxQMeItXellYRt3b.js +++ b/packs_source/weaponfx.db/PPC.LxQMeItXellYRt3b.js @@ -14,4 +14,4 @@ for (const target of targetTokens) { .stretchTo(target) .missed(targetsMissed.has(target.id)); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Pistol.OSMfNiiu5XtzacAJ.js b/packs_source/weaponfx.db/Pistol.OSMfNiiu5XtzacAJ.js index 1fc418b..c1357a6 100644 --- a/packs_source/weaponfx.db/Pistol.OSMfNiiu5XtzacAJ.js +++ b/packs_source/weaponfx.db/Pistol.OSMfNiiu5XtzacAJ.js @@ -18,4 +18,4 @@ for (const target of targetTokens) { .repeats(3, random) .waitUntilFinished(-600); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Plasma Maul.gBqPs99uLDUAroZu.js b/packs_source/weaponfx.db/Plasma Maul.gBqPs99uLDUAroZu.js index db77fe3..909db24 100644 --- a/packs_source/weaponfx.db/Plasma Maul.gBqPs99uLDUAroZu.js +++ b/packs_source/weaponfx.db/Plasma Maul.gBqPs99uLDUAroZu.js @@ -2,29 +2,32 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weap let sequence = new Sequence(); + for (const target of targetTokens) { sequence.effect() .file("jb2a.warhammer.melee.01.white.4") - .tint("#18f014") + .filter("Glow", {color: 0x18f014, innerStrength: 1.5, knockout: true, quality: 0.1, distance: 50}) + .tint("#18f014") .atLocation(sourceToken) + .spriteOffset({x: -0.3}, {gridUnits:true}) .moveTowards(target) - .missed(targetsMissed.has(target.id)); + .missed(targetsMissed.has(target.id)) + .waitUntilFinished(-1400); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Axe_swing.ogg") - .delay(1300) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .waitUntilFinished(-1800); if (!targetsMissed.has(target.id)) { sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Axe_Hit.ogg") - .delay(1550) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + .file("modules/lancer-weapon-fx/soundfx/HammerImpact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.9)); sequence.effect() - .file("jb2a.impact.blue.3") - .scale(1.2) - .tint("#18f014") + .file("jb2a.impact.ground_crack.orange") + .tint("#18f014") .atLocation(target) - .delay(1550) - .waitUntilFinished(-1000); + .belowTokens() + .scaleToObject(3) + .waitUntilFinished(-6000); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Plasma Rifle.noDQfz2lYaqIc1ii.js b/packs_source/weaponfx.db/Plasma Rifle.noDQfz2lYaqIc1ii.js index 9134016..248a588 100644 --- a/packs_source/weaponfx.db/Plasma Rifle.noDQfz2lYaqIc1ii.js +++ b/packs_source/weaponfx.db/Plasma Rifle.noDQfz2lYaqIc1ii.js @@ -1,27 +1,34 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); +const random = Sequencer.Helpers.random_float_between(300, 400); + let sequence = new Sequence(); -for (const target of targetTokens) { +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .duration(633) + .repeats(2, random); + sequence.effect() + .file("jb2a.impact.004.blue") + .playIf(!targetsMissed.has(target.id)) + .atLocation(`impact${i}`) + .tint("#1aff34") + .scaleToObject(2) + .repeats(2, random) + .delay(300) + .playbackRate(1.5); sequence.effect() .file("jb2a.lasershot.green") .atLocation(sourceToken) - .stretchTo(target, {randomOffset: 0.4}) + .stretchTo(target, {randomOffset: 0.3, gridUnits: true}) .missed(targetsMissed.has(target.id)) - .repeats(3, 300); - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Plasma_Fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .repeats(3, 300); - if (!targetsMissed.has(target.id)) { - sequence.effect() - .file("jb2a.impact.004.blue") - .atLocation(target, {randomOffset: 0.4}) - .tint("#1aff34") - .scale(0.6) - .repeats(3, 300) - .delay(400) - .waitUntilFinished(-1800); - } + .name(`impact${i}`) + .repeats(2, random) + .waitUntilFinished(); + + } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Plasma Talons.ui1a07lCGBOk4Rp7.js b/packs_source/weaponfx.db/Plasma Talons.ui1a07lCGBOk4Rp7.js index 4e4abd4..ef8e3bc 100644 --- a/packs_source/weaponfx.db/Plasma Talons.ui1a07lCGBOk4Rp7.js +++ b/packs_source/weaponfx.db/Plasma Talons.ui1a07lCGBOk4Rp7.js @@ -8,20 +8,22 @@ for (const target of targetTokens) { .file("jb2a.claws.400px.red") .tint("#720d87") .scale(0.8) + .zIndex(1) + .opacity(0.6) .atLocation(target) .missed(targetsMissed.has(target.id)); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Melee.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .repeats(2, 200); + .repeats(2, 250); if (!targetsMissed.has(target.id)) { sequence.effect() .file("jb2a.impact.blue.2") - .scale(1.5) + .scale(1.0) .tint("#c91af9") - .atLocation(target) - .delay(600) - .waitUntilFinished(-1000); + .atLocation(target, {randomOffset:0.1|true}) + .delay(200) + .repeats(2, 250); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Plasma Thrower.e5XwWrHsiRKrgh7S.js b/packs_source/weaponfx.db/Plasma Thrower.e5XwWrHsiRKrgh7S.js index 07fdbb0..11b1ab7 100644 --- a/packs_source/weaponfx.db/Plasma Thrower.e5XwWrHsiRKrgh7S.js +++ b/packs_source/weaponfx.db/Plasma Thrower.e5XwWrHsiRKrgh7S.js @@ -1,13 +1,35 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -const target = targetTokens[0]; +const target = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; let sequence = new Sequence() - .effect() - .file("jb2a.breath_weapons02.burst.line.fire.orange.01") - .atLocation(sourceToken) - .rotateTowards(target) - .sound() - .file("modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .play(); + + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + sequence.effect() + .file("jb2a.breath_weapons02.burst.cone.fire.orange.02") + .atLocation(sourceToken) + .filter("ColorMatrix", {hue: 270}) + .filter("Glow", {distance: 3, color: 0xe99649, innerStrength: 2}) + .scale({x: 0.9}) + .playbackRate(1.6) + .rotateTowards(target) + .waitUntilFinished(-3500); + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + + if (!targetsMissed.has(target.id)) { + sequence.effect() + .file("jb2a.flames.02.orange") + .filter("ColorMatrix", {hue: 270}) + .filter("Glow", {distance: 3, color: 0xe99649, innerStrength: 2}) + .opacity(0.7) + .fadeIn(800) + .fadeOut(800) + .atLocation(target) + .scaleToObject(1.2); + } +} + sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Plasma Torch.UL0licrIIu44WXnO.js b/packs_source/weaponfx.db/Plasma Torch.UL0licrIIu44WXnO.js index b13261d..f69be46 100644 --- a/packs_source/weaponfx.db/Plasma Torch.UL0licrIIu44WXnO.js +++ b/packs_source/weaponfx.db/Plasma Torch.UL0licrIIu44WXnO.js @@ -10,4 +10,4 @@ let sequence = new Sequence() .sound() .file("modules/lancer-weapon-fx/soundfx/flamethrower_fire.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .play(); + .play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Railgun.iOD860W9KokfR3Hy.js b/packs_source/weaponfx.db/Railgun.iOD860W9KokfR3Hy.js index f2c2739..b534e3f 100644 --- a/packs_source/weaponfx.db/Railgun.iOD860W9KokfR3Hy.js +++ b/packs_source/weaponfx.db/Railgun.iOD860W9KokfR3Hy.js @@ -1,31 +1,57 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -let sequence = new Sequence(); - -for (const target of targetTokens) { - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) - .waitUntilFinished(-500); - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); - sequence.effect() - .file("jb2a.bullet.Snipe.blue") - .atLocation(sourceToken) - .stretchTo(target) - .missed(targetsMissed.has(target.id)); - if (!targetsMissed.has(target.id)) { - sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); - sequence.effect() - .file("jb2a.impact.orange.0") - .atLocation(target) - .rotateTowards(sourceToken) - .rotate(230) - .center() - .waitUntilFinished(); - } +const findFarthestTargetOfGroup = function (targetTokens) { + let farthestToken = null; + let farthestTokenDistance = 0; + targetTokens.forEach(t => { + let distance = canvas.grid.measureDistance(sourceToken, t); + if (distance > farthestTokenDistance) { + farthestToken = t; + farthestTokenDistance = distance; + } + }); + + return farthestToken; +}; + +const target = findFarthestTargetOfGroup(targetTokens); + +const repeatImpactAnimationForEachTarget = function (sequence, targets) { + targets.forEach(t => { + if (!targetsMissed.has(t.id)) { + sequence.effect() + .file("jb2a.impact.orange.0") + .atLocation(t) + .rotateTowards(sourceToken) + .rotate(230) + .center() + } + }); + return sequence; } -sequence.play(); + + +let sequence = new Sequence() + + .sound() + .file("modules/lancer-weapon-fx/soundfx/Annihilator_Charge.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(-500); + + sequence.effect() + .file("jb2a.bullet.Snipe.blue") + .atLocation(sourceToken) + .stretchTo(target) + + .sound() + .file("modules/lancer-weapon-fx/soundfx/AMR_Fire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + + .sound() + .file("modules/lancer-weapon-fx/soundfx/AMR_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + ; + +sequence = repeatImpactAnimationForEachTarget(sequence, targetTokens); + +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Retort Loop.NbTm6IW88EKyM6sN.js b/packs_source/weaponfx.db/Retort Loop.NbTm6IW88EKyM6sN.js index 5b67fc3..b5b8d15 100644 --- a/packs_source/weaponfx.db/Retort Loop.NbTm6IW88EKyM6sN.js +++ b/packs_source/weaponfx.db/Retort Loop.NbTm6IW88EKyM6sN.js @@ -12,15 +12,23 @@ for (const target of targetTokens) { .atLocation(sourceToken) .stretchTo(target) .missed(targetsMissed.has(target.id)) + .name("impact") .delay(200); if (!targetsMissed.has(target.id)) { sequence.effect() .file("jb2a.impact.blue") .scale(0.3) .atLocation(target, {randomOffset: 0.9}) - .repeats(8, 300) - .delay(500) - .waitUntilFinished(); + .repeats(8, 200) + .delay(700); + } + else { + sequence.effect() + .file("jb2a.impact.blue") + .scale(0.3) + .atLocation("impact", {randomOffset: 0.9}) + .repeats(8, 200) + .delay(700); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/ShockBaton.POS2lrr0O83sNweN.js b/packs_source/weaponfx.db/ShockBaton.POS2lrr0O83sNweN.js new file mode 100644 index 0000000..f5104ae --- /dev/null +++ b/packs_source/weaponfx.db/ShockBaton.POS2lrr0O83sNweN.js @@ -0,0 +1,38 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + +for (const target of targetTokens) { + sequence.effect() + .file("jb2a.melee_attack.01.magic_sword.yellow") + .delay(500) + .scaleToObject(3) + .filter("ColorMatrix", {hue: 180}) + .atLocation(sourceToken) + .moveTowards(target) + .waitUntilFinished(-1000) + .missed(targetsMissed.has(target.id)); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Axe_swing.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(-1450); + + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Melee.ogg") + .playIf(!targetsMissed.has(target.id)) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + sequence.effect() + .file("jb2a.impact.blue.2") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject() + .atLocation(target, {randomOffset: 0.5, gridUnits:true}) + .waitUntilFinished(-1200); + sequence.effect() + .file("jb2a.static_electricity.03") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(0.7) + .atLocation(target, {randomOffset: 0.6, gridUnits: true}) + .repeats(3, 75) + .waitUntilFinished(-1200); +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/ShockBaton.POS2lrr0O83sNweN.json b/packs_source/weaponfx.db/ShockBaton.POS2lrr0O83sNweN.json new file mode 100644 index 0000000..b3c2409 --- /dev/null +++ b/packs_source/weaponfx.db/ShockBaton.POS2lrr0O83sNweN.json @@ -0,0 +1,8 @@ +{ + "_id": "POS2lrr0O83sNweN", + "name": "ShockBaton", + "img": "modules/lancer-weapon-fx/icons/shining-sword.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Shotgun.NMU9syMKa0dTsINf.js b/packs_source/weaponfx.db/Shotgun.NMU9syMKa0dTsINf.js index 1db9622..162fdc3 100644 --- a/packs_source/weaponfx.db/Shotgun.NMU9syMKa0dTsINf.js +++ b/packs_source/weaponfx.db/Shotgun.NMU9syMKa0dTsINf.js @@ -26,4 +26,4 @@ for (const target of targetTokens) { .delay(500) .waitUntilFinished(-100); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Slag Cannon.OAs6mALoTynun3lM.js b/packs_source/weaponfx.db/Slag Cannon.OAs6mALoTynun3lM.js index 30ddcd5..9c6baf5 100644 --- a/packs_source/weaponfx.db/Slag Cannon.OAs6mALoTynun3lM.js +++ b/packs_source/weaponfx.db/Slag Cannon.OAs6mALoTynun3lM.js @@ -1,34 +1,34 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); -const target = targetTokens[0]; -let scale = 0.1 * target.actor.system.derived.mm.Size; +const target = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; let sequence = new Sequence() - .sound() - .file("modules/lancer-weapon-fx/soundfx/CPR_Fire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) - .effect() - .file("jb2a.energy_strands.complete.blue.01") - .tint("#ceb673") - .endTime(1500) - .scale(0.10) - .atLocation(sourceToken) - .moveTowards(target) - .missed(targetsMissed.has(target.id)) - .waitUntilFinished(200); -if (!targetsMissed.has(target.id)) { sequence.sound() - .file("modules/lancer-weapon-fx/soundfx/DisplacerHit1.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) - .repeats(3, 100) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.6)); + .file("modules/lancer-weapon-fx/soundfx/RetortLoop.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) sequence.effect() - .file("jb2a.impact.blue") - .tint("#ceb673") - .scale(0.3) - .atLocation(target, {randomOffset: 0.9}) - .repeats(3, 100) -} + .file("jb2a.breath_weapons02.burst.line") + .atLocation(sourceToken) + .filter("ColorMatrix", {hue: 180, brightness: 0.2, contrast: 0.5}) + .filter("Glow", {distance: 0.5, color: 0xd6c194, innerStrength: 2}) + .stretchTo(target) + .playbackRate(1.5) + .waitUntilFinished(-3500); + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; -sequence.play(); + if (!targetsMissed.has(target.id)) { + sequence.effect() + .file("jb2a.grease.dark_brown.loop") + .opacity(0.8) + .fadeIn(800) + .fadeOut(800) + .atLocation(target, {randomOffset: 2, gridUnits: true}) + .belowTokens() + .repeats(3) + .scaleToObject(1); + } +} + sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Tachyon Lance.BkYGErIuWCVcF4rS.js b/packs_source/weaponfx.db/Tachyon Lance.BkYGErIuWCVcF4rS.js index 655fd00..7e134a2 100644 --- a/packs_source/weaponfx.db/Tachyon Lance.BkYGErIuWCVcF4rS.js +++ b/packs_source/weaponfx.db/Tachyon Lance.BkYGErIuWCVcF4rS.js @@ -21,4 +21,4 @@ for (const target of targetTokens) { .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) .waitUntilFinished(-400); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/TempestBlade.hI3KpcI1IYKR43lF.js b/packs_source/weaponfx.db/TempestBlade.hI3KpcI1IYKR43lF.js new file mode 100644 index 0000000..069fb89 --- /dev/null +++ b/packs_source/weaponfx.db/TempestBlade.hI3KpcI1IYKR43lF.js @@ -0,0 +1,39 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + +for (const target of targetTokens) { + sequence.effect() + .file("jb2a.melee_attack.01.magic_sword.yellow") + .delay(500) + .scaleToObject(6) + .filter("ColorMatrix", {hue: 180}) + .atLocation(sourceToken) + .moveTowards(target) + .waitUntilFinished(-1000) + .missed(targetsMissed.has(target.id)); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Axe_swing.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .waitUntilFinished(-1450); + + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Melee.ogg") + .playIf(!targetsMissed.has(target.id)) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); + sequence.effect() + .file("jb2a.impact.blue.3") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(2) + .atLocation(target) + .waitUntilFinished(-1200); + sequence.effect() + .file("jb2a.static_electricity.03") + .playIf(!targetsMissed.has(target.id)) + .scaleToObject() + .atLocation(target, {randomOffset: 0.8, gridUnits: true}) + .repeats(3, 75) + .opacity(0.8) + .waitUntilFinished(-1200); +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/TempestBlade.hI3KpcI1IYKR43lF.json b/packs_source/weaponfx.db/TempestBlade.hI3KpcI1IYKR43lF.json new file mode 100644 index 0000000..aef53a4 --- /dev/null +++ b/packs_source/weaponfx.db/TempestBlade.hI3KpcI1IYKR43lF.json @@ -0,0 +1,8 @@ +{ + "_id": "hI3KpcI1IYKR43lF", + "name": "TempestBlade", + "img": "modules/lancer-weapon-fx/icons/shining-sword.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Thermal Rifle.LixHY6HTrY7D3b7S.js b/packs_source/weaponfx.db/Thermal Rifle.LixHY6HTrY7D3b7S.js index cc2a251..7b35bda 100644 --- a/packs_source/weaponfx.db/Thermal Rifle.LixHY6HTrY7D3b7S.js +++ b/packs_source/weaponfx.db/Thermal Rifle.LixHY6HTrY7D3b7S.js @@ -3,6 +3,9 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weap let sequence = new Sequence(); for (const target of targetTokens) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/WeaponBeep.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Thermal_Rifle_Fire.ogg") .delay(400) @@ -14,16 +17,17 @@ for (const target of targetTokens) { .atLocation(sourceToken) .stretchTo(target) .missed(targetsMissed.has(target.id)); - if (!targetsMissed.has(target.id)) { + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Thermal_Rifle_Hit.ogg") + .playIf(!targetsMissed.has(target.id)) .delay(700) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); sequence.effect() .file("jb2a.impact.orange.3") + .playIf(!targetsMissed.has(target.id)) .atLocation(target) .delay(700) .waitUntilFinished(); - } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Torch.zsccsSD1tOOqRc5Q.js b/packs_source/weaponfx.db/Torch.zsccsSD1tOOqRc5Q.js index 53bc500..5239de2 100644 --- a/packs_source/weaponfx.db/Torch.zsccsSD1tOOqRc5Q.js +++ b/packs_source/weaponfx.db/Torch.zsccsSD1tOOqRc5Q.js @@ -9,23 +9,25 @@ for (const target of targetTokens) { .scale(0.8) .atLocation(sourceToken) .moveTowards(target) - .missed(targetsMissed.has(target.id)); - sequence.sound() + .missed(targetsMissed.has(target.id)) + .waitUntilFinished(-1200) + .sound() .file("modules/lancer-weapon-fx/soundfx/Axe_swing.ogg") - .delay(1300) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); - if (!targetsMissed.has(target.id)) { + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/Axe_Hit.ogg") - .delay(1550) + .playIf(!targetsMissed.has(target.id)) + .delay(275) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); sequence.effect() .file("jb2a.impact.blue.3") - .scale(1.2) + .playIf(!targetsMissed.has(target.id)) + .delay(275) + .scaleToObject(2) .tint("#c91af9") .atLocation(target) - .delay(1550) .waitUntilFinished(-1000); - } + } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Veil Rifle.6vtYP47LXaX5POYB.js b/packs_source/weaponfx.db/Veil Rifle.6vtYP47LXaX5POYB.js index 118442a..ae61f94 100644 --- a/packs_source/weaponfx.db/Veil Rifle.6vtYP47LXaX5POYB.js +++ b/packs_source/weaponfx.db/Veil Rifle.6vtYP47LXaX5POYB.js @@ -8,10 +8,11 @@ for (const target of targetTokens) { .filter("ColorMatrix", {hue: 60}) .filter("Glow", {distance: 3}) .atLocation(sourceToken) + .scale(0.8) .stretchTo(target) .missed(targetsMissed.has(target.id)); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/veil_rifle.ogg") .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/War Pike.CqlCKrYyJCYdmLks.js b/packs_source/weaponfx.db/War Pike.CqlCKrYyJCYdmLks.js index 7ca1397..96a7212 100644 --- a/packs_source/weaponfx.db/War Pike.CqlCKrYyJCYdmLks.js +++ b/packs_source/weaponfx.db/War Pike.CqlCKrYyJCYdmLks.js @@ -5,26 +5,27 @@ let sequence = new Sequence(); for (const target of targetTokens) { sequence.effect() .file("jb2a.spear.melee.01.white.2") - .filter("Glow", {color: 0x8D918D}) + .filter("Glow", {color: 0x5f5858, innerStrength: 2, knockout: true, distance: 20}) .scale(0.8) .atLocation(sourceToken) .moveTowards(target) .missed(targetsMissed.has(target.id)); sequence.sound() .file("modules/lancer-weapon-fx/soundfx/bladeswing.ogg") - .delay(1000) - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); - if (!targetsMissed.has(target.id)) { + .delay(950) + .endTime(600) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .waitUntilFinished(-800); + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/bladehit.ogg") - .delay(1150) + .playIf(!targetsMissed.has(target.id)) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)); sequence.effect() .file("jb2a.impact.orange.3") - .scale(0.8) + .playIf(!targetsMissed.has(target.id)) + .scaleToObject(2) .atLocation(target) - .delay(1100) .waitUntilFinished(); - } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Warp Rifle.jGNjJXWRQMh7jPhA.js b/packs_source/weaponfx.db/Warp Rifle.jGNjJXWRQMh7jPhA.js index 5bcadb1..477c93c 100644 --- a/packs_source/weaponfx.db/Warp Rifle.jGNjJXWRQMh7jPhA.js +++ b/packs_source/weaponfx.db/Warp Rifle.jGNjJXWRQMh7jPhA.js @@ -1,34 +1,33 @@ const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); const target = targetTokens[0]; -let scale = 0.1 * target.actor.system.derived.mm.Size; let sequence = new Sequence() .sound() - .file("modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg") - .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) - .startTime(900) - .fadeInAudio(500) + .file("modules/lancer-weapon-fx/soundfx/DisplacerFire.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) + .startTime(900) + .fadeInAudio(500) .effect() - .file("jb2a.energy_strands.range.multiple.purple.01") - .scale(0.40) - .atLocation(sourceToken) - .stretchTo(target) - .missed(targetsMissed.has(target.id)) - .waitUntilFinished(-1100) + .file("jb2a.energy_strands.range.multiple.purple.01") + .scale(0.40) + .atLocation(sourceToken) + .stretchTo(target) + .missed(targetsMissed.has(target.id)) + .waitUntilFinished(-1100) -if (!targetsMissed.has(target.id)) { - sequence - .sound() + sequence.sound() .file("modules/lancer-weapon-fx/soundfx/DisplacerHit2.ogg") + .playIf(!targetsMissed.has(target.id)) .delay(300) - .effect() + .effect() .file("jb2a.divine_smite.caster.blueyellow") + .playIf(!targetsMissed.has(target.id)) .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.8)) - .scale(.9) + .scaleToObject(3) .tint("#9523e1") + .filter("Glow", {color: 0xffffff, distance: 1}) .atLocation(target) .waitUntilFinished(-1000) -} -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/AegisDefenseNet.LGPQdA8CUpcw5wNR.js b/packs_source/weaponfx_manual.db/AegisDefenseNet.LGPQdA8CUpcw5wNR.js new file mode 100644 index 0000000..f7e6528 --- /dev/null +++ b/packs_source/weaponfx_manual.db/AegisDefenseNet.LGPQdA8CUpcw5wNR.js @@ -0,0 +1,13 @@ +//This macro is not linked to any weapon or system and must be applied manually. It can be removed with the accompanying 'EndDefenseNet' macro, or through the Sequencer Manager + +new Sequence() + .effect("jb2a.shield.01.intro") + .atLocation(token) + .waitUntilFinished(-700) + .scaleToObject(9.5) + .effect("jb2a.shield.01.loop.blue") + .fadeIn(300) + .persist() + .attachTo(token, { bindVisibility: true }) + .scaleToObject(9.5) +.play() \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/AegisDefenseNet.LGPQdA8CUpcw5wNR.json b/packs_source/weaponfx_manual.db/AegisDefenseNet.LGPQdA8CUpcw5wNR.json new file mode 100644 index 0000000..00abb56 --- /dev/null +++ b/packs_source/weaponfx_manual.db/AegisDefenseNet.LGPQdA8CUpcw5wNR.json @@ -0,0 +1,8 @@ +{ + "_id": "LGPQdA8CUpcw5wNR", + "name": "AegisDefenseNet", + "img": "icons/svg/ice-shield.svg", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/Designate Pinaka Area.D8E9YpHQsJhxBLvs.js b/packs_source/weaponfx_manual.db/Designate Pinaka Area.D8E9YpHQsJhxBLvs.js new file mode 100644 index 0000000..ed2f8f5 --- /dev/null +++ b/packs_source/weaponfx_manual.db/Designate Pinaka Area.D8E9YpHQsJhxBLvs.js @@ -0,0 +1,12 @@ +// This will lay down a template suitable for designating the location of a delayed Pinaka Missile strike. + +game.lancer.canvas.WeaponRangeTemplate.fromRange({ + type: "Blast", + val: 2, +}).placeTemplate() + .then(t => { + if (t) { + t.update({texture: "modules/JB2A_DnD5e/Library/Generic/Zoning/ZoningSquare01In_01_Regular_BlueGreen_Loop_600x600.webm", distance: 1, fillColor: "#FF0000" }); + }; + } +) \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/Designate Pinaka Area.D8E9YpHQsJhxBLvs.json b/packs_source/weaponfx_manual.db/Designate Pinaka Area.D8E9YpHQsJhxBLvs.json new file mode 100644 index 0000000..79b6de4 --- /dev/null +++ b/packs_source/weaponfx_manual.db/Designate Pinaka Area.D8E9YpHQsJhxBLvs.json @@ -0,0 +1,8 @@ +{ + "_id": "D8E9YpHQsJhxBLvs", + "name": "Designate Pinaka Area", + "img": "modules/lancer-weapon-fx/icons/PinakaArea.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/Designate Smoke Grenade.ZNQDndUit13iQDfV.js b/packs_source/weaponfx_manual.db/Designate Smoke Grenade.ZNQDndUit13iQDfV.js new file mode 100644 index 0000000..243d6eb --- /dev/null +++ b/packs_source/weaponfx_manual.db/Designate Smoke Grenade.ZNQDndUit13iQDfV.js @@ -0,0 +1,12 @@ +// This will lay down a template suitable for designating the location of a delayed Pinaka Missile strike. + +game.lancer.canvas.WeaponRangeTemplate.fromRange({ + type: "Blast", + val: 2.0, +}).placeTemplate() + .then(t => { + if (t) { + t.update({texture: "modules/JB2A_DnD5e/Library/Generic/Smoke/SmokePlumes01_03_Regular_Grey_400x400.webm", distance: 1.8, fillColor: "#756c6c" }); + }; + } +) \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/Designate Smoke Grenade.ZNQDndUit13iQDfV.json b/packs_source/weaponfx_manual.db/Designate Smoke Grenade.ZNQDndUit13iQDfV.json new file mode 100644 index 0000000..60b5072 --- /dev/null +++ b/packs_source/weaponfx_manual.db/Designate Smoke Grenade.ZNQDndUit13iQDfV.json @@ -0,0 +1,8 @@ +{ + "_id": "ZNQDndUit13iQDfV", + "name": "Designate Smoke Grenade", + "img": "modules/lancer-weapon-fx/icons/SmokeGrenadeArea.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/Designate Smoke Mine.EiG9UfyeoHsXCX3L.js b/packs_source/weaponfx_manual.db/Designate Smoke Mine.EiG9UfyeoHsXCX3L.js new file mode 100644 index 0000000..ce65c6c --- /dev/null +++ b/packs_source/weaponfx_manual.db/Designate Smoke Mine.EiG9UfyeoHsXCX3L.js @@ -0,0 +1,12 @@ +// This will lay down a template suitable for designating the location of a delayed Pinaka Missile strike. + +game.lancer.canvas.WeaponRangeTemplate.fromRange({ + type: "Blast", + val: 3.0, +}).placeTemplate() + .then(t => { + if (t) { + t.update({texture: "modules/JB2A_DnD5e/Library/Generic/Smoke/SmokePlumes01_03_Regular_Grey_400x400.webm", distance: 2.8, fillColor: "#756c6c" }); + }; + } +) \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/Designate Smoke Mine.EiG9UfyeoHsXCX3L.json b/packs_source/weaponfx_manual.db/Designate Smoke Mine.EiG9UfyeoHsXCX3L.json new file mode 100644 index 0000000..c57aa30 --- /dev/null +++ b/packs_source/weaponfx_manual.db/Designate Smoke Mine.EiG9UfyeoHsXCX3L.json @@ -0,0 +1,8 @@ +{ + "_id": "EiG9UfyeoHsXCX3L", + "name": "Designate Smoke Mine", + "img": "modules/lancer-weapon-fx/icons/SmokeArea.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/ElectricExplodeOnClick.Hlf1weIjm3FsVE9Z.js b/packs_source/weaponfx_manual.db/ElectricExplodeOnClick.Hlf1weIjm3FsVE9Z.js new file mode 100644 index 0000000..78101d4 --- /dev/null +++ b/packs_source/weaponfx_manual.db/ElectricExplodeOnClick.Hlf1weIjm3FsVE9Z.js @@ -0,0 +1,35 @@ +//This Macro requires Warpgate module to function. When executed, the macro will play the explosion fx on the clicked location. Useful for grenades or any other occurance where something needs to explode. + +if (typeof warpgate === "undefined") ui.notifications.error("This macro requires the Warpgate module to be installed!"); + +let config = { + size:2, + icon: 'icons/White/crowned-explosion.png', + label: 'EGrenade', + interval: 1 +} + +let position = await warpgate.crosshairs.show(config); + +let sequence = new Sequence() + + + .effect() + .file("jb2a.explosion.02.blue") + .atLocation(position) + .scale(0.8) + .name("impact") + .delay(500) + .opacity(0.8) + .effect() + .file("jb2a.thunderwave.center.blue") + .atLocation(position) + .name("impact") + .scale(0.6) + .delay(600) + .sound("modules/lancer-weapon-fx/soundfx/AirBurst.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .delay(500) + + +.play(); diff --git a/packs_source/weaponfx_manual.db/ElectricExplodeOnClick.Hlf1weIjm3FsVE9Z.json b/packs_source/weaponfx_manual.db/ElectricExplodeOnClick.Hlf1weIjm3FsVE9Z.json new file mode 100644 index 0000000..36a836f --- /dev/null +++ b/packs_source/weaponfx_manual.db/ElectricExplodeOnClick.Hlf1weIjm3FsVE9Z.json @@ -0,0 +1,8 @@ +{ + "_id": "Hlf1weIjm3FsVE9Z", + "name": "ElectricExplodeOnClick", + "img": "modules/lancer-weapon-fx/icons/crowned-explosion.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/EndDefenseNet.XYuNCvqqzUsq5XkK.js b/packs_source/weaponfx_manual.db/EndDefenseNet.XYuNCvqqzUsq5XkK.js new file mode 100644 index 0000000..e90adfd --- /dev/null +++ b/packs_source/weaponfx_manual.db/EndDefenseNet.XYuNCvqqzUsq5XkK.js @@ -0,0 +1,18 @@ +//This macro is not linked to any weapon or system and must be triggered manually. Use this macro, or the Sequencer Manager, to end the 'AegisDefenseNet' effect. + +let sequence = new Sequence(); + +new Sequence() + .effect("jb2a.shield.01.outro_explode.blue") + .atLocation(token) + .scaleToObject(9.5) + .waitUntilFinished(-400) + .thenDo(endFX) +.play() + + function endFX() { + Sequencer.EffectManager.endEffects({ object: token}) + + } + +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/EndDefenseNet.XYuNCvqqzUsq5XkK.json b/packs_source/weaponfx_manual.db/EndDefenseNet.XYuNCvqqzUsq5XkK.json new file mode 100644 index 0000000..e342663 --- /dev/null +++ b/packs_source/weaponfx_manual.db/EndDefenseNet.XYuNCvqqzUsq5XkK.json @@ -0,0 +1,8 @@ +{ + "_id": "XYuNCvqqzUsq5XkK", + "name": "EndDefenseNet", + "img": "modules/lancer-weapon-fx/icons/cracked-shield.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/ExplodeOnClick.BHTzvudu6KcxJI7p.js b/packs_source/weaponfx_manual.db/ExplodeOnClick.BHTzvudu6KcxJI7p.js new file mode 100644 index 0000000..47d670c --- /dev/null +++ b/packs_source/weaponfx_manual.db/ExplodeOnClick.BHTzvudu6KcxJI7p.js @@ -0,0 +1,33 @@ +//This Macro requires Warpgate module to function. When executed, the macro will play the explosion fx on the clicked location. Useful for grenades or any other occurance where something needs to explode. + +if (typeof warpgate === "undefined") ui.notifications.error("This macro requires the Warpgate module to be installed!"); + +let config = { + size:1, + icon: 'icons/White/bright-explosion.png', + label: 'Grenade', + interval: 1 +} + +let position = await warpgate.crosshairs.show(config); + +let sequence = new Sequence() + + + .effect() + .file("jb2a.explosion.08.orange") + .atLocation(position) + .name("impact") + .delay(500) + .effect() + .file("jb2a.explosion.shrapnel.bomb.01.black") + .atLocation(position) + .name("impact") + .scale(0.6) + .delay(600) + .sound("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.7)) + .delay(500) + + +.play(); diff --git a/packs_source/weaponfx_manual.db/ExplodeOnClick.BHTzvudu6KcxJI7p.json b/packs_source/weaponfx_manual.db/ExplodeOnClick.BHTzvudu6KcxJI7p.json new file mode 100644 index 0000000..3b45dc0 --- /dev/null +++ b/packs_source/weaponfx_manual.db/ExplodeOnClick.BHTzvudu6KcxJI7p.json @@ -0,0 +1,8 @@ +{ + "_id": "BHTzvudu6KcxJI7p", + "name": "ExplodeOnClick", + "img": "modules/lancer-weapon-fx/icons/bright-explosion.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/JetLancerExplosion.WjxNFb3JQBla9BBC.js b/packs_source/weaponfx_manual.db/JetLancerExplosion.WjxNFb3JQBla9BBC.js new file mode 100644 index 0000000..d991969 --- /dev/null +++ b/packs_source/weaponfx_manual.db/JetLancerExplosion.WjxNFb3JQBla9BBC.js @@ -0,0 +1,57 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +let sequence = new Sequence(); + +new Sequence() + .sound("modules/lancer-weapon-fx/soundfx/dramaticSparkles.ogg") + .fadeInAudio(4000) + .volume(0.3) + .duration(5000) + .effect("jb2a.static_electricity.03.blue") + .atLocation(sourceToken) + .scaleToObject(1) + .duration(5000) + .canvasPan() + .atLocation(sourceToken) + .duration(5000) + .scale(1) + .waitUntilFinished() + .canvasPan() + .atLocation(sourceToken) + .duration(100) + .scale(2) + .sound("modules/lancer-weapon-fx/soundfx/jetlancerSound.ogg") + .effect("modules/lancer-weapon-fx/video/jetlancer_explosion_1000.webm") + .aboveInterface() + .atLocation(sourceToken) + .scale(1) + .canvasPan() + .shake({duration: 5000, strength: 10, rotation: false, fadeOutDuration: 500}) + .thenDo(remainsAftermath) + .waitUntilFinished() + .effect("modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png") + .delay(3600) + .aboveInterface() + .atLocation(sourceToken) + .duration(1700) + .fadeOut(300) + .play() + +function remainsAftermath() { + console.log("AFTERMATH"); + console.log(sourceToken); + console.log(canvas) + token.document.update({hidden: true}); + canvas.scene.createEmbeddedDocuments("Tile", [{ + texture: { src: "modules/lancer-weapon-fx/sprites/RETROGRADE-crater.png" }, + x: token.document.x - canvas.dimensions.size, + y: token.document.y - (canvas.dimensions.size + (canvas.dimensions.size / 2)), + height: canvas.dimensions.size * (token.document.width + 2), + width: canvas.dimensions.size * (token.document.width + 2), + tint: "#464646" + }]); +} + + + +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/JetLancerExplosion.WjxNFb3JQBla9BBC.json b/packs_source/weaponfx_manual.db/JetLancerExplosion.WjxNFb3JQBla9BBC.json new file mode 100644 index 0000000..acf7055 --- /dev/null +++ b/packs_source/weaponfx_manual.db/JetLancerExplosion.WjxNFb3JQBla9BBC.json @@ -0,0 +1,8 @@ +{ + "_id": "WjxNFb3JQBla9BBC", + "name": "JetLancerExplosion", + "img": "modules/lancer-weapon-fx/icons/explosion-rays.png", + "type": "script", + "scope": "global", + "author": "fpthefluffypawed" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/MissileAirBurst.1ntDWMtnxAA1uZMH.js b/packs_source/weaponfx_manual.db/MissileAirBurst.1ntDWMtnxAA1uZMH.js new file mode 100644 index 0000000..e3d827d --- /dev/null +++ b/packs_source/weaponfx_manual.db/MissileAirBurst.1ntDWMtnxAA1uZMH.js @@ -0,0 +1,60 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +const pTarget = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; + +// Calculate the point 70% of the distance between sourceToken and pTarget +const pBlast = { + x: sourceToken.position.x + 0.6 * (pTarget.x - sourceToken.position.x), + y: sourceToken.position.y + 0.6 * (pTarget.y - sourceToken.position.y), +}; + + +let sequence = new Sequence() + + + .sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .timeRange(700, 2000); + sequence.effect() + .file("jb2a.throwable.launch.missile") + .scale(0.7) + .from(sourceToken) + .stretchTo(pBlast) + .waitUntilFinished(-200) + .effect() + .file("jb2a.explosion.08") + .atLocation(pBlast) + .name("impact") + .scale(0.8) + .zIndex(1) + .sound() + .file("modules/lancer-weapon-fx/soundfx/Flechette.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + +for (let i=0; i < targetTokens.length; i++) { + let target = targetTokens[i]; + + sequence.effect() + .file("jb2a.bullet.02.orange") + .playIf(!targetsMissed.has(target.id)) + .scale(0.5) + .atLocation(pBlast) + .stretchTo(target) + .effect() + .file("jb2a.explosion_side.01") + .playIf(!targetsMissed.has(target.id)) + .atLocation(target) + .rotateTowards(pBlast) + .center() + .delay(350) + .sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") + .playIf(!targetsMissed.has(target.id)) + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .delay(350); +} +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/MissileAirBurst.1ntDWMtnxAA1uZMH.json b/packs_source/weaponfx_manual.db/MissileAirBurst.1ntDWMtnxAA1uZMH.json new file mode 100644 index 0000000..0a9f405 --- /dev/null +++ b/packs_source/weaponfx_manual.db/MissileAirBurst.1ntDWMtnxAA1uZMH.json @@ -0,0 +1,8 @@ +{ + "_id": "1ntDWMtnxAA1uZMH", + "name": "MissileAirBurst", + "img": "modules/lancer-weapon-fx/icons/incoming-rocket.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/MissileAoE.HOn4Xub4x5q0AmPw.js b/packs_source/weaponfx_manual.db/MissileAoE.HOn4Xub4x5q0AmPw.js new file mode 100644 index 0000000..7e28ab6 --- /dev/null +++ b/packs_source/weaponfx_manual.db/MissileAoE.HOn4Xub4x5q0AmPw.js @@ -0,0 +1,33 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +const target = game.modules.get("lancer-weapon-fx").api.getTargetLocationsFromTokenGroup(targetTokens, 1)[0]; + + +let sequence = new Sequence() + + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Launch.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Travel.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)) + .timeRange(700, 2000); + sequence.effect() + .file("jb2a.pack_hound_missile") + .atLocation(sourceToken) + .stretchTo(target) + .waitUntilFinished(-3200); + sequence.effect() + .file("jb2a.explosion.01.orange") + .atLocation(target) + .scale(1.2) + .zIndex(1) + .waitUntilFinished(-1300); + + if (!targetsMissed.has(target.id)) { + sequence.sound() + .file("modules/lancer-weapon-fx/soundfx/Missile_Impact.ogg") + .volume(game.modules.get("lancer-weapon-fx").api.getEffectVolume(0.5)); + + } +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/MissileAoE.HOn4Xub4x5q0AmPw.json b/packs_source/weaponfx_manual.db/MissileAoE.HOn4Xub4x5q0AmPw.json new file mode 100644 index 0000000..7a15236 --- /dev/null +++ b/packs_source/weaponfx_manual.db/MissileAoE.HOn4Xub4x5q0AmPw.json @@ -0,0 +1,8 @@ +{ + "_id": "HOn4Xub4x5q0AmPw", + "name": "MissileAoE", + "img": "modules/lancer-weapon-fx/icons/rocket.png", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/NuclearExplosionSFC.Nsmpx88frJTCU0Ax.js b/packs_source/weaponfx_manual.db/NuclearExplosionSFC.Nsmpx88frJTCU0Ax.js new file mode 100644 index 0000000..907435a --- /dev/null +++ b/packs_source/weaponfx_manual.db/NuclearExplosionSFC.Nsmpx88frJTCU0Ax.js @@ -0,0 +1,78 @@ +new Sequence() + .effect("modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png") + .fadeIn(100) + .duration(6000) + .fadeOut(3000) + .screenSpace() + .effect("modules/lancer-weapon-fx/sprites/shockwave.png") + .atLocation(token) + .duration(7000) + .scale(0.2) + .scaleOut(12, 7000) + .fadeOut(7000) + .delay(3000) + .sound("modules/lancer-weapon-fx/soundfx/pw_nuke.ogg") + .startTime(800) + .delay(1000) + .effect("modules/lancer-weapon-fx/video/pw_nuke_effect.webm") + .delay(1000) + .atLocation(token) + .aboveLighting() + .xray() + .scale(1) + .zIndex(100) + .thenDo(remainsAftermath) + /* + CRATER EFFECT PERSISTENT AFTERWARDS: + - Both following effects are entirely for the crater, remove + - or comment it out as needed. Light included. + */ + .effect("jb2a.ground_cracks.01.orange") + .persist() + .belowTokens() + .aboveLighting() + .zIndex(1) + .xray() + .randomRotation() + .atLocation(token) + .scale(2) + .thenDo(createLight) + .effect("modules/lancer-weapon-fx/sprites/scorch_mark_hires.png") + .atLocation(token) + .scale(2.2) + .persist() + .belowTokens() + .zIndex(0) + .randomRotation() + .xray() + .canvasPan() + .delay(1000) + .atLocation(token) + .scale(0.5) + .shake({ + duration: 20000, + strength: 15, + fadeOutDuration: 10000, + rotation: true + }) +.play() + +async function remainsAftermath() { + console.log("AFTERMATH"); + token.document.update({hidden: true}); +} + +async function createLight() { + await canvas.scene.createEmbeddedDocuments("AmbientLight", [{ + x: token.document.x + (canvas.dimensions.size / 2), + y: token.document.y + (canvas.dimensions.size / 2), + config: { + color: "#ff9117", + dim: 10, + bright: 5, + animation: { + type: "pulse", + }, + } + }]); +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/NuclearExplosionSFC.Nsmpx88frJTCU0Ax.json b/packs_source/weaponfx_manual.db/NuclearExplosionSFC.Nsmpx88frJTCU0Ax.json new file mode 100644 index 0000000..ca2a68a --- /dev/null +++ b/packs_source/weaponfx_manual.db/NuclearExplosionSFC.Nsmpx88frJTCU0Ax.json @@ -0,0 +1,8 @@ +{ + "_id": "Nsmpx88frJTCU0Ax", + "name": "NuclearExplosionSFC", + "img": "modules/lancer-weapon-fx/icons/mushroom-cloud.png", + "type": "script", + "scope": "global", + "author": "fpthefluffypawed" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/NuclearExplosionSpace.tzS44LYDm9vRB0HP.js b/packs_source/weaponfx_manual.db/NuclearExplosionSpace.tzS44LYDm9vRB0HP.js new file mode 100644 index 0000000..a570993 --- /dev/null +++ b/packs_source/weaponfx_manual.db/NuclearExplosionSpace.tzS44LYDm9vRB0HP.js @@ -0,0 +1,55 @@ +new Sequence() + .effect("modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png") + .fadeIn(100) + .duration(6000) + .fadeOut(3000) + .screenSpace() + .effect("modules/lancer-weapon-fx/sprites/shockwave.png") + .atLocation(token) + .duration(7000) + .scale(0.2) + .scaleOut(12, 7000) + .fadeOut(7000) + .delay(3000) + .sound("modules/lancer-weapon-fx/soundfx/pw_nuke.ogg") + .startTime(800) + .delay(1000) + .effect("modules/lancer-weapon-fx/video/pw_nuke_effect.webm") + .delay(1000) + .atLocation(token) + .aboveLighting() + .xray() + .scale(1) + .zIndex(100) + .thenDo(remainsAftermath) + .canvasPan() + .delay(1000) + .atLocation(token) + .scale(0.5) + .shake({ + duration: 20000, + strength: 15, + fadeOutDuration: 10000, + rotation: true + }) +.play() + +async function remainsAftermath() { + console.log("AFTERMATH"); + token.document.update({hidden: true}); +} + +async function createLight() { + await canvas.scene.createEmbeddedDocuments("AmbientLight", [{ + x: token.document.x + (canvas.dimensions.size / 2), + y: token.document.y + (canvas.dimensions.size / 2), + config: { + color: "#ff9117", + dim: 10, + bright: 5, + animation: { + type: "pulse", + }, + } + }]); +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/NuclearExplosionSpace.tzS44LYDm9vRB0HP.json b/packs_source/weaponfx_manual.db/NuclearExplosionSpace.tzS44LYDm9vRB0HP.json new file mode 100644 index 0000000..02957d9 --- /dev/null +++ b/packs_source/weaponfx_manual.db/NuclearExplosionSpace.tzS44LYDm9vRB0HP.json @@ -0,0 +1,8 @@ +{ + "_id": "tzS44LYDm9vRB0HP", + "name": "NuclearExplosionSpace", + "img": "modules/lancer-weapon-fx/icons/mushroom-cloud.png", + "type": "script", + "scope": "global", + "author": "fpthefluffypawed" +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/PlasmaProjector.7S31ONuehIUe8R0Q.js b/packs_source/weaponfx_manual.db/PlasmaProjector.7S31ONuehIUe8R0Q.js new file mode 100644 index 0000000..5522374 --- /dev/null +++ b/packs_source/weaponfx_manual.db/PlasmaProjector.7S31ONuehIUe8R0Q.js @@ -0,0 +1,74 @@ +const {targetsMissed, targetTokens, sourceToken} = game.modules.get("lancer-weapon-fx").api.getMacroVariables(typeof messageId === "undefined" ? null : messageId, actor); + +const target = targetTokens[0]; + +new Sequence() + + .canvasPan() + .duration(1000) + .atLocation(sourceToken) + .scale(0.25) + .effect() + .file("jb2a.disintegrate.green") + .delay(1000) + .startTime(1) + .scale(2) + .playbackRate(0.6) + .filter("Glow", {distance: 3, color: 0x98ec5f, innerStrength: 2}) + .atLocation(sourceToken) + .stretchTo(target) + .waitUntilFinished(-3400) + .canvasPan() + .duration(2000) + .atLocation(target) + .scale(0.4) + .waitUntilFinished(-500) + .effect() + .file("jb2a.impact.blue") + .filter("ColorMatrix", {hue: 270}) + .scaleToObject() + .atLocation(target, {randomOffset: 1.2, gridUnits: true}) + .repeats(10, 200, 700) + .waitUntilFinished(-500) + .effect("modules/lancer-weapon-fx/sprites/jetlancer_explosion_white_bg.png") + .fadeIn(100) + .duration(6000) + .fadeOut(3000) + .screenSpace() + .effect("modules/lancer-weapon-fx/sprites/shockwave.png") + .atLocation(target) + .filter("ColorMatrix", {hue: 090}) + .duration(7000) + .scale(0.2) + .scaleOut(12, 7000) + .fadeOut(7000) + .delay(3000) + .sound("modules/lancer-weapon-fx/soundfx/pw_nuke.ogg") + .startTime(800) + .delay(1000) + .effect("modules/lancer-weapon-fx/video/pw_nuke_effect.webm") + .filter("ColorMatrix", {hue: 090}) + .delay(1000) + .atLocation(target) + .aboveLighting() + .xray() + .scale(1) + .zIndex(100) + .thenDo(remainsAftermath) + .canvasPan() + .delay(1000) + .atLocation(target) + .scale(0.5) + .shake({ + duration: 20000, + strength: 15, + fadeOutDuration: 10000, + rotation: true + }) + +.play(); + +function remainsAftermath() { + console.log("AFTERMATH"); + targetTokens[0].document.update({hidden: true}); +} \ No newline at end of file diff --git a/packs_source/weaponfx_manual.db/PlasmaProjector.7S31ONuehIUe8R0Q.json b/packs_source/weaponfx_manual.db/PlasmaProjector.7S31ONuehIUe8R0Q.json new file mode 100644 index 0000000..699624e --- /dev/null +++ b/packs_source/weaponfx_manual.db/PlasmaProjector.7S31ONuehIUe8R0Q.json @@ -0,0 +1,8 @@ +{ + "_id": "7S31ONuehIUe8R0Q", + "name": "PlasmaProjector", + "img": "modules/JB2A_DnD5e/Library/6th_Level/Disintegrate/Disintegrate_01_Regular_Green01_Thumb.webp", + "type": "script", + "scope": "global", + "author": "LancerWeaponFX00" +} \ No newline at end of file diff --git a/packs_source/weaponfx.db/Power Knuckle.oGArtZBtIRBcRHCh.js b/packs_source/weaponfx_manual.db/Power Knuckle.oGArtZBtIRBcRHCh.js similarity index 98% rename from packs_source/weaponfx.db/Power Knuckle.oGArtZBtIRBcRHCh.js rename to packs_source/weaponfx_manual.db/Power Knuckle.oGArtZBtIRBcRHCh.js index 03ac4ea..24dbb57 100644 --- a/packs_source/weaponfx.db/Power Knuckle.oGArtZBtIRBcRHCh.js +++ b/packs_source/weaponfx_manual.db/Power Knuckle.oGArtZBtIRBcRHCh.js @@ -21,4 +21,4 @@ for (const target of targetTokens) { .waitUntilFinished(-100); } } -sequence.play(); +sequence.play(); \ No newline at end of file diff --git a/packs_source/weaponfx.db/Power Knuckle.oGArtZBtIRBcRHCh.json b/packs_source/weaponfx_manual.db/Power Knuckle.oGArtZBtIRBcRHCh.json similarity index 100% rename from packs_source/weaponfx.db/Power Knuckle.oGArtZBtIRBcRHCh.json rename to packs_source/weaponfx_manual.db/Power Knuckle.oGArtZBtIRBcRHCh.json diff --git a/scripts/WeaponFX.js b/scripts/WeaponFX.js index 0c31662..bb5d4ab 100644 --- a/scripts/WeaponFX.js +++ b/scripts/WeaponFX.js @@ -60,56 +60,62 @@ Hooks.once("sequencer.ready", async function () { } // preload effects data await Sequencer.Preloader.preload([ - "jb2a.arrow.physical.blue", - "jb2a.breath_weapons02.burst.line.fire.orange.01", - "jb2a.bolt.physical.orange", - "jb2a.bullet.01.orange", - "jb2a.bullet.Snipe.blue", - "jb2a.burning_hands.01.orange", - "jb2a.chain_lightning.primary.blue", - "jb2a.claws.400px.red", - "jb2a.dancing_light.purplegreen", - "jb2a.disintegrate.green", - "jb2a.divine_smite.caster.blueyellow", - "jb2a.divine_smite.target.blueyellow", - "jb2a.eldritch_blast.purple", - "jb2a.energy_beam.normal.bluepink.02", - "jb2a.energy_strands.complete.blue.01", - "jb2a.energy_strands.range.multiple.purple.01.30ft", - "jb2a.explosion.01.orange", - "jb2a.explosion.02.blue", - "jb2a.explosion.03.blueyellow", - "jb2a.explosion.04.blue", - "jb2a.fireball.beam.orange", - "jb2a.fireball.explosion.orange", - "jb2a.fire_jet.orange", - "jb2a.fumes.steam.white", - "jb2a.greataxe.melee.standard.white", - "jb2a.healing_generic.400px.green", - "jb2a.impact.004.blue", - "jb2a.impact.blue", - "jb2a.impact.ground_crack.orange", - "jb2a.impact.orange.0", - "jb2a.impact.orange.3", - "jb2a.impact.yellow", - "jb2a.lasershot.blue", - "jb2a.lasershot.green", - "jb2a.lasersword.melee.blue", - "jb2a.lightning_ball.blue", - "jb2a.lightning_bolt.narrow.blue", - "jb2a.magic_missile.purple", - "jb2a.spear.melee.01.white.2", - "jb2a.static_electricity.02.blue", - "jb2a.sword.melee.01.white", - "jb2a.template_circle.vortex.loop.blue", - "jb2a.toll_the_dead.green.shockwave", - "jb2a.unarmed_strike", - "jb2a.warhammer.melee.01.white.4", - "jb2a.zoning.inward.square.loop.bluegreen.01.01", - "modules/lancer-weapon-fx/icons/LatchDrone.png", - "modules/animated-spell-effects/spell-effects/air/black_smoke_RAY_01.webm", - "modules/animated-spell-effects/spell-effects/energy/energy_throw_RAY_10.webm", - "modules/animated-spell-effects/spell-effects/energy/energy_explosion_CIRCLE_05.webm" + "jb2a.arrow.physical.blue", + "jb2a.breath_weapons02.burst.line.fire.orange.01", + "jb2a.breath_weapons02.burst.cone.fire.orange.02", + "jb2a.bolt.physical.orange", + "jb2a.bullet.03.blue", + "jb2a.bullet.01.orange", + "jb2a.bullet.02.orange", + "jb2a.bullet.Snipe.blue", + "jb2a.burning_hands.01.orange", + "jb2a.chain_lightning.primary.blue", + "jb2a.claws.400px.red", + "jb2a.dancing_light.purplegreen", + "jb2a.disintegrate.green", + "jb2a.divine_smite.caster.blueyellow", + "jb2a.divine_smite.target.blueyellow", + "jb2a.eldritch_blast.purple", + "jb2a.energy_beam.normal.bluepink.02", + "jb2a.energy_strands.complete.blue.01", + "jb2a.energy_strands.range.multiple.purple.01.30ft", + "jb2a.explosion.01.orange", + "jb2a.explosion.02.blue", + "jb2a.explosion.03.blueyellow", + "jb2a.explosion.04.blue", + "jb2a.fireball.beam.orange", + "jb2a.fireball.explosion.orange", + "jb2a.fire_jet.orange", + "jb2a.fumes.steam.white", + "jb2a.greataxe.melee.standard.white", + "jb2a.healing_generic.400px.green", + "jb2a.impact.004.blue", + "jb2a.impact.blue", + "jb2a.impact.ground_crack.orange", + "jb2a.impact.orange.0", + "jb2a.impact.orange.3", + "jb2a.impact.yellow", + "jb2a.lasershot.blue", + "jb2a.lasershot.green", + "jb2a.lasersword.melee.blue", + "jb2a.lightning_ball.blue", + "jb2a.lightning_bolt.narrow.blue", + "jb2a.magic_missile.purple", + "jb2a.pack_hound_missile", + "jb2a.side_impact.part.smoke.blue", + "jb2a.spear.melee.01.white.2", + "jb2a.static_electricity", + "jb2a.sword.melee.01.white", + "jb2a.template_circle.vortex.loop.blue", + "jb2a.throwable.launch.missile", + "jb2a.toll_the_dead.green.shockwave", + "jb2a.unarmed_strike.physical", + "jb2a.warhammer.melee.01.white.4", + "jb2a.zoning.inward.square.loop.bluegreen.01.01", + "jb2a.zoning.inward.circle.loop", + "modules/lancer-weapon-fx/icons/LatchDrone.png", + "modules/lancer-weapon-fx/video/jetlancer_explosion_1000.webm", + "modules/lancer-weapon-fx/video/pw_nuke_effect.webm" ], true); console.log('Lancer Weapon FX | Effects preloaded'); }); diff --git a/scripts/api.js b/scripts/api.js index 375fdb5..e44ae97 100644 --- a/scripts/api.js +++ b/scripts/api.js @@ -1,5 +1,10 @@ import {getMessageInfo} from "./messageParser.js"; +import {euclideanDistance} from "./utils.js"; +import LloydsAlgorithm from "./lloydsAlgorithm.js"; +/** + * Functions exposed by the module for use in macros. + */ class ModuleApi { static getEffectVolume(volume) { return volume * game.settings.get("lancer-weapon-fx", "volume"); @@ -27,6 +32,16 @@ class ModuleApi { targetsMissed, }; } + + static getTargetLocationsFromTokenGroup(targetTokens, numGroups) { + const targetPoints = targetTokens.map(token => { + return {x: token.center.x, y: token.center.y}; + }); + + return LloydsAlgorithm.getCentroids(targetPoints, numGroups); + } + + static euclideanDistance = euclideanDistance; } Hooks.on("init", () => game.modules.get("lancer-weapon-fx").api = ModuleApi); diff --git a/scripts/lloydsAlgorithm.js b/scripts/lloydsAlgorithm.js new file mode 100644 index 0000000..8e4e52d --- /dev/null +++ b/scripts/lloydsAlgorithm.js @@ -0,0 +1,73 @@ +import {euclideanDistance, fisherYatesShuffle, getUniquePoints} from "./utils.js"; + +export default class LloydsAlgorithm { + static _assignToClusters (points, centroids) { + const clusters = Array.from(centroids, () => []); + + for (const point of points) { + const distances = centroids.map(centroid => euclideanDistance(point, centroid)); + const clusterIndex = distances.indexOf(Math.min(...distances)); + clusters[clusterIndex].push(point); + } + + return clusters; + } + + static _calculateCentroids (cluster) { + // Calculate the centroid (mean) of a cluster of points. + if (cluster.length === 0) { + return null; + } + + const sumX = cluster.reduce((sum, point) => sum + point.x, 0); + const sumY = cluster.reduce((sum, point) => sum + point.y, 0); + + return { x: sumX / cluster.length, y: sumY / cluster.length }; + } + + static getCentroids (points, numCentroids) { + if (numCentroids <= 0) { + return []; + } + + // If we request more centroids than there are points, each point must be its own centroid + if (points.length <= numCentroids) { + return points; + } + + // Initialize random centroids to start the algorithm. + // Ensure each seed centroid is unique. + const uniquePoints = getUniquePoints(points); + const centroids = fisherYatesShuffle(uniquePoints.slice()).slice(0, numCentroids); + if (centroids.length < numCentroids) { + // If there are insufficiently many unique seed points, generate more points by adding an increasing offset + // to the biggest X and Y values from all points. + const maxX = Math.max(...uniquePoints.map(({x}) => x)); + const maxY = Math.max(...uniquePoints.map(({y}) => y)); + + for (let i = centroids.length; i < numCentroids; ++i) { + centroids.push({x: maxX + i, y: maxY + i}); + } + } + + let previousCentroids; + while ( + !previousCentroids || + !centroids.every((centroid, i) => + centroid.x === previousCentroids[i].x && centroid.y === previousCentroids[i].y + ) + ) { + previousCentroids = centroids.slice(); + + // Assign points to clusters based on the current centroids. + const clusters = this._assignToClusters(points, centroids); + + // Calculate new centroids based on the current cluster assignments. + centroids.forEach((_, i) => { + centroids[i] = this._calculateCentroids(clusters[i]); + }); + } + + return centroids; + } +} diff --git a/scripts/utils.js b/scripts/utils.js new file mode 100644 index 0000000..0c65b30 --- /dev/null +++ b/scripts/utils.js @@ -0,0 +1,30 @@ +export function euclideanDistance(point1, point2) { + // Calculate the Euclidean distance between two points. + const dx = point1.x - point2.x; + const dy = point1.y - point2.y; + return Math.sqrt(dx * dx + dy * dy); +} + +/** + * Quickly shuffle an array in-place. + */ +export function fisherYatesShuffle(array) { + for (let i = array.length - 1; i > 0; --i) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; +} + +export function getUniquePoints(points) { + const getPointId = point => `${point.x},${point.y}`; + + const seen = new Set(); + return points + .filter(point => { + const id = getPointId(point); + if (seen.has(id)) return false; + seen.add(id); + return true; + }); +} diff --git a/scripts/weaponEffects.js b/scripts/weaponEffects.js index cc58e8b..ca1daba 100644 --- a/scripts/weaponEffects.js +++ b/scripts/weaponEffects.js @@ -1,4 +1,5 @@ const weaponEffects = { + //CORE, LONG RIM, WALLFLOWER, KTB "npcf_devils_cough_shotgun_assassin": "Shotgun", "mw_exo_steelpunch_heavy_needlebeam": "Needle Beam", "mw_exo_sting_heavy_anti_armor_rifle": "AMR", @@ -82,7 +83,7 @@ const weaponEffects = { "mw_krakatoa_thermobaric_flamethrower": "Flamethrower", "mw_kraul_rifle": "Kraul Rifle", "mw_lancaster_integrated": "Latch Drone", - "mw_leviathan_heavy_assault_cannon": "HMG", + "mw_leviathan_heavy_assault_cannon": "Leviathan", "npcf_light_laser_aegis": "Lasers", "npcf_light_machine_gun_archer": "HMG", "mw_raleigh_integrated": "Burst Launcher", @@ -94,9 +95,9 @@ const weaponEffects = { "npcf_melee_weapon_human": "DefaultMelee", "mw_mimic_gun": "PPC", "npcf_missile_launcher_ace": "Missile", - "npcf_missile_pods_rainmaker": "Missile", + "npcf_missile_pods_rainmaker": "Missiles", "mw_missile_rack": "Missile", - "npcf_missile_swarm_ace": "Missile", + "npcf_missile_swarm_ace": "Missiles", "npcf_monowire_sword_specter": "DefaultMelee", "mw_mortar": "Mortar", "npcf_nail_gun_berserker": "Kraul Rifle", @@ -107,7 +108,7 @@ const weaponEffects = { "mw_nexus_light": "Nexus", "npcf_nova_missiles_operator": "Missile", "mw_oracle_lmg_i": "Assault Rifle", - "mw_pinaka_missiles": "Missile", + "mw_pinaka_missiles": "MissilePinaka", "mw_pistol": "Pistol", "mw_exo_plasma_maul": "Plasma Maul", "mw_tokugawa_alt_enkidu_integrated": "Plasma Talons", @@ -134,7 +135,7 @@ const weaponEffects = { "nrfaw-npc_npcf_scouring_whip_lurker": "Nanobot Whip", "npcf_seeker_cloud_hive": "Nexus", "mw_segment_knife": "DefaultMelee", - "mw_sharanga_missiles": "Missile", + "mw_sharanga_missiles": "Missiles", "mw_shatterhead_colony_missiles": "Missile", "mw_shock_knife": "DefaultMelee", "mw_shotgun": "Shotgun", @@ -163,12 +164,39 @@ const weaponEffects = { "mw_veil_rifle": "Veil Rifle", "mw_vijaya_rockets": "Missile", "mw_vorpal_gun": "Retort Loop", - "mw_vulture_dmr": "AMR", + "mw_vulture_dmr": "BattleRifle", "mw_war_pike": "War Pike", "mw_warp_rifle": "Warp Rifle", "mw_sherman_integrated": "Railgun", "default_tech_attack": "DefaultTech", - "lwfx_stabilize": "Stabilize" -}; + "lwfx_stabilize": "Stabilize", + //SOLSTICE RAIN + "mw_xc_br_battle_rifle": "BattleRifle", + "mw_xc_dpm_predator_nexus": "Nexus", + //DUSTGRAVE + "mw_tempest_charged_blade": "TempestBlade", + "mw_hurricane_cluster_projector": "CannonAirburst", + "mw_reaper_assault_cannon": "Leviathan", + "mw_shock_baton": "ShockBaton", + "mw_blast_pick": "BlastPick", + "mw_brutus_wrecker": "DefaultMelee", + "mw_brutus_shield": "DefaultMelee", + //DUSTGRAVE NPCs + "npcf_rock_drill_industrial_mech": "Combat Drill", + "npcf_fusion_cutter_industrial_mech": "Plasma Torch", + "npcf_rivet_cannon_industrial_mech": "Bolt Thrower", + "npcf_buzzsaw_industrial_mech": "DefaultMelee", + "npcf_wrecker_industrial_mech": "DefaultMelee", + "npcf_industrial_clamps_industrial_mech": "DefaultMelee", + "npcf_gyrojet_cannon_spec_op": "Missile", + "npcf_serrated_machete_spec_op": "DefaultMelee", + "npcf_assimilaiton_maw_horror": "AssimilationMaw", + "npcf_disruptor_whip_horror": "DisruptorWhip", + //SIRENS SONG + "npc_Leech_PairedTalonsMKII": "Plasma Talons", + "npc_Tempest_NaniteMonsoonDispensers": "Nexus", + "npc_Tempest_TyphoonNaniteCannon": "Nexus", + "npc_PDCTurret": "Leviathan" + }; export { weaponEffects }; diff --git a/soundfx/BR_Fire.ogg b/soundfx/BR_Fire.ogg new file mode 100644 index 0000000..ff0044f Binary files /dev/null and b/soundfx/BR_Fire.ogg differ diff --git a/soundfx/DD288Full.ogg b/soundfx/DD288Full.ogg new file mode 100644 index 0000000..f419a2f Binary files /dev/null and b/soundfx/DD288Full.ogg differ diff --git a/soundfx/DD288Ready.ogg b/soundfx/DD288Ready.ogg new file mode 100644 index 0000000..c8f6f93 Binary files /dev/null and b/soundfx/DD288Ready.ogg differ diff --git a/soundfx/HeavyImpact.ogg b/soundfx/HeavyImpact.ogg new file mode 100644 index 0000000..b9b23b7 Binary files /dev/null and b/soundfx/HeavyImpact.ogg differ diff --git a/soundfx/KineticImpact.ogg b/soundfx/KineticImpact.ogg new file mode 100644 index 0000000..3cd1a04 Binary files /dev/null and b/soundfx/KineticImpact.ogg differ diff --git a/soundfx/Leviathan.ogg b/soundfx/Leviathan.ogg new file mode 100644 index 0000000..96d2085 Binary files /dev/null and b/soundfx/Leviathan.ogg differ diff --git a/soundfx/LeviathanBarrage.ogg b/soundfx/LeviathanBarrage.ogg new file mode 100644 index 0000000..9656f3a Binary files /dev/null and b/soundfx/LeviathanBarrage.ogg differ diff --git a/soundfx/NexusConfirm.ogg b/soundfx/NexusConfirm.ogg new file mode 100644 index 0000000..25691d3 Binary files /dev/null and b/soundfx/NexusConfirm.ogg differ diff --git a/soundfx/NexusFail.ogg b/soundfx/NexusFail.ogg new file mode 100644 index 0000000..5d697f1 Binary files /dev/null and b/soundfx/NexusFail.ogg differ diff --git a/soundfx/NexusFire.ogg b/soundfx/NexusFire.ogg new file mode 100644 index 0000000..cac3b5b Binary files /dev/null and b/soundfx/NexusFire.ogg differ diff --git a/soundfx/NexusReady.ogg b/soundfx/NexusReady.ogg new file mode 100644 index 0000000..8f979ae Binary files /dev/null and b/soundfx/NexusReady.ogg differ diff --git a/soundfx/Nexus_Fire.ogg b/soundfx/Nexus_Fire.ogg deleted file mode 100644 index 5feac0e..0000000 Binary files a/soundfx/Nexus_Fire.ogg and /dev/null differ diff --git a/soundfx/smartsound_WEAPONS_FLAMETHROWER_Long_Heavy_Single_01.ogg b/soundfx/SlagCannon.ogg similarity index 100% rename from soundfx/smartsound_WEAPONS_FLAMETHROWER_Long_Heavy_Single_01.ogg rename to soundfx/SlagCannon.ogg diff --git a/soundfx/StartSequence.ogg b/soundfx/StartSequence.ogg new file mode 100644 index 0000000..439e812 Binary files /dev/null and b/soundfx/StartSequence.ogg differ diff --git a/soundfx/TechPrepare.ogg b/soundfx/TechPrepare.ogg new file mode 100644 index 0000000..d9a062e Binary files /dev/null and b/soundfx/TechPrepare.ogg differ diff --git a/soundfx/TechWarn.ogg b/soundfx/TechWarn.ogg new file mode 100644 index 0000000..5666c28 Binary files /dev/null and b/soundfx/TechWarn.ogg differ diff --git a/soundfx/WeaponBeep.ogg b/soundfx/WeaponBeep.ogg new file mode 100644 index 0000000..d239017 Binary files /dev/null and b/soundfx/WeaponBeep.ogg differ diff --git a/soundfx/WeaponClick.ogg b/soundfx/WeaponClick.ogg new file mode 100644 index 0000000..8f2b2e5 Binary files /dev/null and b/soundfx/WeaponClick.ogg differ diff --git a/soundfx/dramaticSparkles.ogg b/soundfx/dramaticSparkles.ogg new file mode 100644 index 0000000..184e117 Binary files /dev/null and b/soundfx/dramaticSparkles.ogg differ diff --git a/soundfx/jetlancerSound.ogg b/soundfx/jetlancerSound.ogg new file mode 100644 index 0000000..328036f Binary files /dev/null and b/soundfx/jetlancerSound.ogg differ diff --git a/soundfx/pw_nuke.ogg b/soundfx/pw_nuke.ogg new file mode 100644 index 0000000..c34107d Binary files /dev/null and b/soundfx/pw_nuke.ogg differ diff --git a/soundfx/smartsound_WEAPONS_FLAMETHROWER_Long_Heavy_Single_02.ogg b/soundfx/smartsound_WEAPONS_FLAMETHROWER_Long_Heavy_Single_02.ogg deleted file mode 100644 index d7bfd6e..0000000 Binary files a/soundfx/smartsound_WEAPONS_FLAMETHROWER_Long_Heavy_Single_02.ogg and /dev/null differ diff --git a/sprites/RETROGRADE-crater.png b/sprites/RETROGRADE-crater.png new file mode 100644 index 0000000..11ea37b Binary files /dev/null and b/sprites/RETROGRADE-crater.png differ diff --git a/sprites/jetlancer_explosion_white_bg.png b/sprites/jetlancer_explosion_white_bg.png new file mode 100644 index 0000000..e7dbbfd Binary files /dev/null and b/sprites/jetlancer_explosion_white_bg.png differ diff --git a/sprites/scorch_mark_hires.png b/sprites/scorch_mark_hires.png new file mode 100644 index 0000000..c5eb43d Binary files /dev/null and b/sprites/scorch_mark_hires.png differ diff --git a/sprites/shockwave.png b/sprites/shockwave.png new file mode 100644 index 0000000..0431b05 Binary files /dev/null and b/sprites/shockwave.png differ diff --git a/test/lloydsAlgorithm.test.js b/test/lloydsAlgorithm.test.js new file mode 100644 index 0000000..852b627 --- /dev/null +++ b/test/lloydsAlgorithm.test.js @@ -0,0 +1,83 @@ +import {expect, jest, test} from '@jest/globals'; +import LloydsAlgorithm from "../scripts/lloydsAlgorithm.js"; + +beforeEach(() => { + jest.spyOn(global.Math, "random").mockReturnValue(0.5); +}); + +afterEach(() => { + jest.spyOn(global.Math, "random").mockRestore(); +}) + +test( + "that the algorithm runs with 0 points", + () => { + expect(LloydsAlgorithm.getCentroids([], 2)).toStrictEqual([]) + }, +); + +test( + "that the algorithm runs with points less than the number of clusters", + () => { + expect(LloydsAlgorithm.getCentroids([{x: 1, y: 1}], 2)).toStrictEqual([{x: 1, y: 1}]) + }, +); + +test( + "that the algorithm runs with duplicate points", + () => { + expect( + LloydsAlgorithm.getCentroids( + [ + {x: 1, y: 1}, + {x: 1, y: 1}, + ], + 2 + ) + ).toStrictEqual([ + {x: 1, y: 1}, + {x: 1, y: 1}, + ]) + }, +); + +test( + "that the algorithm runs with the same number of points as clusters", + () => { + expect( + LloydsAlgorithm.getCentroids( + [ + {x: 0, y: 0}, + {x: 1, y: 1}, + ], + 2 + ) + ).toStrictEqual([ + {x: 0, y: 0}, + {x: 1, y: 1}, + ]) + }, +); + +test( + "that the algorithm runs with the same number of points as clusters", + () => { + expect( + LloydsAlgorithm.getCentroids( + [ + {x: -1, y: -1}, + {x: -1, y: 1}, + {x: 1, y: -1}, + {x: 1, y: 1}, + ], + 2 + ) + ).toStrictEqual([ + // Equal distance to each cluster has a bias in one direction due to use of + // `distances.indexOf(Math.min(...distances))` + // This is ok as it prevents infinite loops and is not common in practice + {x: -1/3, y: -1/3}, + {x: 1, y: 1}, + ]) + }, +); diff --git a/test/weaponEffects.test.js b/test/weaponEffects.test.js new file mode 100644 index 0000000..47eda85 --- /dev/null +++ b/test/weaponEffects.test.js @@ -0,0 +1,31 @@ +import fs from "fs"; +import path from "path"; +import {expect, jest, test} from '@jest/globals'; +import {weaponEffects} from "../scripts/weaponEffects.js"; +import {DIR_PACKS_SOURCE} from "../tooling/consts.mjs"; + +const WEAPON_FX_PACK_DIR = path.join(DIR_PACKS_SOURCE, "weaponfx.db"); + +const automaticMacros = fs.readdirSync(WEAPON_FX_PACK_DIR) + .filter(filename => filename.endsWith(".json")) + .map(filename => JSON.parse(fs.readFileSync(path.join(WEAPON_FX_PACK_DIR, filename), "utf-8")).name); + +test( + `that all macros lined in "weaponEffects" exist`, + () => { + const automaticMacrosSet = new Set(automaticMacros); + const missingNames = Object.values(weaponEffects) + .filter(name => !automaticMacrosSet.has(name)); + expect(missingNames).toStrictEqual([]); + }, +); + +test( + `that effects not listed in "weaponEffects" are not in the "weaponfx" compendium`, + () => { + const weaponEffectsSet = new Set(Object.values(weaponEffects)); + const manualNames = automaticMacros + .filter(name => !weaponEffectsSet.has(name)); + expect(manualNames).toStrictEqual([]); + }, +); diff --git a/tooling/create-new-effect.mjs b/tooling/create-new-effect.mjs index f9c9e32..0089439 100644 --- a/tooling/create-new-effect.mjs +++ b/tooling/create-new-effect.mjs @@ -16,7 +16,8 @@ program .argument("", "macro name") .option("--id ", "16-character alphanumeric ID", getFoundryId()) .option("--img ", "path to icon image", "icons/svg/dice-target.svg") - .action((name, {id, img}) => { + .option("--pack ", "pack to add the macro to", "weaponfx") + .action((name, {id, img, pack}) => { if (!name.trim()) program.error(` must be 1 or more (non-whitespace) characters!`); if (id.length !== 16) program.error(` must be 16 characters!`); if (!img.trim()) program.error(` must be 1 or more (non-whitespace) characters!`); @@ -38,7 +39,7 @@ program 4, ); - const dirOut = path.join(DIR_PACKS_SOURCE, "weaponfx.db"); + const dirOut = path.join(DIR_PACKS_SOURCE, `${pack}.db`); const fnameOut = `${sanitize(name)}.${id}`; const fpathOutJs = path.join(dirOut, `${fnameOut}.js`); @@ -53,8 +54,7 @@ program • Complete the macro JS • Edit the "img" in the macro JSON • Run "npm run db:pack" -• Test in-game! -• (Add to "scripts/weaponEffects")`); +• Test in-game!${pack === "weaponfx" ? `\n• (Add to "scripts/weaponEffects")` : ""}`); }); program.parse(); diff --git a/tooling/pack-macros.mjs b/tooling/pack-macros.mjs index b89e920..a9ed20c 100644 --- a/tooling/pack-macros.mjs +++ b/tooling/pack-macros.mjs @@ -31,5 +31,5 @@ fs.readdirSync(DIR_PACKS_SOURCE) .join("\n") + "\n", "utf-8", ); - console.log(`Packed ${docs.length} documents into ${dir}`); + console.log(`Packed ${docs.length} document(s) into ${dir}`); }); diff --git a/tooling/run-all-macros.js b/tooling/run-all-macros.js index d6a2076..76d5507 100644 --- a/tooling/run-all-macros.js +++ b/tooling/run-all-macros.js @@ -10,13 +10,9 @@ // --- - const NAMES_BLOCKLIST = new Set([ - "Preload LancerWeaponFX", - ]); + const NAMES_BLOCKLIST = new Set([]); const NAMES_NO_MISS = new Set([ - "Apply Smoke Grenade", - "Deploy Smoke Mine", "Flechette Launcher", "Flamethrower", "LockOn", diff --git a/video/jetlancer_explosion_1000.webm b/video/jetlancer_explosion_1000.webm new file mode 100644 index 0000000..a6c895d Binary files /dev/null and b/video/jetlancer_explosion_1000.webm differ diff --git a/video/pw_nuke_effect.webm b/video/pw_nuke_effect.webm new file mode 100644 index 0000000..23880a5 Binary files /dev/null and b/video/pw_nuke_effect.webm differ