forked from MrVauxs/pf2e-jb2a-macros
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmacros.db
62 lines (62 loc) · 195 KB
/
macros.db
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
{"name":"Cone Hands","type":"script","author":"BHRwUaMa68cNSVcP","img":"systems/pf2e/icons/spells/burning-hands.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nconst template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nconst [templateX, templateY] = [template.data.x, template.data.y];\n\nlet file = args[2]?.[0]\n\n// file = \"rainbow\"\n\nif (file === \"rainbow\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.cone_of_cold.green\")\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .scale({y: 2})\n .filter(\"ColorMatrix\", { hue: 50 }, \"light\")\n .loopProperty(\n \"effectFilters.light\",\n \"hue\",\n {\n from: 0,\n to: 360,\n duration: 1500\n }\n )\n .effect()\n .file(\"jb2a.cone_of_cold.green\")\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .scale({y: 2})\n .opacity(0.8)\n .effect()\n .file(\"jb2a.cone_of_cold.orange\")\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .rotate(20)\n .opacity(0.8)\n .effect()\n .file(\"jb2a.cone_of_cold.purple\")\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .rotate(-20)\n .opacity(0.8)\n .effect()\n .file(\"jb2a.cone_of_cold.purple\")\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .rotate(-10)\n .filter(\"ColorMatrix\", { contrast: 2, hue: -60 })\n .opacity(0.8)\n .effect()\n .file(\"jb2a.cone_of_cold.orange\")\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .rotate(10)\n .filter(\"ColorMatrix\", { contrast: 2, hue: 120 })\n .opacity(0.8)\n .play()\n} else {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(file)\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .scale({y: 2})\n .effect()\n .file(file)\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .rotate(20)\n .effect()\n .file(file)\n .mask(template)\n .atLocation(template)\n .stretchTo(template)\n .rotate(-20)\n .play()\n}","flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"cf":{"id":"temp_sjnygaa08ij"}},"ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":1662948680058,"modifiedTime":1663243398330,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"folder":null,"sort":0,"_id":"0O8rNzIVLo8p3tXj"}
{"_id":"1SwXNmbriolNG2ap","name":"Rebounding Toss","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/skills/ranged/shuriken-thrown-orange.webp","scope":"global","command":"// WIP!\n return // Comment me out to test\n\nlet targets = Array.from(game.user.targets);\nlet token = args[0].token;\nlet items = args[0].token._actor.items.filter(i => i.type === \"weapon\" && i.isHeld === true)\nlet weapons = []\n\ntoken.actor.sheet.minimize();\n\nlet imageProperties = [\n \"padding: 1em 1em\",\n \"border: none\",\n \"width: 10em\",\n \"height: auto\"\n]\n\nitems.forEach(x => weapons.push({label: `<img src=\"${x.img}\" style=\"${imageProperties.join(\";\")}\"><p>${x.name}</p>`, value: x}))\n\nlet weaponSelection = await warpgate.menu(\n {\n inputs: [\n { \n type: 'info', \n label: 'Which weapon are you attacking with?'\n },\n { \n type: 'info', \n label: 'Only Equipped Weapons are shown, draw your weapon first if you want to attack with it!'\n }\n ],\n buttons: weapons\n }, \n { \n title: \"Rebounding Toss\"\n }\n)\n\n\n// Second Throw BS\nlet distanceLimit = 10\nconst tokenCenter = targets[0];\nlet cachedDistance = 0;\n\nconst checkDistance = async(crosshairs) => {\n\n while (crosshairs.inFlight) {\n \n //wait for initial render\n await warpgate.wait(100);\n \n const ray = new Ray( tokenCenter, crosshairs );\n \n const distance = canvas.grid.measureDistances([{ray}], {gridSpaces:true})[0]\n\n //only update if the distance has changed\n if (cachedDistance !== distance) {\n cachedDistance = distance; \n if(distance > distanceLimit) {\n crosshairs.icon = 'icons/svg/hazard.svg'\n } else {\n crosshairs.icon = weaponSelection.buttons.img\n }\n crosshairs.draw()\n crosshairs.label = `${distance} ft`\n }\n }\n}\n\nconst callbacks = {\n show: checkDistance\n}\n\nif (weaponSelection.buttons) {\n let weaponOfChoice = (actor.data.data.actions ?? []).filter(action => action.type === 'strike').find(strike => strike.name === weaponSelection.buttons.data.name)\n \n if (targets.length === 1) {\n // Roll attack\n weaponOfChoice?.attack();\n \n // Check if attack hit\n const secondThrowLocation = warpgate.crosshairs.show({size: token.data.width, icon: token.data.img, label: '0 ft.'}, callbacks);\n \n // Handle fuckups\n if (location.cancelled) {\n ui.notifications.error('Cancelled Rebounding Toss\\'s second throw.');\n return;\n }\n if (cachedDistance > distanceLimit) {\n ui.notifications.error('Your Rebounding Toss can only attack a second target within 10 feet of the first one.')\n return;\n }\n \n const boundsContains = (bounds, point) =>\n bounds.left <= point.x\n && point.x <= bounds.right\n && bounds.top <= point.y\n && point.y <= bounds.bottom;\n \n const found = !!canvas.tokens.placeables.map(x => x.bounds).find(b => boundsContains(b, secondThrowLocation));\n } else if (targets.length > 1) ui.notifications.info(\"Too many targets!\"); else ui.notifications.info(\"No Targets!\")\n}\n\ntoken.actor.sheet.maximize();","folder":null,"sort":0,"permission":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.fdIIA40dPrWNfbyr"},"cf":{"id":"temp_9hsvsxrbtvj"}}}
{"_id":"1dUKN6KL7g3cdDdz","name":"Bouncing Lightning","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/electric-arc.webp","scope":"global","command":"// Affected by Interface Volume\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nlet targetTokens = Array.from(game.user.targets)\nif (targetTokens.length === 0) return;\n\nlet sequence = new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.chain_lightning.primary.blue\")\n .atLocation(tokenD) \n .stretchTo(targetTokens[0]) \n .waitUntilFinished(-1100)\n .sound()\n .volume(0.3)\n .file(\"modules/soundfxlibrary/Combat/Single/Spell%20Impact%20Lightning/spell-impact-lightning-3.mp3\")\n .fadeInAudio(500)\n .fadeOutAudio(500)\n .effect()\n .file(\"jb2a.static_electricity.02.blue\")\n .atLocation(targetTokens[0])\n .scaleToObject(1.2)\n .repeats(2)\n .wait(100)\nfor (let i = 1; i < targetTokens.length; i++) {\n sequence\n .effect()\n .file(\"jb2a.chain_lightning.secondary.blue\")\n .repeats(2)\n .atLocation(targetTokens[i - 1]) \n .stretchTo(targetTokens[i])\n .wait(200)\n .sound()\n .volume(0.3)\n .file(\"modules/soundfxlibrary/Combat/Single/Spell%20Impact%20Lightning/spell-impact-lightning-4.mp3\")\n .fadeInAudio(500)\n .fadeOutAudio(500)\n .effect()\n .file(\"jb2a.static_electricity.02.blue\")\n .atLocation(targetTokens[i])\n .scaleToObject(1.2)\n .repeats(2)\n .wait(200)\n}\nsequence.play()","folder":null,"sort":0,"flags":{"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_7rg2mnzpvsh"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.4","coreVersion":"10.287","createdTime":null,"modifiedTime":1665266563148,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"53lks5kxxOscwgvk","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_9hsvsxrbtvj","name":"WIP","color":"#ffffff","fontColor":"#000000","icon":"icons/svg/mystery-man-black.svg","sorting":"m","contents":["SaXHztUmj7Fh9G58","reYCOeWs6vFSD91T","AxZgxsk91WiYzQQo","1SwXNmbriolNG2ap"],"children":[],"folderPath":[],"version":"2.5.5"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":null,"modifiedTime":1666515573812,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"name":"Feral Shades","type":"script","scope":"global","author":"BHRwUaMa68cNSVcP","img":"systems/pf2e/icons/spells/feral-shades.webp","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nconst template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nconst [templateX, templateY] = [template.data.x, template.data.y];\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file('jb2a.darkness.black')\n .mask(template)\n .atLocation(tokenD)\n .opacity(0.8)\n .fadeIn(500)\n .fadeOut(500)\n .duration(10000)\n .scale(0.2)\n .animateProperty(\"sprite\", \"scale.x\", { from: 0, to: 2, duration: 2500, ease:\"easeOutCirc\"})\n .animateProperty(\"sprite\", \"scale.y\", { from: 0, to: 2, duration: 2500, ease:\"easeOutCirc\"})\n .effect()\n .file('jb2a.energy_strands.range.standard.dark_purple.01')\n .mask(template)\n .atLocation(template)\n .zIndex(1)\n .stretchTo(template, {randomOffset: true})\n .repeats(50, 0, 500)\n .play()","ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.SPu9f0NvlJG9JL3m"},"cf":{"id":"temp_sjnygaa08ij"}},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":1663084951587,"modifiedTime":1663106253255,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"folder":null,"sort":0,"_id":"62nzP4aLTMC5DNF7"}
{"_id":"6yeZBx2HjHHrQIRp","name":"Panache","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/features/classes/panache.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nlet testArgs\n\nif (!args.length) testArgs = await Sequencer.EffectManager.getEffects({ origin: \"panache\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.token_border.circle.static.blue.004\"]\n : [\"jb2a.token_border.circle.static.blue.008\"];\n\nif (args[0] == \"on\" || testArgs === \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.antilife_shell.blue_no_circle\")\n .origin(\"panache\")\n .name(tokenD.name + \"'s Panache\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .filter(\"ColorMatrix\", {\n hue: 190\n })\n .scaleToObject(2 * tokenScale)\n .waitUntilFinished(-1500)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"panache\")\n .name(tokenD.name + \"'s Panache\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(assets[0])\n .origin(\"panache\")\n .name(tokenD.name + \"'s Panache\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .filter(\"ColorMatrix\", {\n hue: 190\n })\n .fadeOut(3000)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .play()\n} else if (testArgs === \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"panache\", object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.6","coreVersion":"10.285","createdTime":null,"modifiedTime":1663589249622,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"7nrt0AppNUZDPmYk","name":"Humanoid Form","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/humanoid-form.webp","scope":"global","command":"// Original Author: EskieMoh#2969\n// Rebuilt by: MrVauxs#8622\n// To go back to your original form, click the Revert button at the top of the sheet that's been transformed.\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nif (!(args.at(-1) === \"on\" || args.at(-1) === \"off\")) args.push(await Sequencer.EffectManager.getEffects({ origin: \"Humanoid Form\", source: tokenD }).length ? \"off\" : \"on\");\n\nif (args.at(-1) == \"on\") {\n let disguise\n if (args[2].name && args[2].image && args[2].scale) {\n disguise = [\n args[2].name, \n args[2].image, \n args[2].scale\n ]\n } else {\n let tokenName = tokenD.name.toLowerCase().split(\"\").reverse().join(\"\")\n tokenName = tokenName[0].toUpperCase() + tokenName.slice(1)\n\n let disguiseDefault = [tokenName, tokenD.document.texture.src, tokenD.document.texture.scaleX]\n\n if (Array.from(game.user.targets).length) {\n disguiseDefault = [\n Array.from(game.user.targets)[0].name, \n Array.from(game.user.targets)[0].document.texture.src, \n Array.from(game.user.targets)[0].document.texture.scaleX\n ]\n }\n\n disguise = await warpgate.dialog([\n {\n type: 'text',\n label: `🎩 Name`,\n options: `${disguiseDefault[0]}`\n },\n {\n type: 'text',\n label: `✨ Token Image <u style=\"cursor: help;\" title=\"Make sure it works on the scene, CORS is a fickle god.\">URL</u>`,\n options: `${disguiseDefault[1]}`\n },\n {\n type: 'text',\n label: `📷 <u style=\"cursor: help;\" title=\"In case the token you are going into is a pop-out token. Or is smaller than you!\">Token Scale</u>`,\n options: `${disguiseDefault[2]}`\n },\n ],\n \"🎭Humanoid Form🎭\",\n \"Cast!\")\n\n if (!disguise) return;\n\n // No funny business with empty inputs.\n disguise = disguise.map((x, index) => x.length === 0 ? disguiseDefault[index] : x)\n }\n \n console.log(`PF2e x JB2A Macros | Transformed ${tokenD.name} into ${disguise[0]} with ${disguise[1]} image with scale of ${disguise[2]}.`)\n\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .origin(\"Humanoid Form\")\n .name(\"Humanoid Form - Intro (Casting)\")\n .attachTo(tokenD)\n .file(\"jb2a.magic_signs.circle.02.transmutation.intro\")\n .scaleToObject(1 * tokenScale)\n .waitUntilFinished(-500)\n .animateProperty(\"sprite\", \"rotation\", { from: 0, to: 360, duration: 3000, ease: \"easeOutExpo\"})\n .effect()\n .origin(\"Humanoid Form\")\n .name(\"Humanoid Form - Intro (Transformation)\")\n .file(disguise[1])\n .scaleToObject(Number(disguise[2]))\n .fadeIn(800)\n .attachTo(tokenD)\n /*.animation()\n .on(tokenD)\n .fadeOut(200)\n .effect()\n .origin(\"Humanoid Form\")\n .name(\"Humanoid Form - Intro (Fade In)\")\n .file(disguise[1])\n .fadeIn(800)\n .scaleToObject(Number(disguise[2]))\n .duration(900)\n .effect()\n .origin(\"Humanoid Form\")\n .name(\"Humanoid Form - Intro (Fade Out)\")\n .from(tokenD)\n .fadeOut(800)\n .scaleToObject(Number(disguise[2]))\n .waitUntilFinished(-50)\n .animation()\n .on(tokenD)\n .opacity(1)*/\n .thenDo(async () => {\n let mutation = await warpgate.mutate(\n tokenD.document,\n {\n token: {\n name: disguise[0],\n texture: {\n src: disguise[1],\n scaleX: Number(disguise[2]),\n scaleY: Number(disguise[2])\n }\n }\n },\n {},\n {\n name: `Humanoid Form (${disguise[0]})`,\n description: `This token has used the <a class=\"entity-link content-link\" draggable=\"true\" data-pack=\"pf2e.spells-srd\" data-id=\"2qGqa33E4GPUCbMV\"><i class=\"fas fa-suitcase\"></i> Humanoid Form</a> spell and has turned into ${disguise[0]}!`\n }\n );\n console.log(tokenD, await mutation);\n // See https://github.com/trioderegion/warpgate/issues/72\n /* \n await warpgate.event.trigger(\n warpgate.EVENT.REVERT,\n () => {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .origin(\"Humanoid Form\")\n .name(\"Humanoid Form - Exit\")\n .file(disguise[1])\n .scaleToObject(Number(disguise[2]))\n .attachTo(tokenD)\n .fadeOut(1000)\n .play()\n }\n )\n */\n }\n )\n .play();\n} else if (args.at(-1) == \"off\") {\n Sequencer.EffectManager.endEffects({ origin: \"Humanoid Form\", object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.0fUIZ0XifYGrR9oY"},"cf":{"id":"temp_xz48q3g0ej8"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.0","coreVersion":"10.288","createdTime":null,"modifiedTime":1666913773986,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"8M1lDOo679Hsj80q","name":"Aeon Stone","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/commodities/gems/gem-faceted-diamond-silver-.webp","scope":"global","command":"// Cannot be used standalone.\n\nargs = args.flat()\nlet tokenD = args[1].actor.getActiveTokens()[0]\nlet stone = \"jb2a.ioun_stones.01\"\nlet colors = {}\nlet stoneType = args[1].slug.replace(\"aeon-stone-\", \"\").replace(\"-\", \" \").trim()\nlet stoneScale = 0.15\n\nconsole.log(\"hey\", stoneType)\n\nswitch (stoneType) {\n\tcase \"clear spindle\": stone = \"jb2a.ioun_stones.01.white.regeneration\"; break;\n\tcase \"dull grey\": colors = { brightness: 0.9, saturate: -1 }; break;\n\tcase \"agate ellipsoid\": stone = \"jb2a.ioun_stones.02.purple.absorption\"; colors = { hue: 200 }; break;\n\tcase \"azure briolette\": stone = \"jb2a.ioun_stones.02.purple.absorption\"; colors = { hue: 670 }; break;\n\tcase \"black pearl\": stone = \"jb2a.ioun_stones.01.blue.insight\"; colors = { brightness: 0.2 }; break;\n\tcase \"orange prism\": stone = \"jb2a.ioun_stones.02.pink.fortitude\"; colors = { hue: 95 }; break;\n\tcase \"gold nodule\": stone = \"jb2a.ioun_stones.01.blue.awareness\"; colors = { hue: 525 }; break;\n\tcase \"clear quartz octagon\": stone = \"jb2a.ioun_stones.01.pink.protection\"; colors = { brightness: 1, saturate: -1 }; break;\n\tcase \"pearlescent pyramid\": stone = \"jb2a.ioun_stones.02.pink.fortitude\"; colors = { brightness: 1, saturate: -1 }; break;\n\tcase \"dusty rose prism\": stone = \"jb2a.ioun_stones.01.pink.fortitude\"; colors = { saturate: -0.2 }; break;\n\tcase \"lavender and green ellipsoid\": stone = \"jb2a.ioun_stones.02.purple.absorption\"; colors = { hue: 200 }; break;\n\tcase \"pale orange rhomboid\": stone = \"jb2a.ioun_stones.01.blue.strength\"; colors = { saturate: -0.2, hue: 200 }; break;\n\tcase \"pink rhomboid\": stone = \"jb2a.ioun_stones.01.blue.strength\"; colors = { hue: 490 }; break;\n\tcase \"tourmaline sphere\": stone = \"jb2a.ioun_stones.02.red.intellect\"; colors = { brightness: 1.6, hue: -60 }; break;\n\tcase \"western star\": stone = \"jb2a.twinkling_stars.points04.orange\"; stoneScale = 0.6; break;\n\tcase \"pale lavender ellipsoid\": stone = \"jb2a.ioun_stones.01.purple.absorption\"; colors = { brightness: 1.3 }; break;\n\tcase \"pearly white spindle\": stone = \"jb2a.ioun_stones.02.white.sustenance\"; break;\n\n\tdefault: console.log(\"Cannot find '\" + stoneType + \"', picking a random ioun stone animation.\"); break;\n}\n\nif (args[0] == \"on\"){\n\tlet existingEffects = Sequencer.EffectManager.getEffects({ name: `${args[1].actor.data.name} - Aeon Stone - *` })\n\t\n\tnew Sequence(\"PF2e x JB2A Macros\")\n\t\t.effect()\n\t\t\t.file(stone)\n\t\t\t.attachTo(tokenD, {followRotation: false})\n\t\t\t.scale(stoneScale)\n\t\t\t.spriteOffset({ y: 0.5 }, { gridUnits: true })\n\t\t\t.filter(\"ColorMatrix\", colors)\n\t\t\t.zeroSpriteRotation()\n\t\t\t.animateProperty(\"sprite\", \"position.y\", { from: 0, to: 0.5, duration: 3000, gridUnits: true })\n\t\t\t.animateProperty(\"sprite\", \"position.y\", { from: 0.5, to: 0, duration: 3000, gridUnits: true, fromEnd: true })\n\t\t\t.loopProperty(\"spriteContainer\", \"rotation\", { from: 0, to: 360, duration: 6000})\n\t\t\t.loopProperty(\"sprite\", \"rotation\", { values: [0, -30, 0, 30], duration: 1500, pingPong: true})\n\t\t\t.scaleOut(0, 800)\n\t\t\t.scaleIn(0, 800)\n\t\t\t.persist(true, {persistTokenPrototype: true})\n\t\t\t.name(`${args[1].actor.data.name} - Aeon Stone - ${stoneType}`)\n\t\t\t.extraEndDuration(3000)\n\t\t.play()\n} else if (args[0] == \"off\") {\n\tawait Sequencer.EffectManager.endEffects({ name: `${args[1].actor.data.name} - Aeon Stone - ${stoneType}`, object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":true},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_uokxor3emwq"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.3","coreVersion":"10.288","createdTime":null,"modifiedTime":1667305223442,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"name":"Open AA","type":"script","scope":"global","author":"SCUQoZ7lvePPTab6","img":"icons/svg/dice-target.svg","command":"Hooks.call('AutomaticAnimations.Open.Menu.New')","ownership":{"default":0,"SCUQoZ7lvePPTab6":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.mG8E4zXZSHJC5YFy"},"cf":{"id":"temp_9hsvsxrbtvj"}},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":1665496217402,"modifiedTime":1666367948932,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"folder":null,"sort":0,"_id":"AxZgxsk91WiYzQQo"}
{"name":"Brain Drain","type":"script","scope":"global","author":"SCUQoZ7lvePPTab6","img":"systems/pf2e/icons/spells/brain-drain.webp","command":"// Original Author: @Trueprophet#9165\n// Modified by: @MrVauxs#8622\n\nlet targets = Array.from(game.user.targets);\nlet [tokenD] = vauxsMacroHelpers(args)\n\nif (!(args && args[2] && args[2].length)) args[2] = {color: \"orange\"} // or \"orange\"\n\nlet files = args[2]?.color === \"purple\" ? [\n \"jb2a.divine_smite.caster.reversed.purplepink\",\n \"jb2a.eldritch_blast.purple\",\n \"jb2a.eyes.01.bluegreen.single.2\",\n \"jb2a.eyes.01.bluegreen.single.2\",\n \"jb2a.energy_strands.range.standard.purple\"\n] : [\n \"jb2a.divine_smite.caster.reversed.orange\",\n \"jb2a.eldritch_blast.yellow\",\n \"jb2a.eyes.01.orangeyellow.single.2\",\n \"jb2a.eyes.01.orangeyellow.single.2\",\n \"jb2a.energy_strands.range.standard.orange\"\n]\n\nlet cyanToPurple = {\n hue: 90\n}\n\nfor (let target of targets) {\n new Sequence(\"PF2e Animation Macros\")\n .effect()\n .file(files[0])\n .fadeIn(200)\n .atLocation(tokenD)\n .playbackRate(3)\n .scale(0.75)\n .fadeOut(50)\n .effect()\n .file(files[1])\n .fadeIn(200)\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeOut(200)\n .wait(1000)\n .effect()\n .file(files[2])\n .filter(\"ColorMatrix\", args[2]?.color === \"purple\" ? cyanToPurple : {})\n .atLocation(tokenD)\n .scale(0.3)\n .scaleIn(0, 500, {ease: \"easeInCubic\", Delay: 100})\n .moveTowards(target, {rotate:false, ease:\"easeInOutQuart\"})\n .moveSpeed(500)\n .fadeOut(200)\n .waitUntilFinished(-120)\n .effect()\n .file(files[3])\n .filter(\"ColorMatrix\", args[2]?.color === \"purple\" ? cyanToPurple : {})\n .atLocation(target, {offset: {x: 0, y: -25}})\n .fadeIn(100)\n .scaleToObject(0.5)\n .animateProperty(\"spriteContainer\", \"scale.x\", {from:0, to: 2, duration: 700})\n .animateProperty(\"spriteContainer\", \"scale.y\", {from:0, to: 2, duration: 700})\n .fadeOut(50)\n .waitUntilFinished(-5000) \n .effect()\n .file(files[4])\n .scale(0.8, 1)\n .fadeIn(50)\n .atLocation(target)\n .stretchTo(tokenD)\n .repeats(7, 300, 400)\n .randomizeMirrorY()\n .fadeOut(50)\n .play()\n};","ownership":{"default":0,"SCUQoZ7lvePPTab6":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.r8oELkjUjXhMEDKw"},"cf":{"id":"temp_7rg2mnzpvsh"}},"_stats":{"systemId":"pf2e","systemVersion":"4.3.0","coreVersion":"10.288","createdTime":1666910964779,"modifiedTime":1666912641337,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"folder":null,"sort":0,"_id":"BCeeFyLkQhbiqF4b"}
{"_id":"CtkjmTtEYfMPbtm4","name":"Heal","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/heal.webp","scope":"global","command":"// Cannot be used standalone.\nlet diceNumber = args[0].rolls[0].terms[0].number\nlet caster = args[1].sourceToken\nlet spellTarget = Array.from(game.user.targets)[0]\nlet doNotTargetCaster = false\n\nfunction getSpellVariant() {\n const spellVariants = args[0]?.item?.overlays?.contents;\n if (!spellVariants) return ui.notifications.error(\"No variants found! Check if you have updated your Heal spell to the newest version. It's been a while.\")\n const originChatMessage = game.messages.filter(message => !message.isRoll && message.item?.original?.id === args[0].item.id).pop();\n const chosenVariantId = originChatMessage.item.appliedOverlays.get('override');\n let spellVariant = spellVariants.find(variant => variant._id === chosenVariantId);\n if(spellVariant) {\n if(spellVariant.system.time.value === \"1\") {\n oneActionHeal();\n } else if(spellVariant.system.time.value === \"2\") {\n twoActionHeal()\n } else if(spellVariant.system.time.value === \"3\") {\n d3.render(true);\n }\n } else {\n console.log('No spell variants found.')\n }\n}\n\nfunction getModeOfBeing(actor) {\n let modeOfBeing = actor.modeOfBeing;\n if(actor.traits.find(trait => trait === 'automaton') || actor.ancestry?.name === 'Poppet') modeOfBeing = 'living';\n if(actor.traits.find(trait => trait === 'dhampir')) modeOfBeing = 'undead';\n\n return modeOfBeing;\n}\n\nlet d3 = new Dialog({\n title: \"Heal\",\n content: `<p>Do you want to target yourself?</p>`,\n buttons: {\n one: {\n label: \"Yes\",\n callback: () => {\n doNotTargetCaster = false\n threeActionHeal()\n }\n },\n two: {\n label: \"No\",\n callback: () => {\n doNotTargetCaster = true\n threeActionHeal()\n }\n }\n },\n default: \"No\"\n})\n\nfunction main(){\n if(caster != undefined){\n getSpellVariant();\n }else{\n ui.notifications.error(`You must select the token of the caster!`)\n return;\n } \n}\nmain();\n\n//Defining unique behavior for each kind of effect\nfunction oneActionHeal(){\n //error checking for multiple targets\n if (game.user.targets.size!= 1){\n ui.notifications.error(\"Select only one target!\")\n return;\n }\n if(canvas.grid.measureDistance(caster,spellTarget) < 7.5){\n console.log(\"Close enough to touch!\")\n // checks whether the target is undead or not\n oneActionHealAnimation()\n } else {\n console.log(`Too far to touch!`); \n ui.notifications.error(`Your target is further than touch distance away! Try again.`);\n return;\n } \n}\n\nfunction twoActionHeal(){\n //error checking for multiple targets\n if (game.user.targets.size!= 1){\n ui.notifications.error(\"Select only one target!\")\n return;\n }\n if(canvas.grid.measureDistance(caster,spellTarget) <= 30){\n console.log(\"Within 30 feet!\")\n // checks whether the target is undead or not\n twoActionHealAnimation()\n }else{\n console.log(`Farther than 30 feet!`); \n ui.notifications.error(`Your target is further than 30 feet away! Try again.`);\n return;\n }\n}\n\nfunction threeActionHeal(){\n //divide up all tokens within range into an array for living and an array for undead\n let tokensOnMap = Array.from(canvas.tokens.placeables)\n let tokensInRange = tokensOnMap.filter(distance => canvas.grid.measureDistance(distance,caster)<=30)\n let undeadTokensInRange = []\n let livingTokensInRange = []\n\n for(let i=0;i<tokensInRange.length;i++){\n if(getModeOfBeing(tokensInRange[i].actor) === 'undead'){\n undeadTokensInRange.push(tokensInRange[i])\n }else if(getModeOfBeing(tokensInRange[i].actor) === 'living'){\n if (doNotTargetCaster) {\n if (!(caster === tokensInRange[i])) livingTokensInRange.push(tokensInRange[i])\n } else livingTokensInRange.push(tokensInRange[i])\n } \n }\n console.log(undeadTokensInRange)\n console.log(livingTokensInRange)\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(caster)\n .randomRotation()\n .size(14, {gridUnits: true})\n .file(\"jb2a.healing_generic.burst.greenorange\")\n .waitUntilFinished(-1500)\n .play()\n for(let i=0;i<undeadTokensInRange.length;i++){\n new Sequence(\"Damage Undead\")\n .effect()\n .atLocation(undeadTokensInRange[i])\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.divine_smite.target.greenyellow\")\n .play()\n }\n for(let i=0;i<livingTokensInRange.length;i++){\n new Sequence(\"Heal living\")\n .effect()\n .atLocation(livingTokensInRange[i])\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.healing_generic.200px.green\")\n .play()\n }\n}\n\n//Defining animations for each kind of effect\nfunction oneActionHealAnimation(){\n if(getModeOfBeing(spellTarget.actor) === 'undead'){\n //trigger energy strand from caster to target, then trigger healing burst on target\n new Sequence(\"Damage undead\")\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.divine_smite.target.greenyellow\")\n .play()\n }else if (getModeOfBeing(spellTarget.actor) === 'living') {\n //trigger energy strand from caster to target, then trigger damaging burst on target\n new Sequence(\"Heal living\")\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.healing_generic.200px.green\")\n .play()\n }\n}\nfunction twoActionHealAnimation(){\n if(getModeOfBeing(spellTarget.actor) === 'undead'){\n //trigger energy strand from caster to target, then trigger damaging burst on target\n new Sequence(\"Damage undead\") \n .effect()\n .atLocation(caster)\n .stretchTo(spellTarget)\n .file(\"jb2a.energy_strands.range.standard.dark_purple\")\n .waitUntilFinished(-1000)\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.divine_smite.target.greenyellow\")\n .play()\n }else if(getModeOfBeing(spellTarget.actor) === 'living') {\n //trigger energy strand from caster to target, then trigger healing burst on target\n new Sequence(\"Heal living\") \n .effect()\n .atLocation(caster)\n .stretchTo(spellTarget)\n .file(\"jb2a.energy_strands.range.standard.dark_green\")\n .waitUntilFinished(-1000)\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.healing_generic.200px.green\")\n .play()\n }\n}\nfunction threeActionHealAnimation(){\n \n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"exportSource":{"world":"hogwarts","system":"pf2e","coreVersion":"9.269","systemVersion":"3.10.2.11602"},"core":{"sourceId":"Macro.1wpIPbvbCvQaueft"},"cf":{"id":"temp_6gsujam4gp6"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":null,"modifiedTime":1665873484532,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"Dlff2f5pPBnj7SlK","name":"Equipment Changes","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/equipment/chest/breastplate-collared-steel.webp","scope":"global","command":"// This macro triggers every time updateItem hook is triggered.\n// You can use this to say, create \"On Equip\" or \"On Invest\" effects.\n// Not something you could even try using standalone.\n\nlet data = args[0].data\nlet changes = args[0].changes\n\nif (data.name.includes(\"Aeon Stone\")) {\n\tif ((changes.data.equipped.invested && data.isEquipped) || (data.isInvested && changes.data.equipped.carryType === \"worn\")) {\n\t runJB2Apf2eMacro(\"Aeon Stone\", [\"on\", data])\n\t} else runJB2Apf2eMacro(\"Aeon Stone\", [\"off\", data])\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_uokxor3emwq"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662741209027,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"E1eKr1GPbMu11gDZ","name":"Quickened","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/conditions/quickened.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nlet testArgs\n\nif (!args.length) testArgs = await Sequencer.EffectManager.getEffects({ origin: \"quickened\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.token_border.circle.static.blue.003\"]\n : [\"jb2a.token_border.circle.static.blue.003\"];\n\nif (args[0] == \"on\" || testArgs === \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"quickened\")\n .name(\"Quickened\" + tokenD.name)\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .scaleToObject(tokenScale)\n .rotate(90)\n .tint(\"#00FFFF\")\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(assets[0])\n .origin(\"quickened\")\n .name(\"Quickened\" + tokenD.name)\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .fadeOut(3000)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .play()\n} else if (testArgs === \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"quickened\", object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.5","coreVersion":"10.288","createdTime":null,"modifiedTime":1665450216677,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"IaIxaOh0D7roiQz1","name":"Protective Ward","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/protective-ward.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nif (!args.length) args[0] = await Sequencer.EffectManager.getEffects({ origin: \"protective-ward-aura\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst auraRadius = tokenD.auras.get(\"aura-effect-bless\")?.radius\nconst gridUnits = 1.5 + 3 * (isNaN(auraRadius) ? 1 : auraRadius / 5)\n\nif (args[0] == \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.shield.01.complete.01.yellow\")\n .attachTo(tokenD)\n .origin(\"protective-ward-aura\")\n .name(\"Pf2e x JB2A Aura - Protective Ward\")\n .persist()\n .opacity(0.8)\n .size(4.5, { gridUnits: true })\n .play()\n} else if (args[0] == \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"protective-ward-aura\", source: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_o2l5kjd1mwj"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662722216974,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"JM7aQZeP0zMbbHyw","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_6gsujam4gp6","name":"Multiple Functions","color":"#423a7e","fontColor":"#FFFFFF","icon":"icons/svg/daze.svg","sorting":"m","contents":["x3ZaL34wkz4LljPo","blSU13HzwUtDVjJZ","lmKZBrfclq8V6sJI","kz6IN257FJ58SgmE","CtkjmTtEYfMPbtm4","lkQvlxkMpsbLwwx5","LsHdd70Q1TpFTQf0"],"children":["temp_uokxor3emwq"],"folderPath":[],"version":"2.5.3"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.5","coreVersion":"10.288","createdTime":null,"modifiedTime":1665498471530,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"JVtjNvoMoxsfddd7","name":"Illusory Disguise","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/illusory-disguise.webp","scope":"global","command":"// Original Author: EskieMoh#2969\n// Remastered by: MrVauxs#8622\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nlet testArgs\n\nif (!args.length) testArgs = await Sequencer.EffectManager.getEffects({ origin: \"Illusory Disguise\", source: tokenD }).length ? \"off\" : \"on\";\n\nif (args[0] === \"on\" || testArgs === \"on\") {\n let tokenName = tokenD.name.toLowerCase().split(\"\").reverse().join(\"\")\n tokenName = tokenName[0].toUpperCase() + tokenName.slice(1)\n\n let disguiseDefault = [tokenName, tokenD.document.data.img, tokenD.document.data.scale, false]\n\n if (Array.from(game.user.targets).length) {\n disguiseDefault = [\n Array.from(game.user.targets)[0].name, \n Array.from(game.user.targets)[0].document.data.img, \n Array.from(game.user.targets)[0].document.data.scale\n ]\n }\n \n let disguise = await warpgate.dialog([\n {\n type: 'text',\n label: `🎩 Name`,\n options: `${disguiseDefault[0]}`\n },\n {\n type: 'text',\n label: `✨ Token Image <u style=\"cursor: help;\" title=\"Make sure it works on the scene, CORS is a fickle god.\">URL</u>`,\n options: `${disguiseDefault[1]}`\n },\n {\n type: 'text',\n label: `📷 <u style=\"cursor: help;\" title=\"In case the token you are going into is a pop-out token. Or is smaller than you!\">Token Scale</u>`,\n options: `${disguiseDefault[2]}`\n },\n {\n type: 'checkbox',\n label: `Turn your original token <u style=\"cursor: help;\" title=\"Enabled by default, this hides the token under the disguise. Useful for disguising into a smaller or a top-down token.\">invisible</u>?`,\n options: true,\n value: true\n },\n ],\n \"🎭Illusory Disguise🎭\",\n \"Cast!\")\n\n if (!disguise) return;\n\n if (args.length === 1) ui.notifications.info(\"PF2e x JB2A Macros | You are not using the Active Effect version of this spell, thus requiring you to remove the effect by going into the <i class='fas fa-film'></i> Sequencer Effect Manager.\");\n\n // No funny business with empty inputs.\n disguise = disguise.map((x, index) => x.length === 0 ? disguiseDefault[index] : x)\n \n console.log(`Transformed ${tokenD.name} into ${disguise[0]} with ${disguise[1]} image with scale of ${disguise[2]}.${disguise[3] ? \"The original token has been turned invisible.\" : \"\"}`)\n\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.markers.circle_of_stars.blue\")\n .atLocation(tokenD)\n .delay(200)\n .duration(8000)\n .fadeIn(500)\n .fadeOut(7500)\n .scaleToObject(1.3 * Math.min(tokenD.document.data.scale, 1))\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .loopProperty(\"sprite\", \"rotation\", { from: 0, to: 360, duration: 60000 })\n .zIndex(1)\n .effect()\n .file(\"jb2a.sneak_attack.blue\")\n .atLocation(tokenD)\n .delay(200)\n .scaleToObject(2 * Math.min(tokenD.document.data.scale, 1))\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .playbackRate(1)\n .zIndex(2)\n .waitUntilFinished(-1000)\n .animation()\n .playIf(disguise[3])\n .fadeOut(500)\n .on(tokenD)\n .effect()\n .file(disguise[1])\n .origin(\"Illusory Disguise\")\n .name(\"Illusory Disguise\")\n .scaleToObject(Number(disguise[2]))\n .opacity(0.8)\n .scaleIn(0, 200, { ease: \"easeOutCubic\" })\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .persist(true, { persistTokenPrototype: true })\n .fadeIn(760)\n .fadeOut(2500)\n .effect()\n .file(\"jb2a.particles.outward.purple.02.03\")\n .origin(\"Illusory Disguise\")\n .name(\"Illusory Disguise - Particles\")\n .delay(200)\n .scaleToObject(1.5 * Math.min(1, Number(disguise[2])))\n .zIndex(2)\n .scaleIn(0, 200, { ease: \"easeOutCubic\" })\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .persist(true, { persistTokenPrototype: true })\n .fadeIn(760)\n .fadeOut(2500)\n .waitUntilFinished(-2500)\n .animation()\n .playIf(disguise[3])\n .fadeIn(2500)\n .on(tokenD)\n .play();\n} else if (testArgs === \"off\") {\n Sequencer.EffectManager.endEffects({ origin: \"Illusory Disguise\", object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.0fUIZ0XifYGrR9oY"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.6","coreVersion":"10.285","createdTime":null,"modifiedTime":1663588207552,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"KHYzBiPwMIY6WfYa","name":"Dancing Lights","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/magic/light/explosion-star-glow-yellow.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nlet callbacks = {\n pre: async (location, updates) => {\n mergeObject(updates, {\n token: {\n alpha: 0\n }\n })\n },\n post: async (location, spawnedTokenDoc, updates, iteration) => {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(spawnedTokenDoc)\n .file(\"jb2a.template_circle.out_pulse.02.burst\")\n .scaleToObject(2)\n .fadeOut(500)\n .animation()\n .on(spawnedTokenDoc)\n .opacity(1)\n .play()\n }\n}\n\nconst options = await warpgate.menu(\n\t\t\t{\n\t\t\t\tinputs: [\n\t\t\t\t\t{\n type: \"info\",\n label: \"Select your dancing lights...\"\n },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\tlabel: \"Amount\",\n\t\t\t\t\t\toptions: 1\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"select\",\n\t\t\t\t\t\tlabel: \"Color\",\n\t\t\t\t\t\toptions: [\n \"Blue-Teal\",\n \"Blue-Yellow\",\n \"Green\",\n \"Pink\",\n \"Purple-Green\",\n \"Red\",\n \"Yellow\"\n ]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"Summon Anything\"\n\t\t\t}\n\t\t)\n\nif (!options.buttons) return;\n\nlet importedActor = await fromUuid(\"Compendium.pf2e-jb2a-macros.Actors.teCoIt8sjArsIl4D\");\n\nimportedActor.img = `modules/jb2a_patreon/Library/Cantrip/Dancing_Lights/DancingLights_01_${options.inputs[2].replace(\"-\", \"\")}_Thumb.webp`;\nimportedActor.prototypeToken.texture.src = `modules/jb2a_patreon/Library/Cantrip/Dancing_Lights/DancingLights_01_${options.inputs[2].replace(\"-\", \"\")}_200x200.webm`;\n\nawait playerSummons({\n args,\n importedActor,\n spawnArgs: {callbacks, options: {duplicates: Math.min(Math.max(1, options.inputs[1]), 4)}}\n})","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"exportSource":{"world":"hogwarts","system":"pf2e","coreVersion":"9.269","systemVersion":"3.10.2.11602"},"core":{"sourceId":"Macro.1wpIPbvbCvQaueft"},"cf":{"id":"temp_3t4j7cyld29"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":null,"modifiedTime":1667132847391,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"name":"#[CF_tempEntity]","type":"chat","command":"","flags":{"cf":{"id":"temp_brzxllxt18s","name":"Ray / Line","color":"#38698f","fontColor":"#FFFFFF","icon":"icons/svg/down.svg","sorting":"m","contents":["pC8bqYNdqGeeUoWO","j1cUixlhlZBbeM1r"],"children":[],"folderPath":["temp_c76abfsyvz7"]}},"author":"BHRwUaMa68cNSVcP","img":"icons/svg/dice-target.svg","scope":"global","folder":null,"sort":0,"ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":1663106274188,"modifiedTime":1663106277421,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"_id":"KRn1ZdjVWJnWMo51"}
{"_id":"KXoNTv1YkjM3D9NI","name":"Soul Siphon","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/soul-siphon.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nlet target = Array.from(game.user.targets)[0]\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(token)\n .stretchTo(target)\n .origin(\"soul siphon\")\n .name(\"Soul Siphon\")\n .file(\"jb2a.energy_strands.range.standard.dark_red\")\n .waitUntilFinished(-1500)\n .effect()\n .atLocation(target)\n .stretchTo(token)\n .origin(\"soul siphon\")\n .name(\"Soul Siphon\")\n .file(\"jb2a.energy_strands.range.standard.dark_red\")\n .waitUntilFinished(-1500)\n .effect()\n .randomRotation()\n .scaleToObject(2)\n .origin(\"soul siphon\")\n .name(\"Soul Siphon\")\n .atLocation(token)\n .file(\"jb2a.energy_strands.in.red.01.2\")\n .play()","folder":null,"sort":0,"flags":{"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_7rg2mnzpvsh"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662742190007,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"name":"Variable Templates","type":"script","scope":"global","author":"BHRwUaMa68cNSVcP","img":"icons/magic/lightning/bolt-beam-strike-blue.webp","command":"// Not something you could even try using standalone.\n\nif (!args.length) return;\n\nconsole.log(args[1].templateData)\n\nconst animationName = args[1].animNameFinal + \" (\" + args[1].templateData + \")\"\n\ndebug(\"Variable Templates\", [animationName, args])\n\n// Doesn't work yet with Automated Animations not allowing template data.\nAutoAnimations.playAnimation(\n args[1].sourceToken, \n [],\n { name: animationName, templateData: args[1].templateData }\n)","ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.w8CEay4vmtDBeavi"},"cf":{"id":"temp_6gsujam4gp6"}},"_stats":{"systemId":"pf2e","systemVersion":"4.2.5","coreVersion":"10.288","createdTime":1663680578497,"modifiedTime":1665499835090,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"folder":null,"sort":0,"_id":"LsHdd70Q1TpFTQf0"}
{"_id":"LxFkyULbmva8yGDm","name":"Bane","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/bane.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nif (!args.length) args[0] = await Sequencer.EffectManager.getEffects({ origin: \"aura-effect-bane\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst auraRadius = tokenD.auras.get(\"aura-effect-bane\")?.radius\nconst gridUnits = 1.5 + 3 * (isNaN(auraRadius) ? 1 : auraRadius / 5)\n\nif (args[0] == \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.bless.400px.intro.purple\")\n .scaleIn(0, 1000, {ease: \"easeInBounce\"})\n .atLocation(tokenD)\n .attachTo(tokenD)\n .name(\"Pf2e x JB2A Aura - Bane Intro\")\n .origin(\"aura-effect-bane\")\n .opacity(0.9)\n .size(gridUnits, { gridUnits: true })\n .effect()\n .delay(1500)\n .file(\"jb2a.bless.400px.loop.purple\")\n .atLocation(tokenD)\n .fadeOut(500)\n .persist(true, { persistTokenPrototype: true })\n .attachTo(tokenD)\n .belowTokens(true)\n .origin(\"aura-effect-bane\")\n .name(\"Pf2e x JB2A Aura - Bane\")\n .scaleOut(2, 2500, {ease: \"easeOutCubic\"})\n .fadeOut(1000)\n .size(gridUnits, { gridUnits: true })\n .play()\n} else if (args[0] == \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"aura-effect-bane\", source: tokenD })\n}","folder":null,"sort":0,"flags":{"core":{"sourceId":"Macro.eJJhPoLdv7ul62dc"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_o2l5kjd1mwj"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662722131626,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"O0RE17QySMEMVdHd","name":"Unleash Psyche","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/features/classes/unleash-psyche.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nlet testArgs\n\nif (!args.length) testArgs = await Sequencer.EffectManager.getEffects({ origin: \"UnleashPsyche\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.particles.outward.greenyellow.01.03\", \"jb2a.token_border.circle.static.blue.007\"]\n : [\"jb2a.particles.outward.orange.01.03\", \"jb2a.token_border.circle.static.orange.012\"];\n\nconst nameOfEffect = `${tokenD.name}'s Unleashed Psyche`\n\nlet preload = [\"jb2a.thunderwave.center.blue\", \"jb2a.particles.inward.greenyellow.01.02\", \"jb2a.particles.swirl.greenyellow.01.01\"].concat(assets)\n\nawait Sequencer.Preloader.preloadForClients(preload)\n\nif (args[0] == \"on\" || testArgs === \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .origin(\"UnleashPsyche\")\n .name(nameOfEffect + \" - Explosion\")\n .file(\"jb2a.thunderwave.center.blue\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .filter(\"ColorMatrix\", { hue: 100 })\n .scaleToObject(3.5 * tokenScale)\n .waitUntilFinished(-900)\n .effect()\n .origin(\"UnleashPsyche\")\n .name(nameOfEffect + \" - Particles (Inward)\")\n .file(\"jb2a.particles.inward.greenyellow.01.02\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .fadeOut(1500)\n .filter(\"ColorMatrix\", { hue: 250 })\n .scaleToObject(tokenScale)\n .fadeIn(300)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"UnleashPsyche\")\n .name(nameOfEffect + \" - Particles (Swirl)\")\n .file(\"jb2a.particles.swirl.greenyellow.01.01\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .fadeOut(500)\n .filter(\"ColorMatrix\", { hue: 250 })\n .scaleToObject(1.7 * tokenScale)\n .fadeIn(300)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"UnleashPsyche\")\n .name(nameOfEffect + \" - Token Border\")\n .file(assets[1])\n .atLocation(tokenD)\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .opacity(0.6)\n .fadeOut(3000)\n .scaleToObject(2 * tokenScale)\n .filter(\"ColorMatrix\", { hue: 250 })\n .persist(true, { persistTokenPrototype: true })\n .play()\n} else if (testArgs === \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"UnleashPsyche\", object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":null,"modifiedTime":1666272240196,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"OOKf1Stu6m8HZNWA","name":"Scorching Ray","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/scorching-ray.webp","scope":"global","command":"// Original Author: EskieMoh#2969\n// Remastered by: MrVauxs#8622\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.particles.outward.greenyellow.02.05\", { saturate: -1 }]\n : [\"jb2a.particles.outward.orange.02.05\", {}];\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nlet targets = Array.from(game.user.targets);\n\nif (!tokenD) { ui.notifications.error(\"No token found.\"); return; }\n\nlet targetDialogue = []\nlet rayCount = []\n\nif (game.system.id === \"pf2e\") {\n\tfor (let i of targets.keys()) {\n\t\trayCount.push(1)\n\t}\n} else {\n\ttargetDialogue.push({\n\t\ttype: 'info',\n\t\tlabel: `Up to 10 each.`,\n\t})\n\tfor (let i of targets.keys()) {\n\t\ttargetDialogue.push({\n\t\t\ttype: 'number',\n\t\t\tlabel: `Rays to ${targets[i].name}`,\n\t\t})\n\t}\n\trayCount = await warpgate.dialog(targetDialogue, \"🔥Scorching Ray🔥\", \"Cast!\")\n}\n\nrayCount = rayCount.filter(Number).map(x => Math.min(x, 10))\n\nrayCount.map((ray, index) => {\n\tlet target = targets[index]\n\n\tnew Sequence(\"PF2e x JB2A Macros\")\n\t\t.effect()\n\t\t\t.file(\"jb2a.magic_signs.circle.02.evocation.loop.yellow\")\n\t\t\t.attachTo(tokenD, { offset: { x: -0.5 }, gridUnits: true, local: true })\n\t\t\t.fadeIn(500)\n\t\t\t.fadeOut(500)\n\t\t\t.scaleToObject(2.25)\n\t\t\t.rotateTowards(target, {attachTo: true})\n\t\t\t.duration(5000)\n\t\t\t.scale({ x: 1, y: 2 })\n\t\t\t.rotateIn(360, 2000, {ease: \"easeInOutBack\"})\n\t\t\t.scaleOut(0.2, 2000, {ease: \"easeOutQuint\", delay: -4000})\n\t\t.effect()\n\t\t\t.filter(\"ColorMatrix\", assets[1])\n\t\t\t.file(assets[0])\n\t\t\t.attachTo(tokenD, { offset: { x: -0.5 }, gridUnits: true, local: true })\n\t\t\t.fadeIn(500)\n\t\t\t.fadeOut(500)\n\t\t\t.scaleToObject(2.25)\n\t\t\t.rotateTowards(target, {attachTo: true})\n\t\t\t.duration(5000)\n\t\t\t.scale({ x: 1, y: 2 })\n\t\t\t.rotateIn(360, 2000, {ease: \"easeInOutBack\"})\n\t\t\t.scaleOut(0.3, 2000, {ease: \"easeOutQuint\", delay: -4000})\n\t\t.wait(3000)\n\t\t.effect()\n\t\t\t.from(tokenD)\n\t\t\t.filter(\"ColorMatrix\", { contrast: 1, saturate: 1 })\n\t\t\t.attachTo(tokenD)\n\t\t\t.duration(1500 + Math.abs(ray) * 300)\n\t\t\t.fadeIn(500)\n\t\t\t.scaleToObject(tokenD.document.data.scale)\n\t\t\t.fadeOut(500)\n\t\t\t.opacity(0.3)\n\t\t\t.filter(\"Blur\", { blurX: 10, blurY: 20 })\n\t\t\t.tint(\"#ffbd2e\")\n\t\t.effect()\n\t\t\t.file(\"jb2a.scorching_ray.orange\")\n\t\t\t.attachTo(tokenD, { offset: { x: 0.4 }, gridUnits: true, local: true })\n\t\t\t.stretchTo(target, {attachTo: true})\n\t\t\t.repeats(Math.abs(ray), 250, 250)\n\t\t\t.randomizeMirrorY()\n\t\t.wait(200)\n\t\t.effect()\n\t\t\t.from(target)\n\t\t\t.filter(\"ColorMatrix\", { contrast: 1, saturate: 1 })\n\t\t\t.attachTo(target)\n\t\t\t.duration(1500)\n\t\t\t.fadeIn(500)\n\t\t\t.fadeOut(500)\n\t\t\t.scaleToObject(target.document.data.scale)\n\t\t\t.opacity(0.3)\n\t\t\t.filter(\"Blur\", { blurX: 10, blurY: 20 })\n\t\t\t.tint(\"#ffbd2e\")\n\t\t.play()\n})","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"exportSource":{"world":"pathfinder","system":"pf2e","coreVersion":"9.269","systemVersion":"3.13.5.16"},"core":{"sourceId":"Macro.jNwOrcCo8TgMz6bI"},"cf":{"id":"temp_7rg2mnzpvsh"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":null,"modifiedTime":1666122099577,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"OOYnWts6o8nGdhC6","name":"Haunting Hymn","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/haunting-hymn.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nconst template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nconst [templateX, templateY] = [template.data.x, template.data.y];\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file('jb2a.template_circle.out_pulse.01.burst')\n .mask(template)\n .atLocation(tokenD)\n .randomRotation()\n .play()","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"cf":{"id":"temp_sjnygaa08ij"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":null,"modifiedTime":1663106249759,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"name":"Sudden Charge","type":"script","scope":"global","author":"BHRwUaMa68cNSVcP","img":"icons/skills/movement/ball-spinning-blue.webp","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nui.notifications.info(\"Sudden Charge! Select where you want to move. Right click to cancel.\")\nawait Sequencer.Preloader.preloadForClients(\"jb2a.gust_of_wind.veryfast\")\n\nfor (let i = 0; i < 2; i++) {\n const location = await warpgate.crosshairs.show({ \n rememberControlled: true,\n size: tokenD.document.height,\n label: \"Sudden Charge \" + (i + 1),\n icon: \"icons/skills/movement/ball-spinning-blue.webp\",\n interval: tokenD.document.height < 1 ? 4 : tokenD.document.height % 2 === 0 ? 1 : -1,\n })\nif (location.cancelled) return;\n\nnew Sequence(\"PF2e x JB2A Macros\")\n .animation()\n .on(tokenD)\n .moveTowards(location)\n .moveSpeed(500)\n .snapToGrid()\n .offset({ x: -50, y: -50 })\n .effect()\n .file(\"jb2a.gust_of_wind.veryfast\")\n .atLocation(tokenD)\n .stretchTo(location, {onlyX: true})\n .randomizeMirrorY()\n .belowTokens()\n .fadeOut(1000)\n .scale(0.5 * tokenD.document.height)\n .play()\n}","ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.QcnNdQKVRelB8Sjk"},"cf":{"id":"temp_xz48q3g0ej8"}},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":1663734075594,"modifiedTime":1667133080635,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"folder":null,"sort":0,"_id":"OrBFtL6vBRyDHgfV"}
{"_id":"OtxjeBG0360JNVtE","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"permission":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"flags":{"cf":{"id":"temp_o2l5kjd1mwj","name":"Auras","color":"#4f4f40","fontColor":"#FFFFFF","icon":"icons/svg/circle.svg","sorting":"m","contents":["IaIxaOh0D7roiQz1","LxFkyULbmva8yGDm","y2Hundr4PzbGNeys"],"children":[],"folderPath":["temp_s3arecn2xs"]}}}
{"name":"Dazzling Flash","type":"script","author":"BHRwUaMa68cNSVcP","img":"systems/pf2e/icons/spells/dazzling-flash.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nconst template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nconst [templateX, templateY] = [template.data.x, template.data.y];\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file('jb2a.thunderwave.center.blue')\n .mask(template)\n .atLocation(tokenD)\n .play()","flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"cf":{"id":"temp_sjnygaa08ij"}},"ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":1662948680058,"modifiedTime":1663106247232,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"folder":null,"sort":0,"_id":"PWAdvQ9qxwTcXCsu"}
{"_id":"PiernEW8sh3FaeG0","name":"Drain Bonded Item","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/magic/defensive/shield-barrier-blades-teal.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.divine_smite.caster.blueyellow\", { saturate: -1 }, \"jb2a.shimmer.01.blue\"]\n : [\"jb2a.divine_smite.caster.greenyellow\", {}, \"jb2a.shimmer.01.green\"];\n\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .attachTo(tokenD)\n .origin(\"drain bonded item\")\n .filter(\"ColorMatrix\", assets[1])\n .name(\"Drain Bonded Item - Energy Strands\")\n .scaleToObject(2)\n .file(\"jb2a.energy_strands.in.green.01.1\")\n .effect()\n .atLocation(tokenD)\n .attachTo(tokenD)\n .scaleToObject(2)\n .origin(\"drain bonded item\")\n .name(\"Drain Bonded Item - Charging\")\n .filter(\"ColorMatrix\", assets[1])\n .file(assets[0])\n .waitUntilFinished(300)\n .effect()\n .atLocation(tokenD)\n .attachTo(tokenD)\n .origin(\"drain bonded item\")\n .name(\"Drain Bonded Item - Shimmer\")\n .filter(\"ColorMatrix\", assets[1])\n .scaleToObject(1.5)\n .file(assets[2])\n .play()","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":true},"core":{"sourceId":"Macro.0fUIZ0XifYGrR9oY"},"cf":{"id":"temp_xz48q3g0ej8"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662741468191,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"Q0hKSbLmADnVbKQB","name":"Persistent Conditions","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/skills/wounds/blood-drip-droplet-red.webp","scope":"global","command":"let tokenD = args[0].token\nlet type = /Received Fast Healing/g.test(args[0].data.flavor) ? \"healing\" : args[0].data.flags.persistent.damageType;\nlet color = \"jb2a.liquid.splash.red\"\nlet scale = 1.5\nlet below = false\n\nswitch (type.toLowerCase()) {\n case \"piercing\":\n case \"slashing\":\n case \"bleed\": color = \"jb2a.liquid.splash.red\"; break;\n case \"acid\": color = \"jb2a.liquid.splash.green\"; break;\n case \"acid\": color = \"jb2a.liquid.splash.blue\"; break;\n case \"bludgeoning\": below = true; scale = 2.5; color = \"jb2a.impact.ground_crack.blue.03\"; break;\n case \"good\": color = \"jb2a.divine_smite.caster.yellowwhite\"; break;\n case \"evil\": color = \"jb2a.divine_smite.caster.dark_red\"; break;\n case \"lawful\": color = \"jb2a.divine_smite.caster.orange\"; break;\n case \"chaotic\": color = \"jb2a.divine_smite.caster.purplepink\"; break;\n case \"sonic\": color = \"jb2a.thunderwave.center.blue\"; break;\n case \"electricity\": color = \"jb2a.lightning_strike.blue.0\"; break;\n case \"cold\": scale = 2; color = \"jb2a.impact_themed.ice_shard.blue\"; break;\n case \"force\": below = true; scale = 3; color = \"jb2a.impact.ground_crack.blue.01\"; break; \n case \"mental\": color = \"jb2a.magic_signs.rune.enchantment.intro.purple\"; break; \n case \"poison\": color = \"jb2a.icon.poison.dark_green\"; break; \n case \"negative\": color = \"jb2a.healing_generic.200px.purple\"; break; \n case \"positive\": color = \"jb2a.healing_generic.400px.yellow\"; break;\n case \"healing\": color = \"jb2a.healing_generic.400px.green\"; break;\n case \"fire\": return;\n default: ui.notifications.error(`Can't find animation for ${type}`)\n}\n\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .belowTokens(below)\n .fadeIn(500)\n .fadeOut(500)\n .atLocation(tokenD)\n .scaleToObject(scale)\n .file(color)\n .play()","folder":null,"sort":0,"flags":{"core":{"sourceId":"Macro.5PhqUehtnjxz35Gg"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_xz48q3g0ej8"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":null,"modifiedTime":1666121035526,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"name":"Manifest Eidolon","type":"script","scope":"global","author":"SCUQoZ7lvePPTab6","img":"systems/pf2e/icons/features/classes/eidolon.webp","command":"const [tokenD, tokenScale] = vauxsMacroHelpers(args)\nlet spawnArgs = { eidolon: true }\n\nlet eidolons = game.actors.filter(v => v.class?.name === \"Eidolon\" && v.isOwner)\nspawnArgs.actorName = eidolons[0].name\n\nlet result\nif (eidolons.length > 1) {\n result = await warpgate.menu(\n {\n inputs: [\n {\n label: \"Pick your Eidolon\",\n type: \"select\",\n options: eidolons.map(v => v.name)\n }\n ],\n buttons: [\n {\n label: \"Confirm\",\n value: 1\n },\n {\n label: \"Cancel\",\n value: 0\n }\n ]\n },\n {\n title: \"Too many Eidolons!\"\n }\n )\n if (!result.buttons) return;\n spawnArgs.actorName = result.inputs[0]\n}\n\nlet importedToken = game.actors.filter(v => v.class?.name === \"Eidolon\" && v.isOwner && v.name === spawnArgs.actorName)[0].prototypeToken\n\nlet crossHairConfig = {\n label: importedToken.name,\n interval: importedToken.height < 1 ? 4 : importedToken.height % 2 === 0 ? 1 : -1,\n lockSize: true,\n drawIcon: true,\n size: importedToken.height,\n icon: importedToken.texture.src\n}\nconst crosshairs = await warpgate.crosshairs.show(crossHairConfig)\nif (crosshairs.cancelled) return;\n\nspawnArgs.location = (await canvas.scene.createEmbeddedDocuments('MeasuredTemplate', [crosshairs]))[0]\n\nspawnArgs.callbacks = {\n pre: async (location, updates) => {\n mergeObject(updates, {\n token: {\n alpha: 0\n }\n })\n },\n post: async (location, spawnedTokenDoc, updates, iteration) => {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .file(\"jb2a.sacred_flame.source.yellow\")\n .scaleToObject(3)\n .wait(250)\n .effect()\n .atLocation(spawnedTokenDoc)\n .file(\"jb2a.sacred_flame.target.yellow\")\n .belowTokens()\n .scaleToObject(3)\n .waitUntilFinished(-3000)\n .animation()\n .on(spawnedTokenDoc)\n .fadeIn(100)\n .play()\n }\n}\n\nspawnArgs.options = { ...spawnArgs.options, ...{ controllingActor: tokenD.actor } }\n\ndebug(\"Requesting to GM\", spawnArgs)\nawait warpgate.event.notify(\"askGMforSummon\", spawnArgs)","ownership":{"default":0,"SCUQoZ7lvePPTab6":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.TCGcHbgpYSOjpCmP"},"cf":{"id":"temp_3t4j7cyld29"}},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":1667134397618,"modifiedTime":1667136422308,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"folder":null,"sort":0,"_id":"Qyoalm1R3chywfE0"}
{"_id":"R6ywhDd0CGrQkzr1","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_c76abfsyvz7","name":"Templates","color":"#436546","fontColor":"#FFFFFF","icon":"icons/svg/explosion.svg","sorting":"m","contents":[],"children":["temp_brzxllxt18s","temp_8f8hkx7i8fo","temp_sjnygaa08ij"],"folderPath":[],"version":"2.5.3"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":null,"modifiedTime":1663106380872,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"SaXHztUmj7Fh9G58","name":"Acid Flask","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/equipment/alchemical-items/alchemical-bombs/acid-flask.webp","scope":"global","command":"// Can be used standalone!\n\nlet tokenD = args[1]?.sourceToken ?? canvas.tokens.controlled[0]\nlet targets = args[1]?.allTargets ?? Array.from(game.user.targets)\nlet target = targets[0]\n\nif (!tokenD || !target) {\n return ui.notifications.error(`Missing a ${!tokenD ? \"selected token\" : \"\"}${!tokenD && !target ? \" and \": \"\"}${!target ? \"target\" : \"\"}.`);\n}\n\nlet projectile = \"\"\nlet explosion = [\"\"]\nlet explosionRemains = [\"\"]\nlet seqe = new Sequence(\"PF2e x JB2A Macros\")\nlet splashBonus = 3\nlet mods = [{ \"label\": `No Modifications`, \"value\": 0 }]\nlet options\n\n// Special feats\n\nif (tokenD.actor.data.items.filter(x => x.name === \"Bomber\").length) mods.push({ \"label\": `<a class=\"entity-link content-link\" data-pack=\"pf2e.classfeatures\" data-id=\"7JbiaZ8bxODM5mzS\"><i class=\"fas fa-suitcase\"></i> Bomber</a>`, \"value\": \"Bomber\" });\nif (tokenD.actor.data.items.filter(x => x.name === \"Expanded Splash\").length) mods.push({ \"label\": `<a class=\"entity-link content-link\" data-pack=\"pf2e.feats-srd\" data-id=\"gyVcJfZTmBytLsXq\"><i class=\"fas fa-suitcase\"></i> Expanded Splash</a>`, \"value\": \"Expanded\" });\nif (tokenD.actor.data.items.filter(x => x.name === \"Directional Bombs\").length) mods.push({ \"label\": `<a class=\"entity-link content-link\" data-pack=\"pf2e.feats-srd\" data-id=\"ozvYhY4hG1deXly8\"><i class=\"fas fa-suitcase\"></i> Directional Bombs</a>`, \"value\": \"Directional\" });\n\nif (mods.length > 1) {\n options = await warpgate.buttonDialog({buttons: mods}, 'column')\n}\n// check for Expanded Splash and Bomber's singular splash feature and add 3 to splashBonus\n\nseqe.effect()\n .file(\"jb2a.throwable.throw.flask.03.green\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .macro(\n options == 'Directional' ? \"Compendium.pf2e-jb2a-macros.Macros.Cone Template\" : \"\",\n target,\n {},\n [\n \"jb2a.liquid.splash_side.bright_green\", \n \"jb2a.explosion.side_fracture.flask.03\"\n ]\n )\n .effect()\n .playIf(options !== 'Directional')\n .file(\"jb2a.liquid.splash.bright_green\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .effect()\n .playIf(options !== 'Directional')\n .file(\"jb2a.explosion.side_fracture.flask.03\")\n .offset({ x: 0.5, y: 0.5 }, { gridUnits: true })\n .atLocation(target)\n .rotate(180)\n .rotateTowards(token)\n .play()","folder":null,"sort":0,"permission":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.GK9NCgnOnTYxdETf"},"cf":{"id":"temp_9hsvsxrbtvj"}}}
{"_id":"VVytkF4BupAKO3Oe","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_s3arecn2xs","name":"Active Effects","color":"#454545","fontColor":"#FFFFFF","icon":"icons/svg/aura.svg","sorting":"m","contents":["uCRBEs5o1lFVhRqT","XSlxNRM032wVYBBw","nA5gqHtwwwsyOtih","JVtjNvoMoxsfddd7","ZxnGGJn7z4fbBfcq","6yeZBx2HjHHrQIRp","tItdi7rFVh3PEyKx","gU05Ao19uKUf5H2h","E1eKr1GPbMu11gDZ","O0RE17QySMEMVdHd"],"children":["temp_o2l5kjd1mwj"],"folderPath":[],"version":"2.5.2"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta2","coreVersion":"10.284","createdTime":null,"modifiedTime":1662651556864,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"Vug9mAtV6Zne3G6K","name":"Bombs","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/magic/fire/explosion-fireball-small-blue.webp","scope":"global","command":"// Cannot be used standalone.\n\nif (!args.length) return;\n\nlet tokenD = args[1].sourceToken\nlet targets = args[1].allTargets\nlet target = targets[0]\nlet rinsedName = args[1].rinsedName.replace(/\\(.+\\)/g, \"\")\n\nlet projectile = \"\"\nlet explosion = [\"\"]\nlet explosionRemains = [\"\"]\nlet seq = new Sequence(\"PF2e x JB2A Macros\")\nlet splashBonus = 3\nlet mods = [{ \"label\": `No Modifications`, \"value\": 0 }]\nlet ID = Sequencer.Helpers.random_int_between(100, 999)\n\n// Special feats\n/*\nif (tokenD.actor.data.items.filter(x => x.name === \"Bomber\").length) mods.push({ \"label\": `<a class=\"entity-link content-link\" data-pack=\"pf2e.classfeatures\" data-id=\"7JbiaZ8bxODM5mzS\"><i class=\"fas fa-suitcase\"></i> Bomber</a>`, \"value\": \"Bomber\" })\nif (tokenD.actor.data.items.filter(x => x.name === \"Expanded Splash\").length) mods.push({ \"label\": `<a class=\"entity-link content-link\" data-pack=\"pf2e.feats-srd\" data-id=\"gyVcJfZTmBytLsXq\"><i class=\"fas fa-suitcase\"></i> Expanded Splash</a>`, \"value\": \"Expanded Splash\" })\nif (tokenD.actor.data.items.filter(x => x.name === \"Directional Bombs\").length) mods.push({ \"label\": `<a class=\"entity-link content-link\" data-pack=\"pf2e.feats-srd\" data-id=\"ozvYhY4hG1deXly8\"><i class=\"fas fa-suitcase\"></i> Directional Bombs</a>`, \"value\": \"Directional Bombs\" })\n\nif (falsemods.length > 1) {\n let options = await warpgate.buttonDialog({buttons: mods}, 'column')\n}\n*/\n\nswitch (rinsedName) {\n case \"vexingvapor\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.03.green\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .filter(\"ColorMatrix\", {\n hue: 120\n })\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.03\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n .effect()\n .file(\"jb2a.fog_cloud.2.green\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(3000)\n .fadeOut(1500)\n .duration(8000)\n .opacity(0.5)\n .filter(\"ColorMatrix\", {\n hue: 200\n })\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .wait(1000)\n .effect()\n .file(\"jb2a.markers.stun.purple.01\")\n .fadeIn(3000)\n .fadeOut(1500)\n .duration(6500)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n break;\n }\n case \"tanglefootbag\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.grenade.02.blackyellow\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.grease.dark_brown.loop\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(1000)\n .fadeOut(1000)\n .duration(12000)\n .scaleToObject(0.8)\n .atLocation(target)\n .belowTokens()\n .effect()\n .file(\"jb2a.grease.dark_brown.loop\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(1000)\n .fadeOut(1000)\n .duration(12000)\n .randomizeMirrorX()\n .randomizeMirrorY()\n .scale(0.1)\n .atLocation(target, {randomOffset: 1 })\n .attachTo(target)\n .mask(target)\n .effect()\n .file(\"jb2a.grease.dark_brown.loop\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(1000)\n .fadeOut(1000)\n .randomizeMirrorX()\n .randomizeMirrorY()\n .duration(12000)\n .scale(0.1)\n .atLocation(target, {randomOffset: 1 })\n .attachTo(target)\n .mask(target)\n .effect()\n .file(\"jb2a.grease.dark_brown.loop\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(1000)\n .fadeOut(1000)\n .randomizeMirrorX()\n .randomizeMirrorY()\n .duration(12000)\n .scale(0.1)\n .atLocation(target, {randomOffset: 1 })\n .attachTo(target)\n .mask(target)\n .effect()\n .file(\"jb2a.grease.dark_brown.loop\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(1000)\n .randomizeMirrorX()\n .randomizeMirrorY()\n .fadeOut(1000)\n .duration(12000)\n .scale(0.1)\n .atLocation(target, {randomOffset: 1 })\n .attachTo(target)\n .mask(target)\n break;\n }\n case \"sulfurbomb\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.bomb.01.green\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .filter(\"ColorMatrix\", {\n hue: -30\n })\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.fog_cloud.2.green\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(3000)\n .fadeOut(1500)\n .duration(8000)\n .opacity(0.5)\n .filter(\"ColorMatrix\", {\n hue: -30\n })\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n break;\n }\n case \"pernicioussporebomb\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.bomb.01.green\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.08.green\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .waitUntilFinished(-2500)\n .effect()\n .file(\"jb2a.spirit_guardians.green.particles\")\n .fadeIn(500)\n .fadeOut(500)\n .duration(4000)\n .loopProperty(\"sprite\", \"rotation\", { from: 0, to: 360, duration: 75000})\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n break;\n }\n case \"necroticbomb\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.bomb.01.black\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-150)\n .effect()\n .file(\"jb2a.explosion.03.bluewhite\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .wait(50)\n .effect()\n .file(\"jb2a.explosion.08.dark_green\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n break;\n }\n case \"mudbomb\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.grenade.02.blackyellow\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.grease.dark_brown.loop\")\n .size({ width: 3, height: 3 }, {gridUnits: true})\n .scaleIn(0, 1000)\n .fadeIn(1500)\n .belowTokens()\n .fadeOut(500)\n .duration(4500)\n .randomizeMirrorY()\n .randomizeMirrorX()\n .atLocation(target)\n .effect()\n .file(\"jb2a.explosion.shrapnel.grenade.02.black\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n break;\n }\n case \"junkbomb\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.grenade.02.blackyellow\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.03.blueyellow\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .effect()\n .file(\"jb2a.explosion.shrapnel.grenade.02.black\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n break;\n }\n case \"ghostcharge\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.grenade.03.blackblue\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.07.tealyellow\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .effect()\n .file(\"jb2a.explosion.shrapnel.grenade.03.black\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n break;\n }\n case \"frostvial\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.02.blue\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.impact_themed.ice_shard.blue\")\n .scale(0.5)\n .atLocation(target)\n .effect()\n .file(\"jb2a.explosion.05.bluewhite\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.02\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n break;\n }\n case \"dreadampoule\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.03.green\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .filter(\"ColorMatrix\", {\n hue: 120\n })\n .waitUntilFinished(-200)\n .effect()\n .origin(\"Dread Ampoule ID\" + ID)\n .name(\"Dread Ampoule - Fog\")\n .file(\"jb2a.fog_cloud.2.green\")\n .scaleIn(0.25, 1000, { ease: \"easeInQuart\" })\n .fadeIn(3000)\n .fadeOut(1500)\n .duration(8000)\n .opacity(0.5)\n .filter(\"ColorMatrix\", {\n hue: 200\n })\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.03\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n .wait(1000)\n .thenDo(function(){\n for (let i = 0, iMax = 25; i <= iMax; i++) {\n seq.effect()\n .origin(\"Dread Ampoule ID\" + ID)\n .name(`Dread Ampoule - Horror Effect ${i} / ${iMax}`)\n .fadeIn(1000)\n .fadeOut(1000)\n .scale(0.3)\n .animateProperty(\"sprite\", \"position.y\", { from: 0, to: -200, duration: 9000})\n .duration(3000)\n .file(\"jb2a.icon.horror.purple\")\n .atLocation(target, { randomOffset: 1.3 })\n .wait(200)\n }\n })\n break;\n }\n case \"crystalshards\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.bomb.01.blue\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.04.blue\")\n .zIndex(1)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .wait(50)\n .effect()\n .file(\"jb2a.explosion.shrapnel.bomb.01.blue\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .atLocation(target)\n .zIndex(2)\n break;\n }\n case \"bottledsunlight\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.02.blue\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .filter(\"ColorMatrix\", {\n hue: 100,\n brightness: 1\n })\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.markers.light.outro.yellow\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .fadeIn(1000)\n .fadeOut(1000)\n .scaleIn(0, 2000, { ease: \"easeOutBack\" })\n .atLocation(target)\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.02\")\n .atLocation(target)\n .rotate(180)\n .filter(\"ColorMatrix\", {\n hue: 100,\n brightness: 1\n })\n .rotateTowards(tokenD)\n break;\n }\n case \"bottledlightning\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.02.blue\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.02\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n .effect()\n .file(\"jb2a.explosion.02.blue\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .waitUntilFinished(-1000)\n .effect()\n .file(\"jb2a.static_electricity.02.blue\")\n .attachTo(target)\n .duration(2500)\n .scaleToObject(1.3)\n .effect()\n .file(\"jb2a.static_electricity.03.blue\")\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .duration(1500)\n .atLocation(target)\n break;\n }\n case \"waterbomb\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.bomb.01.blue\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.liquid.splash.blue\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .effect()\n .playIf(false) // WIP\n .file(\"jb2a.liquid.splash_side.blue\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.03\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n break;\n }\n case \"acidflask\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.03.green\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.liquid.splash.bright_green\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .effect()\n .playIf(false) // WIP\n .file(\"jb2a.liquid.splash_side.bright_green\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.03\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n break;\n }\n case \"alchemist'sfire\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.01.orange\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.01\")\n .atLocation(target)\n .rotate(180)\n .rotateTowards(tokenD)\n break;\n }\n case \"alignmentampoule\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.flask.02.blue\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .filter(\"ColorMatrix\", {\n hue: 100,\n brightness: 1\n })\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.bluewhite.3\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .effect()\n .file(\"jb2a.explosion.side_fracture.flask.02\")\n .atLocation(target)\n .rotate(180)\n .filter(\"ColorMatrix\", {\n hue: 100,\n brightness: 1\n })\n .rotateTowards(tokenD)\n break;\n }\n case \"redpitchbomb\":\n case \"tallowbomb\": {\n seq.effect()\n .file(\"jb2a.throwable.throw.bomb.01.black\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.01.orange\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .wait(50)\n .effect()\n .file(\"jb2a.explosion.shrapnel.bomb.01.black\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n break;\n }\n case \"thunderstone\": {\n seq.effect()\n .file(\"jb2a.slingshot\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-1000)\n .effect()\n .file(\"jb2a.thunderwave.center.blue\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n break;\n }\n default: {\n seq.effect()\n .file(\"jb2a.throwable.throw.bomb.01.black\")\n .atLocation(tokenD)\n .stretchTo(target)\n .fadeIn(300)\n .waitUntilFinished(-200)\n .effect()\n .file(\"jb2a.explosion.shrapnel.bomb.01.black\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n .effect()\n .file(\"jb2a.explosion.03.blueyellow\")\n .atLocation(target)\n .size({ width: 3.5, height: 3.5 }, {gridUnits: true})\n break;\n }\n}\n\nseq.play()","folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.xdy-pf2e-workbench.asymonous-benefactor-macros-internal.u3dPC2egeK3IC26I"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_qfrxw4o5gm"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.1.2","coreVersion":"10.286","createdTime":null,"modifiedTime":1663880024875,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"command":"const template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file('jb2a.web.01')\n .mask(template)\n .attachTo(template)\n .persist()\n .scaleToObject()\n .belowTokens()\n .name(\"Web Spell\")\n .effect()\n .file('jb2a.web.01')\n .mask(template)\n .attachTo(template)\n .persist()\n .opacity(0.3)\n .scaleToObject()\n .name(\"Web Spell\")\n .play()","name":"Web","type":"script","img":"systems/pf2e/icons/spells/web.webp","flags":{"pf2e":{"itemMacro":true},"core":{"sourceId":"Macro.v3vq1FB1xGSmEbIQ"},"cf":{"id":"temp_8f8hkx7i8fo"},"advanced-macros":{"runAsGM":false}},"author":"BHRwUaMa68cNSVcP","scope":"global","ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.4","coreVersion":"10.287","createdTime":1664895290321,"modifiedTime":1665322340383,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"folder":null,"sort":0,"_id":"X6PZ0lboOsQSY8KO"}
{"_id":"XG6myvgJadegWTbF","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"permission":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"flags":{"cf":{"id":"temp_qfrxw4o5gm","name":"Bombs","color":"#525252","fontColor":"#FFFFFF","icon":"systems/pf2e/icons/unidentified_item_icons/alchemical_bomb.webp","sorting":"m","contents":["Vug9mAtV6Zne3G6K"],"children":[],"folderPath":["temp_7rg2mnzpvsh"]}}}
{"_id":"XSlxNRM032wVYBBw","name":"Clumsy","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/skills/movement/feet-winged-boots-brown.webp","scope":"global","command":"return // WIP\nlet token = args[1].sourceToken\nlet conditionOverhead = Sequencer.EffectManager.getEffects({ name: `${token.name} - Conditions Overhead*`, object: token })\n\nconsole.log(conditionOverhead)\n\nif (args[0] == \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .name(`${token.name} - Conditions Overhead - Clumsy`)\n .attachTo(token, {bindAlpha: false})\n .from(token)\n .loopProperty(\"spriteContainer\", \"rotation\", { values: [0, 5, 0, -5], duration: 2000, pingPong: true})\n .persist()\n .fadeOut(500)\n .animation()\n .on(token)\n .fadeOut(100)\n .play()\n} else if (args[0] == \"off\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .animation()\n .fadeIn(100)\n .on(token)\n .play()\n await Sequencer.EffectManager.endEffects({ name: `${token.name} - Conditions Overhead - Clumsy`, object: token })\n}","folder":null,"sort":0,"permission":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"cf":{"id":"temp_s3arecn2xs"}}}
{"_id":"ZxnGGJn7z4fbBfcq","name":"Overdrive","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/features/feats/overdrive-success.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nlet testArgs\n\nif (!args.length) testArgs = await Sequencer.EffectManager.getEffects({ origin: \"overdrive\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.token_border.circle.static.blue.002\"]\n : [\"jb2a.token_border.circle.static.blue.010\"];\n\nif (args[0] == \"on\" || testArgs === \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .origin(\"overdrive\")\n .name(tokenD.name + \"'s Overdrive\")\n .filter(\"ColorMatrix\", {\n hue: 100,\n contrast: 1,\n saturate: 0 \n })\n .tint(\"#7DF9FF\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .scaleToObject(2 * tokenScale)\n .waitUntilFinished(-1500)\n .effect()\n .playIf(args[1]?.itemName.includes(\"Critical\"))\n .file(\"jb2a.static_electricity.03.blue\")\n .origin(\"overdrive\")\n .name(tokenD.name + \"'s Overdrive\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .scaleToObject(1.5 * tokenScale)\n .fadeOut(500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(assets[0])\n .origin(\"overdrive\")\n .name(tokenD.name + \"'s Overdrive\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .fadeOut(500)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .play()\n} else if (testArgs == \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"overdrive\", object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.6","coreVersion":"10.285","createdTime":null,"modifiedTime":1663588870732,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"blSU13HzwUtDVjJZ","name":"Bardic Cantripry","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/magic/sonic/scream-wail-shout-teal.webp","scope":"global","command":"// Cannot be used standalone.\n\nlet targets = args[1].hitTargets\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nif (!args[1]?.item?.system?.slug) return;\nlet spellName = args[1]?.item?.system?.slug.replace(\"spell-effect-\", \"\").trim()\n\nif (typeof args[0] === \"string\") {\n if (args[0] == \"on\") {\n switch (spellName) {\n case \"inspire-courage\": {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .name(spellName)\n .attachTo(tokenD)\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(3000)\n .fadeIn(500)\n .opacity(1)\n .mask()\n .filter(\"ColorMatrix\", {saturate: 1})\n .tint(\"#FF0000\")\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.token_border.circle.static.blue.001\")\n .name(spellName)\n .attachTo(tokenD)\n .opacity(0.6)\n .fadeOut(3000)\n .fadeIn(500)\n .scaleToObject(2 * tokenScale)\n .filter(\"ColorMatrix\", {saturate: 1})\n .tint(\"#FF0000\")\n .persist(true, { persistTokenPrototype: true })\n .play()\n break;\n }\n case \"inspire-defense\": {\n let randomD = Sequencer.Helpers.random_int_between(0, 360)\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.shield_themed.below.ice.01.blue\")\n .name(spellName)\n .belowTokens()\n .rotate(randomD)\n .attachTo(tokenD)\n .fadeIn(3000)\n .fadeOut(3000)\n .scaleToObject(1.5 * tokenScale)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.shield_themed.above.ice.01.blue\")\n .name(spellName)\n .attachTo(tokenD)\n .rotate(randomD)\n .fadeIn(3000)\n .fadeOut(3000)\n .scaleToObject(1.5 * tokenScale)\n .persist(true, { persistTokenPrototype: true })\n .play()\n break;\n }\n }\n } else if (args[0] == \"off\") {\n await Sequencer.EffectManager.endEffects({ name: spellName, object: token })\n }\n} else {\n let target = args[1].hitTargets[0] ?? args[1].sourceToken;\n\n let songOfMarching = Sequencer.EffectManager.getEffects({ name: \"Song of Marching\", source: token })[0]\n let dirgeOfDoom = Sequencer.EffectManager.getEffects({ name: \"Dirge of Doom\", source: token })[0]\n if (songOfMarching || dirgeOfDoom) {\n let menu = await warpgate.menu({\n inputs: [{ type: 'info', label: `End ${songOfMarching ? \"Song of Marching\" : dirgeOfDoom ? \"Dirge of Doom\" : \"an unknown spell\"}?` },],\n buttons: [{\n label: 'End',\n value: 1\n }, {\n label: 'Keep',\n value: 2\n }]\n }, { title: \"Bard Cantrip\" })\n if (menu.buttons === 1) {\n Sequencer.EffectManager.endEffects({ name: `Bardic Cantrips - ${songOfMarching ? \"Song of Marching\" : dirgeOfDoom ? \"Dirge of Doom\" : \"*\"}`, source: token })\n }\n } else {\n switch (spellName) {\n case \"hymn-of-healing\": {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.greenorange\")\n .waitUntilFinished(-1000)\n .effect()\n .atLocation(target)\n .scaleToObject(1.5)\n .file(\"jb2a.healing_generic.400px.green\")\n .play()\n break;\n }\n case \"inspire-competence\": {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.pink\")\n .effect()\n .atLocation(target)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.pink\")\n .play()\n break;\n }\n case \"inspire-courage\": {\n let seq = new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.dark_red\")\n targets.forEach((element, index) => {\n seq.effect()\n .atLocation(targets[index])\n .scaleToObject(1.5)\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n })\n seq.play()\n break;\n }\n case \"inspire-defense\": {\n let seq = new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.blueyellow\")\n targets.forEach((element, index) => {\n seq.effect()\n .atLocation(targets[index])\n .scaleToObject(1.5)\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n })\n seq.play()\n break;\n }\n case \"allegro\": {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.blueyellow\")\n .effect()\n .atLocation(target)\n .scaleToObject(1.5)\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .play()\n break;\n }\n case \"song-of-marching\": {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.greenorange\")\n .effect()\n .atLocation(tokenD)\n .attachTo(tokenD)\n .belowTokens()\n .size({ width: 3, height: 3 }, { gridUnits: true })\n .scaleIn(0, 1000)\n .rotateIn(180, 1000)\n .scaleOut(0, 1000)\n .rotateOut(180, 1000)\n .persist()\n .opacity(0.5)\n .persist()\n .name(\"Bardic Cantrips - Song of Marching\")\n .file(\"jb2a.markers.music.greenorange\")\n .play()\n ui.notifications.info(\"Persistent Effect created, once you don't want it playing you can remove it in <i class=\\\"fas fa-film\\\"></i> Sequencers Effect Manager.\")\n break;\n }\n case \"dirge-of-doom\": {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.dark_red\")\n .effect()\n .atLocation(tokenD)\n .attachTo(tokenD)\n .belowTokens()\n .size({ width: 15, height: 15 }, { gridUnits: true })\n .scaleIn(0, 1000)\n .scaleOut(0, 1000)\n .fadeIn(900)\n .fadeOut(900)\n .persist()\n .opacity(0.5)\n .persist()\n .name(\"Bardic Cantrips - Dirge of Doom\")\n .file(\"jb2a.spirit_guardians.dark_red.ring\")\n .effect()\n .atLocation(tokenD)\n .attachTo(tokenD)\n .belowTokens()\n .persist()\n .scaleToObject(3)\n .noLoop(true)\n .scaleOut(0, 600)\n .loopProperty(\"sprite\", \"rotation\", { from: 0, to: 360, duration: 6000 })\n .endTime(600)\n .name(\"Bardic Cantrips - Dirge of Doom\")\n .file(\"jb2a.divine_smite.caster.dark_red\")\n .play()\n ui.notifications.info(\"Persistent Effect created, once you don't want it playing you can remove it in <i class=\\\"fas fa-film\\\"></i> Sequencers Effect Manager.\")\n break;\n }\n case \"song-of-strength\": {\n let seq = new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .scaleToObject(2)\n .file(\"jb2a.bardic_inspiration.greenorange\")\n targets.forEach((element, index) => {\n seq.effect()\n .atLocation(targets[index])\n .scaleToObject(1.5)\n .file(\"jb2a.divine_smite.caster.greenyellow\")\n })\n seq.play()\n break;\n }\n default: console.log(`Can't find \"${spellName}\", probably unimplemented!`)\n }\n }\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.JX5DMXhKxzDOjyRw"},"cf":{"id":"temp_6gsujam4gp6"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.3","coreVersion":"10.288","createdTime":null,"modifiedTime":1667305023411,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"eF8VdNDiF0y5E7kR","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_c76abfsyvz7","name":"Templates","color":"#3f4a40","fontColor":"#FFFFFF","icon":"icons/svg/explosion.svg","sorting":"m","contents":[],"children":["temp_brzxllxt18s","temp_8f8hkx7i8fo","temp_sjnygaa08ij"],"folderPath":[],"version":"2.5.3"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":null,"modifiedTime":1663106380939,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"name":"Summon Anything","type":"script","scope":"global","author":"BHRwUaMa68cNSVcP","img":"icons/magic/earth/construct-stone.webp","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nlet callbacks = {\n pre: async (location, updates) => {\n mergeObject(updates, {\n token: {\n alpha: 0\n }\n })\n },\n post: async (location, spawnedTokenDoc, updates, iteration) => {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .file(\"jb2a.sacred_flame.source.yellow\")\n .scaleToObject(3)\n .wait(250)\n .effect()\n .atLocation(spawnedTokenDoc)\n .file(\"jb2a.sacred_flame.target.yellow\")\n .belowTokens()\n .scaleToObject(3)\n .waitUntilFinished(-3000)\n .animation()\n .on(spawnedTokenDoc)\n .fadeIn(100)\n .play()\n }\n}\n\nawait playerSummons({\n args,\n spawnArgs: {callbacks}\n})","ownership":{"default":2,"BHRwUaMa68cNSVcP":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.5MmsrQlckT9J5GGI"},"cf":{"id":"temp_3t4j7cyld29"}},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":1663028898956,"modifiedTime":1667132849197,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"folder":null,"sort":0,"_id":"emzJwDdpyYpuYkcm"}
{"_id":"fCFQjzbgASICMVb3","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_6gsujam4gp6","name":"Multiple Functions","color":"#5f5353","fontColor":"#FFFFFF","icon":"icons/svg/daze.svg","sorting":"m","contents":["blSU13HzwUtDVjJZ","lmKZBrfclq8V6sJI","kz6IN257FJ58SgmE","CtkjmTtEYfMPbtm4","lkQvlxkMpsbLwwx5","LsHdd70Q1TpFTQf0","x3ZaL34wkz4LljPo"],"children":["temp_uokxor3emwq"],"folderPath":[],"version":"2.5.3"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.5","coreVersion":"10.288","createdTime":null,"modifiedTime":1665450898661,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"gDoZB0nbuJanr3t8","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_xz48q3g0ej8","name":"Non-Attacks / Utility","color":"#7c4f7d","fontColor":"#FFFFFF","icon":"icons/svg/card-hand.svg","sorting":"m","contents":["PiernEW8sh3FaeG0","Q0hKSbLmADnVbKQB","7nrt0AppNUZDPmYk","OrBFtL6vBRyDHgfV"],"children":["temp_3t4j7cyld29"],"folderPath":[],"version":"2.5.5"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":null,"modifiedTime":1667132849197,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"gU05Ao19uKUf5H2h","name":"Rage","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/skills/wounds/injury-face-impact-orange.webp","scope":"global","command":"// Original Author: EskieMoh#2969\n// Remastered by: MrVauxs#8622\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nlet testArgs\n\nif (!args.length) testArgs = await Sequencer.EffectManager.getEffects({ origin: \"rage\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.particles.outward.greenyellow.01.03\", \"jb2a.token_border.circle.static.blue.007\"]\n : [\"jb2a.particles.outward.orange.01.03\", \"jb2a.token_border.circle.static.orange.012\"];\n\nlet preload = [\"jb2a.extras.tmfx.outpulse.circle.02.normal\", \"jb2a.impact.ground_crack.orange.01\", \"jb2a.impact.ground_crack.still_frame.01\", \"jb2a.wind_stream.white\"].concat(assets)\n\nawait Sequencer.Preloader.preloadForClients(preload)\n\nif (args[0] === \"on\" || testArgs === \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.extras.tmfx.outpulse.circle.02.normal\")\n .atLocation(tokenD)\n .size(4, {gridUnits: true})\n .opacity(0.25)\n .effect()\n .file(\"jb2a.impact.ground_crack.orange.01\")\n .atLocation(tokenD)\n .belowTokens()\n .filter(\"ColorMatrix\", {hue: -15,saturate: 1})\n .size(3.5, {gridUnits: true})\n .zIndex(1)\n .effect()\n .file(\"jb2a.impact.ground_crack.still_frame.01\")\n .atLocation(tokenD)\n .belowTokens()\n .fadeIn(2000)\n .filter(\"ColorMatrix\", {hue: -15,saturate: 1})\n .size(3.5, {gridUnits: true})\n .fadeOut(20000)\n .zIndex(0)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .atLocation(tokenD, {offset: {y:-75}})\n .size(1.75, {gridUnits: true})\n .rotate(90)\n .opacity(0.9)\n .filter(\"ColorMatrix\", {saturate: 1})\n .tint(\"#FF0000\")\n .loopProperty(\"sprite\", \"position.y\", { from: -5, to: 5, duration: 50, pingPong: true})\n .duration(8000)\n .fadeOut(3000)\n .effect()\n .file(assets[0])\n .atLocation(tokenD)\n .scaleToObject(2.5)\n .filter(\"ColorMatrix\", {hue: -15,saturate: 1})\n .opacity(1)\n .fadeIn(200)\n .tint(assets[0] === \"jb2a.particles.outward.greenyellow.01.03\" ? \"#FF0000\" : \"\")\n .fadeOut(3000)\n .loopProperty(\"sprite\", \"position.x\", { from: -5, to: 5, duration: 50, pingPong: true})\n .animateProperty(\"sprite\", \"position.y\", { from: 0, to: -100, duration: 6000, pingPong: true, delay:2000})\n .duration(8000)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .atLocation(tokenD)\n .origin(\"rage\")\n .name(tokenD.name + \"'s Rage\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(3000)\n .opacity(1)\n .mask()\n .filter(\"ColorMatrix\", {saturate: 1})\n .tint(\"#FF0000\")\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(assets[1])\n .atLocation(tokenD)\n .origin(\"rage\")\n .name(tokenD.name + \"'s Rage\")\n .attachTo(tokenD)\n .tieToDocuments(args.length ? args[1].item : [])\n .opacity(0.6)\n .fadeOut(3000)\n .scaleToObject(2 * tokenScale)\n .filter(\"ColorMatrix\", {saturate: 1})\n .tint(\"#FF0000\")\n .persist(true, { persistTokenPrototype: true })\n .play()\n} else if (testArgs === \"off\") {\n Sequencer.EffectManager.endEffects({ origin: \"rage\", source: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.hqr7muUDzlQbaZfg"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.5","coreVersion":"10.288","createdTime":null,"modifiedTime":1665496945364,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"iUD1DevEIfAXZpzc","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_uokxor3emwq","name":"Equipment Changes","color":"#4e4a13","fontColor":"#FFFFFF","icon":"icons/svg/chest.svg","sorting":"m","contents":["8M1lDOo679Hsj80q","Dlff2f5pPBnj7SlK"],"children":[],"folderPath":["temp_6gsujam4gp6"],"version":"2.5.2"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662659540677,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"j1cUixlhlZBbeM1r","name":"Lightning Bolt","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/lightning-bolt.webp","scope":"global","command":"// Original Author: EskieMoh#2969\n// Rebuilt by: MrVauxs#8622\n// Requires a pre-placed template.\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nconst template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .filter(\"ColorMatrix\", {\n hue: 100,\n contrast: 1,\n saturate: 0 \n })\n .tint(\"#7DF9FF\")\n .attachTo(tokenD)\n .scaleToObject(2 * tokenScale)\n .zIndex(2)\n .waitUntilFinished(-500)\n .effect()\n .file(\"jb2a.static_electricity.03.blue\")\n .attachTo(tokenD)\n .scaleToObject(1.5 * tokenScale)\n .fadeOut(500)\n .repeats(2, 4000, 4000)\n .effect()\n .file(\"jb2a.lightning_ball.blue\")\n .atLocation(tokenD)\n .fadeOut(500)\n .duration(3000)\n .scale(0.3)\n .center()\n .animateProperty(\"spriteContainer\", \"position.x\", { from: 0, to: 0.32, duration: 1000, delay: 500, gridUnits: true, ease: \"easeOutBack\" })\n .rotateTowards(template, {cacheLocation: true})\n .zIndex(1)\n .waitUntilFinished(-1000)\n .effect()\n .file(\"jb2a.lightning_ball.blue\")\n .atLocation(tokenD)\n .fadeIn(500)\n .fadeOut(500)\n .anchor({x:0.24})\n .duration(3000)\n .scale(0.3)\n .rotateTowards(template, {cacheLocation: true})\n .zIndex(4)\n .wait(2000)\n .effect()\n .file(\"jb2a.impact.011.blue\")\n .atLocation(tokenD) \n .anchor({x:0.15})\n .scale(0.3)\n .rotateTowards(template, {cacheLocation: true})\n .zIndex(3)\n .effect()\n .file(\"jb2a.lightning_bolt.wide.blue\")\n .atLocation(template, {cacheLocation: true})\n .scale(0.45)\n .stretchTo(template, {onlyX: true, tiling: true, cacheLocation: true})\n .zIndex(3)\n .play();","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.0fUIZ0XifYGrR9oY"},"cf":{"id":"temp_brzxllxt18s"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":null,"modifiedTime":1663184759756,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"name":"#[CF_tempEntity]","type":"chat","command":"","flags":{"cf":{"id":"temp_3t4j7cyld29","name":"Summon","color":"#aba84f","fontColor":"#FFFFFF","icon":"icons/svg/ice-aura.svg","sorting":"m","contents":["KHYzBiPwMIY6WfYa","emzJwDdpyYpuYkcm","Qyoalm1R3chywfE0"],"children":[],"folderPath":["temp_xz48q3g0ej8"]}},"author":"SCUQoZ7lvePPTab6","img":"icons/svg/dice-target.svg","scope":"global","folder":null,"sort":0,"ownership":{"default":0,"SCUQoZ7lvePPTab6":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":1667132836777,"modifiedTime":1667134415674,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"_id":"jrE17X2Pl3AWc4jV"}
{"_id":"kz6IN257FJ58SgmE","name":"Harm","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/harm.webp","scope":"global","command":"// Cannot be used standalone.\n\nlet diceNumber = args[0].roll.terms[0].number\nlet caster = args[1].sourceToken\nlet spellTarget = Array.from(game.user.targets)[0]\nlet doNotTargetCaster = false\n\nlet d = new Dialog({\n title: \"Harm\",\n content: \"<p>How many actions are you using to cast Harm?</p>\",\n buttons: {\n one: {\n icon: '<span class=\"pf2-icon\">1</span>',\n label: \"One Action\",\n callback: () => {\n spellTarget = Array.from(game.user.targets)[0]\n oneActionHarm()\n }\n },\n two: {\n icon: '<span class=\"pf2-icon\">2</span>',\n label: \"Two Actions\",\n callback: () => {\n spellTarget = Array.from(game.user.targets)[0]\n twoActionHarm()\n }\n },\n three:{\n icon: `<span class=\"pf2-icon\">3</span>`,\n label: \"Three Actions\",\n callback: () => {\n d3.render(true);\n }\n }\n },\n default: \"Two Actions\"\n})\n\nlet d3 = new Dialog({\n title: \"Harm\",\n content: `<p>Do you want to target yourself?</p>`,\n buttons: {\n one: {\n label: \"Yes\",\n callback: () => {\n doNotTargetCaster = false\n threeActionHarm()\n }\n },\n two: {\n label: \"No\",\n callback: () => {\n doNotTargetCaster = true\n threeActionHarm()\n }\n }\n },\n default: \"No\"\n})\n\n\nmain()\n\nfunction main(){\n if(caster != undefined){\n d.render(true);\n }else{\n ui.notifications.error(`You must select the token of the caster!`)\n return;\n } \n}\n\n//Defining unique behavior for each kind of effect\n\n\nfunction oneActionHarm(){\n //error checking for multiple targets\n if (game.user.targets.size!= 1){\n ui.notifications.error(\"Select only one target!\")\n return;\n }\n if(canvas.grid.measureDistance(caster,spellTarget) < 7.5){\n console.log(\"Close enough to touch!\")\n // checks whether the target is undead or not\n oneActionHarmAnimation()\n }else{\n console.log(`Too far to touch!`); \n ui.notifications.error(`Your target is further than touch distance away! Try again.`);\n return;\n } \n}\n\nfunction twoActionHarm(){\n //error checking for multiple targets\n if (game.user.targets.size!= 1){\n ui.notifications.error(\"Select only one target!\")\n return;\n }\n if(canvas.grid.measureDistance(caster,spellTarget) <= 30){\n console.log(\"Within 30 feet!\")\n // checks whether the target is undead or not\n twoActionHarmAnimation()\n }else{\n console.log(`Farther than 30 feet!`); \n ui.notifications.error(`Your target is further than 30 feet away! Try again.`);\n return;\n }\n}\n\nfunction threeActionHarm(){\n //divide up all tokens within range into an array for living and an array for undead\n let tokensOnMap = Array.from(canvas.tokens.placeables)\n let tokensInRange = tokensOnMap.filter(distance => canvas.grid.measureDistance(distance,caster)<=30)\n let tokenTraitsInRange = tokensInRange.map(x => x.actor.traits)\n let undeadTokensInRange = []\n let livingTokensInRange = []\n for(let i=0;i<tokensInRange.length;i++){\n if(Array.from(tokenTraitsInRange[i]).includes(`undead`)){\n undeadTokensInRange.push(tokensInRange[i])\n }else if(!Array.from(tokenTraitsInRange[i]).includes(`undead`) && !Array.from(tokenTraitsInRange[i]).includes(`construct`)){\n if (doNotTargetCaster) {\n if (!(caster === tokensInRange[i])) livingTokensInRange.push(tokensInRange[i])\n } else livingTokensInRange.push(tokensInRange[i])\n \n }\n }\n console.log(undeadTokensInRange)\n console.log(livingTokensInRange)\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(caster)\n .randomRotation()\n .size(15, {gridUnits: true})\n .file(\"jb2a.healing_generic.burst.purplepink\")\n .waitUntilFinished(-1500)\n .play()\n for(let i=0;i<undeadTokensInRange.length;i++){\n new Sequence(\"Heal Undead\")\n .effect()\n .atLocation(undeadTokensInRange[i])\n .randomRotation()\n .scaleToObject(1.5)\n .file(\"jb2a.cure_wounds.400px.purple\")\n .play()\n }\n for(let i=0;i<livingTokensInRange.length;i++){\n new Sequence(\"Harm living\")\n .effect()\n .atLocation(livingTokensInRange[i])\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.divine_smite.caster.dark_purple\")\n .effect()\n .atLocation(livingTokensInRange[i])\n .scaleToObject()\n .file(\"jb2a.toll_the_dead.purple.skull_smoke\")\n .delay(500)\n .play()\n }\n}\n\n//Defining animations for each kind of effect\n function oneActionHarmAnimation(){\n if(Array.from(spellTarget.actor.traits).includes(`undead`)){\n //trigger energy strand from caster to target, then trigger healing burst on target\n new Sequence(\"Heal undead\")\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.cure_wounds.400px.purple\")\n .play()\n }else{\n //trigger energy strand from caster to target, then trigger damaging burst on target\n new Sequence(\"Harm living\")\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.divine_smite.caster.dark_purple\")\n .effect()\n .atLocation(spellTarget)\n .scaleToObject()\n .file(\"jb2a.toll_the_dead.purple.skull_smoke\")\n .delay(500)\n .play()\n }\n }\n function twoActionHarmAnimation(){\n if(Array.from(spellTarget.actor.traits).includes(`undead`)){\n //trigger energy strand from caster to target, then trigger healing burst on target\n new Sequence(\"Heal undead\") \n .effect()\n .atLocation(caster)\n .stretchTo(spellTarget)\n .file(\"jb2a.energy_strands.range.standard.dark_purple\")\n .waitUntilFinished(-1000)\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.cure_wounds.400px.purple\")\n .play()\n }else{\n //trigger energy strand from caster to target, then trigger damaging burst on target\n new Sequence(\"Harm living\") \n .effect()\n .atLocation(caster)\n .stretchTo(spellTarget)\n .file(\"jb2a.energy_strands.range.standard.dark_purple\")\n .waitUntilFinished(-1000)\n .effect()\n .atLocation(spellTarget)\n .randomRotation()\n .scaleToObject(1.25)\n .file(\"jb2a.divine_smite.caster.dark_purple\")\n .effect()\n .atLocation(spellTarget)\n .scaleToObject()\n .file(\"jb2a.toll_the_dead.purple.skull_smoke\")\n .delay(500)\n .play()\n }\n }\n function threeActionHarmAnimation(){\n \n }","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"exportSource":{"world":"hogwarts","system":"pf2e","coreVersion":"9.269","systemVersion":"3.10.2.11602"},"core":{"sourceId":"Macro.OHxEXANJvgNk9uTU"},"cf":{"id":"temp_6gsujam4gp6"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662741175323,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"lToy5mQpBkIAZaGw","name":"#[CF_tempEntity]","type":"chat","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"flags":{"cf":{"id":"temp_7rg2mnzpvsh","name":"Attacks","color":"#843333","fontColor":"#FFFFFF","icon":"icons/svg/acid.svg","sorting":"m","contents":["OOKf1Stu6m8HZNWA","1dUKN6KL7g3cdDdz","KXoNTv1YkjM3D9NI","BCeeFyLkQhbiqF4b"],"children":["temp_qfrxw4o5gm"],"folderPath":[],"version":"2.4.7"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.0","coreVersion":"10.288","createdTime":null,"modifiedTime":1666910999302,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"lkQvlxkMpsbLwwx5","name":"Tanglefoot","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/tanglefoot.webp","scope":"global","command":"// Cannot be used standalone\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nlet target = Array.from(game.user.targets)[0]\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.eldritch_blast.purple\", { hue: 180 }, \"jb2a.entangle.green\"]\n : [\"jb2a.eldritch_blast.lightgreen\", {}, \"jb2a.entangle.green02\"];\n\nif (typeof args[0] === \"string\") {\n if (args[0] == \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .name(\"Tanglefoot\")\n .scaleToObject(1.2)\n .atLocation(tokenD)\n .fadeOut(500)\n .attachTo(tokenD)\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .file(\"jb2a.entangle.green\")\n .play()\n } else if (args[0] == \"off\") {\n await Sequencer.EffectManager.endEffects({ name: \"Tanglefoot\", object: tokenD })\n }\n} else {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .atLocation(tokenD)\n .stretchTo(target)\n .file(assets[0])\n .filter(\"ColorMatrix\", assets[1])\n .waitUntilFinished(-3000)\n .effect()\n .scaleToObject(1.2)\n .atLocation(target)\n .attachTo(target)\n .fadeOut(500)\n .repeats(2)\n .fadeIn(500)\n .file(assets[2])\n .play()\n}","folder":null,"sort":0,"flags":{"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"advanced-macros":{"runAsGM":true},"cf":{"id":"temp_6gsujam4gp6"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.1.2","coreVersion":"10.286","createdTime":null,"modifiedTime":1664148381194,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"lmKZBrfclq8V6sJI","name":"Dimension Jumps","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/magic/movement/pinwheel-turning-blue.webp","scope":"global","command":"// Cannot be used standalone.\n\nlet opts = {};\nlet seq = new Sequence(\"PF2e x JB2A Macros\")\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nlet movementSpeed = args[0].actor.attributes.speed.total;\n\n// Determine spell level, this is BS though.\n// What I am basically doing is searching the latest messages for a spellLevel tag and see if they have it. Whichever is latest wins, rather than which one caused the damage roll.\n// The flag is also created by checking the HTML of the spell than the actual data, since there is no official spell level flag.\nlet spellLevel = args[0].data.flags.pf2e?.casting?.level ?? [...args[0].collection].filter(x => x.data.flags?.pf2e?.casting).slice(-1)[0].data.flags.pf2e.casting.level\n\n// Determine Spells Range\nswitch (args[0].item.system.slug) {\n case \"dimensional-assault\": opts.range = movementSpeed / 2; break;\n case \"snare-hopping\": opts.range = 10 * spellLevel; opts.reverseTeleport = true; break;\n case \"abundant-step\": opts.range = Math.max(15, movementSpeed); break;\n case \"blink-charge\": opts.range = (spellLevel - 4) * 60; break;\n case \"collective-transposition\": opts.range = 30; opts.reverseTeleport = true; opts.possibleTargets = 2 + (spellLevel - 6); break;\n case \"dimension-door\": opts.range = spellLevel < 5 ? 120 : 1000; break;\n case \"dimensional-steps\": opts.range = 20 + 5 * (spellLevel - 4); break;\n case \"shadow-jump\": opts.range = 120; break;\n case \"teleport\": opts.range = 100 * (10 * (spellLevel - 6)); break;\n case \"unexpected-transposition\": opts.range = 30; opts.switcheroo = true; ui.notifications.info(\"PF2e Animation Macros | Select a target to switch places with!\"); break;\n case \"terrain-transposition\": {\n let rangeMenu = await warpgate.menu({\n buttons: [{\n label: 'Yes',\n value: 2\n }, {\n label: 'No',\n value: 1\n }]\n }, {\n title: 'Are you in Favoured Terrain?'\n })\n opts.range = 90 * rangeMenu.buttons\n break;\n }\n}\n\nconsole.log(opts)\n\ntokenD.actor.sheet.minimize();\nconst tokenCenter = tokenD.center;\nlet cachedDistance = 0;\nconst checkDistance = async (crosshairs) => {\n\n while (crosshairs.inFlight) {\n\n //wait for initial render\n await warpgate.wait(100);\n\n const ray = new Ray(tokenCenter, crosshairs);\n\n const distance = canvas.grid.measureDistances([{ ray }], { gridSpaces: true })[0]\n\n //only update if the distance has changed\n if (cachedDistance !== distance) {\n cachedDistance = distance;\n if (distance > opts.range) {\n crosshairs.icon = 'icons/svg/hazard.svg'\n } else {\n crosshairs.icon = tokenD.data.texture.src\n }\n crosshairs.draw()\n crosshairs.label = `${distance} ft`\n }\n }\n}\n\nconst callbacks = {\n show: checkDistance\n}\n\nlet targetLocation = await warpgate.crosshairs.show({ size: tokenD.data.width, icon: tokenD.data.texture.src, label: '0 ft.', interval: tokenD.data.width % 2 === 0 ? 1 : -1 }, callbacks)\n\nif (targetLocation.cancelled) { tokenD.actor.sheet.maximize(); return; }\nif (cachedDistance > opts.range) {\n ui.notifications.error(`Your teleport has a maximum range of ${opts.range} ft. Last try.`)\n targetLocation = await warpgate.crosshairs.show({ size: tokenD.data.width, icon: tokenD.data.texture.src, label: '0 ft.', interval: -1 }, callbacks)\n}\nif (cachedDistance > opts.range) {\n ui.notifications.error(`Your teleport has a maximum range of ${opts.range} ft.`)\n return\n}\n\nlet targetToken = warpgate.crosshairs.collect(targetLocation).filter(token => !canvas.tokens.controlled.map(t => t.id).includes(tokenD.id))[0]?.object;\n\nswitch (args[0].item.system.slug) {\n case \"dimensional-assault\": {\n await Sequencer.Preloader.preloadForClients([\"jb2a.misty_step.02.purple\", \"jb2a.misty_step.01.purple\", \"jb2a.energy_strands.range.standard.purple.04\"])\n seq.effect()\n .file(\"jb2a.misty_step.01.purple\")\n .atLocation(tokenD)\n .scaleToObject(2)\n .wait(600)\n .animation()\n .on(tokenD)\n .opacity(0)\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.energy_strands.range.standard.purple.04\")\n .atLocation(tokenD)\n .stretchTo(targetLocation)\n .animation()\n .on(tokenD)\n .teleportTo(targetLocation)\n .snapToGrid()\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.misty_step.02.purple\")\n .attachTo(tokenD)\n .scaleToObject(2)\n .wait(1500)\n .animation()\n .on(tokenD)\n .opacity(1.0)\n break;\n };\n case \"snare-hopping\": {\n break;\n };\n case \"ki-rush\":\n case \"abundant-step\": {\n seq.effect()\n .file(tokenD.data.texture.src)\n .atLocation(tokenD)\n .attachTo(tokenD, {bindAlpha: false})\n .loopProperty(\"spriteContainer\", \"position.x\", { values: [0, 15, 0 -15], duration: 50})\n .loopProperty(\"spriteContainer\", \"position.y\", { values: [0, -15, 0, 15], duration: 50})\n .from(tokenD)\n .filter(\"Blur\", { blurX: 5, blurY: 0, quality: 5 })\n .fadeIn(500)\n .fadeOut(500)\n .wait(300)\n .animation()\n .opacity(0)\n .on(tokenD)\n .moveTowards(targetLocation)\n .moveSpeed(50)\n .snapToGrid()\n .waitUntilFinished()\n .animation()\n .opacity(1)\n .on(tokenD)\n break;\n };\n case \"dimension-door\": {\n await Sequencer.Preloader.preloadForClients([\"jb2a.magic_signs.rune.conjuration.intro.blue\", \"jb2a.portals.vertical.vortex.blue\"])\n const portalScale = tokenD.w / canvas.grid.size * 0.7;\n seq.effect()\n .file('jb2a.magic_signs.rune.conjuration.intro.blue')\n .atLocation(tokenD)\n .scale(portalScale * 0.7)\n .opacity(0.5)\n .waitUntilFinished(-600)\n .effect()\n .file('jb2a.portals.vertical.vortex.blue')\n .atLocation(tokenD, {offset: {y: -(tokenD.h)}})\n .scale(portalScale)\n .duration(1200)\n .fadeIn(200)\n .fadeOut(500)\n .animation()\n .on(tokenD)\n .opacity(0)\n .effect()\n .from(tokenD)\n .moveTowards({ x: tokenD.center.x, y: tokenD.center.y - tokenD.h }, { ease: 'easeInCubic', rotate: false })\n .zeroSpriteRotation()\n .fadeOut(500)\n .scale(tokenD.document.texture.scaleX)\n .duration(500)\n .wait(250)\n .effect()\n .file('jb2a.portals.vertical.vortex.blue')\n .atLocation(targetLocation, {offset: { y: -(tokenD.h)}})\n .scale(portalScale)\n .duration(1200)\n .fadeOut(500)\n .fadeIn(200)\n .effect()\n .from(tokenD)\n .atLocation({ x: targetLocation.x, y: targetLocation.y - tokenD.h }, { ease: 'easeInCubic', rotate: false })\n .scale(tokenD.document.texture.scaleX)\n .fadeIn(500)\n .duration(500)\n .moveTowards(targetLocation)\n .rotate(90)\n .waitUntilFinished()\n .animation()\n .on(tokenD)\n .teleportTo(targetLocation, { relativeToCenter: true })\n .opacity(1)\n break;\n };\n case \"dimensional-steps\": {\n await Sequencer.Preloader.preloadForClients([\"jb2a.misty_step.02.blue\", \"jb2a.misty_step.01.blue\", \"jb2a.energy_strands.range.standard.blue.04\"])\n seq.effect()\n .file(\"jb2a.misty_step.01.blue\")\n .atLocation(tokenD)\n .scaleToObject(2)\n .wait(600)\n .animation()\n .on(tokenD)\n .opacity(0)\n .waitUntilFinished()\n .animation()\n .on(tokenD)\n .teleportTo(targetLocation)\n .snapToGrid()\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.misty_step.02.blue\")\n .attachTo(tokenD)\n .scaleToObject(2)\n .wait(1500)\n .animation()\n .on(tokenD)\n .opacity(1.0)\n break;\n };\n case \"blink-charge\": {\n await Sequencer.Preloader.preloadForClients([\n \"jb2a.misty_step.02.blue\",\n \"jb2a.misty_step.01.blue\",\n \"jb2a.energy_strands.range.standard.blue.04\",\n \"jb2a.energy_strands.overlay.blue.01\"\n ])\n seq.effect()\n .file(\"jb2a.energy_strands.overlay.blue.01\")\n .atLocation(tokenD)\n .attachTo(tokenD)\n .fadeIn(500)\n .scaleToObject(tokenScale)\n .wait(600)\n .effect()\n .file(\"jb2a.misty_step.01.blue\")\n .atLocation(tokenD)\n .scaleToObject(2)\n .wait(600)\n .animation()\n .on(tokenD)\n .opacity(0)\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.energy_strands.range.standard.blue.04\")\n .atLocation(tokenD)\n .stretchTo(targetLocation)\n .animation()\n .on(tokenD)\n .teleportTo(targetLocation)\n .snapToGrid()\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.misty_step.02.blue\")\n .attachTo(tokenD)\n .scaleToObject(2)\n .wait(1500)\n .animation()\n .on(tokenD)\n .opacity(1.0)\n if (Array.from(game.user.targets)[0]) {\n await Sequencer.Preloader.preloadForClients([\"jb2a.divine_smite.target.blueyellow\"])\n seq.effect()\n .waitUntilFinished(-500)\n .file(\"jb2a.divine_smite.target.blueyellow\")\n .atLocation(Array.from(game.user.targets)[0])\n .scale({ x: 1, y: 1 })\n }\n break;\n };\n case \"shadow-jump\": {\n await Sequencer.Preloader.preloadForClients([\"jb2a.misty_step.02.dark_black\", \"jb2a.misty_step.01.dark_black\"])\n seq.effect()\n .file(\"jb2a.misty_step.01.dark_black\")\n .atLocation(tokenD)\n .scaleToObject(2)\n .wait(600)\n .animation()\n .on(tokenD)\n .opacity(0)\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.drop_shadow.dark_black\")\n .atLocation(tokenD)\n .moveTowards(targetLocation)\n .scale({ x: 1, y: 1 })\n .waitUntilFinished(-1500)\n .animation()\n .on(tokenD)\n .teleportTo(targetLocation)\n .snapToGrid()\n .waitUntilFinished()\n .effect()\n .file(\"jb2a.misty_step.02.dark_black\")\n .attachTo(tokenD)\n .scaleToObject(2)\n .wait(1500)\n .animation()\n .on(tokenD)\n .opacity(1.0)\n break;\n };\n case \"terrain-transposition\": {\n await Sequencer.Preloader.preloadForClients([\"jb2a.swirling_leaves.complete.01.green.0\", \"jb2a.energy_strands.range.standard.dark_green.03\"])\n seq.effect()\n .file(\"jb2a.swirling_leaves.complete.01.green.0\")\n .atLocation(tokenD)\n .attachTo(tokenD)\n .fadeIn(500)\n .scaleToObject(tokenScale * 2)\n .waitUntilFinished(-2000)\n .fadeOut(500)\n .effect()\n .from(tokenD)\n .fadeOut(500)\n .atLocation(tokenD)\n .attachTo(tokenD, {bindAlpha: false})\n .animation()\n .on(tokenD)\n .fadeOut(500)\n .opacity(0)\n .waitUntilFinished()\n .animation()\n .on(tokenD)\n .teleportTo(targetLocation)\n .snapToGrid()\n .effect()\n .file(\"jb2a.energy_strands.range.standard.dark_green\")\n .atLocation(tokenD)\n .stretchTo(targetLocation)\n .waitUntilFinished(-1300)\n .animation()\n .on(tokenD)\n .fadeIn(500)\n .opacity(1.0)\n break;\n };\n case \"collective-transposition\": {\n break;\n };\n case \"Teleport\": {\n break;\n };\n case \"unexpected-transposition\": {\n seq.effect()\n .file(\"jb2a.smoke.puff.centered\")\n .atLocation(tokenD)\n .attachTo(tokenD)\n .scaleToObject(2)\n .effect()\n .file(\"jb2a.smoke.puff.centered\")\n .atLocation(targetToken)\n .attachTo(targetToken)\n .scaleToObject(2)\n .animation()\n .on(tokenD)\n .opacity(0)\n .animation()\n .on(targetToken)\n .opacity(0)\n .animation()\n .on(tokenD)\n .teleportTo(targetToken)\n .fadeIn(500)\n .animation()\n .on(targetToken)\n .teleportTo(tokenD)\n .fadeIn(500)\n break;\n };\n}\n\nawait seq.play()\n\ntokenD.actor.sheet.maximize();","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"cf":{"id":"temp_6gsujam4gp6"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":null,"modifiedTime":1667149006572,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"_id":"nA5gqHtwwwsyOtih","name":"Encumbered","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/commodities/stone/stone-pile-grey.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nif (!args.length) args[0] = await Sequencer.EffectManager.getEffects({ name: `${tokenD.name} - Encumbered`, source: tokenD }).length ? \"off\" : \"on\";\n\nconst arrayOfThings = [1 * tokenD.document.data.scale, 0.9 * tokenD.document.data.scale]\nif (args[0] == \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .name(`${tokenD.name} - Encumbered`)\n .attachTo(tokenD, {bindAlpha: false})\n .from(tokenD)\n .persist()\n .loopProperty(\"spriteContainer\", \"scale.x\", { values: arrayOfThings, duration: 2000, pingPong: true})\n .loopProperty(\"spriteContainer\", \"scale.y\", { values: arrayOfThings, duration: 2000, pingPong: true})\n .filter(\"Glow\", { color: 000000, distance: 20, outerStrength: 1, innerStrength: 0 })\n .fadeOut(500)\n // Clumsy .loopProperty(\"spriteContainer\", \"rotation\", { values: [0, 5, 0, -5], duration: 2000, pingPong: true})\n .wait(100)\n .animation()\n .fadeOut(100)\n .on(tokenD)\n .play()\n} else if (args[0] == \"off\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .animation()\n .fadeIn(100)\n .on(tokenD)\n .play()\n await Sequencer.EffectManager.endEffects({ name: `${tokenD.name} - Encumbered`, object: tokenD });\n}","folder":null,"sort":0,"flags":{"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662655790087,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"name":"Pummeling Rubble","type":"script","scope":"global","author":"BHRwUaMa68cNSVcP","img":"systems/pf2e/icons/spells/pummeling-rubble.webp","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\nconst template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nconst [templateX, templateY] = [template.data.x, template.data.y];\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file('jb2a.falling_rocks.side.1x1')\n .mask(template)\n .atLocation(tokenD)\n .stretchTo(template, {offset: {x: 100}})\n .fadeOut(400)\n .scale({ x: 0.7, y: 1.0 })\n .play()","ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.4F4OeHGpmWM8OqYF"},"cf":{"id":"temp_sjnygaa08ij"}},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":1662950452004,"modifiedTime":1663106252133,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"folder":null,"sort":0,"_id":"nlYSBFttAhdWpyla"}
{"name":"Darkness","type":"script","scope":"global","author":"BHRwUaMa68cNSVcP","img":"systems/pf2e/icons/spells/darkness.webp","command":"// Just updates the template with perfect vision data.\n// If used standalone, it updates the latest placed template.\n\nconst flag = {\n \"perfect-vision\": {\n \"visionLimitation\": {\n \"enabled\": true,\n \"sight\": 0,\n \"sound\": null,\n \"move\": null,\n \"other\": null,\n \"detection\": {\n \"basicSight\": 0,\n \"feelTremor\": null,\n \"hearing\": null,\n \"seeAll\": 0,\n \"seeInvisibility\": 0,\n \"senseAll\": null,\n \"senseInvisibility\": null\n }\n }\n }\n}\n\nconst template = args.length ? args[1].templateData : canvas.templates.placeables[canvas.templates.placeables.length - 1].document\n\ntemplate.update({\"flags\": flag})","ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.ZrTz8dusj2oVDRXi"},"cf":{"id":"temp_8f8hkx7i8fo"}},"_stats":{"systemId":"pf2e","systemVersion":"4.1.3","coreVersion":"10.286","createdTime":1664155646051,"modifiedTime":1664290701456,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"folder":null,"sort":0,"_id":"ooHL5fVdUQbWIlIh"}
{"_id":"pC8bqYNdqGeeUoWO","name":"Grim Tendrils","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/magic/unholy/energy-smoke-pink.webp","scope":"global","command":"const template = args[1]?.templateData ?? canvas.templates.placeables[canvas.templates.placeables.length - 1];\nnew Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file('jb2a.energy_strands.range.multiple.purple.01')\n .fadeIn(500)\n .fadeOut(500)\n .atLocation(template)\n .rotateTowards(template)\n .stretchTo(template, { offset: { x: 0, y: -50 }})\n .scale({ x: 1.4 })\n .spriteOffset({ x: -50 })\n .play()","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"exportSource":{"world":"hogwarts","system":"pf2e","coreVersion":"9.269","systemVersion":"3.10.2.11602"},"core":{"sourceId":"Macro.1wpIPbvbCvQaueft"},"cf":{"id":"temp_brzxllxt18s"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":null,"modifiedTime":1663106276374,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"_id":"reYCOeWs6vFSD91T","name":"Cone Template","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/svg/dice-target.svg","scope":"global","command":"// Original by david (aka claudekennilol)#2244\n// Modified by MrVauxs#8622\n// requires warpgate, jb2a patreon, and sequencer\n\nconst tokenD = args[0] ?? token\nconst gridSize = canvas.grid.h;\nconst sourceSquare = (center, widthSquares, heightSquares) => {\n const h = gridSize * heightSquares;\n const w = gridSize * widthSquares;\n\n const bottom = center.y + h / 2;\n const left = center.x - w / 2;\n const top = center.y - h / 2;\n const right = center.x + w / 2;\n\n const rightSpots = [...new Array(heightSquares)].map((_, i) => ({\n direction: 0,\n x: right,\n y: top + gridSize / 2 + gridSize * i,\n }));\n const bottomSpots = [...new Array(widthSquares)].map((_, i) => ({\n direction: 90,\n x: right - gridSize / 2 - gridSize * i,\n y: bottom,\n }));\n const leftSpots = [...new Array(heightSquares)].map((_, i) => ({\n direction: 180,\n x: left,\n y: bottom - gridSize / 2 - gridSize * i,\n }));\n const topSpots = [...new Array(widthSquares)].map((_, i) => ({\n direction: 270,\n x: left + gridSize / 2 + gridSize * i,\n y: top,\n }));\n const allSpots = [\n ...rightSpots.slice(Math.floor(rightSpots.length / 2)),\n { direction: 45, x: right, y: bottom },\n ...bottomSpots,\n { direction: 135, x: left, y: bottom },\n ...leftSpots,\n { direction: 225, x: left, y: top },\n ...topSpots,\n { direction: 315, x: right, y: top },\n ...rightSpots.slice(0, Math.floor(rightSpots.length / 2)),\n ];\n\n return {\n x: left,\n y: top,\n center,\n top,\n bottom,\n left,\n right,\n h,\n w,\n heightSquares,\n widthSquares,\n allSpots,\n };\n};\n\n// cast from source token, if no source token, then select a square to originate the cone from.\nlet square;\nif (typeof tokenD === 'undefined') {\n const sourceConfig = {\n drawIcon: true,\n drawOutline: false,\n interval: -1,\n label: 'Cone Start',\n };\n\n const source = await warpgate.crosshairs.show(sourceConfig);\n if (source.cancelled) {\n return;\n }\n square = sourceSquare({ x: source.x, y: source.y }, 1, 1);\n}\nelse {\n const width = Math.max(Math.round(tokenD.data.width), 1);\n const height = Math.max(Math.round(tokenD.data.height), 1)\n square = sourceSquare(tokenD.center, width, height);\n}\n\n// Template Data\nconst templateData = {\n t: args[1]?.templateType ?? \"cone\",\n distance: args[1]?.distance ?? 15,\n fillColor: args[1]?.fillColor ?? '#000000',\n angle: args[1]?.angle ?? 90,\n ...square.allSpots[0],\n user: game.userId,\n}\n\nlet template = (await canvas.scene.createEmbeddedDocuments('MeasuredTemplate', [templateData]))[0];\n\nconst targetConfig = {\n drawIcon: false,\n drawOutline: false,\n}\n\nlet currentSpotIndex = 0;\nconst updateTemplateLocation = async (crosshairs) => {\n while (crosshairs.inFlight) {\n await warpgate.wait(100);\n\n const totalSpots = 4 + 2 * square.heightSquares + 2 * square.widthSquares;\n const radToNormalizedAngle = (rad) => {\n let angle = (rad * 180 / Math.PI) % 360;\n\n // offset the angle for even-sided tokens, because it's centered in the grid it's just wonky without the offset\n if (square.heightSquares % 2 === 0 && square.widthSquares % 2 === 0) {\n angle -= (360 / totalSpots) / 2;\n }\n const normalizedAngle = Math.round(angle / (360 / totalSpots)) * (360 / totalSpots);\n return normalizedAngle < 0\n ? normalizedAngle + 360\n : normalizedAngle;\n }\n\n const ray = new Ray(square.center, crosshairs);\n const angle = radToNormalizedAngle(ray.angle);\n const spotIndex = Math.ceil(angle / 360 * totalSpots);\n\n if (spotIndex === currentSpotIndex) {\n continue;\n }\n\n currentSpotIndex = spotIndex;\n const spot = square.allSpots[currentSpotIndex];\n\n template = await template.update({ ...spot });\n\n const getCenterOfSquares = (t) => {\n const x1 = t.x + gridSize / 2;\n const y1 = t.y + gridSize / 2;\n const tokenSquaresWidth = t.data.width;\n const tokenSquaresHeight = t.data.height;\n const centers = [];\n for (let x = 0; x < tokenSquaresWidth; x++) {\n for (let y = 0; y < tokenSquaresHeight; y++) {\n centers.push({ id: t.id, center: { x: x1 + x * gridSize, y: y1 + y * gridSize } });\n }\n }\n return centers;\n };\n const centers = canvas.tokens.placeables\n .map(t => t.actor.data.data.size <= 4\n ? { id: t.id, center: t.center }\n : getCenterOfSquares(t))\n .flatMap(x => x);\n const tokenIdsToTarget = centers.filter(o => canvas.grid.getHighlightLayer('Template.' + template.id).geometry.containsPoint(o.center)).map(x => x.id);\n game.user.updateTokenTargets(tokenIdsToTarget);\n }\n}\n\nconst rotateCrosshairs = await warpgate.crosshairs.show(\n targetConfig,\n {\n show: updateTemplateLocation\n });\nif (rotateCrosshairs.cancelled) {\n await template.delete();\n game.user.updateTokenTargets();\n return;\n}\n\nconst seq = new Sequence(\"PF2e x JB2A Macros\")\n\nseq.effect()\n .playIf(!args[2]?.length)\n .file('jb2a.magic_signs.rune.evocation.intro.red')\n .atLocation(square)\n .offset({ x: -square.w / 2, y: -square.h / 2 })\n .scaleToObject(1.6)\n .opacity(0.5)\n .waitUntilFinished()\n.effect()\n .playIf(!args[2]?.length)\n .file('jb2a.burning_hands.02.orange')\n .fadeIn(300)\n .attachTo(template)\n .stretchTo(template, {onlyX: true})\n .rotateTowards(template)\n .mask()\n .waitUntilFinished()\n .thenDo(async () => {\n if (args && args[2]) {\n args[2].forEach((element) => seq\n .effect()\n .file(element)\n .fadeIn(300)\n .attachTo(template)\n .stretchTo(template, {onlyX: true})\n .rotateTowards(template)\n .mask()\n )\n }\n })\n\nseq.thenDo(async function(){\n await template.delete();\n})\n\nawait seq.play();","folder":null,"sort":0,"permission":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"flags":{"advanced-macros":{"runAsGM":false},"exportSource":{"world":"hogwarts","system":"pf2e","coreVersion":"9.269","systemVersion":"3.10.2.11602"},"core":{"sourceId":"Macro.1wpIPbvbCvQaueft"},"cf":{"id":"temp_9hsvsxrbtvj"}}}
{"_id":"tItdi7rFVh3PEyKx","name":"Petrified","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"icons/magic/earth/strike-body-stone-crumble.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nif (!args.length) args[0] = await Sequencer.EffectManager.getEffects({ origin: \"petrified\", source: tokenD }).length ? \"off\" : \"on\";\n\nif (args[0] == \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .origin(\"petrified\")\n .name(`${tokenD.name} - Petrified`)\n .attachTo(tokenD, {bindAlpha: false})\n .from(tokenD)\n .filter(\"ColorMatrix\", { \n hue: 0, \n brightness: 1, \n contrast: 0, \n saturate: -1\n })\n .scaleToObject(tokenD.document.data.scale)\n .persist()\n .fadeOut(500)\n .effect()\n .origin(\"petrified\")\n .name(`${tokenD.name} - Petrified`)\n .attachTo(tokenD, {bindAlpha: false})\n .file(\"jb2a.impact.ground_crack.still_frame.01\")\n .scaleToObject(2)\n .persist()\n .zIndex(9999)\n .opacity(0.5)\n .mask(tokenD)\n .fadeOut(500)\n .animation()\n .delay(100)\n .on(tokenD)\n .fadeOut(100)\n .play()\n} else if (args[0] == \"off\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .animation()\n .fadeIn(200)\n .on(tokenD)\n .play()\n await Sequencer.EffectManager.endEffects({ origin: `petrified`, object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.a6jod3yUvFLPBT8W"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.0-beta3","coreVersion":"10.284","createdTime":null,"modifiedTime":1662656458587,"lastModifiedBy":"BHRwUaMa68cNSVcP"}}
{"name":"#[CF_tempEntity]","type":"chat","command":"","flags":{"cf":{"id":"temp_8f8hkx7i8fo","name":"Burst","color":"#741a1a","fontColor":"#FFFFFF","icon":"icons/svg/circle.svg","sorting":"m","contents":["ooHL5fVdUQbWIlIh","X6PZ0lboOsQSY8KO"],"children":[],"folderPath":["temp_c76abfsyvz7"]}},"author":"BHRwUaMa68cNSVcP","img":"icons/svg/dice-target.svg","scope":"global","folder":null,"sort":0,"ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.4","coreVersion":"10.287","createdTime":1663106380642,"modifiedTime":1665264025660,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"_id":"tfMAQL4aBu95Bl3P"}
{"name":"#[CF_tempEntity]","type":"chat","command":"","flags":{"cf":{"id":"temp_sjnygaa08ij","name":"Cone","color":"#175435","fontColor":"#FFFFFF","icon":"icons/svg/downgrade.svg","sorting":"m","contents":["PWAdvQ9qxwTcXCsu","OOYnWts6o8nGdhC6","nlYSBFttAhdWpyla","62nzP4aLTMC5DNF7","0O8rNzIVLo8p3tXj"],"children":[],"folderPath":["temp_c76abfsyvz7"]}},"author":"BHRwUaMa68cNSVcP","img":"icons/svg/dice-target.svg","scope":"global","folder":null,"sort":0,"ownership":{"default":0,"BHRwUaMa68cNSVcP":3},"_stats":{"systemId":"pf2e","systemVersion":"4.0.4","coreVersion":"10.285","createdTime":1663106241356,"modifiedTime":1663106254304,"lastModifiedBy":"BHRwUaMa68cNSVcP"},"_id":"u8M6CUXsVng6SEBh"}
{"_id":"uCRBEs5o1lFVhRqT","name":"Arcane Cascade","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/features/classes/arcane-cascade.webp","scope":"global","command":"// Requires drag and dropping the Stance onto a token.\n// Cannot be used standalone.\n\nconst [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nif (!args.length) args[0] = await Sequencer.EffectManager.getEffects({ origin: \"arcane cascade\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst assets = game.modules.get(\"JB2A_DnD5e\")?.active\n ? [\"jb2a.token_border.circle.static.blue.002\", \"jb2a.divine_smite.caster.blueyellow\",\"jb2a.divine_smite.caster.blueyellow\",\"jb2a.divine_smite.caster.blueyellow\"]\n : [\"jb2a.token_border.circle.static.blue.010\", \"jb2a.divine_smite.caster.yellowwhite\",\"jb2a.divine_smite.caster.orange\",\"jb2a.divine_smite.caster.purplepink\"];\n\nif (args[0] == \"on\") {\n let seq = new Sequence(\"PF2e x JB2A Macros\")\n let damageType = args[1].item.flags.pf2e.rulesSelections.stanceArcaneCascade\n switch (damageType) {\n case \"sonic\": seq.effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.extras.tmfx.border.circle.outpulse.02.normal\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(1.2 * tokenScale)\n .fadeOut(1000)\n .fadeIn(1000)\n .belowTokens()\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.extras.tmfx.border.circle.outpulse.02.normal\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(2000)\n .fadeIn(2000)\n .belowTokens()\n .scaleToObject(1.3 * tokenScale)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.extras.tmfx.border.circle.outpulse.02.normal\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .belowTokens()\n .fadeOut(3000)\n .fadeIn(3000)\n .scaleToObject(1.4 * tokenScale)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.extras.tmfx.border.circle.outpulse.02.normal\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(4000)\n .fadeIn(4000)\n .belowTokens()\n .scaleToObject(1.5 * tokenScale)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.extras.tmfx.border.circle.outpulse.02.normal\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .belowTokens()\n .fadeOut(5000)\n .fadeIn(5000)\n .scaleToObject(1.6 * tokenScale)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"poison\": seq.effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.icon.poison.dark_green\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .zIndex(10)\n .scaleToObject(1 * tokenScale)\n .animateProperty(\"sprite\", \"height\", { from: 1 * tokenScale, to: 1.5 * tokenScale, duration: 1500, gridUnits: true, ease: \"easeOutBack\"})\n .animateProperty(\"sprite\", \"width\", { from: 1 * tokenScale, to: 1.5 * tokenScale, duration: 1500, gridUnits: true, ease: \"easeOutBack\"})\n .fadeOut(1000)\n .fadeIn(600)\n .duration(2000)\n .waitUntilFinished(-1500)\n .effect()\n .playIf(!game.modules.get(\"JB2A_DnD5e\")?.active)\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.fog_cloud.02.green\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .belowTokens()\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .fadeIn(1500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .playIf(!game.modules.get(\"JB2A_DnD5e\")?.active)\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.fog_cloud.02.green\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .opacity(0.3)\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .fadeIn(1500)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"positive\": seq.effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.energy_strands.in.green.01.2\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(2 * tokenScale)\n .waitUntilFinished(-500)\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.energy_strands.complete.blue.01\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .belowTokens()\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .filter(\"ColorMatrix\", {\n hue: 240\n })\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.energy_strands.overlay.blue.01\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .filter(\"ColorMatrix\", {\n hue: 240\n })\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"negative\": seq.effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.energy_strands.in.purple.01.2\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .playIf(!game.modules.get(\"JB2A_DnD5e\")?.active)\n .scaleToObject(2 * tokenScale)\n .waitUntilFinished(-500)\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.energy_strands.complete.purple.01\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .belowTokens()\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .playIf(!game.modules.get(\"JB2A_DnD5e\")?.active)\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .playIf(!game.modules.get(\"JB2A_DnD5e\")?.active)\n .file(\"jb2a.energy_strands.overlay.purple.01\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.energy_strands.in.green.01.2\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .playIf(game.modules.get(\"JB2A_DnD5e\")?.active)\n .filter(\"ColorMatrix\", {\n hue: -170\n })\n .scaleToObject(2 * tokenScale)\n .waitUntilFinished(-500)\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.energy_strands.complete.blue.01\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .belowTokens()\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .playIf(game.modules.get(\"JB2A_DnD5e\")?.active)\n .filter(\"ColorMatrix\", {\n hue: 60\n })\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .playIf(game.modules.get(\"JB2A_DnD5e\")?.active)\n .file(\"jb2a.energy_strands.overlay.blue.01\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .filter(\"ColorMatrix\", {\n hue: 60\n })\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"mental\": seq.effect()\n .file(assets[3])\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .scaleToObject(1.5 * tokenScale)\n .waitUntilFinished(-2000)\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.magic_signs.rune.enchantment.intro.purple\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .zIndex(10)\n .animateProperty(\"sprite\", \"height\", { from: 1 * tokenScale, to: 1.5 * tokenScale, duration: 1500, gridUnits: true, ease: \"easeOutBack\"})\n .animateProperty(\"sprite\", \"width\", { from: 1 * tokenScale, to: 1.5 * tokenScale, duration: 1500, gridUnits: true, ease: \"easeOutBack\"})\n .fadeOut(1500)\n .fadeIn(700)\n .effect()\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .file(\"jb2a.token_border.circle.static.purple.003\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .opacity(0.6)\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"lawful\": seq.effect()\n .file(assets[2])\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(2 * tokenScale)\n .waitUntilFinished(-2000)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .tint(\"#FFA500\")\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.ward.rune.yellow.01\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .filter(\"ColorMatrix\", {\n hue: -20\n })\n .belowTokens()\n .scaleToObject(2 * tokenScale)\n .fadeOut(500)\n .fadeIn(500)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"good\": seq.effect()\n .file(assets[1])\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(1.5 * tokenScale)\n .waitUntilFinished(-1400)\n .effect()\n .file(\"jb2a.bless.200px.intro.yellow\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(1.7 * tokenScale)\n .fadeOut(250)\n .waitUntilFinished(-500)\n .effect()\n .file(\"jb2a.bless.200px.loop.yellow\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .belowTokens()\n .scaleToObject(1.7 * tokenScale)\n .fadeOut(500)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"force\": seq.effect()\n .file(\"jb2a.antilife_shell.blue_no_circle\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(1.4 * tokenScale)\n .waitUntilFinished(-1500)\n .effect()\n .file(\"jb2a.fireflies.many.01.blue\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .randomRotation()\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(1.4 * tokenScale)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.wall_of_force.sphere.blue\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(1.3 * tokenScale)\n .fadeIn(800)\n .fadeOut(500)\n .persist(true, { persistTokenPrototype: true })\n .play();\n break;\n case \"fire\": seq.effect()\n .file(\"jb2a.fireflies.many.01.green\")\n .origin(\"Unlearcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .filter(\"ColorMatrix\", {\n hue: 300\n })\n .randomRotation()\n .scaleToObject(1.5 * tokenScale)\n .fadeIn(500)\n .fadeOut(500)\n .opacity(0.7)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.fumes.fire.orange\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .spriteAnchor({ x: 0.1, y: 0.9 })\n .belowTokens()\n .scaleToObject(1.5 * tokenScale)\n .fadeIn(500)\n .fadeOut(500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.token_border.circle.static.blue.005\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .filter(\"ColorMatrix\", {\n hue: 190\n })\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .opacity(0.9)\n .persist(true, { persistTokenPrototype: true })\n .play()\n break;\n case \"electricity\": seq.effect()\n .file(\"jb2a.divine_smite.caster.blueyellow\")\n .origin(\"Unlearcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .filter(\"ColorMatrix\", {\n hue: 100,\n contrast: 1,\n saturate: 0 \n })\n .tint(\"#7DF9FF\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(2 * tokenScale)\n .waitUntilFinished(-1500)\n .effect()\n .file(\"jb2a.static_electricity.03.blue\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(1.5 * tokenScale)\n .fadeOut(500)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(assets[0])\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .play()\n break;\n case \"evil\": seq.effect()\n .file(\"jb2a.icon.fear.orange\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeIn(500)\n .fadeOut(500)\n .duration(2000)\n .scaleToObject(2 * tokenScale)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .tint(\"#ff4500\")\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.token_border.circle.static.blue.001\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .opacity(0.6)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .tint(\"#ff4500\")\n .persist(true, { persistTokenPrototype: true })\n break;\n case \"cold\": seq.effect()\n .file(\"jb2a.ice_spikes.radial.burst.white\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeIn(500)\n .fadeOut(500)\n .belowTokens()\n .duration(2000)\n .scaleToObject(4 * tokenScale)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.token_border.circle.static.blue.001\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .opacity(0.6)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.shield_themed.below.ice.01.blue\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .opacity(0.6)\n .belowTokens()\n .scaleToObject(1.4 * tokenScale)\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.shield_themed.above.ice.01.blue\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .scaleToObject(1.4 * tokenScale)\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n break;\n case \"chaotic\": seq.effect()\n .file(\"jb2a.icon.fear.dark_purple\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeIn(500)\n .fadeOut(500)\n .duration(2000)\n .scaleToObject(2 * tokenScale)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .tint(\"#800080\")\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.token_border.circle.static.blue.001\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .opacity(0.6)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .tint(\"#800080\")\n .persist(true, { persistTokenPrototype: true })\n break;\n case \"acid\": seq.effect()\n .file(\"jb2a.liquid.splash.blue\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .atLocation(tokenD)\n .fadeIn(500)\n .fadeOut(500)\n .tint(\"#8ffe09\")\n .scaleToObject(2 * tokenScale)\n .effect()\n .file(\"jb2a.liquid.splash.blue\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .atLocation(tokenD)\n .fadeIn(500)\n .belowTokens()\n .fadeOut(500)\n .tint(\"#8ffe09\")\n .scaleToObject(2 * tokenScale)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .tint(\"#8ffe09\")\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.token_border.circle.static.blue.001\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .opacity(0.6)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .tint(\"#8ffe09\")\n .persist(true, { persistTokenPrototype: true })\n break;\n case \"slashing\":\n case \"piercing\":\n case \"bludgeoning\": seq.effect()\n .file(\"jb2a.extras.tmfx.outpulse.circle.02.normal\")\n .atLocation(tokenD)\n .size(4, {gridUnits: true})\n .playIf(damageType == \"bludgeoning\")\n .opacity(0.25)\n .effect()\n .file(\"jb2a.impact.ground_crack.orange.01\")\n .atLocation(tokenD)\n .belowTokens()\n .playIf(damageType == \"bludgeoning\")\n .filter(\"ColorMatrix\", {hue: -15,saturate: 1})\n .size(3.5, {gridUnits: true})\n .zIndex(1)\n .tint(\"#808080\")\n .effect()\n .file(\"jb2a.impact.ground_crack.still_frame.01\")\n .atLocation(tokenD)\n .playIf(damageType == \"bludgeoning\")\n .belowTokens()\n .fadeIn(2000)\n .filter(\"ColorMatrix\", {hue: -15,saturate: 1})\n .size(3.5, {gridUnits: true})\n .fadeOut(20000)\n .tint(\"#808080\")\n .zIndex(0)\n .effect()\n .file(\"jb2a.wind_stream.white\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .scaleToObject(tokenScale)\n .rotate(90)\n .fadeOut(1500)\n .mask()\n .fadeIn(700)\n .persist(true, { persistTokenPrototype: true })\n .effect()\n .file(\"jb2a.token_border.circle.static.blue.001\")\n .origin(\"arcane cascade\")\n .name(tokenD.name + \"'s Arcane Cascade\")\n .attachTo(tokenD) \n .tieToDocuments([args[1]?.item, tokenD])\n .fadeOut(3000)\n .opacity(0.6)\n .scaleToObject(2 * tokenScale)\n .fadeIn(700)\n .tint(\"#808080\")\n .persist(true, { persistTokenPrototype: true })\n break;\n }\n seq.play()\n} else if (args[0] == \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"arcane cascade\", object: tokenD })\n}","folder":null,"sort":0,"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.rBz1gNwQkWu8TidN"},"cf":{"id":"temp_s3arecn2xs"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.3.2","coreVersion":"10.288","createdTime":null,"modifiedTime":1667148553706,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}
{"name":"Add Effect","type":"script","scope":"global","author":"SCUQoZ7lvePPTab6","img":"icons/svg/daze.svg","command":"debug(\"Add Effect Macro\", args)\nlet effect\n\nif (args[2].on) effect = args[2].on;\n\nif (args[2].off && args[0] === \"off\") effect = args[2].off;\n\nasync function ask(source) {\n\tif (!args[2].ask || game.settings.get(\"pf2e-jb2a-macros\", \"autoAccept\")) {\n\t\tawait args[1].sourceToken.actor.createEmbeddedDocuments(\"Item\", [source])\n\t\treturn;\n\t};\n\tawait new Dialog({\n\t\ttitle: \"Add Effect?\",\n\t\tcontent: `\n\t\t<p>Do you want to add <b>\"${source.name}\"</b> to your character, <b>${args[1].sourceToken.actor.name}</b>?</p>\n\t\t<p><i>You can automatically accept these in PF2e Animation Macros settings.</i></p>\n `,\n\t\tbuttons: {\n\t\t\tbutton1: {\n\t\t\t\tlabel: \"Accept\",\n\t\t\t\tcallback: async () => { await args[1].sourceToken.actor.createEmbeddedDocuments(\"Item\", [source]) },\n\t\t\t\ticon: `<i class=\"fas fa-check\"></i>`\n\t\t\t},\n\t\t\tbutton2: {\n\t\t\t\tlabel: \"Decline\",\n\t\t\t\tcallback: async () => { },\n\t\t\t\ticon: `<i class=\"fas fa-times\"></i>`\n\t\t\t}\n\t\t},\n\t}).render(true);\n}\n\nif (!effect) return;\nconst ITEM_UUID = effect;\nconst source = await fromUuid(ITEM_UUID);\nawait ask(source)","ownership":{"default":0,"SCUQoZ7lvePPTab6":3},"flags":{"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.US5tGmPkyimygfcx"},"cf":{"id":"temp_6gsujam4gp6"}},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":1665450793356,"modifiedTime":1666345972226,"lastModifiedBy":"SCUQoZ7lvePPTab6"},"folder":null,"sort":0,"_id":"x3ZaL34wkz4LljPo"}
{"_id":"y2Hundr4PzbGNeys","name":"Bless","type":"script","author":"ynn7ZMgoRi8oPGYQ","img":"systems/pf2e/icons/spells/bless.webp","scope":"global","command":"const [tokenD, tokenScale] = await vauxsMacroHelpers(args)\n\nif (!args.length) args[0] = await Sequencer.EffectManager.getEffects({ origin: \"aura-effect-bless\", name: \"Pf2e x JB2A Aura - Bless*\", source: tokenD }).length ? \"off\" : \"on\";\n\nconst auraRadius = tokenD.auras.get(\"aura-effect-bless\")?.radius\nconst gridUnits = 1.5 + 3 * (isNaN(auraRadius) ? 1 : auraRadius / 5)\n\nif (args[0] == \"on\") {\n new Sequence(\"PF2e x JB2A Macros\")\n .effect()\n .file(\"jb2a.bless.400px.intro.yellow\")\n .scaleIn(0, 1000, {ease: \"easeInBounce\"})\n .atLocation(tokenD)\n .attachTo(tokenD)\n .name(\"Pf2e x JB2A Aura - Bless Intro\")\n .origin(\"aura-effect-bless\")\n .opacity(0.9)\n .size(gridUnits, { gridUnits: true })\n .waitUntilFinished(-2000)\n .effect()\n .delay(1500)\n .file(\"jb2a.bless.400px.loop.yellow\")\n .atLocation(tokenD)\n .fadeOut(500)\n .persist(true, { persistTokenPrototype: true })\n .attachTo(tokenD)\n .belowTokens(true)\n .origin(\"aura-effect-bless\")\n .name(\"Pf2e x JB2A Aura - Bless\")\n .scaleOut(2, 2500, {ease: \"easeOutCubic\"})\n .fadeOut(1000)\n .size(gridUnits, { gridUnits: true })\n .play()\n} else if (args[0] == \"off\") {\n await Sequencer.EffectManager.endEffects({ origin: \"aura-effect-bless\", name: \"Pf2e x JB2A Aura - Bless*\", source: tokenD })\n}","folder":null,"sort":0,"flags":{"core":{"sourceId":"Macro.eJJhPoLdv7ul62dc"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_o2l5kjd1mwj"}},"ownership":{"default":0,"ynn7ZMgoRi8oPGYQ":3},"_stats":{"systemId":"pf2e","systemVersion":"4.2.6","coreVersion":"10.288","createdTime":null,"modifiedTime":1665872439248,"lastModifiedBy":"SCUQoZ7lvePPTab6"}}