swade-mb-shared/macros/warpgate_spells/deflection-warpgate.js
2022-04-20 23:43:00 -05:00

79 lines
2.3 KiB
JavaScript

const ICON = 'icons/magic/defensive/shield-barrier-deflect-teal.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: "Deflection",
content: `Apply <em>Deflection</em> to ${tokenList}`,
default: "cancel",
buttons: [
{label: "Apply (melee)", value: "melee"},
{label: "Apply (ranged)", value: "ranged"},
{label: "Apply with raise (both)", 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 = 'Deflection';
let effectId = `deflection${choice}`;
let changes = []
switch (choice) {
case 'melee':
effectName = "Melee " + effectName;
break
case 'ranged':
effectName = "Ranged " + effectName;
break
}
const effectIcon = ICON;
for (const token of tokens) {
let effectData = {
icon: effectIcon,
id: effectId,
label: effectName,
duration: {rounds: 5},
flags: {
swade: {
expiration: 3,
loseTurnOnHold: true
}
},
changes: [
{key: 'data.stats.parry.modifier', mode: foundry.CONST.ACTIVE_EFFECT_MODES.UPGRADE, value: 0, priority: 0}
],
};
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);
}
}