| Actor | Currency |
';\n const fmtOptions = {\n minimumIntegerDigits: 1,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n };\n const fmt = Intl.NumberFormat('en-US', fmtOptions);\n for (const token of tokens) {\n const actor = token.actor;\n let total = 0;\n for (const item of actor.items.filter((i) => currencies.indexOf(i.name) > -1)) {\n total += item.system.price * item.system.quantity;\n }\n template += `| ${actor.name} | ${fmt.format(total)} |
`;\n }\n template += '';\n foundry.applications.api.DialogV2.prompt({\n window: { title: 'Currency Totals' },\n content: template,\n });\n}",
"ownership": {
"default": 0,
"ueJGUfSYuRRL3Ypr": 3
@@ -21,8 +21,8 @@
"systemVersion": "3.2.5",
"coreVersion": "13.344",
"createdTime": 1680966567327,
- "modifiedTime": 1707686618258,
- "lastModifiedBy": "Aqnn9hCDQPbyTWiq",
+ "modifiedTime": 1748487080309,
+ "lastModifiedBy": "sVoCvBU1knmXzoYe",
"compendiumSource": "Macro.lOAxoK00x5QQFbTH",
"duplicateSource": null,
"exportSource": {
diff --git a/src/packsrc/helper-macros/Knockout_Poison_4yXWP6VCi8wsmdVw.json b/src/packsrc/helper-macros/Knockout_Poison_4yXWP6VCi8wsmdVw.json
deleted file mode 100644
index 9faca24..0000000
--- a/src/packsrc/helper-macros/Knockout_Poison_4yXWP6VCi8wsmdVw.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "Knockout Poison",
- "type": "script",
- "author": "sVoCvBU1knmXzoYe",
- "img": "icons/magic/acid/dissolve-drip-droplet-smoke.webp",
- "scope": "global",
- "command": "const speaker = ChatMessage.implementation.getSpeaker();\ntoken = (canvas.ready ? canvas.tokens.get(speaker.token) : null);\nactor = token?.actor || game.actors.get(speaker.actor);\nif (!actor.status.isDistracted) {\n const dist = game.swade.util.getStatusEffectDataById('distracted')\n await actor.toggleActiveEffect(dist, {active: true})\n}\nconst duration = new Roll('2d6')\nawait duration.toMessage(options={flavor: \"Knockout Poison Duration (hours)\"})\nif (!actor.status.isIncapacitated) {\n const incap = game.swade.util.getStatusEffectDataById('incapacitated')\n await actor.toggleActiveEffect(incap, {active: true})\n}",
- "folder": "DbVwJ0fIfuijv8Nu",
- "ownership": {
- "default": 0,
- "sVoCvBU1knmXzoYe": 3
- },
- "flags": {
- "core": {}
- },
- "_stats": {
- "systemId": "swade",
- "systemVersion": "3.2.5",
- "coreVersion": "13.344",
- "createdTime": 1705988837960,
- "modifiedTime": 1705990319268,
- "lastModifiedBy": "sVoCvBU1knmXzoYe",
- "compendiumSource": null,
- "duplicateSource": null,
- "exportSource": {
- "worldId": "swade-test",
- "uuid": null,
- "coreVersion": "11.315",
- "systemId": "swade",
- "systemVersion": "3.2.5"
- }
- },
- "_id": "4yXWP6VCi8wsmdVw",
- "sort": 200000,
- "_key": "!macros!4yXWP6VCi8wsmdVw"
-}
diff --git a/src/packsrc/helper-macros/Lethal_Poison_mMSTm47fgx77GqAO.json b/src/packsrc/helper-macros/Lethal_Poison_mMSTm47fgx77GqAO.json
deleted file mode 100644
index 14c9326..0000000
--- a/src/packsrc/helper-macros/Lethal_Poison_mMSTm47fgx77GqAO.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "Lethal Poison",
- "type": "script",
- "author": "sVoCvBU1knmXzoYe",
- "img": "icons/magic/acid/dissolve-bone-skull.webp",
- "scope": "global",
- "command": "const speaker = ChatMessage.implementation.getSpeaker();\ntoken = (canvas.ready ? canvas.tokens.get(speaker.token) : null);\nactor = token?.actor || game.actors.get(speaker.actor);\nif (!actor.status.isDistracted) {\n const dist = game.swade.util.getStatusEffectDataById('distracted')\n await actor.toggleActiveEffect(dist, {active: true})\n}\nif (!actor.status.isStunned) {\n const stun = game.swade.util.getStatusEffectDataById('stunned')\n await actor.toggleActiveEffect(stun, {active: true})\n}\nconst poison = await Dialog.wait({\n title: `Apply Lethal Poison to ${actor.name}`,\n content: `What was the result of the vigor roll against the lethal poison? (If ${actor.name} succeeded, you can close out of this dialog to cancel)
`,\n buttons: {\n fail: {\n icon: '',\n label: \"Failure\"\n },\n critFail: {\n icon: '',\n label: \"Critical Failure\"\n }\n }\n})\nconst wounds = actor.system.wounds\nconst p = poison === 'fail' ? 1 : 2\nconst newWounds = wounds.value + p\nactor.update({'system.wounds.value': newWounds})\nif (newWounds > wounds.max) {\n if (!actor.status.isIncapacitated) {\n const incap = game.swade.util.getStatusEffectDataById('incapacitated')\n await actor.toggleActiveEffect(incap, {active: true})\n }\n}\nconst duration = new Roll('2d6')\nawait duration.toMessage(options={flavor: `${actor.name} will perish from the lethal poison in this many rounds`});\nactor.createEmbeddedDocuments('ActiveEffect', [{\n name: 'Lethal Poison',\n duration: {\n rounds: duration.total\n },\n icon: 'icons/magic/acid/dissolve-bone-skull.webp',\n statuses: ['perish'],\n flags: {swade: {expiration: 0}}\n}])",
- "folder": "DbVwJ0fIfuijv8Nu",
- "ownership": {
- "default": 0,
- "sVoCvBU1knmXzoYe": 3
- },
- "flags": {
- "core": {}
- },
- "_stats": {
- "systemId": "swade",
- "systemVersion": "3.2.5",
- "coreVersion": "13.344",
- "createdTime": 1705988835525,
- "modifiedTime": 1705990319268,
- "lastModifiedBy": "sVoCvBU1knmXzoYe",
- "compendiumSource": null,
- "duplicateSource": null,
- "exportSource": {
- "worldId": "swade-test",
- "uuid": null,
- "coreVersion": "11.315",
- "systemId": "swade",
- "systemVersion": "3.2.5"
- }
- },
- "_id": "mMSTm47fgx77GqAO",
- "sort": 300000,
- "_key": "!macros!mMSTm47fgx77GqAO"
-}
diff --git a/src/packsrc/helper-macros/Mild_Poison_McmMNB2mI5xejauq.json b/src/packsrc/helper-macros/Mild_Poison_McmMNB2mI5xejauq.json
deleted file mode 100644
index 95b3e4e..0000000
--- a/src/packsrc/helper-macros/Mild_Poison_McmMNB2mI5xejauq.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "Mild Poison",
- "type": "script",
- "author": "sVoCvBU1knmXzoYe",
- "img": "icons/magic/acid/dissolve-pool-bubbles.webp",
- "scope": "global",
- "command": "const speaker = ChatMessage.implementation.getSpeaker();\ntoken = (canvas.ready ? canvas.tokens.get(speaker.token) : null);\nactor = token?.actor || game.actors.get(speaker.actor);\nif (!actor.status.isDistracted) {\n const dist = game.swade.util.getStatusEffectDataById('distracted')\n await actor.toggleActiveEffect(dist, {active: true})\n}\nconst poison = await Dialog.wait({\n title: `Apply Mild Poison to ${actor.name}`,\n content: `What was the result of the vigor roll against the mild poison? (If ${actor.name} succeeded, you can close out of this dialog to cancel)
`,\n buttons: {\n fail: {\n icon: '',\n label: \"Failure\"\n },\n critFail: {\n icon: '',\n label: \"Critical Failure\"\n }\n }\n})\nconst fatigue = actor.system.fatigue\nconst p = poison === 'fail' ? 1 : 2\nactor.update({'system.fatigue.value': Math.min(fatigue.max, fatigue.value + p)})",
- "folder": "DbVwJ0fIfuijv8Nu",
- "ownership": {
- "default": 0,
- "sVoCvBU1knmXzoYe": 3
- },
- "flags": {
- "core": {}
- },
- "_stats": {
- "systemId": "swade",
- "systemVersion": "3.2.5",
- "coreVersion": "13.344",
- "createdTime": 1705988833306,
- "modifiedTime": 1705990319268,
- "lastModifiedBy": "sVoCvBU1knmXzoYe",
- "compendiumSource": null,
- "duplicateSource": null,
- "exportSource": {
- "worldId": "swade-test",
- "uuid": null,
- "coreVersion": "11.315",
- "systemId": "swade",
- "systemVersion": "3.2.5"
- }
- },
- "_id": "McmMNB2mI5xejauq",
- "sort": 100000,
- "_key": "!macros!McmMNB2mI5xejauq"
-}
diff --git a/src/packsrc/helper-macros/Paralyzing_Poison_P4MNq8EUR8ReFr9C.json b/src/packsrc/helper-macros/Paralyzing_Poison_P4MNq8EUR8ReFr9C.json
deleted file mode 100644
index d06abc7..0000000
--- a/src/packsrc/helper-macros/Paralyzing_Poison_P4MNq8EUR8ReFr9C.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "Paralyzing Poison",
- "type": "script",
- "author": "sVoCvBU1knmXzoYe",
- "img": "icons/magic/acid/dissolve-arm-flesh.webp",
- "scope": "global",
- "command": "const speaker = ChatMessage.implementation.getSpeaker();\ntoken = (canvas.ready ? canvas.tokens.get(speaker.token) : null);\nactor = token?.actor || game.actors.get(speaker.actor);\nif (!actor.status.isDistracted) {\n const dist = game.swade.util.getStatusEffectDataById('distracted')\n await actor.toggleActiveEffect(dist, {active: true})\n}\nconst stun = game.swade.util.getStatusEffectDataById('stunned')\nconst poison = await Dialog.wait({\n title: `Apply Paralyzing Poison to ${actor.name}`,\n content: ``,\n buttons: {\n duration: {\n icon: '',\n label: \"Duration\",\n callback: (html) => {\n stun.duration.rounds = parseInt(html.find('#paralyzingPoisonDuration')[0].value)\n if (Number.isNaN(stun.duration.rounds)) stun.duration.rounds = 1\n }\n },\n default: {\n icon: '',\n label: \"Default Stun\"\n }\n }\n})\nawait actor.toggleActiveEffect(stun, {active: true})",
- "folder": "DbVwJ0fIfuijv8Nu",
- "ownership": {
- "default": 0,
- "sVoCvBU1knmXzoYe": 3
- },
- "flags": {
- "core": {}
- },
- "_stats": {
- "systemId": "swade",
- "systemVersion": "3.2.5",
- "coreVersion": "13.344",
- "createdTime": 1705988829990,
- "modifiedTime": 1705990353747,
- "lastModifiedBy": "sVoCvBU1knmXzoYe",
- "compendiumSource": null,
- "duplicateSource": null,
- "exportSource": {
- "worldId": "swade-test",
- "uuid": null,
- "coreVersion": "11.315",
- "systemId": "swade",
- "systemVersion": "3.2.5"
- }
- },
- "_id": "P4MNq8EUR8ReFr9C",
- "sort": 0,
- "_key": "!macros!P4MNq8EUR8ReFr9C"
-}
diff --git a/src/packsrc/helper-macros/Poison_DbVwJ0fIfuijv8Nu.json b/src/packsrc/helper-macros/Poison_DbVwJ0fIfuijv8Nu.json
deleted file mode 100644
index 18c697b..0000000
--- a/src/packsrc/helper-macros/Poison_DbVwJ0fIfuijv8Nu.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "Poison",
- "sorting": "a",
- "folder": null,
- "type": "Macro",
- "_id": "DbVwJ0fIfuijv8Nu",
- "sort": 0,
- "color": null,
- "flags": {},
- "_stats": {
- "systemId": "swade",
- "systemVersion": "3.2.5",
- "coreVersion": "11.315",
- "createdTime": 1705990230579,
- "modifiedTime": 1705990230579,
- "lastModifiedBy": "sVoCvBU1knmXzoYe"
- },
- "_key": "!folders!DbVwJ0fIfuijv8Nu"
-}
diff --git a/src/packsrc/helper-macros/Quick_Damage_Roll_NANSnFATVJntUfL7.json b/src/packsrc/helper-macros/Quick_Damage_Roll_NANSnFATVJntUfL7.json
index ffaaaac..3c00334 100644
--- a/src/packsrc/helper-macros/Quick_Damage_Roll_NANSnFATVJntUfL7.json
+++ b/src/packsrc/helper-macros/Quick_Damage_Roll_NANSnFATVJntUfL7.json
@@ -4,7 +4,7 @@
"scope": "global",
"author": "sVoCvBU1knmXzoYe",
"img": "icons/sundries/gaming/dice-runed-brown.webp",
- "command": "new Dialog({\n title: \"Damage Roll Configuration\",\n content: `\n \n `,\n buttons: {\n ok: {\n label: \"Roll Damage\",\n callback: (html) => {\n const damageRoll = html.find('input[name=\"damageRoll\"]').val();\n let flavor = html.find('input[name=\"flavor\"]').val();\n const ap = parseInt(html.find('input[name=\"ap\"]').val()) || 0;\n const options = {};\n if (ap > 0) {\n flavor = `${flavor ? flavor + \" - \" : \"\"}AP: ${ap}`\n options.ap = ap;\n }\n // Perform the damage roll and send the message\n new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor });\n },\n },\n cancel: {\n label: \"Cancel\",\n },\n },\n}).render(true);",
+ "command": "new foundry.applications.api.DialogV2({\n window: { title: \"Damage Roll Configuration\" },\n content: `\n \n `,\n buttons: [\n {\n action: \"ok\",\n label: \"Roll Damage\",\n callback: (event, button, dialog) => {\n const form = new foundry.applications.ux.FormDataExtended(button.form);\n console.log(form)\n const damageRoll = form.object.damageRoll;\n let flavor = form.object.flavor;\n const ap = parseInt(form.object.ap) || 0;\n const options = {};\n if (ap > 0) {\n flavor = `${flavor ? flavor + \" - \" : \"\"}AP: ${ap}`\n options.ap = ap;\n }\n // Perform the damage roll and send the message\n new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor });\n },\n },\n {\n action: \"cancel\",\n label: \"Cancel\",\n },\n ],\n}).render(true);",
"folder": null,
"ownership": {
"default": 0,
@@ -18,8 +18,8 @@
"systemVersion": "3.2.5",
"coreVersion": "13.344",
"createdTime": 1702933790652,
- "modifiedTime": 1707686618258,
- "lastModifiedBy": "Aqnn9hCDQPbyTWiq",
+ "modifiedTime": 1748489026748,
+ "lastModifiedBy": "sVoCvBU1knmXzoYe",
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null
diff --git a/src/packsrc/helper-macros/Request_Fear_Check_qQLM79NpAuilKFrh.json b/src/packsrc/helper-macros/Request_Fear_Check_qQLM79NpAuilKFrh.json
index 28bf8ee..760379f 100644
--- a/src/packsrc/helper-macros/Request_Fear_Check_qQLM79NpAuilKFrh.json
+++ b/src/packsrc/helper-macros/Request_Fear_Check_qQLM79NpAuilKFrh.json
@@ -5,7 +5,7 @@
"author": "sVoCvBU1knmXzoYe",
"img": "icons/magic/death/skull-energy-light-white.webp",
"scope": "global",
- "command": "const requestFearRollFromTokens = game.modules.get('swade-mb-helpers').api.requestFearRollFromTokens;\n\nasync function main() {\n let tokens = Array.from(game.user.targets);\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled;\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens');\n return;\n }\n\n new Dialog({\n title: 'Request Fear roll...',\n content: `\n `,\n buttons: {\n ok: {\n label: 'Request Roll',\n callback: (html) => {\n const fear = parseInt(html.find('input[name=\"fear\"]').val()) || 0;\n const options = { targetNumber: 4, fear };\n requestFearRollFromTokens(tokens, options);\n },\n },\n cancel: {\n label: 'Cancel',\n },\n },\n }).render(true);\n}\n\nmain();",
+ "command": "const requestFearRollFromTokens = game.modules.get('swade-mb-helpers').api.requestFearRollFromTokens;\n\nasync function main() {\n let tokens = Array.from(game.user.targets);\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled;\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens');\n return;\n }\n\n new foundry.applications.api.DialogV2({\n window: { title: 'Request Fear roll...' },\n content: `\n `,\n buttons: [\n {\n action: \"submit\",\n label: 'Request Roll',\n callback: (event, button, dialog) => {\n formdata = new foundry.applications.ux.FormDataExtended(button.form).object\n const fear = parseInt(formdata.fear) || 0;\n const options = { targetNumber: 4, fear };\n requestFearRollFromTokens(tokens, options);\n },\n },\n {\n action: \"cancel\", label: 'Cancel',\n },\n ],\n }).render(true);\n}\n\nmain();",
"folder": null,
"sort": 300000,
"ownership": {
@@ -18,7 +18,7 @@
"systemVersion": "3.3.11",
"coreVersion": "13.344",
"createdTime": 1703356535979,
- "modifiedTime": 1715916003523,
+ "modifiedTime": 1748489622548,
"lastModifiedBy": "sVoCvBU1knmXzoYe",
"compendiumSource": null,
"duplicateSource": null,
diff --git a/src/packsrc/helper-macros/Request_Notice_Roll_pnLnFrfTTJeodFRy.json b/src/packsrc/helper-macros/Request_Notice_Roll_pnLnFrfTTJeodFRy.json
index 390199a..919c1b3 100644
--- a/src/packsrc/helper-macros/Request_Notice_Roll_pnLnFrfTTJeodFRy.json
+++ b/src/packsrc/helper-macros/Request_Notice_Roll_pnLnFrfTTJeodFRy.json
@@ -4,7 +4,7 @@
"scope": "global",
"author": "sVoCvBU1knmXzoYe",
"img": "icons/sundries/gaming/dice-pair-white-green.webp",
- "command": "const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens\n\n;const traitName = 'Notice';\nconst traitType = 'skill'; // or 'attribute'\n\nasync function main() {\n let tokens = Array.from(game.user.targets);\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled;\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens');\n return;\n }\n\n const content = `\n \n `;\n const buttons = {\n ok: {\n label: 'Request Roll',\n callback: (html) => {\n const form = html[0].querySelector('form');\n const formDataObject = new FormDataExtended(form).object;\n console.log(formDataObject);\n const rollMod = parseInt(formDataObject.mod);\n const rollModDesc = formDataObject.modDesc;\n const rollType = traitType;\n const rollDesc = traitName;\n const targetNumber = parseInt(formDataObject.tn);\n const options = { targetNumber };\n if (rollMod !== 0) {\n options.mods = [{ label: rollModDesc, value: rollMod }];\n }\n requestRollFromTokens(tokens, rollType, rollDesc, options);\n },\n },\n cancel: {\n label: 'Cancel',\n },\n };\n new Dialog({\n title: 'Request roll',\n content,\n buttons,\n }).render(true);\n}\n\nmain();",
+ "command": "const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens\n\n;const traitName = 'Notice';\nconst traitType = 'skill'; // or 'attribute'\n\nasync function main() {\n let tokens = Array.from(game.user.targets);\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled;\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens');\n return;\n }\n\n const content = `\n \n `;\n const buttons = [\n {\n action: \"submit\",\n label: 'Request Roll',\n callback: (event, button, dialog) => {\n const form = button.form;\n const formDataObject = new foundry.applications.ux.FormDataExtended(form).object;\n console.log(formDataObject);\n const rollMod = parseInt(formDataObject.mod);\n const rollModDesc = formDataObject.modDesc;\n const rollType = traitType;\n const rollDesc = traitName;\n const targetNumber = parseInt(formDataObject.tn);\n const options = { targetNumber };\n if (rollMod !== 0) {\n options.mods = [{ label: rollModDesc, value: rollMod }];\n }\n requestRollFromTokens(tokens, rollType, rollDesc, options);\n },\n },\n {\n action: \"cancel\", label: 'Cancel',\n },\n ];\n new foundry.applications.api.DialogV2({\n window: { title: 'Request roll' }, \n content,\n buttons,\n }).render(true);\n}\n\nmain();",
"folder": null,
"ownership": {
"default": 0,
@@ -18,7 +18,7 @@
"systemVersion": "3.3.11",
"coreVersion": "13.344",
"createdTime": 1700430548162,
- "modifiedTime": 1716008037403,
+ "modifiedTime": 1748489319298,
"lastModifiedBy": "sVoCvBU1knmXzoYe",
"compendiumSource": null,
"duplicateSource": null,
diff --git a/src/packsrc/helper-macros/Request_Roll_G9ksuYJo1512PTo9.json b/src/packsrc/helper-macros/Request_Roll_G9ksuYJo1512PTo9.json
index a4712f1..766c8c5 100644
--- a/src/packsrc/helper-macros/Request_Roll_G9ksuYJo1512PTo9.json
+++ b/src/packsrc/helper-macros/Request_Roll_G9ksuYJo1512PTo9.json
@@ -4,7 +4,7 @@
"scope": "global",
"author": "R9ZgY0IvWl8ovIuT",
"img": "icons/sundries/gaming/dice-runed-tan.webp",
- "command": "const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens;\n\nasync function main() {\n let tokens = Array.from(game.user.targets);\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled;\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens');\n return;\n }\n\n const attributes = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'];\n const skillSet = new Set();\n for (const token of tokens) {\n const tokenSkills = token.actor.items.filter(\n (i) => i.type === 'skill' && !['Untrained', 'Untrained Attempt'].includes(i.name),\n );\n for (const skill of tokenSkills) {\n skillSet.add(skill.name);\n }\n }\n const attributeOptions = attributes\n .map(\n (a) => `\n `,\n )\n .join('');\n const skillOptions = Array.from(skillSet)\n .sort()\n .map(\n (s) => `\n `,\n )\n .join('');\n const content = `\n \n `;\n const buttons = {\n ok: {\n label: 'Request Roll',\n callback: (html) => {\n const form = html[0].querySelector('form');\n const formDataObject = new FormDataExtended(form).object;\n console.log(formDataObject);\n const rollMod = parseInt(formDataObject.mod);\n const rollModDesc = formDataObject.modDesc;\n const rollParts = formDataObject.trait.split('|');\n const rollType = rollParts[0] === 'a' ? 'attribute' : 'skill';\n const rollDesc = rollParts[1];\n const targetNumber = parseInt(formDataObject.tn);\n const options = { targetNumber };\n if (rollMod !== 0) {\n options.mods = [{ label: rollModDesc, value: rollMod }];\n }\n requestRollFromTokens(tokens, rollType, rollDesc, options);\n },\n },\n cancel: {\n label: 'Cancel',\n },\n };\n new Dialog({\n title: 'Request roll',\n content,\n buttons,\n }).render(true);\n}\n\nmain();",
+ "command": "const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens;\n\nasync function main() {\n let tokens = Array.from(game.user.targets);\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled;\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens');\n return;\n }\n\n const attributes = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'];\n const skillSet = new Set();\n for (const token of tokens) {\n const tokenSkills = token.actor.items.filter(\n (i) => i.type === 'skill' && !['Untrained', 'Untrained Attempt'].includes(i.name),\n );\n for (const skill of tokenSkills) {\n skillSet.add(skill.name);\n }\n }\n const attributeOptions = attributes\n .map(\n (a) => `\n `,\n )\n .join('');\n const skillOptions = Array.from(skillSet)\n .sort()\n .map(\n (s) => `\n `,\n )\n .join('');\n const content = `\n \n `;\n const buttons = [\n {\n action: \"submit\",\n label: 'Request Roll',\n callback: (event, button, dialog) => {\n const form = button.form;\n const formDataObject = new foundry.applications.ux.FormDataExtended(form).object;\n console.log(formDataObject);\n const rollMod = parseInt(formDataObject.mod);\n const rollModDesc = formDataObject.modDesc;\n const rollParts = formDataObject.trait.split('|');\n const rollType = rollParts[0] === 'a' ? 'attribute' : 'skill';\n const rollDesc = rollParts[1];\n const targetNumber = parseInt(formDataObject.tn);\n const options = { targetNumber };\n if (rollMod !== 0) {\n options.mods = [{ label: rollModDesc, value: rollMod }];\n }\n requestRollFromTokens(tokens, rollType, rollDesc, options);\n },\n },\n {\n action: \"cancel\", label: 'Cancel',\n },\n ];\n new foundry.applications.api.DialogV2({\n window: { title: 'Request roll' },\n content,\n buttons,\n }).render(true);\n}\n\nmain();",
"folder": null,
"ownership": {
"default": 0,
@@ -18,7 +18,7 @@
"systemVersion": "3.3.11",
"coreVersion": "13.344",
"createdTime": 1700430548162,
- "modifiedTime": 1716007807299,
+ "modifiedTime": 1748489384349,
"lastModifiedBy": "sVoCvBU1knmXzoYe",
"compendiumSource": null,
"duplicateSource": null,
diff --git a/src/packsrc/helper-macros/Set_Token_Vision_arjbjmgKMjyp9tWE.json b/src/packsrc/helper-macros/Set_Token_Vision_arjbjmgKMjyp9tWE.json
index 7c2e8b9..48658b9 100644
--- a/src/packsrc/helper-macros/Set_Token_Vision_arjbjmgKMjyp9tWE.json
+++ b/src/packsrc/helper-macros/Set_Token_Vision_arjbjmgKMjyp9tWE.json
@@ -4,7 +4,7 @@
"author": "sVoCvBU1knmXzoYe",
"img": "icons/magic/perception/orb-crystal-ball-scrying-blue.webp",
"scope": "global",
- "command": "/* globals args */ [93/901]\nconst argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null;\n// argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values\n// will guess based on scene darkness\nconst BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark'];\nconst THRESHOLDS = {\n dim: 0.4,\n dark: 0.6,\n pitchdark: 0.8,\n};\nconst RANGES = {\n basic: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0,\n },\n lowlight: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0,\n },\n darkvision: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 10,\n },\n nightvision: {\n bright: 200,\n dim: 200,\n dark: 200,\n pitchdark: 200,\n },\n blindsense: {\n bright: 5,\n dim: 5,\n dark: 5,\n pitchdark: 5,\n },\n};\nconst SIGHT_NAMES = {\n lowlight: 'low-light-vision',\n darkvision: 'darkvision',\n nightvision: 'night-vision',\n blindsense: 'blindsense',\n};\nconst SIGHT_MODES = {\n lowlight: 'lowlight',\n darkvision: 'darkvision',\n nightvision: 'darkvision',\n basic: 'basic',\n blindsense: 'blindsense',\n};\n\nfunction findAbility(token, swid) {\n return token.actor.items.find((i) => i.type === 'ability' && i.system.swid === swid);\n}\n\nasync function main() { \n const scene = game.scenes.current;\n let sceneBright = BRIGHT_LEVELS[0];\n if (scene.darkness > THRESHOLDS.pitchdark) {\n sceneBright = BRIGHT_LEVELS[3];\n } else if (scene.darkness > THRESHOLDS.dark) {\n sceneBright = BRIGHT_LEVELS[2];\n } else if (scene.darkness > THRESHOLDS.dim) {\n sceneBright = BRIGHT_LEVELS[1];\n }\n let bright = sceneBright;\n if (argBright && BRIGHT_LEVELS.includes(argBright)) {\n bright = argBright;\n }\n\n new Dialog({\n title: 'Select scene brightness',\n content: `\n \n `,\n buttons: {\n ok: {\n label: 'Select scene Brightness',\n value: 'ok',\n callback: (html) => {\n const form = html[0].querySelector('form');\n const formDataObject = new FormDataExtended(form).object;\n console.log('form data', formDataObject, form);\n\n bright = formDataObject.bright;\n for (const tokenId of scene.tokens.map((t) => t.id)) {\n const token = scene.tokens.get(tokenId);\n if (!token.sight.enabled) {\n console.log(`Skipping ${token.name}, vision not enabled`);\n continue;\n // don't set sight on a token where it's not enabled\n }\n let sightType = 'basic';\n for (const sight in SIGHT_NAMES) {\n if (findAbility(token, SIGHT_NAMES[sight])) {\n sightType = sight;\n }\n }\n const range = RANGES[sightType][bright];\n const sightMode = SIGHT_MODES[sightType];\n const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults;\n const data = {\n 'sight.range': range,\n 'sight.visionMode': sightMode,\n 'sight.attenuation': visionModeData.attenuation,\n 'sight.brightness': visionModeData.brightness,\n 'sight.saturation': visionModeData.saturation,\n 'sight.contrast': visionModeData.contrast,\n };\n console.log(`Updating ${token.name}:`, sightType, bright, data);\n token.update(data);\n }\n },\n },\n cancel: {\n label: 'Cancel',\n },\n },\n }).render(true);\n}\n\nmain();",
+ "command": "const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null;\n// argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values\n// will guess based on scene darkness\nconst BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark'];\nconst THRESHOLDS = {\n dim: 0.4,\n dark: 0.6,\n pitchdark: 0.8,\n};\nconst RANGES = {\n basic: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0,\n },\n lowlight: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0,\n },\n darkvision: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 10,\n },\n nightvision: {\n bright: 200,\n dim: 200,\n dark: 200,\n pitchdark: 200,\n },\n blindsense: {\n bright: 5,\n dim: 5,\n dark: 5,\n pitchdark: 5,\n },\n};\nconst SIGHT_NAMES = {\n lowlight: 'low-light-vision',\n darkvision: 'darkvision',\n nightvision: 'night-vision',\n blindsense: 'blindsense',\n};\nconst SIGHT_MODES = {\n lowlight: 'lowlight',\n darkvision: 'darkvision',\n nightvision: 'darkvision',\n basic: 'basic',\n blindsense: 'blindsense',\n};\n\nfunction findAbility(token, swid) {\n return token.actor.items.find((i) => i.type === 'ability' && i.system.swid === swid);\n}\n\nasync function main() { \n const scene = game.scenes.current;\n let sceneBright = BRIGHT_LEVELS[0];\n if (scene.darkness > THRESHOLDS.pitchdark) {\n sceneBright = BRIGHT_LEVELS[3];\n } else if (scene.darkness > THRESHOLDS.dark) {\n sceneBright = BRIGHT_LEVELS[2];\n } else if (scene.darkness > THRESHOLDS.dim) {\n sceneBright = BRIGHT_LEVELS[1];\n }\n let bright = sceneBright;\n if (argBright && BRIGHT_LEVELS.includes(argBright)) {\n bright = argBright;\n }\n\n new foundry.applications.api.DialogV2({\n window: { title: 'Select scene brightness' },\n content: `\n \n `,\n buttons: [\n {\n action: \"submit\",\n label: 'Select scene Brightness',\n value: 'ok',\n callback: (event, button, dialog) => {\n const form = button.form;\n const formDataObject = new foundry.applications.ux.FormDataExtended(form).object;\n console.log('form data', formDataObject, form);\n\n bright = formDataObject.bright;\n for (const tokenId of scene.tokens.map((t) => t.id)) {\n const token = scene.tokens.get(tokenId);\n if (!token.sight.enabled) {\n console.log(`Skipping ${token.name}, vision not enabled`);\n continue;\n // don't set sight on a token where it's not enabled\n }\n let sightType = 'basic';\n for (const sight in SIGHT_NAMES) {\n if (findAbility(token, SIGHT_NAMES[sight])) {\n sightType = sight;\n }\n }\n const range = RANGES[sightType][bright];\n const sightMode = SIGHT_MODES[sightType];\n const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults;\n const data = {\n 'sight.range': range,\n 'sight.visionMode': sightMode,\n 'sight.attenuation': visionModeData.attenuation,\n 'sight.brightness': visionModeData.brightness,\n 'sight.saturation': visionModeData.saturation,\n 'sight.contrast': visionModeData.contrast,\n };\n console.log(`Updating ${token.name}:`, sightType, bright, data);\n token.update(data);\n }\n },\n },\n { action: \"cancel\", label: 'Cancel' },\n ],\n }).render(true);\n}\n\nmain();",
"folder": null,
"ownership": {
"default": 0,
@@ -18,7 +18,7 @@
"systemVersion": "3.3.11",
"coreVersion": "13.344",
"createdTime": 1702934878750,
- "modifiedTime": 1715919057421,
+ "modifiedTime": 1748489054294,
"lastModifiedBy": "sVoCvBU1knmXzoYe",
"compendiumSource": null,
"duplicateSource": null,