2022-05-16 23:48:38 -05:00

42 lines
94 KiB
Plaintext

{"_id":"2Kz94m5zinSq0pxq","name":"Toggle Entangled","permission":{"default":0,"g5E84yQWEXKWBl9L":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.0nnEBhT2P7XeoKl7"},"cf":{"id":"temp_pswasgs6ygg"}},"scope":"global","command":"main ()\n\nasync function main() {\n //Is a token selected\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n\n let tokens = canvas.tokens.controlled.map(token => {return token});\n\n for (let token of tokens) {\n if (token.actor.status.isEntangled) {\n await token.actor.update({\"data.status.isEntangled\": false})\n await token.actor.update({\"data.status.isDistracted\": false})\n } else {\n await token.actor.update({\"data.status.isBound\": false})\n await token.actor.update({\"data.status.isDistracted\": true})\n await token.actor.update({\"data.status.isEntangled\": true})\n }\n } // end for\n} //End main","author":"g5E84yQWEXKWBl9L","img":"systems/swade/assets/icons/status/status_entangled.svg","actorIds":[]}
{"_id":"4SRoZduQrF2o3MZK","name":"Invisibility","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"systems/swade/assets/icons/status/status_invisible.svg","scope":"global","command":"const powerEffectApply = game.macros.getName(\"Power Effect\");\n\nreturn await powerEffectApply.execute(\"Invisibility\");","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.01dTmSPBq0xJQJcm"},"scene-packer":{"sourceId":"Macro.4SRoZduQrF2o3MZK","hash":"86acbda4ecfadba35cb7adb877aea4bc164c06a6"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"5uYT6npGhh29j3Bq","name":"Toggle Holding","permission":{"default":0,"goVuB7uyVDPjAwfj":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.dsr95SKSNCDX70VO"},"cf":{"id":"temp_pswasgs6ygg"}},"scope":"global","command":"main ()\n\nasync function main() {\n\nconst effect = \"systems/swade/assets/icons/status/status_holding.svg\";\nconst effectName = \"Holding\";\n\n //Is a token selected\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n\n let tokens = canvas.tokens.controlled.map(token => {return token});\n\n for (let token of tokens) {\n await token.toggleEffect(effect);\n } // end for\n} //End main","author":"goVuB7uyVDPjAwfj","img":"systems/swade/assets/icons/status/status_holding.svg","actorIds":[]}
{"_id":"79YiKPX3WcmBeMzm","name":"Intangibility","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp","scope":"global","command":"const powerEffectApply = game.macros.getName(\"Power Effect\");\n\nreturn await powerEffectApply.execute(\"Intangibility\");","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.01dTmSPBq0xJQJcm"},"scene-packer":{"sourceId":"Macro.79YiKPX3WcmBeMzm","hash":"48cfba28bf13ab364cef9bdc7953f64c23d9c5e4"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"92LxuCERE2PKwgWn","name":"CancelSpellEffect","type":"script","author":"ygiRButlaf23fX9p","img":"icons/svg/cancel.svg","scope":"global","command":"const effect = args[0];\nconst targetIds = args[1];\nconst extra = args[2];\n\nasync function main() {\n for (const tokenId of targetIds) {\n let token = game.canvas.tokens.get(tokenId);\n let actor = token?.actor;\n if (!actor) continue;\n const active = actor.effects.find(e => e.data.label === effect.label);\n if (active) {\n await token.toggleEffect(effect, { active: false });\n console.log(\"Removed active effect\", effect.label, \"from\", token.name);\n }\n }\n}\nmain();","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"combat-utility-belt":{"macroTrigger":""},"advanced-macros":{"runAsGM":false},"scene-packer":{"sourceId":"Macro.LHPOj1ppx03VgI1R"},"cf":{"id":"temp_p20tzfcm449","path":"Spell Effect Macros","color":"#000000"}}}
{"_id":"9KVvOhKLlyZHrQ76","name":"Fly","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"systems/swade/assets/icons/status/status_flying.svg","scope":"global","command":"const powerEffectApply = game.macros.getName(\"Power Effect\");\n\nreturn await powerEffectApply.execute(\"Fly\");","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.01dTmSPBq0xJQJcm"},"scene-packer":{"sourceId":"Macro.9KVvOhKLlyZHrQ76","hash":"48cfba28bf13ab364cef9bdc7953f64c23d9c5e4"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"9RQzK3bB1im4N0Lw","name":"Summon Ally","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/symbols/circle-ouroboros.webp","scope":"global","command":"const ICON = 'icons/magic/symbols/circle-ouroboros.webp';\nconst ACTORFOLDER = \"Summon Ally\";\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens[0]);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(token) {\n let tokenList = token.name;\n let folder = game.folders.find(f => f.data.type == 'Actor' && f.data.name == ACTORFOLDER)\n let menuOptions = {\n title: \"Summon Ally\",\n defaultButton: \"cancel\",\n options: {}\n }\n let menuData = {\n inputs: [\n { type: 'header', label: 'Summon Ally' },\n { type: 'info', label: `${tokenList} is summoning an ally` },\n {\n type: 'info',\n label: `<table><thead>\n <tr><th>Rank</th><th>Cost</th><th>Servant</th></tr>\n </thead><tbody>\n <tr><td>Novice</td><td>2</td><td>Attendant</td></tr>\n <tr><td>Seasoned</td><td>4</td><td>Bodyguard</td></tr>\n <tr><td>Veteran</td><td>6*</td><td>Mirror Self*</td></tr>\n <tr><td>Heroic</td><td>8</td><td>Sentinel</td></tr>\n </tbody></table> \n `\n },\n {\n type: 'select',\n label: \"Ally to summon\",\n options: folder.contents.map(a => a.data.name)\n },\n {\n type: 'number',\n label: 'Number to spawn (+half total cost per addtl.)',\n options: 1\n },\n { type: 'checkbox', label: 'Bite/Claw (+1)', options: false }\n ],\n buttons: [\n { label: \"Apply\", value: \"apply\" },\n { label: \"Apply with Raise\", value: \"raise\" },\n { label: \"Cancel\", value: \"cancel\" }\n ]\n }\n\n let {buttons, inputs} = await warpgate.menu(menuData, menuOptions);\n let summonData = {\n raise: (buttons == \"raise\"), \n actorName: (inputs[3]),\n number: inputs[4],\n addBiteClaw: inputs[5],\n }\n summonData.actor = folder.contents.find(a => a.data.name == summonData.actorName);\n summonData.icon = summonData.actor.data.token.img;\n doWork(summonData, token);\n}\n\nasync function doWork(summonData, token) {\n console.log(\"Summon Ally\", token, summonData);\n let effectData = {\n icon: ICON,\n id: \"summonally\",\n label: \"Summoned Ally\",\n duration: { rounds: 5 },\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: [],\n };\n let mutateOptions = {\n comparisonKeys: { 'ActiveEffect': 'label' },\n name: \"Summoned Ally\",\n permanent: true,\n description: \"Summoned Ally\",\n }\n let mutate = {\n embedded: {\n ActiveEffect: {\n \"Summoned Ally\": effectData,\n }\n }\n };\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n let spawnOptions = {\n controllingActor: token.actor,\n duplicates: summonData.number,\n comparisonKeys: {'ActiveEffect': 'label'},\n crosshairs: {\n size: 1,\n icon: summonData.icon,\n label: `Summon ${summonData.actorName}`,\n drawOutline: false,\n rememberControlled: true\n }\n }\n let mutateData = {\n token: {\n actorLink: false,\n name: `${token.name}'s ${summonData.actor.data.token.name}`,\n },\n embedded: {\n Item: {}\n }\n }\n if (summonData.raise) {\n mutateData.embedded.Item.Resilient = {\n \"name\": \"Resilient\",\n \"type\": \"ability\",\n \"img\": \"systems/swade/assets/icons/ability.svg\",\n \"data\": {\n \"description\": \"<div class=\\\"swpf-core\\\">\\n<p>Some creatures, such as ogres or dire versions of common animals on Golarion, are tough to put down.</p>\\n<p>Resilient Extras can take one @Compendium[swpf-core-rules.swpf-rules.Wounds]{Wound} before they&rsquo;re @Compendium[swpf-core-rules.swpf-rules.Incapacitation]{Incapacitated}, Very Resilient Extras can take two. @Compendium[swpf-core-rules.swpf-rules.Wild Cards and Extras]{Wild Cards} can&rsquo;t be Resilient or Very Resilient. The abilities exist to bring select Extras a little closer to the heroes and villains who lead them.</p>\\n</div>\",\n \"notes\": \"\",\n \"additionalStats\": {},\n \"subtype\": \"special\",\n \"grantsPowers\": false\n },\n \"effects\": {},\n \"flags\": {\n \"core\": {\n \"sourceId\": \"Compendium.swpf-core-rules.swpf-abilities.kiu5yk2aQkUGwlHN\"\n },\n }\n }\n }\n \n if (summonData.addBiteClaw) {\n mutateData.embedded.Item[\"Bite/Claw\"] = {\n \"name\": \"Bite/Claw\",\n \"type\": \"weapon\",\n \"img\": \"icons/creatures/claws/claw-hooked-curved.webp\",\n \"data\": {\n \"description\": \"\",\n \"notes\": \"\",\n \"additionalStats\": {},\n \"quantity\": 1,\n \"weight\": 0,\n \"price\": 0,\n \"equippable\": true,\n \"equipped\": true,\n \"isVehicular\": false,\n \"actions\": {\n \"skill\": \"Fighting\",\n \"skillMod\": \"\",\n \"dmgMod\": \"\",\n \"additional\": {}\n },\n \"bonusDamageDie\": 6,\n \"damage\": \"@str+d6\",\n \"range\": \"\",\n \"rof\": \"1\",\n \"ap\": 0,\n \"parry\": 0,\n \"minStr\": \"\",\n \"shots\": 0,\n \"currentShots\": 0,\n \"ammo\": \"\",\n \"autoReload\": false\n },\n \"effects\": {},\n }\n }\n await warpgate.spawn(summonData.actorName, mutateData, {}, spawnOptions)\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"2330aea2aee15edc2f08b0bc010a12096b472242","sourceId":"Macro.9RQzK3bB1im4N0Lw"},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.9RQzK3bB1im4N0Lw"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"AVI34dUpDYCEm9w5","name":"AE_Companion_Macro(NAMEOFFORMACTOR)","type":"script","author":"ygiRButlaf23fX9p","img":"icons/svg/dice-target.svg","scope":"global","command":"const macro = game.macros.getName(\"shapeshift_AE_form\");\nlet value = await macro.execute(args[0]);\nreturn value;","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"combat-utility-belt":{"macroTrigger":""},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.BEcVfWAVnXW0QKTR"},"scene-packer":{"sourceId":"Macro.BEcVfWAVnXW0QKTR"},"cf":{"id":"temp_ocr9zgcmo7","color":"#000000"}}}
{"_id":"B07BTxFEkIpxWK3p","name":"Adventure Card","permission":{"default":0,"mrhsZpAiXth4sLah":3},"type":"script","flags":{"core":{"sourceId":"Compendium.swade-macros-simple.SWADE-Macros.dj9ISCPKpZRu43ud"},"cf":{"id":"temp_natl1zonf8"}},"scope":"global","command":"/* Mini Tutorial\r\n1 - Import the cards to a rollable table (i recommend Card Deck Importer - follow the instructions there). Name the rollable table AdventureDeck or change below.\r\n2 - Create an item (gear) named Adventure Card. Give it to the characters that will use it.\r\n3 - Run the macro.\r\n*/\r\n\r\nvar rollTableName = \"AdventureDeck\"; /// name of the rolltable with adventure cards\r\nvar itemCard = \"Adventure Card\"; /// name of the item holding the adventure card\r\n\r\nlet chars = game.actors.entities.filter((t) => t.data.type === \"character\"); /// all the chars\r\nlet optionchars = \"\";\r\nvar allchars = [];\r\n\r\nfor (const char of chars) {\r\n let myitem = char.items.find((i) => i.name === itemCard);\r\n if (myitem !== null) {\r\n /// filters the ones that has the item\r\n optionchars += `<option value=\"` + char._id + `\">` + char.name + `</option>`;\r\n allchars.push(char._id);\r\n }\r\n}\r\n\r\nif (!optionchars) {\r\n /// no chars\r\n ui.notifications.warn(`No character has the item ` + itemCard + `.`, {});\r\n}\r\n\r\nlet template =\r\n `<p>How many cards? <input type=\"number\" value=\"1\" id=\"qtde\" style=\"width:50px\" /></p>\r\n<p>For wich character? <select id=\"jogs\"><option value=\"todos\">All</option>` +\r\n optionchars +\r\n `</select></p>`;\r\nnew Dialog({\r\n title: \"Give Adventure Cards\",\r\n content: template,\r\n buttons: {\r\n ok: {\r\n label: \"Give\",\r\n callback: function (html) {\r\n applyFormOptions(html);\r\n },\r\n },\r\n cancel: {\r\n label: \"Cancel\",\r\n },\r\n },\r\n}).render(true);\r\n\r\nfunction drawFromTable(tableName) {\r\n /// thanks to Forien for this. Check his modules https://foundryvtt.com/community/forien\r\n const table = game.tables.getName(tableName);\r\n if (!table) {\r\n ui.notifications.warn(`Table ${tableName} not found.`, {});\r\n return;\r\n }\r\n let results = table.roll().results;\r\n\r\n // if table is without replacemenets, mark results as drawn\r\n if (table.data.replacement === false) {\r\n results = results.map((r) => {\r\n r.drawn = true;\r\n return r;\r\n });\r\n\r\n table.updateEmbeddedEntity(\"TableResult\", results);\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction applyFormOptions(html) {\r\n let qtde = html.find(\"#qtde\")[0].value;\r\n let selchar = html.find(\"#jogs\")[0].value;\r\n\r\n if (selchar === \"todos\") {\r\n for (let i = 0; i < allchars.length; i++) {\r\n giveCards(qtde, allchars[i]);\r\n }\r\n } else {\r\n giveCards(qtde, selchar);\r\n }\r\n\r\n let chatData = {\r\n user: game.user._id,\r\n speaker: ChatMessage.getSpeaker(),\r\n content: \"Adventure Cards given\",\r\n };\r\n ChatMessage.create(chatData, {});\r\n}\r\n\r\nfunction giveCards(howmany, actorId) {\r\n let char = game.actors.get(actorId);\r\n let myitem = char.items.find((i) => i.name === itemCard);\r\n let updatedesc = \"\";\r\n\r\n for (let i = 1; i <= howmany; i++) {\r\n let results = drawFromTable(rollTableName);\r\n updatedesc +=\r\n \"<p>@Compendium[\" + results[0].collection + \".\" + results[0].resultId + \"]{\" + results[0].text + \"}</p>\";\r\n }\r\n\r\n myitem.update({ [\"data.description\"]: updatedesc });\r\n}\r\n","author":"mrhsZpAiXth4sLah","img":"icons/svg/chest.svg","actorIds":[]}
{"_id":"CZvzvDhyY6oUHdKN","name":"Toggle Flying","permission":{"default":0,"goVuB7uyVDPjAwfj":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.dsr95SKSNCDX70VO"},"cf":{"id":"temp_pswasgs6ygg"}},"scope":"global","command":"main ()\n\nasync function main() {\n\nconst effect = \"systems/swade/assets/icons/status/status_flying.svg\";\nconst effectName = \"Flying\";\n\n //Is a token selected\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n\n let tokens = canvas.tokens.controlled.map(token => {return token});\n\n for (let token of tokens) {\n await token.toggleEffect(effect);\n } // end for\n} //End main","author":"goVuB7uyVDPjAwfj","img":"systems/swade/assets/icons/status/status_flying.svg","actorIds":[]}
{"_id":"EMnNSHCl45UMUnJu","name":"Warrior's Gift","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/control/modfiy-luck-fortune-gray.webp","scope":"global","command":"const ICON = 'icons/magic/control/modfiy-luck-fortune-gray.webp'\n\nconst PACKNAMES = [\n 'swade-core-rules.swade-edges',\n 'swpf-core-rules.swpf-edges',\n]\n\nconst EDGENAMES = [\n 'Block',\n 'Improved Block',\n 'Brawler',\n 'Bruiser',\n 'Calculating',\n 'Combat Reflexes',\n 'Counterattack',\n 'Improved Counterattack',\n 'Dead Shot',\n 'Dodge',\n 'Extraction',\n 'Improved Extraction',\n 'Feint',\n 'First Strike',\n 'Improved First Strike',\n 'Formation Fighter',\n 'Free Runner',\n 'Frenzy',\n 'Improved Frenzy',\n 'Giant Killer',\n 'Hard to Kill',\n 'Harder to Kill',\n 'Improvisational Fighter',\n 'Iron Jaw',\n 'Killer Instinct',\n 'Level Headed',\n 'Improved Level Headed',\n 'Marksman',\n 'Mighty Blow',\n 'Nerves of Steel',\n 'Improved Nerves of Steel',\n 'No Mercy',\n 'Rapid Reload',\n 'Rapid Shot',\n 'Improved Rapid Shot',\n 'Steady Hands',\n 'Sweep',\n 'Improved Sweep',\n 'Trademark Weapon',\n 'Improved Trademark Weapon',\n 'Two-Weapon Fighting',\n]\n\nlet EDGES = new Map()\nfor (let edgeName of EDGENAMES) {\n for (let packName of PACKNAMES) {\n let edge = game.packs.get(packName)?.index?.find(i => i.name == edgeName);\n if (edge) {\n EDGES.set(edgeName, {pack: packName, edge: edge._id});\n break;\n }\n }\n}\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let menuOptions = {\n title: \"Warrior's Gift\",\n defaultButton: \"cancel\",\n options: {}\n }\n let edgeNames = Array.from(EDGES.keys()).sort();\n let menuData = {\n inputs: [\n {type: 'header', label: \"Warrior's Gift\"},\n {type: 'info', label: `Apply Warrior's Gift to ${tokenList}`},\n {type: 'select', label: \"Edge\", options: edgeNames},\n ],\n buttons: [\n {label: \"Apply\", value: \"apply\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let {buttons, inputs} = await warpgate.menu(menuData, menuOptions);\n if (buttons && buttons != \"cancel\") {\n await createEffect(tokens, inputs[2]);\n }\n}\n\nasync function createEffect(tokens, edgeName) {\n const effectIcon = ICON;\n for (const token of tokens) {\n const effectName = `Warrior's Gift (${edgeName})`;\n const effectId = `warriorsgift${edgeName}`;\n const edgeId = EDGES.get(edgeName).edge;\n const pack = EDGES.get(edgeName).pack;\n const edge = await game.packs.get(pack).getDocument(edgeId);\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: [],\n };\n let edgeData = {...edge.data};\n let mutate = {\n embedded: {\n Item: {\n [edgeName]: edgeData,\n },\n ActiveEffect: {\n [effectName]: effectData,\n }\n }\n };\n edgeData.effects.forEach(edgeEffect => {\n mutate.embedded.ActiveEffect[edgeEffect.data.label] = edgeEffect.data\n })\n \n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: false,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"1f36d4f0d8aab97fdee83a6c5c4b128f1a25d323","sourceId":"Macro.EMnNSHCl45UMUnJu"},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.EMnNSHCl45UMUnJu"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"Elp8657828AQ5fUL","name":"Card Draw","permission":{"default":0,"mrhsZpAiXth4sLah":3},"type":"script","flags":{"core":{"sourceId":"Compendium.swade-macros-simple.SWADE-Macros.RhmF9WWSB93bXUeF"},"cf":{"id":"temp_natl1zonf8"}},"scope":"global","command":"/*\r\nFeatures\r\n- Draw n cards placing them in the scene\r\n- This macro can reset the table preventing from the error\r\n- This macro can line up the cards\r\n*/\r\n\r\ngetRequirements();\r\n\r\nfunction getRequirements() {\r\n //How Many Cards to Draw\r\n //Width/Height\r\n //Which Table to Draw From\r\n let cardsList = \"\";\r\n Array.from(game.tables).map((el) => {\r\n cardsList += `<option value=\"${el.data.name}\">${el.data.name}</option>`;\r\n });\r\n\r\n let template = `\r\n <p>Table to Draw From: <select id=\"tableName\">${cardsList}</select></p>\r\n <p>\r\n Cards to Draw (Lines x Columns): <input id=\"dogFightLines\" type=\"number\" min=\"1\" style=\"width: 50px;\" value=1> x <input id=\"dogFightColumns\" type=\"number\" min=\"1\" style=\"width: 50px;\" value=9>\r\n </p> \r\n <p>\r\n Height: <input id=\"height\" type=\"number\" min=\"1\" style=\"width: 50px\" value=150>\r\n Width: <input id=\"width\" type=\"number\" min=\"1\" style=\"width: 50px\" value=107>\r\n </p>\r\n <br />\r\n <p>\r\n <input type=\"checkbox\" id=\"reset\" checked/>\r\n Reset Table?\r\n </p> \r\n <p>\r\n <input type=\"checkbox\" id=\"stackupcards\"/>\r\n Just stack up all cards\r\n </p> \r\n <br /> \r\n <p>\r\n <h3>Horizontal spacing between cards</h3>\r\n <input id=\"spacingx\" type=\"range\" min=\"0\" max=\"100\" value=\"20\" step=\"5\">\r\n </p>\r\n <p>\r\n <h3>Vertical spacing between cards (dogfight only)</h3>\r\n <input id=\"spacingy\" type=\"range\" min=\"0\" max=\"100\" value=\"100\" step=\"5\"> \r\n </p>\r\n `;\r\n new Dialog({\r\n title: \"Draw Cards To Table\",\r\n content: template,\r\n buttons: {\r\n ok: {\r\n label: \"Draw\",\r\n callback: async (html) => {\r\n makeTiles(html);\r\n },\r\n },\r\n cancel: {\r\n label: \"Cancel\",\r\n },\r\n },\r\n }).render(true);\r\n}\r\n\r\nasync function makeTiles(html) { \r\n let spacingx = html.find(\"#spacingx\")[0].value/100;\r\n let spacingy = html.find(\"#spacingy\")[0].value/100;\r\n let dogFightLines = html.find(\"#dogFightLines\")[0].value;\r\n let dogFightColumns = html.find(\"#dogFightColumns\")[0].value; \r\n let resetTable = html.find(\"#reset\")[0].value;\r\n const stackupcards = html.find(\"#stackupcards\")[0].checked;\r\n let tableName = html.find(\"#tableName\")[0].value;\r\n let cardsToDraw = dogFightLines*dogFightColumns;\r\n let _height = html.find(\"#height\")[0].value;\r\n let _width = html.find(\"#width\")[0].value;\r\n\r\n if (resetTable=='on') {\r\n await game.tables.find((el) => el.data.name == tableName).reset();\r\n }\r\n\r\n let cardDraws = (\r\n await game.tables\r\n .find((el) => el.data.name == tableName)\r\n .drawMany(cardsToDraw)\r\n ).results;\r\n\r\n let centerX = game.scenes.active.data.width / 3;\r\n let centerY = game.scenes.active.data.height / 2;\r\n \r\n let deltaX = 0;\r\n let deltaY = 0;\r\n let counter = 0;\r\n \r\n //console.log(spacingx + '/' + spacingy + ' stackupcards:' + (stackupcards!='on'));\r\n for (let y = 0; y < dogFightLines; y++) {\r\n deltaY = ( _height*y + _height*spacingy*y );\r\n for (let x = 0; x < dogFightColumns; x++) { \r\n deltaX = ( _width*x + _width*spacingx*x ); \r\n if (stackupcards) {\r\n deltaX = 0;\r\n deltaY = 0; \r\n }\r\n await Tile.create({\r\n img: cardDraws[counter].img,\r\n width: _width,\r\n height: _height,\r\n x: centerX + deltaX,\r\n y: centerY + deltaY\r\n }); \r\n //console.log('x:' + x + ' y:' + y + ' counter:' + counter + ' deltaX:' + deltaX + ' deltaY:' + deltaY);\r\n counter = counter + 1;\r\n //console.log('centerX: ' + centerX + ' / deltaX: ' + deltaX + ' / centerX+deltaX:' + (centerX+deltaX) ); \r\n } \r\n }\r\n}","author":"mrhsZpAiXth4sLah","img":"icons/svg/thrust.svg","actorIds":[]}
{"_id":"FngiDIs9HR2p0eY1","name":"Sloth/Speed","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/skills/movement/feet-winged-boots-glowing-yellow.webp","scope":"global","command":"const SPEEDICON = 'icons/skills/movement/feet-winged-boots-glowing-yellow.webp'\nconst SLOTHICON = 'icons/magic/control/encase-creature-spider-hold.webp'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let menuOptions = {\n title: 'Sloth/Speed',\n defaultButton: \"Cancel\",\n options: {}\n };\n let menuData = {\n inputs: [\n { type: 'header', label: 'Sloth/Speed' },\n { type: 'info', label: `Affected Tokens: ${tokenList}` },\n { type: 'info', label: \"Speed or Sloth\" },\n { type: 'radio', label: 'Speed', options: ['isspeed', true] },\n { type: 'radio', label: 'Sloth', options: ['isspeed', false] },\n ],\n buttons: [\n { label: \"Apply\", value: \"apply\" },\n { label: \"Apply with raise\", value: \"raise\" },\n { label: \"Cancel\", value: \"cancel\" }\n ]\n }\n let { buttons, inputs } = await warpgate.menu(menuData, menuOptions);\n if (buttons != \"cancel\") {\n let direction = inputs[3] || inputs[4];\n createEffect(tokens, direction, buttons);\n }\n}\n\nasync function createEffect(tokens, direction, buttons) {\n const raise = (buttons == 'raise');\n const effectName = `${raise ? \"Major\" : \"Minor\"} ${direction}`;\n const effectId = `${raise ? \"Major\" : \"Minor\"}${direction}`;\n const effectIcon = (direction == \"Speed\" ? SPEEDICON : SLOTHICON)\n for (const token of tokens) {\n let tokenDoc = token.document;\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: []\n };\n let mode = foundry.CONST.ACTIVE_EFFECT_MODES.MULTIPLY;\n if (direction == \"Speed\") {\n effectData.duration = { rounds: 5 };\n effectData.changes.push({\n key: 'data.stats.speed.value',\n mode: mode,\n value: 2\n })\n } else {\n effectData.changes.push({\n key: 'data.stats.speed.value',\n mode: mode,\n value: 0.5\n })\n }\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: { 'ActiveEffect': 'label' },\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"0318a6a5650fcdfffa0a670ca22c559c503bc575","sourceId":"Macro.FngiDIs9HR2p0eY1"},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.FngiDIs9HR2p0eY1"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"FntCnwyd0hrKppdd","name":"Protection","type":"script","author":"ygiRButlaf23fX9p","img":"systems/swade/assets/icons/status/status_protection.svg","scope":"global","command":"const targets = canvas.tokens.controlled;\nconst extra = { flavor: \"Magic Shield\" }\nconst spellEffect = game.macros.getName(\"ApplySpellEffect\");\nconst label = \"Protection\";\nconst id = \"protection\";\nconst icon = \"systems/swade/assets/icons/status/status_protection.svg\";\nconst duration = 5;\n\nmain();\n\nasync function main() {\n let effect = {\n changes: [\n { key: \"data.stats.toughness.armor\", value: 2, mode: 2 }\n ],\n duration: { rounds: duration },\n icon: icon,\n label: label,\n id: id\n }\n\n let applyChanges = false;\n let d = new Dialog({\n title: `Applying ${label} effects`,\n content: `Apply ${label} with raise?`,\n buttons: {\n raise: {\n icon: '<i class=\"fas fa-arrow-alt-circle-up\"></i>',\n label: 'With raise',\n callback: () => {\n applyChanges = true;\n effect.label = effect.label + \" with raise\";\n effect.changes[0].key = 'data.stats.toughness.value';\n }\n },\n noraise: {\n icon: '<i class=\"fas fa-arrow-alt-circle-right\"></i>',\n label: 'Normal Success',\n callback: () => { applyChanges = true }\n }\n },\n default: \"noraise\",\n close: html => {\n if (applyChanges) {\n spellEffect.execute(effect, targets, extra);\n }\n }\n });\n d.render(true);\n}","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"scene-packer":{"sourceId":"Macro.aIbfmIoI2JVsbg9D"},"cf":{"id":"temp_p20tzfcm449","path":"Spell Effect Macros","color":"#000000"},"core":{"sourceId":"Macro.aIbfmIoI2JVsbg9D"}}}
{"_id":"Fvw5ksJfaqV4sisJ","name":"Toggle Stunned","permission":{"default":0,"g5E84yQWEXKWBl9L":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.0nnEBhT2P7XeoKl7"},"cf":{"id":"temp_pswasgs6ygg"}},"scope":"global","command":"main ()\n\nasync function main() {\n //Is a token selected\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n const proneEffectName = \"SWADE.Prone\";\n let proneEffect = CONFIG.statusEffects.find(s => s.label == proneEffectName);\n\n let tokens = canvas.tokens.controlled.map(token => {return token});\n\n for (let token of tokens) {\n if (token.actor.status.isStunned) {\n await token.actor.update({\"data.status.isStunned\": false})\n } else {\n // add stunned and vulnerable and distracted and prone\n await token.actor.update({\"data.status.isStunned\": true})\n await token.actor.update({\"data.status.isDistracted\": true})\n if (!token.actor.effects.find(e => e.data.icon == proneEffect.icon)) {\n await token.toggleEffect(proneEffect);\n }\n await token.actor.update({\"data.status.isVulnerable\": true})\n }\n } // end for\n} //End main","author":"g5E84yQWEXKWBl9L","img":"systems/swade/assets/icons/status/status_stunned.svg","actorIds":[]}
{"_id":"GdDAPaUnymrqdVrM","name":"Toggle Prone","permission":{"default":0,"goVuB7uyVDPjAwfj":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.0nnEBhT2P7XeoKl7"},"cf":{"id":"temp_pswasgs6ygg"}},"scope":"global","command":"main ()\n\nasync function main() {\n //Is a token selected\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n const effectName = \"SWADE.Prone\";\n let effect = CONFIG.statusEffects.find(s => s.label == effectName);\n\n let tokens = canvas.tokens.controlled.map(token => {return token});\n\n for (let token of tokens) {\n await token.toggleEffect(effect);\n } // end for\n} //End main","author":"goVuB7uyVDPjAwfj","img":"systems/swade/assets/icons/status/status_prone.svg","actorIds":[]}
{"_id":"HRVgvCZuAPR2WCMH","name":"Toggle Bound","permission":{"default":0,"g5E84yQWEXKWBl9L":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.0nnEBhT2P7XeoKl7"},"cf":{"id":"temp_pswasgs6ygg"}},"scope":"global","command":"main ()\n\nasync function main() {\n //Is a token selected\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n\n let tokens = canvas.tokens.controlled.map(token => {return token});\n\n for (let token of tokens) {\n if (token.actor.status.isBound) {\n await token.actor.update({\"data.status.isBound\": false})\n await token.actor.update({\"data.status.isDistracted\": false})\n await token.actor.update({\"data.status.isVulnerable\": false})\n } else {\n await token.actor.update({\"data.status.isBound\": true})\n await token.actor.update({\"data.status.isDistracted\": true})\n await token.actor.update({\"data.status.isEntangled\": false})\n await token.actor.update({\"data.status.isVulnerable\": true})\n }\n } // end for\n} //End main","author":"g5E84yQWEXKWBl9L","img":"systems/swade/assets/icons/status/status_bound.svg","actorIds":[]}
{"_id":"Ih0MlJcIkTiSWsAm","name":"#[CF_tempEntity]","type":"chat","author":"ygiRButlaf23fX9p","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"cf":{"id":"temp_p20tzfcm449","path":"Spell Effect Macros","color":"#000000","name":"Spell Effect Macros","children":["lm51dm7e9yhTx4os","fzkUWlTKCJ68nEzL","92LxuCERE2PKwgWn","FntCnwyd0hrKppdd","yV3XNCfgHpGrREt0","tjaqN9gedJpYFgbu"],"folderPath":[]}}}
{"_id":"K51dscyigZyR1Kma","name":"Elemental Manipulation","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/symbols/elements-air-earth-fire-water.webp","scope":"global","command":"const ICON = 'icons/magic/symbols/elements-air-earth-fire-water.webp'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let dialogOptions = {\n title: \"Elemental Manipulation\",\n content: `Apply <em>Elemental Manipulation</em> to ${tokenList}`,\n default: \"cancel\",\n buttons: [\n {label: \"Apply\", value: \"apply\"},\n {label: \"Apply with raise\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let choice = await warpgate.buttonDialog(dialogOptions);\n if (choice != \"cancel\") {\n createEffect(tokens, choice);\n }\n}\n\nasync function createEffect(tokens, choice) {\n let effectName = 'Elemental Manipulation';\n let effectId = 'elementalmanipulation';\n const effectIcon = ICON;\n let changes = [];\n for (const token of tokens) {\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: changes,\n };\n let range = token.actor.data.data.attributes.smarts.die.sides.toString()\n let itemMutate = {\n embedded: {\n Item: {\n \"Elemental Manipulation: Thrown Rocks\": {\n \"name\": \"Elemental Manipulation: Thrown Rock\",\n \"type\": \"weapon\",\n \"img\": \"icons/magic/earth/projectile-stone-ball-orange.webp\",\n \"data\": {\n \"description\": \"\",\n \"notes\": \"\",\n \"additionalStats\": {},\n \"quantity\": 1,\n \"weight\": 0,\n \"price\": 0,\n \"equippable\": true,\n \"equipped\": true,\n \"isArcaneDevice\": false,\n \"isVehicular\": false,\n \"mods\": 1,\n \"actions\": {\n \"skill\": \"Athletics\",\n \"skillMod\": \"\",\n \"dmgMod\": \"\",\n \"additional\": {}\n },\n \"bonusDamageDie\": 6,\n \"damage\": \"2d4\",\n \"range\": range,\n \"rof\": \"1\",\n \"ap\": 0,\n \"parry\": 0,\n \"minStr\": \"\",\n \"shots\": 0,\n \"currentShots\": 0,\n \"ammo\": \"\",\n \"autoReload\": false\n },\n \"effects\": [],\n \"folder\": null,\n \"sort\": 0,\n \"permission\": { \"default\": 0 },\n \"flags\": {}\n },\n \"Elemental Manipulation: Fire Blast\": {\n \"name\": \"Elemental Manipulation: Fire Blast\",\n \"type\": \"weapon\",\n \"img\": \"icons/magic/fire/explosion-fireball-medium-orange.webp\",\n \"data\": {\n \"description\": \"\",\n \"notes\": \"\",\n \"additionalStats\": {},\n \"quantity\": 1,\n \"weight\": 0,\n \"price\": 0,\n \"equippable\": true,\n \"equipped\": true,\n \"isArcaneDevice\": false,\n \"isVehicular\": false,\n \"mods\": 1,\n \"actions\": {\n \"skill\": \"Athletics\",\n \"skillMod\": \"\",\n \"dmgMod\": \"\",\n \"additional\": {}\n },\n \"bonusDamageDie\": 6,\n \"damage\": \"2d4\",\n \"range\": range,\n \"rof\": \"1\",\n \"ap\": 0,\n \"parry\": 0,\n \"minStr\": \"\",\n \"shots\": 0,\n \"currentShots\": 0,\n \"ammo\": \"\",\n \"autoReload\": false\n },\n \"effects\": [],\n \"folder\": null,\n \"sort\": 0,\n \"permission\": { \"default\": 0 },\n \"flags\": {}\n }\n }\n }\n }\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n mutateOptions.permanent = false;\n await warpgate.mutate(token.document, itemMutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"0318a6a5650fcdfffa0a670ca22c559c503bc575","sourceId":"Macro.K51dscyigZyR1Kma"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"OAC1Ofm7iEjU9KAm","name":"Growth/Shrink","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/control/silhouette-grow-shrink-blue.webp","scope":"global","command":"const GROWTHICON = 'icons/magic/control/silhouette-grow-shrink-blue.webp'\nconst SHRINKICON = 'icons/magic/control/silhouette-grow-shrink-tan.webp'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let menuOptions = {\n title: 'Growth/Shrink',\n defaultButton: \"Cancel\",\n options: {}\n };\n let menuData = {\n inputs: [\n { type: 'header', label: 'Growth/Shrink' },\n { type: 'info', label: `Affected Tokens: ${tokenList}` },\n { type: 'number', label: 'Number of steps (2pp ea)' },\n { type: 'info', label: \"Grow or Shrink\" },\n { type: 'radio', label: 'Growth', options: ['isspeed', true] },\n { type: 'radio', label: 'Shrink', options: ['isspeed', false] },\n ],\n buttons: [\n { label: \"Apply\", value: \"apply\" },\n { label: \"Cancel\", value: \"cancel\" }\n ]\n }\n let { buttons, inputs } = await warpgate.menu(menuData, menuOptions);\n if (buttons && buttons != \"cancel\") {\n let direction = inputs[4] || inputs[5];\n let steps = inputs[2];\n createEffect(tokens, steps, direction, buttons);\n }\n}\n\nasync function createEffect(tokens, steps, direction, buttons) {\n const effectName = direction\n const effectId = direction\n const effectIcon = (direction == \"Growth\" ? GROWTHICON : SHRINKICON)\n for (const token of tokens) {\n let tokenDoc = token.document;\n let mode = foundry.CONST.ACTIVE_EFFECT_MODES.ADD;\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: []\n };\n let strDie = token.actor.data.data.attributes.strength.die.sides;\n let size = token.actor.data.data.stats.size;\n let strDieChange = 0;\n let strModChange = 0;\n let sizeChange = 0;\n if (direction == \"Growth\") {\n strDieChange = 2 * steps;\n sizeChange = steps;\n while (strDie + strDieChange > 12) {\n strDieChange -= 2;\n strModChange += 1;\n }\n } else {\n let stepCount = steps;\n while (size + sizeChange > -2 && stepCount > 0) {\n stepCount -= 1;\n strDieChange -= 2;\n sizeChange -= 1;\n }\n if (strDie + strDieChange < 4) {\n strDieChange = (4 - strDie);\n }\n }\n effectData.changes.push(\n {\n key: 'data.stats.size',\n mode: mode,\n value: sizeChange\n }\n )\n effectData.changes.push(\n {\n key: 'data.attributes.strength.die.sides',\n mode: mode,\n value: strDieChange,\n }\n )\n effectData.changes.push(\n {\n key: 'data.attributes.strength.die.modifier',\n mode: mode,\n value: strModChange\n }\n )\n size += sizeChange;\n let scale = 0;\n let height = 1;\n let width = 1;\n switch (size) {\n case -2: scale = 0.6; break;\n case -1: scale = 0.8; break\n case 0: break;\n case 1: scale = 1.2; break;\n case 2: scale = 1.5; break;\n case 3: scale = 2; break;\n case 4: height = 2; width = 2; scale = 1; break;\n case 5: height = 2; width = 2; scale = 1.2; break;\n case 6: height = 2; width = 2; scale = 1.5; break;\n case 7: height = 2; width = 2; scale = 1.5; break;\n case 8: height = 3; width = 3; scale = 1; break;\n case 9: height = 3; width = 3; scale = 1.2; break;\n case 10: height = 3; width = 3; scale = 1.4; break;\n case 11: height = 3; width = 3; scale = 1.6; break;\n }\n if (size < -2) {\n scale = 0.5;\n } else if (size > 11) {\n scale = 1\n height = 4\n width = 4\n }\n let tempMutate = {\n token: {\n scale: scale,\n height: height,\n width: width\n }\n }\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: { 'ActiveEffect': 'label' },\n name: effectName,\n description: effectName,\n }\n await warpgate.mutate(token.document, tempMutate, {}, mutateOptions);\n mutateOptions.permanent = true;\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"bf9a764f896185e473234bc726355cbca362293b","sourceId":"Macro.OAC1Ofm7iEjU9KAm"},"advanced-macros":{"runAsGM":false},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"name":"Fear Table","permission":{"default":0,"goVuB7uyVDPjAwfj":3},"type":"script","flags":{"core":{"sourceId":"Macro.tt5wQLZWCHErlY8L"},"combat-utility-belt":{"macroTrigger":""}},"scope":"global","command":"// Ask for Fear Penalty\n// Roll On the Fear Table with the Penalty\n\nmain()\n\nasync function main(){\n let fearTable = await game.packs.get(\"swade-core-rules.swade-tables\").getEntity(game.packs.get(\"swade-core-rules.swade-tables\").index.find(el => el.name == \"Fear Table\")._id)\n new Dialog({\n title:\"Fear Table Modifier\",\n content: `\n <div style=\"display:flex\">\n <p style=\"flex:3\">Creature Fear Penalty (Positive Number): </p>\n <input type=\"number\" id=\"fearPenalty\" value=0 style=\"flex:1\"/>\n </div> \n `,\n buttons: {\n roll: {\n label: \"Roll\",\n callback: (html) => {\n let mod = html.find(\"#fearPenalty\")[0].value;\n console.log(mod)\n fearTable.draw({roll:new Roll(`1d20 + ${mod}`)})\n }\n }, \n cancel: {\n label: \"Cancel\"\n }\n }\n }).render(true)\n}","author":"goVuB7uyVDPjAwfj","img":"systems/swade/assets/icons/status/status_frightened.svg","actorIds":[],"_id":"Ry6NLK24QaSVA1dM"}
{"name":"AE_Companion_Macro(Small Air Elemental Form)","type":"script","author":"ygiRButlaf23fX9p","img":"icons/svg/dice-target.svg","scope":"global","command":"const macro = game.macros.getName(\"shapeshift_AE_form\");\nlet value = await macro.execute(args[0]);\nreturn value;","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"combat-utility-belt":{"macroTrigger":""},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.BEcVfWAVnXW0QKTR"},"scene-packer":{"sourceId":"Macro.bA8Q9JRHD6BTBsi2","hash":"ff08fce7de98bccd0cb4b9e4feccf4952428fad6"},"cf":{"id":"temp_ocr9zgcmo7","path":"Shape Change Macros for AE","color":"#000000"}},"_id":"T2zPslXg2KNLoUGI"}
{"name":"#[CF_tempEntity]","permission":{"default":0,"goVuB7uyVDPjAwfj":3},"type":"chat","flags":{"cf":{"id":"temp_pswasgs6ygg","folderPath":[],"color":"#000000","fontColor":"#FFFFFF","name":"States","children":[],"icon":""}},"scope":"global","command":"","author":"goVuB7uyVDPjAwfj","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"T7HZINkdw1Z6u1Fc"}
{"_id":"U6ysKunxzRsvhnR6","name":"Protection (SWPF)","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"systems/swade/assets/icons/status/status_protection.svg","scope":"global","command":"const ICON = 'systems/swade/assets/icons/status/status_protection.svg'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let dialogOptions = {\n title: \"Protection\",\n content: `Apply <em>Protection</em> to ${tokenList}`,\n default: \"cancel\",\n buttons: [\n {label: \"Apply (+2 armor)\", value: \"apply\"},\n {label: \"Apply with raise (+2 toughness)\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let choice = await warpgate.buttonDialog(dialogOptions);\n if (choice != \"cancel\") {\n createEffect(tokens, choice);\n }\n}\n\nasync function createEffect(tokens, choice) {\n let effectName = 'Protection';\n let effectId = 'protection';\n const effectIcon = ICON;\n let changes = [\n {\n key: 'data.stats.toughness.armor',\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.UPGRADE,\n value: 2,\n priority: 0\n }\n ];\n if (choice == 'raise') {\n changes[0].key = 'data.stats.toughness.value';\n }\n for (const token of tokens) {\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: changes,\n };\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"957aefe73814ccfb53a7ae2d2cbfa68bc3200c6d","sourceId":"Macro.U6ysKunxzRsvhnR6"},"core":{"sourceId":"Macro.U6ysKunxzRsvhnR6"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"name":"Raise Calculator (Dynamic)","permission":{"default":0,"g5E84yQWEXKWBl9L":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""},"furnace":{"runAsGM":false},"core":{"sourceId":"Macro.onkkfY2zBddVpiLr"},"exportSource":{"world":"swadetest","system":"swade","coreVersion":"0.7.9","systemVersion":"0.18.3"}},"scope":"global","command":"let text = `<img style=\"border: 0;\" src=\"modules/swade-mb-shared/assets/icons/misc/raise_black.svg\" alt=\"\" width=\"25\" height=\"25\" /> Your Raises will show here once you leave the Result field.`;\n\nnew Dialog({\n title: 'Raise Calculator',\n content: `\n <form>\n <div class=\"form-group\">\n <label><img src=\"modules/swade-mb-shared/assets/icons/misc/bullseye.svg\" alt=\"\" width=\"25\" height=\"25\" style=\"border: 0;\" /> <b>Target Number:</b></label> \n <input name=\"target\" placeholder=\"0\" type=\"text\" autofocus onClick=\"this.select();\"/>\n </div>\n <div class=\"form-group\">\n <label><img src=\"modules/swade-mb-shared/assets/icons/misc/rolling-dices.svg\" alt=\"\" border=\"0\" width=\"25\" height=\"25\" style=\"border: 0;\" /> <b>Result:</b></label> \n <input name=\"result\" placeholder=\"0\" type=\"text\" onClick=\"this.select();\"/>\n </div>\n <p class=\"calculation\">${text}</p>\n </form>`,\n buttons: {},\n render: ([dialogContent]) => {\n dialogContent.querySelector(`input[name=\"target\"`).focus();\n dialogContent.querySelector(`input[name=\"result\"`).addEventListener(\"input\", (event) => {\n const textInput = event.target;\n const form = textInput.closest(\"form\")\n const calcResult = form.querySelector(\".calculation\");\n const target = form.querySelector('input[name=\"target\"]').value;\n const result = form.querySelector('input[name=\"result\"]').value;\n let raises = Math.floor((parseInt(result) - parseInt(target)) / 4);\n if (parseInt(target) > parseInt(result)) {\n calcResult.innerHTML = `<img style=\"border: 0;\" src=\"modules/swade-mb-shared/assets/icons/misc/raise_red.svg\" alt=\"\" width=\"25\" height=\"25\" /> <b>Failure</b>`;\n }\n else if (parseInt(target) <= parseInt(result) && raises < 1) {\n calcResult.innerHTML = `<img style=\"border: 0;\" src=\"modules/swade-mb-shared/assets/icons/misc/raise_yellow.svg\" alt=\"\" width=\"25\" height=\"25\" /> <b>Success</b>`;\n }\n else {\n calcResult.innerHTML = `<img style=\"border: 0;\" src=\"modules/swade-mb-shared/assets/icons/misc/raise_green.svg\" alt=\"\" width=\"25\" height=\"25\" /> <b>${raises} Raise(s)</b>`;\n }\n });\n },\n}).render(true);\n\n// v.1.2.0 By SalieriC#8263, with help from Rawny#2166.","author":"g5E84yQWEXKWBl9L","img":"modules/swade-mb-shared/assets/icons/misc/rolling-dices.svg","actorIds":[],"_id":"UB86lMBB3woUkLcb"}
{"_id":"Unwe07YlxhFhjXlJ","name":"#[CF_tempEntity]","type":"chat","author":"ygiRButlaf23fX9p","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"cf":{"id":"temp_ocr9zgcmo7","folderPath":[],"color":"#000000","fontColor":"#FFFFFF","name":"Shape Change Macros for AE","children":["T2zPslXg2KNLoUGI","ed7YiOqkaqkGx0CR"],"icon":""}}}
{"_id":"VzTYSKRXvpOTquUO","name":"Power Effect","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/symbols/rune-sigil-green.webp","scope":"global","command":"const POWERS = new Map([\n ['Invisibility', {\n icon: 'systems/swade/assets/icons/status/status_invisible.svg',\n duration: {rounds: 5},\n extra: {expiration: 3, loseTurnOnHold: true},\n changes: []\n }],\n ['Intangibility', {\n icon: 'icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp',\n duration: {rounds: 5},\n extra: {expiration: 3, loseTurnOnHold: true},\n changes: []\n }],\n ['Fly', {\n icon: 'systems/swade/assets/icons/status/status_flying.svg',\n duration: {rounds: 5},\n extra: {expiration: 3, loseTurnOnHold: true},\n changes: []\n }],\n ['Sanctuary', {\n icon: 'icons/magic/defensive/shield-barrier-flaming-diamond-blue-yellow.webp',\n duration: {rounds: 5},\n extra: {expiration: 3, loseTurnOnHold: true},\n changes: []\n }],\n ['Arcane Protection', {\n icon: 'icons/magic/defensive/shield-barrier-deflect-gold.webp',\n duration: {rounds: 5},\n extra: {expiration: 3, loseTurnOnHold: true},\n changes: []\n }],\n ['Environmental Protection', {\n icon: 'icons/magic/defensive/armor-shield-barrier-steel.webp',\n duration: {seconds: 3600},\n extra: {expiration: 3, loseTurnOnHold: true},\n changes: []\n }]\n]);\nlet argEffectName = \"\";\ntry {\n if (args !== undefined && POWERS.has(args[0])) {\n argEffectName = args[0];\n }\n} catch (error) {}\n\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let powers = [...POWERS].map(p => p[0]).sort();\n if (argEffectName) {\n let dialogOptions = {\n title: argEffectName,\n content: `Apply <em>${argEffectName}</em> to ${tokenList}`,\n default: \"cancel\",\n buttons: [\n {label: \"Apply\", value: \"apply\"},\n {label: \"Apply with raise\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let choice = await warpgate.buttonDialog(dialogOptions);\n if (choice != \"cancel\") {\n const power = POWERS.get(argEffectName);\n createEffect(tokens, choice, argEffectName, power);\n }\n } else {\n powers.unshift('');\n let menuOptions = {\n title: 'Apply Power',\n defaultButton: \"Cancel\",\n options: {}\n }\n let menuData = {\n inputs: [\n {type: 'info', label: `<strong>Affected Tokens:</strong> ${tokenList}`},\n {type: 'select', label: 'Power', options: powers},\n ],\n buttons: [\n {label: \"Apply\", value: \"apply\"},\n {label: \"Apply with raise\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let {buttons, inputs} = await warpgate.menu(menuData, menuOptions);\n if (buttons != \"cancel\" && inputs[1] != '') {\n const power = POWERS.get(inputs[1]);\n createEffect(tokens, buttons, inputs[1], power);\n }\n }\n}\n\nasync function createEffect(tokens, choice, powerName, power) {\n let effectName = powerName;\n let effectId = effectName.toLowerCase().replaceAll(/[^a-z0-9]/ig, '');\n const effectIcon = power.icon;\n let changes = power.changes;\n if (choice == 'raise') {\n effectName = `Major ${effectName}`;\n }\n for (const token of tokens) {\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: power.duration,\n changes: changes,\n };\n if (power.extra) {\n effectData.flags = {'swade': power.extra};\n }\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"f58d43809e7c8b4acb768083c2d10ee6c90d1183","sourceId":"Macro.VzTYSKRXvpOTquUO"},"core":{"sourceId":"Macro.VzTYSKRXvpOTquUO"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"},"advanced-macros":{"runAsGM":false}}}
{"_id":"ZMWoKCwGTBTufQaF","name":"Protection (SWADE)","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"systems/swade/assets/icons/status/status_protection.svg","scope":"global","command":"const ICON = 'systems/swade/assets/icons/status/status_protection.svg'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let dialogOptions = {\n title: \"Protection\",\n content: `Apply <em>Protection</em> to ${tokenList}`,\n default: \"cancel\",\n buttons: [\n {label: \"Apply (+2 armor)\", value: \"apply\"},\n {label: \"Apply with raise (+4 armor)\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let choice = await warpgate.buttonDialog(dialogOptions);\n if (choice != \"cancel\") {\n createEffect(tokens, choice);\n }\n}\n\nasync function createEffect(tokens, choice) {\n let effectName = 'Protection';\n let effectId = 'protection';\n const effectIcon = ICON;\n let changes = [\n {\n key: 'data.stats.toughness.armor',\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.UPGRADE,\n value: 2,\n priority: 0\n }\n ];\n if (choice == 'raise') {\n changes[0].value = 4\n }\n for (const token of tokens) {\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: changes,\n };\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"e57a55958fcf779fbae52d3964558fc71347c868","sourceId":"Macro.ZMWoKCwGTBTufQaF"},"core":{"sourceId":"Macro.U6ysKunxzRsvhnR6"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"c8lz4DUmw6afCYRC","name":"Environmental Protection","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/defensive/armor-shield-barrier-steel.webp","scope":"global","command":"const powerEffectApply = game.macros.getName(\"Power Effect\");\n\nreturn await powerEffectApply.execute(\"Environmental Protection\");","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.01dTmSPBq0xJQJcm"},"scene-packer":{"sourceId":"Macro.c8lz4DUmw6afCYRC","hash":"0df93d946a1860cbef3fffcc10cb152cc5e41735"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"name":"Stunned CUB","type":"script","author":"g5E84yQWEXKWBl9L","img":"systems/swade/assets/icons/status/status_stunned.svg","scope":"global","command":"async function tokenEffect(token) {\n if (token.actor.data.data.status.isStunned) {\n let result = await token.actor.rollAttribute('vigor');\n let msg = \"\" + token.data.name + \" \";\n let flavor = \"\";\n if (result.total >= 4) {\n await token.actor.update({\"data.status.isStunned\": false})\n msg += \"is no longer <strong>Stunned</strong> and will not be Vulnerable at the end of \";\n flavor = \"Shaking it off\";\n if (result.total >= 8) {\n msg += \"THIS turn (raise).\";\n } else {\n msg += \"NEXT turn.\";\n }\n } else {\n msg += \"remains <strong>Stunned</strong>\";\n flavor = \"Still Stunned\";\n }\n ChatMessage.create({\n user: game.user._id,\n emote: true,\n flavor: flavor,\n speaker: ChatMessage.getSpeaker({token: token}),\n content: msg});\n } else {\n game.cub.addCondition(\"Prone\", token);\n await token.actor.update({\n \"data.status.isStunned\": true,\n \"data.status.isDistracted\": true,\n \"data.status.isVulnerable\": true})\n }\n}\n\nasync function main() {\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n canvas.tokens.controlled.forEach(token => tokenEffect(token));\n}\n\nmain()","folder":null,"sort":0,"permission":{"default":0,"g5E84yQWEXKWBl9L":3},"flags":{"combat-utility-belt":{"macroTrigger":""},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.QtQtq20VkzGUeP5F"}},"_id":"d3GjZnYn8tuJ2J7j"}
{"_id":"ed7YiOqkaqkGx0CR","name":"shapeshift_AE_form","type":"script","author":"ygiRButlaf23fX9p","img":"icons/svg/dice-target.svg","scope":"global","command":"let summon = args[0].summon;\nlet duplicates = args[0].duplicates;\nlet assignedActor = args[0].assignedActor;\n\nlet data = {\n actor: {},\n token: {},\n embedded: {\n ActiveEffect: {\n \"override\": {\n icon: assignedActor.data.img,\n label: `${assignedActor.data.name} Override`,\n changes: []\n }\n },\n Item: {}\n }\n};\n\nconst name = `${assignedActor.data.token.name} (${summon.data.token.name})`;\n\nconst actorElements = ['wildcard', 'bennies', 'fatigue', 'wounds'];\nconst keptAttributes = ['smarts', 'spirit']\n\nfor (const elem of actorElements) {\n data.actor[`data.${elem}`] = assignedActor.data.data[elem];\n}\n\ndata.actor['name'] = name;\ndata.token['name'] = name;\n\nfor (const attr of keptAttributes) {\n let attrData = assignedActor.data.data.attributes[attr];\n data.embedded.ActiveEffect.override.changes.push({\n key: `data.attributes.${attr}.die.sides`,\n value: assignedActor.data.data.attributes[attr].die.sides,\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE\n });\n data.embedded.ActiveEffect.override.changes.push({\n key: `data.attributes.${attr}.die.modifier`,\n value: assignedActor.data.data.attributes[attr].die.modifier,\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE\n });\n let skills = assignedActor.items.filter(\n i => i.type === 'skill' && i.data.data.attribute === attr);\n for(const skill of skills) {\n data.embedded.ActiveEffect.override.changes.push({\n \"key\": `@Skill{${skill.name}}[data.die.sides]`,\n \"value\": skill.data.data.die.sides,\n \"mode\": foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE\n });\n data.embedded.ActiveEffect.override.changes.push({\n \"key\": `@Skill{${skill.name}}[data.die.modifier]`,\n \"value\": skill.data.data.die.modifier,\n \"mode\": foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE\n });\n }\n}\nconst otherItems = assignedActor.items.filter(\n i => i.type === 'edge' || i.type === 'hindrance')\nfor(const item of otherItems) {\n data.embedded['Item'][item.name] = item.data;\n}\n\nreturn data;","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"combat-utility-belt":{"macroTrigger":""},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.WzTbhEUdD90hJLnX"},"scene-packer":{"sourceId":"Macro.Iaez53kAVbNCn1FZ","hash":"b2834198d9a69c1b7418e5437e963ba12f9b61ce"},"cf":{"id":"temp_ocr9zgcmo7","color":"#000000","path":"Shape Change Macros for AE"}}}
{"_id":"fzkUWlTKCJ68nEzL","name":"Boost/Lower Trait","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/movement/chevrons-down-yellow.webp","scope":"global","command":"const UPICON = 'icons/magic/life/cross-embers-glow-yellow-purple.webp'\nconst DOWNICON = 'icons/magic/movement/chevrons-down-yellow.webp'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let traitOptions = [\n \"Agility\",\n \"Smarts\",\n \"Spirit\",\n \"Strength\",\n \"Vigor\"\n ];\n let allSkills = [];\n let traits = {\n \"Agility\": {\n type: \"attribute\",\n name: \"Agility\",\n modkey: \"data.attributes.agility.die.modifier\",\n diekey: \"data.attributes.agility.die.sides\"\n },\n \"Smarts\": {\n type: \"attribute\",\n name: \"Smarts\",\n modkey: \"data.attributes.smarts.die.modifier\",\n diekey: \"data.attributes.smarts.die.sides\"\n },\n \"Spirit\": {\n type: \"attribute\",\n name: \"Spirit\",\n modkey: \"data.attributes.spirit.die.modifier\",\n diekey: \"data.attributes.spirit.die.sides\"\n },\n \"Strength\": {\n type: \"attribute\",\n name: \"Strength\",\n modkey: \"data.attributes.strength.die.modifier\",\n diekey: \"data.attributes.strength.die.sides\"\n },\n \"Vigor\": {\n type: \"attribute\",\n name: \"Vigor\",\n modkey: \"data.attributes.vigor.die.modifier\",\n diekey: \"data.attributes.vigor.die.sides\"\n }\n };\n let tokenList = tokens.map(t => t.name).join(\", \");\n for (const token of tokens) {\n let skills = token.actor.items.filter(e => e.type == \"skill\");\n for (const skill of skills) {\n let name = skill.data.name\n traits[name] = {\n type: \"skill\",\n name: name,\n modkey: `@Skill{${name}}[data.die.modifier]`,\n diekey: `@Skill{${name}}[data.die.sides]`\n };\n if (name != 'Unskilled' && !allSkills.find(v => v == name)) {\n allSkills.push(name);\n }\n }\n }\n traitOptions = traitOptions.concat(allSkills.sort());\n let menuOptions = {\n title: 'Boost/Lower Trait',\n defaultButton: \"Cancel\",\n options: {}\n };\n let menuData = {\n inputs: [\n {type: 'header', label: 'Boost/Lower Trait'},\n {type: 'info', label: `Affected Tokens: ${tokenList}`}, \n {type: 'select', label: 'Trait', options: traitOptions},\n {type: 'info', label: \"Boost or Lower?\"},\n {type: 'radio', label: 'Boost', options: ['boostlower', true]},\n {type: 'radio', label: 'Lower', options: ['boostlower', false]},\n ],\n buttons: [\n {label: \"Apply\", value: \"apply\"},\n {label: \"Apply with raise\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let {buttons, inputs} = await warpgate.menu(menuData, menuOptions);\n if (buttons != \"cancel\") {\n let trait = inputs[2];\n let direction = inputs[4] || inputs[5];\n createEffect(tokens, traits[trait], direction, buttons);\n }\n}\n\nfunction getDottedPart(obj, key) {\n let value = obj;\n for (const part of key.split(\".\")) {\n value = value[part];\n }\n return value;\n}\n\nasync function createEffect(tokens, trait, direction, buttons) {\n const raise = (buttons == 'raise');\n const effectName = `${raise ? \"Major\" : \"Minor\"} ${direction} ${trait.name}`;\n const effectId = `${raise ? \"Major\" : \"Minor\"}${direction}${trait.name}`;\n const effectIcon = (direction == 'Boost' ? UPICON : DOWNICON)\n for (const token of tokens) {\n let tokenDoc = token.document;\n let currentDie = 0;\n let currentMod = 0;\n if (trait.type == 'attribute') {\n currentDie = getDottedPart(token.actor.data, trait.diekey);\n currentMod = getDottedPart(token.actor.data, trait.modkey);\n } else {\n let skill = token.actor.items.filter(s => s.type == 'skill').find(\n s => s.data.name == trait.name)\n if (skill) {\n currentDie = skill.data.data.die.sides;\n currentMod = skill.data.data.die.modifier;\n } else {\n currentDie = 4;\n currentMod = -2;\n }\n }\n if (currentDie == 0) {\n continue;\n }\n if (currentDie == 4 && direction == \"Lower\") {\n continue;\n }\n let diemod = 2;\n let modmod = 0;\n if (direction == \"Lower\") {\n diemod = -2;\n }\n if (currentDie == 6 && direction == \"Lower\" && raise) {\n diemod = -1\n } else if (currentDie == 12 && direction == \"Boost\") {\n diemod = 0;\n modmod = 1;\n }\n if (raise) {\n diemod *= 2;\n modmod *= 2;\n }\n if (currentDie == 10 && direction == \"Boost\" && raise) {\n diemod = 2;\n modmod = 1;\n }\n if (currentDie == 4 && currentMod == -2 && direction == \"Boost\") {\n diemod = (raise ? 2 : 0);\n modmod = 2;\n }\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: []\n };\n let mode = foundry.CONST.ACTIVE_EFFECT_MODES.ADD;\n if (diemod != 0) {\n effectData.changes.push({ key: trait.diekey, mode: mode, value: diemod, priority: 0 });\n }\n if (modmod != 0) {\n effectData.changes.push({ key: trait.modkey, mode: mode, value: modmod, priority: 0 });\n }\n if (direction == \"Boost\") {\n effectData.duration = { rounds: 5 };\n }\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: { 'ActiveEffect': 'label' },\n name: effectName,\n permanent: false,\n description: effectName,\n }\n if (trait.type == 'skill' && direction == 'Boost' && !token.actor.items.getName(trait.name)) {\n let itemmutate = { embedded: { Item: {} } }\n itemmutate.embedded.Item[trait.name] = {\n \"name\": trait.name,\n \"type\": \"skill\",\n \"img\": \"systems/swade/assets/icons/skills/uncertainty.svg\",\n \"data\": {\n \"description\": \"See SWADE. Auto added as untrained for Boost Trait.\",\n \"notes\": \"\",\n \"additionalStats\": {},\n \"attribute\": trait.attribute,\n \"isCoreSkill\": false,\n \"die\": {\n \"sides\": 4,\n \"modifier\": -2\n },\n \"wild-die\": {\n \"sides\": 6\n }\n }\n }\n await warpgate.mutate(token.document, itemmutate, {}, mutateOptions);\n }\n mutateOptions.permanent = true;\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"scene-packer":{"hash":"de40818571bebaf7d7b661be5880490654328fb3","sourceId":"Macro.ETjGUe4hbN0D9kV3","defaultPermission":2},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"},"core":{"sourceId":"Macro.ETjGUe4hbN0D9kV3"}}}
{"name":"#[CF_tempEntity]","permission":{"default":0,"mrhsZpAiXth4sLah":3},"type":"chat","flags":{"cf":{"id":"temp_natl1zonf8","folderPath":[],"color":"#000000","fontColor":"#FFFFFF","name":"Cards","children":[],"icon":""}},"scope":"global","command":"","author":"mrhsZpAiXth4sLah","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"hnicuEhZlfMF2upA"}
{"name":"Sanctuary CUB","type":"script","author":"g5E84yQWEXKWBl9L","img":"icons/svg/holy-shield.svg","scope":"global","command":"const CONDITION = \"Sanctuary\";\n\n\nasync function tokenEffect(token) {\n console.log(token);\n let message = \"\" + token.data.name;\n if (game.cub.hasCondition(CONDITION, token)) {\n message += \" is no longer under Sanctuary.\";\n game.cub.removeCondition(CONDITION, token);\n } else {\n game.cub.addCondition(CONDITION, token);\n message += \" is under @Compendium[swpf-core-rules.swpf-powers.H82NWO4VNEYTqciG]{Sanctuary}.\";\n }\n ChatMessage.create({\n user: game.user._id,\n emote: true,\n flavor: \"Sanctuary!\",\n speaker: ChatMessage.getSpeaker({token: token}),\n content: message});\n}\n\nasync function main() {\n if (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n }\n canvas.tokens.controlled.forEach(token => tokenEffect(token));\n}\n\nmain()","folder":null,"sort":0,"permission":{"default":0,"g5E84yQWEXKWBl9L":3},"flags":{"combat-utility-belt":{"macroTrigger":""},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Macro.T7GXMuVq2JNMne2g"}},"_id":"jAPMvsQemX2LnSWp"}
{"_id":"lm51dm7e9yhTx4os","name":"ApplySpellEffect","type":"script","author":"ygiRButlaf23fX9p","img":"icons/svg/sun.svg","scope":"global","command":"let effect = args[0];\nlet targets = args[1];\nlet extra = args[2];\nif (!extra) {\n extra = {};\n}\nif (!extra.name) { extra.name = effect.label }\nif (!extra.duration) { extra.duration = effect.duration?.rounds }\nif (!extra.startMessage) {\n extra.startMessage = `${effect.label}'s effects start`\n}\nif (!extra.endMessage) {\n extra.endMessage = `${effect.label}'s effects end`\n}\nif (!extra.fadeMessage) {\n extra.fadeMessage = `${effect.label}'s effects start to fade`\n}\n\nif (canvas.tokens.controlled.length == 0) {\n ui.notifications.error(\"No tokens selected\");\n return;\n}\nfor (let tgt of targets) {\n let actor = tgt.actor;\n let active = actor.effects.find(i => i.data.label === effect.label);\n let chatData = {\n speaker: ChatMessage.getSpeaker(tgt),\n type: CONST.CHAT_MESSAGE_TYPES.OTHER,\n emote: true\n }\n if (extra.flavor) {\n chatData.flavor = extra.flavor;\n }\n if (active) {\n await tgt.toggleEffect(effect, { active: false })\n chatData.content = extra.endMessage;\n } else {\n await tgt.toggleEffect(effect, { active: true })\n chatData.content = extra.startMessage;\n }\n if (chatData.content) {\n ChatMessage.create(chatData);\n }\n}\nif (game.modules.get(\"turnAlert\")?.active) {\n if (game.combat && extra.duration) {\n let alertData = {\n round: extra.duration - 1,\n roundAbsolute: false,\n turnId: game.combat.combatant._id,\n message: extra.fadeMessage\n }\n await TurnAlert.create(alertData);\n\n const targetIds = targets.map(t => t.id);\n alertData = {\n round: extra.duration - 1,\n roundAbsolute: false,\n turnId: game.combat.combatant._id,\n endOfTurn: true,\n message: extra.endMessage,\n macro: \"CancelSpellEffect\",\n args: [effect, targetIds]\n }\n await TurnAlert.create(alertData);\n }\n} else if (game.modules.get(\"about-time\")?.active && extra.duration) {\n let duration = extra.duration * 6;\n let preDuration = duration - 6;\n console.log(\"effects end in duration:\", duration, preDuration)\n Gametime.doIn({ seconds: preDuration }, () => {\n let chatData = {\n type: CONST.CHAT_MESSAGE_TYPES.OTHER,\n emote: true,\n content: extra.fadeMessage\n }\n if (extra.flavor) {\n chatData.flavor = extra.flavor;\n }\n ChatMessage.create(chatData);\n });\n const targetIds = targets.map(t => t.id);\n Gametime.doIn({ seconds: duration }, () => {\n let macro = game.macros.getName(\"CancelSpellEffect\")\n macro.execute(effect, targetIds)\n })\n}","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"combat-utility-belt":{"macroTrigger":""},"advanced-macros":{"runAsGM":false},"scene-packer":{"sourceId":"Macro.OB9FF0mpgWSYEryu"},"cf":{"id":"temp_p20tzfcm449","path":"Spell Effect Macros","color":"#000000"}}}
{"_id":"p94dkSmOgfuoC28K","name":"Deflection (SWPF)","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/defensive/shield-barrier-deflect-teal.webp","scope":"global","command":"const ICON = 'icons/magic/defensive/shield-barrier-deflect-teal.webp'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let dialogOptions = {\n title: \"Deflection\",\n content: `Apply <em>Deflection</em> to ${tokenList}`,\n default: \"cancel\",\n buttons: [\n {label: \"Apply (melee)\", value: \"melee\"},\n {label: \"Apply (ranged)\", value: \"ranged\"},\n {label: \"Apply with raise (both)\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let choice = await warpgate.buttonDialog(dialogOptions);\n if (choice != \"cancel\") {\n createEffect(tokens, choice);\n }\n}\n\nasync function createEffect(tokens, choice) {\n let effectName = 'Deflection';\n let effectId = `deflection${choice}`;\n let changes = []\n switch (choice) {\n case 'melee':\n effectName = \"Melee \" + effectName;\n break\n case 'ranged':\n effectName = \"Ranged \" + effectName;\n break \n }\n const effectIcon = ICON;\n for (const token of tokens) {\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: [\n {key: 'data.stats.parry.modifier', mode: foundry.CONST.ACTIVE_EFFECT_MODES.UPGRADE, value: 0, priority: 0}\n ],\n };\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"9fef11ff303f385dcc039b421c26212cdee832c2","sourceId":"Macro.p94dkSmOgfuoC28K"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"},"advanced-macros":{"runAsGM":false},"core":{"sourceId":"Compendium.swade-mb-shared.macros.p94dkSmOgfuoC28K"}}}
{"_id":"tjaqN9gedJpYFgbu","name":"Smite","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"systems/swade/assets/icons/status/status_smite.svg","scope":"global","command":"const ICON = 'systems/swade/assets/icons/status/status_smite.svg'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let menuOptions = {\n title: 'Smite',\n defaultButton: \"cancel\",\n options: {}\n }\n let menuData = {\n inputs: [\n {type: 'header', label: 'Smite'},\n {type: 'info', label: `Apply Smite to ${tokenList}`},\n ],\n buttons: [\n {label: \"Apply\", value: \"apply\"},\n {label: \"Apply with Raise\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let tokenWeapons = {};\n let index = 1;\n for (const token of tokens) {\n index += 2;\n tokenWeapons[token.id] = index;\n menuData.inputs.push({type: 'info', label: `<h2>${token.name}</h2>`});\n let weapons = token.actor.items.filter(i => i.type == 'weapon').map(i => i.name);\n weapons.unshift(\"\");\n menuData.inputs.push({type: 'select', label: token.name, options: weapons});\n }\n let {buttons, inputs} = await warpgate.menu(menuData, menuOptions);\n for (let tokenid in tokenWeapons) {\n tokenWeapons[tokenid] = inputs[tokenWeapons[tokenid]];\n }\n if (buttons != \"cancel\") {\n await createEffect(tokens, tokenWeapons, buttons);\n }\n console.log(buttons, tokenWeapons);\n}\n\nasync function createEffect(tokens, tokenWeapons, choice) {\n const effectIcon = ICON;\n const changeValue = (choice == 'raise' ? \"+4\" : \"+2\");\n for (const token of tokens) {\n const weaponName = tokenWeapons[token.id];\n const weaponId = token.actor.items.getName(weaponName)?.id\n const changeKey = `@Weapon{${weaponName}}[data.damage]`\n if (!weaponId) {\n continue\n }\n const effectName = `Smite (${weaponName})`;\n const effectId = `smite${choice}_${weaponId}`;\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: [\n {\n key: changeKey,\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,\n value: changeValue,\n priority: 0\n }\n ],\n };\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.MXSe0F5osRtleDV4"},"scene-packer":{"sourceId":"Macro.MXSe0F5osRtleDV4","hash":"a74182d3f48775895d7f8e9b4b0af22194eaa82c"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"uB67GR2V90kmvyVs","name":"Deflection (SWADE)","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/defensive/shield-barrier-deflect-teal.webp","scope":"global","command":"const ICON = 'icons/magic/defensive/shield-barrier-deflect-teal.webp'\n\nlet tokens = [];\nlet targets = Array.from(game.user.targets);\nif (targets.length > 0) {\n tokens = targets;\n} else if (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled;\n}\nif (tokens.length > 0) {\n main(tokens);\n} else {\n ui.notifications.error(\"Please select or target a token\");\n}\n\nasync function main(tokens) {\n let tokenList = tokens.map(t => t.name).join(\", \");\n let dialogOptions = {\n title: \"Deflection\",\n content: `Apply <em>Deflection</em> to ${tokenList}`,\n default: \"cancel\",\n buttons: [\n {label: \"Apply (-2)\", value: \"apply\"},\n {label: \"Apply with raise (-4)\", value: \"raise\"},\n {label: \"Cancel\", value: \"cancel\"}\n ]\n }\n let choice = await warpgate.buttonDialog(dialogOptions);\n if (choice != \"cancel\") {\n createEffect(tokens, choice);\n }\n}\n\nasync function createEffect(tokens, choice) {\n let effectName = 'Deflection';\n let effectId = `deflection${choice}`;\n let changes = []\n if (choice == \"raise\") {\n effectName = \"Major \" + effectName;\n }\n const effectIcon = ICON;\n for (const token of tokens) {\n let effectData = {\n icon: effectIcon,\n id: effectId,\n label: effectName,\n duration: {rounds: 5},\n flags: {\n swade: {\n expiration: 3,\n loseTurnOnHold: true\n }\n },\n changes: [\n {key: 'data.stats.parry.modifier', mode: foundry.CONST.ACTIVE_EFFECT_MODES.UPGRADE, value: 0, priority: 0}\n ],\n };\n let mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n };\n mutate.embedded.ActiveEffect[effectName] = effectData;\n let mutateOptions = {\n comparisonKeys: {'ActiveEffect': 'label'},\n name: effectName,\n permanent: true,\n description: effectName,\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions);\n }\n}","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"scene-packer":{"hash":"5aaf1e3ca287022321b0e6c7b610e1a42175d2b2","sourceId":"Macro.uB67GR2V90kmvyVs"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"},"core":{"sourceId":"Compendium.swade-mb-shared.macros.uB67GR2V90kmvyVs"}}}
{"_id":"wa7ZoYUhNcjrNEmN","name":"#[CF_tempEntity]","type":"chat","author":"HXnQ3GTDyHZ7E1ev","img":"icons/svg/dice-target.svg","scope":"global","command":"","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000","name":"SWADE Spell Effects (WarpGate)","children":["ye1BuJD7kKGAyReU","fzkUWlTKCJ68nEzL","uB67GR2V90kmvyVs","p94dkSmOgfuoC28K","K51dscyigZyR1Kma","c8lz4DUmw6afCYRC","9KVvOhKLlyZHrQ76","OAC1Ofm7iEjU9KAm","79YiKPX3WcmBeMzm","4SRoZduQrF2o3MZK","VzTYSKRXvpOTquUO","ZMWoKCwGTBTufQaF","U6ysKunxzRsvhnR6","yV3XNCfgHpGrREt0","FngiDIs9HR2p0eY1","tjaqN9gedJpYFgbu",null,"EMnNSHCl45UMUnJu"],"folderPath":[]},"scene-packer":{"hash":"3d9a8396d815dcef72c41f01fa0318a9a20c0bb4"}}}
{"_id":"yV3XNCfgHpGrREt0","name":"Sanctuary","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/defensive/shield-barrier-flaming-diamond-blue-yellow.webp","scope":"global","command":"const powerEffectApply = game.macros.getName(\"Power Effect\");\n\nreturn await powerEffectApply.execute(\"Sanctuary\");","folder":null,"sort":0,"permission":{"default":0,"ygiRButlaf23fX9p":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.01dTmSPBq0xJQJcm"},"scene-packer":{"sourceId":"Macro.fzA6qQ1PyNgV8FqE","hash":"a45f562cc1f65a09386c3a6f9006b1fad3650f78"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}
{"_id":"ye1BuJD7kKGAyReU","name":"Arcane Protection","type":"script","author":"HXnQ3GTDyHZ7E1ev","img":"icons/magic/defensive/shield-barrier-deflect-gold.webp","scope":"global","command":"const powerEffectApply = game.macros.getName(\"Power Effect\");\n\nreturn await powerEffectApply.execute(\"Arcane Protection\");","folder":null,"sort":0,"permission":{"default":0,"HXnQ3GTDyHZ7E1ev":3},"flags":{"advanced-macros":{"runAsGM":false},"combat-utility-belt":{"macroTrigger":""},"core":{"sourceId":"Macro.01dTmSPBq0xJQJcm"},"scene-packer":{"sourceId":"Macro.ye1BuJD7kKGAyReU","hash":"0d06d7cc1e1d6d1b9767648e0519e61253496a1c"},"cf":{"id":"temp_g9ptj9b0b4s","path":"SWADE Spell Effects (WarpGate)","color":"#000000"}}}