39 lines
76 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":"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":"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":"70fd9a71799b4022ffab164c7585ae2e117e4ca8","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":"8365ba311b9c84175e351280fae446938618f341","sourceId":"Macro.K51dscyigZyR1Kma"},"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",null,"c8lz4DUmw6afCYRC","9KVvOhKLlyZHrQ76","79YiKPX3WcmBeMzm","4SRoZduQrF2o3MZK","VzTYSKRXvpOTquUO","ZMWoKCwGTBTufQaF","U6ysKunxzRsvhnR6","yV3XNCfgHpGrREt0","tjaqN9gedJpYFgbu"],"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"}}}