diff --git a/macros/warpgate_spells/sloth-speed.js b/macros/warpgate_spells/sloth-speed.js new file mode 100644 index 0000000..6c55ca7 --- /dev/null +++ b/macros/warpgate_spells/sloth-speed.js @@ -0,0 +1,95 @@ +const SPEEDICON = 'icons/skills/movement/feed-winged-boots-glowing-yellow.webp' +const SLOTHICON = 'icons/magic/control/encase-creature-spider-hold.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 menuOptions = { + title: 'Sloth/Speed', + defaultButton: "Cancel", + options: {} + }; + let menuData = { + inputs: [ + { type: 'header', label: 'Sloth/Speed' }, + { type: 'info', label: `Affected Tokens: ${tokenList}` }, + { type: 'info', label: "Speed or Sloth" }, + { type: 'radio', label: 'Speed', options: ['isspeed', true] }, + { type: 'radio', label: 'Sloth', options: ['isspeed', false] }, + ], + buttons: [ + { label: "Apply", value: "apply" }, + { label: "Apply with raise", value: "raise" }, + { label: "Cancel", value: "cancel" } + ] + } + let { buttons, inputs } = await warpgate.menu(menuData, menuOptions); + console.log(buttons, inputs) + if (buttons != "cancel") { + let direction = inputs[3] || inputs[4]; + createEffect(tokens, direction, buttons); + } +} + +async function createEffect(tokens, trait, direction, buttons) { + const raise = (buttons == 'raise'); + const effectName = `${raise ? "Major" : "Minor"} ${direction} ${trait.name}`; + const effectId = `${raise ? "Major" : "Minor"}${direction}${trait.name}`; + const effectIcon = (direction == "Speed" ? SPEEDICON : SLOTHICON) + for (const token of tokens) { + let tokenDoc = token.document; + let effectData = { + icon: effectIcon, + id: effectId, + label: effectName, + flags: { + swade: { + expiration: 3, + loseTurnOnHold: true + } + }, + changes: [] + }; + let mode = foundry.CONST.ACTIVE_EFFECT_MODES.MULTIPLY; + if (direction == "Speed") { + effectData.duration = { rounds: 5 }; + effectData.changes.push({ + key: 'data.stats.speed.value', + mode: mode, + value: 2 + }) + } else { + effectData.changes.push({ + key: 'data.stats.speed.value', + mode: mode, + value: 0.5 + }) + } + 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); + } +} \ No newline at end of file