From 1bfbbb2ae597d008583e6a96ebbdae977d2a80ad Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Tue, 10 May 2022 23:26:57 -0500 Subject: [PATCH] add elemental manipulation --- .../warpgate_spells/elemental-manipulation.js | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/macros/warpgate_spells/elemental-manipulation.js b/macros/warpgate_spells/elemental-manipulation.js index e69de29..0522d71 100644 --- a/macros/warpgate_spells/elemental-manipulation.js +++ b/macros/warpgate_spells/elemental-manipulation.js @@ -0,0 +1,157 @@ +const ICON = 'icons/magic/symbols/elements-air-earth-fire-water.webp' + +let tokens = []; +let targets = Array.from(game.user.targets); +if (targets.length > 0) { + tokens = targets; +} else if (canvas.tokens.controlled.length > 0) { + tokens = canvas.tokens.controlled; +} +if (tokens.length > 0) { + main(tokens); +} else { + ui.notifications.error("Please select or target a token"); +} + +async function main(tokens) { + let tokenList = tokens.map(t => t.name).join(", "); + let dialogOptions = { + title: "Elemental Manipulation", + content: `Apply Elemental Manipulation to ${tokenList}`, + default: "cancel", + buttons: [ + {label: "Apply", value: "apply"}, + {label: "Apply with raise", value: "raise"}, + {label: "Cancel", value: "cancel"} + ] + } + let choice = await warpgate.buttonDialog(dialogOptions); + if (choice != "cancel") { + createEffect(tokens, choice); + } +} + +async function createEffect(tokens, choice) { + let effectName = 'Elemental Manipulation'; + let effectId = 'elementalmanipulation'; + const effectIcon = ICON; + let changes = []; + for (const token of tokens) { + let effectData = { + icon: effectIcon, + id: effectId, + label: effectName, + duration: {rounds: 5}, + flags: { + swade: { + expiration: 3, + loseTurnOnHold: true + } + }, + changes: changes, + }; + let range = token.actor.data.data.attributes.smarts.die.sides.toString() + let itemMutate = { + embedded: { + Item: { + "Elemental Manipulation: Thrown Rocks": { + "name": "Elemental Manipulation: Thrown Rock", + "type": "weapon", + "img": "icons/magic/earth/projectile-stone-ball-orange.webp", + "data": { + "description": "", + "notes": "", + "additionalStats": {}, + "quantity": 1, + "weight": 0, + "price": 0, + "equippable": true, + "equipped": true, + "isArcaneDevice": false, + "isVehicular": false, + "mods": 1, + "actions": { + "skill": "Athletics", + "skillMod": "", + "dmgMod": "", + "additional": {} + }, + "bonusDamageDie": 6, + "damage": "2d4", + "range": range, + "rof": "1", + "ap": 0, + "parry": 0, + "minStr": "", + "shots": 0, + "currentShots": 0, + "ammo": "", + "autoReload": false + }, + "effects": [], + "folder": null, + "sort": 0, + "permission": { "default": 0 }, + "flags": {} + }, + "Elemental Manipulation: Fire Blast": { + "name": "Elemental Manipulation: Fire Blast", + "type": "weapon", + "img": "icons/magic/fire/explosion-fireball-medium-orange.webp", + "data": { + "description": "", + "notes": "", + "additionalStats": {}, + "quantity": 1, + "weight": 0, + "price": 0, + "equippable": true, + "equipped": true, + "isArcaneDevice": false, + "isVehicular": false, + "mods": 1, + "actions": { + "skill": "Athletics", + "skillMod": "", + "dmgMod": "", + "additional": {} + }, + "bonusDamageDie": 6, + "damage": "2d4", + "range": range, + "rof": "1", + "ap": 0, + "parry": 0, + "minStr": "", + "shots": 0, + "currentShots": 0, + "ammo": "", + "autoReload": false + }, + "effects": [], + "folder": null, + "sort": 0, + "permission": { "default": 0 }, + "flags": {} + } + } + } + } + let mutate = { + embedded: { + ActiveEffect: { + } + } + }; + mutate.embedded.ActiveEffect[effectName] = effectData; + let mutateOptions = { + comparisonKeys: {'ActiveEffect': 'label'}, + name: effectName, + permanent: true, + description: effectName, + } + await warpgate.mutate(token.document, mutate, {}, mutateOptions); + mutateOptions.permanent = false; + await warpgate.mutate(token.document, itemMutate, {}, mutateOptions); + } +} \ No newline at end of file