diff --git a/macros/gold-calculator.js b/macros/gold-calculator.js index b6e4f36..c769783 100644 --- a/macros/gold-calculator.js +++ b/macros/gold-calculator.js @@ -1,33 +1,33 @@ -let tokens = [] +let tokens = []; if (canvas.tokens.controlled.length > 0) { - tokens = canvas.tokens.controlled + tokens = canvas.tokens.controlled; } if (tokens.length > 0) { - main(tokens) + main(tokens); } else { - ui.notifications.error('Please select or target a token') + ui.notifications.error('Please select or target a token'); } -async function main (tokens) { - const currencies = ['Copper', 'Silver', 'Gold', 'Platinum'] - let template = '
' +async function main(tokens) { + const currencies = ['Copper', 'Silver', 'Gold', 'Platinum']; + let template = '
ActorCurrency
'; const fmtOptions = { minimumIntegerDigits: 1, minimumFractionDigits: 2, - maximumFractionDigits: 2 - } - const fmt = Intl.NumberFormat('en-US', fmtOptions) + maximumFractionDigits: 2, + }; + const fmt = Intl.NumberFormat('en-US', fmtOptions); for (const token of tokens) { - const actor = token.actor - let total = 0 - for (const item of actor.items.filter(i => currencies.indexOf(i.name) > -1)) { - total += item.system.price * item.system.quantity + const actor = token.actor; + let total = 0; + for (const item of actor.items.filter((i) => currencies.indexOf(i.name) > -1)) { + total += item.system.price * item.system.quantity; } - template += `` + template += ``; } - template += '' - Dialog.prompt({ - title: 'Currency Totals', - content: template - }) + template += ''; + foundry.applications.api.DialogV2.prompt({ + window: { title: 'Currency Totals' }, + content: template, + }); } diff --git a/macros/quickDamage.js b/macros/quickDamage.js index 50b316c..33adeb6 100644 --- a/macros/quickDamage.js +++ b/macros/quickDamage.js @@ -1,5 +1,5 @@ -new Dialog({ - title: 'Damage Roll Configuration', +new foundry.applications.api.DialogV2({ + window: { title: "Damage Roll Configuration" }, content: `
@@ -16,24 +16,28 @@ new Dialog({
`, - buttons: { - ok: { - label: 'Roll Damage', - callback: (html) => { - const damageRoll = html.find('input[name="damageRoll"]').val() - let flavor = html.find('input[name="flavor"]').val() - const ap = parseInt(html.find('input[name="ap"]').val()) || 0 - const options = {} + buttons: [ + { + action: "ok", + label: "Roll Damage", + callback: (event, button, dialog) => { + const form = new foundry.applications.ux.FormDataExtended(button.form); + console.log(form) + const damageRoll = form.object.damageRoll; + let flavor = form.object.flavor; + const ap = parseInt(form.object.ap) || 0; + const options = {}; if (ap > 0) { - flavor = `${flavor ? flavor + ' - ' : ''}AP: ${ap}` - options.ap = ap + flavor = `${flavor ? flavor + " - " : ""}AP: ${ap}` + options.ap = ap; } // Perform the damage roll and send the message - new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor }) - } + new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor }); + }, }, - cancel: { - label: 'Cancel' - } - } -}).render(true) + { + action: "cancel", + label: "Cancel", + }, + ], +}).render(true); diff --git a/macros/requestFearRoll.js b/macros/requestFearRoll.js index abe0ee2..65700ad 100644 --- a/macros/requestFearRoll.js +++ b/macros/requestFearRoll.js @@ -10,8 +10,8 @@ async function main() { return; } - new Dialog({ - title: 'Request Fear roll...', + new foundry.applications.api.DialogV2({ + window: { title: 'Request Fear roll...' }, content: `

Requesting Fear roll from ${tokens.map((t) => t.name).join(', ')}.

@@ -21,19 +21,21 @@ async function main() { `, - buttons: { - ok: { + buttons: [ + { + action: "submit", label: 'Request Roll', - callback: (html) => { - const fear = parseInt(html.find('input[name="fear"]').val()) || 0; + callback: (event, button, dialog) => { + formdata = new foundry.applications.ux.FormDataExtended(button.form).object + const fear = parseInt(formdata.fear) || 0; const options = { targetNumber: 4, fear }; requestFearRollFromTokens(tokens, options); }, }, - cancel: { - label: 'Cancel', + { + action: "cancel", label: 'Cancel', }, - }, + ], }).render(true); } diff --git a/macros/requestRoll.js b/macros/requestRoll.js index b29f4d3..a9710ce 100644 --- a/macros/requestRoll.js +++ b/macros/requestRoll.js @@ -60,12 +60,14 @@ async function main() { `; - const buttons = { - ok: { + const buttons = [ + { + action: "submit", label: 'Request Roll', - callback: (html) => { - const form = html[0].querySelector('form'); - const formDataObject = new FormDataExtended(form).object; + callback: (event, button, dialog) => { + const form = button.form; + const formDataObject = new foundry.applications.ux.FormDataExtended(form).object; + console.log(formDataObject); const rollMod = parseInt(formDataObject.mod); const rollModDesc = formDataObject.modDesc; const rollParts = formDataObject.trait.split('|'); @@ -79,12 +81,12 @@ async function main() { requestRollFromTokens(tokens, rollType, rollDesc, options); }, }, - cancel: { - label: 'Cancel', + { + action: "cancel", label: 'Cancel', }, - }; - new Dialog({ - title: 'Request roll', + ]; + new foundry.applications.api.DialogV2({ + window { title: 'Request roll' }, content, buttons, }).render(true); diff --git a/macros/requuesRollMATT.js b/macros/requestRollMATT.js similarity index 100% rename from macros/requuesRollMATT.js rename to macros/requestRollMATT.js diff --git a/macros/setTokenVision.js b/macros/setTokenVision.js index ee8a0b7..1388165 100644 --- a/macros/setTokenVision.js +++ b/macros/setTokenVision.js @@ -1,4 +1,3 @@ -/* globals args */ const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null; // argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values // will guess based on scene darkness @@ -58,7 +57,7 @@ function findAbility(token, swid) { return token.actor.items.find((i) => i.type === 'ability' && i.system.swid === swid); } -async function main() { +async function main() { const scene = game.scenes.current; let sceneBright = BRIGHT_LEVELS[0]; if (scene.darkness > THRESHOLDS.pitchdark) { @@ -73,8 +72,8 @@ async function main() { bright = argBright; } - new Dialog({ - title: 'Select scene brightness', + new foundry.applications.api.DialogV2({ + window: { title: 'Select scene brightness' }, content: `

Set token vision

@@ -109,14 +108,16 @@ async function main() { `, - buttons: { - ok: { + buttons: [ + { + action: "submit", label: 'Select scene Brightness', value: 'ok', - callback: (html) => { - const form = html[0].querySelector('form'); - const formDataObject = new FormDataExtended(form).Object; + callback: (event, button, dialog) => { + const form = button.form; + const formDataObject = new foundry.applications.ux.FormDataExtended(form).object; console.log('form data', formDataObject, form); + bright = formDataObject.bright; for (const tokenId of scene.tokens.map((t) => t.id)) { const token = scene.tokens.get(tokenId); @@ -147,10 +148,8 @@ async function main() { } }, }, - cancel: { - label: 'Cancel', - }, - }, + { action: "cancel", label: 'Cancel' }, + ], }).render(true); } diff --git a/src/packs/common-actions/LOG b/src/packs/common-actions/LOG index 524ccf4..e289a38 100644 --- a/src/packs/common-actions/LOG +++ b/src/packs/common-actions/LOG @@ -1,5 +1,5 @@ -2025/05/28-21:41:56.707066 7ce44d7be640 Delete type=3 #1 -2025/05/28-21:41:56.709675 7ce44bfbb640 Level-0 table #5: started -2025/05/28-21:41:56.712231 7ce44bfbb640 Level-0 table #5: 19401 bytes OK -2025/05/28-21:41:56.714241 7ce44bfbb640 Delete type=0 #3 -2025/05/28-21:41:56.714365 7ce44bfbb640 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end) +2025/05/28-22:37:46.855626 7bc6857bc640 Delete type=3 #1 +2025/05/28-22:37:46.857913 7bc684fbb640 Level-0 table #5: started +2025/05/28-22:37:46.860494 7bc684fbb640 Level-0 table #5: 19401 bytes OK +2025/05/28-22:37:46.862582 7bc684fbb640 Delete type=0 #3 +2025/05/28-22:37:46.862712 7bc684fbb640 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end) diff --git a/src/packs/gear/LOG b/src/packs/gear/LOG index d078961..8c2448d 100644 --- a/src/packs/gear/LOG +++ b/src/packs/gear/LOG @@ -1,5 +1,5 @@ -2025/05/28-21:41:56.840173 7912d87bc640 Delete type=3 #1 -2025/05/28-21:41:56.842145 7912d7fbb640 Level-0 table #5: started -2025/05/28-21:41:56.844320 7912d7fbb640 Level-0 table #5: 6870 bytes OK -2025/05/28-21:41:56.846291 7912d7fbb640 Delete type=0 #3 -2025/05/28-21:41:56.846358 7912d7fbb640 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) +2025/05/28-22:37:46.975797 7364abfff640 Delete type=3 #1 +2025/05/28-22:37:46.978271 7364a9bff640 Level-0 table #5: started +2025/05/28-22:37:46.980551 7364a9bff640 Level-0 table #5: 6870 bytes OK +2025/05/28-22:37:46.982643 7364a9bff640 Delete type=0 #3 +2025/05/28-22:37:46.982766 7364a9bff640 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) diff --git a/src/packs/helper-actors/LOG b/src/packs/helper-actors/LOG index e17fd52..4964e5c 100644 --- a/src/packs/helper-actors/LOG +++ b/src/packs/helper-actors/LOG @@ -1,5 +1,5 @@ -2025/05/28-21:41:56.986214 7f67ff7fe640 Delete type=3 #1 -2025/05/28-21:41:56.988479 7f67fdbff640 Level-0 table #5: started -2025/05/28-21:41:56.990440 7f67fdbff640 Level-0 table #5: 2017 bytes OK -2025/05/28-21:41:56.992375 7f67fdbff640 Delete type=0 #3 -2025/05/28-21:41:56.992443 7f67fdbff640 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) +2025/05/28-22:37:47.109584 77100d5fa640 Delete type=3 #1 +2025/05/28-22:37:47.111689 770fe6ffd640 Level-0 table #5: started +2025/05/28-22:37:47.113682 770fe6ffd640 Level-0 table #5: 2017 bytes OK +2025/05/28-22:37:47.115738 770fe6ffd640 Delete type=0 #3 +2025/05/28-22:37:47.115806 770fe6ffd640 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) diff --git a/src/packs/helper-macros/000005.ldb b/src/packs/helper-macros/000005.ldb index d80bd73..a456e16 100644 Binary files a/src/packs/helper-macros/000005.ldb and b/src/packs/helper-macros/000005.ldb differ diff --git a/src/packs/helper-macros/LOG b/src/packs/helper-macros/LOG index c300ed4..52c2c00 100644 --- a/src/packs/helper-macros/LOG +++ b/src/packs/helper-macros/LOG @@ -1,5 +1,5 @@ -2025/05/28-21:41:57.101447 7d71ad7bd640 Delete type=3 #1 -2025/05/28-21:41:57.103563 7d718ffff640 Level-0 table #5: started -2025/05/28-21:41:57.105990 7d718ffff640 Level-0 table #5: 21473 bytes OK -2025/05/28-21:41:57.108035 7d718ffff640 Delete type=0 #3 -2025/05/28-21:41:57.108115 7d718ffff640 Manual compaction at level-0 from '!folders!8FWN37c0gcpAisAv' @ 72057594037927935 : 1 .. '!macros!ypFtlnrgQkzqLpxI' @ 0 : 0; will stop at (end) +2025/05/28-22:37:47.223706 722ad5fbe640 Delete type=3 #1 +2025/05/28-22:37:47.226010 722ab7fff640 Level-0 table #5: started +2025/05/28-22:37:47.228570 722ab7fff640 Level-0 table #5: 16824 bytes OK +2025/05/28-22:37:47.230659 722ab7fff640 Delete type=0 #3 +2025/05/28-22:37:47.230782 722ab7fff640 Manual compaction at level-0 from '!folders!8FWN37c0gcpAisAv' @ 72057594037927935 : 1 .. '!macros!ypFtlnrgQkzqLpxI' @ 0 : 0; will stop at (end) diff --git a/src/packs/helper-macros/MANIFEST-000002 b/src/packs/helper-macros/MANIFEST-000002 index 94997f9..8e78c89 100644 Binary files a/src/packs/helper-macros/MANIFEST-000002 and b/src/packs/helper-macros/MANIFEST-000002 differ diff --git a/src/packs/module-docs/LOG b/src/packs/module-docs/LOG index b97c762..66a0514 100644 --- a/src/packs/module-docs/LOG +++ b/src/packs/module-docs/LOG @@ -1,5 +1,5 @@ -2025/05/28-21:41:57.215575 7be0bd7fa640 Delete type=3 #1 -2025/05/28-21:41:57.217780 7be096ffd640 Level-0 table #5: started -2025/05/28-21:41:57.220087 7be096ffd640 Level-0 table #5: 22029 bytes OK -2025/05/28-21:41:57.222061 7be096ffd640 Delete type=0 #3 -2025/05/28-21:41:57.222149 7be096ffd640 Manual compaction at level-0 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!w4TImRTAiNiqDWeL.vQhO6BVdKZOubTUQ' @ 0 : 0; will stop at (end) +2025/05/28-22:37:47.371068 75e9a17bd640 Delete type=3 #1 +2025/05/28-22:37:47.373331 75e983fff640 Level-0 table #5: started +2025/05/28-22:37:47.375656 75e983fff640 Level-0 table #5: 22029 bytes OK +2025/05/28-22:37:47.377626 75e983fff640 Delete type=0 #3 +2025/05/28-22:37:47.377712 75e983fff640 Manual compaction at level-0 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!w4TImRTAiNiqDWeL.vQhO6BVdKZOubTUQ' @ 0 : 0; will stop at (end) diff --git a/src/packsrc/helper-macros/Gold_Totals_QMnx9cuyw81kRS2o.json b/src/packsrc/helper-macros/Gold_Totals_QMnx9cuyw81kRS2o.json index f739ab6..c3b637d 100644 --- a/src/packsrc/helper-macros/Gold_Totals_QMnx9cuyw81kRS2o.json +++ b/src/packsrc/helper-macros/Gold_Totals_QMnx9cuyw81kRS2o.json @@ -4,7 +4,7 @@ "author": "ueJGUfSYuRRL3Ypr", "img": "icons/commodities/currency/coins-plain-stack-gold-yellow.webp", "scope": "global", - "command": "let tokens = []\nif (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 const currencies = ['Copper', 'Silver', 'Gold', 'Platinum']\n let template = '
ActorCurrency
${actor.name}${fmt.format::(total)}
${actor.name}${fmt.format(total)}
'\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 += ``\n }\n template += ''\n Dialog.prompt({\n title: 'Currency Totals',\n content: template\n })\n}", + "command": "let tokens = [];\nif (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 const currencies = ['Copper', 'Silver', 'Gold', 'Platinum'];\n let template = '
ActorCurrency
${actor.name}${fmt.format(total)}
';\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 += ``;\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: `

How many rounds of paralysis?

`,\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 \n \n
\n
\n \n \n
\n
\n \n \n
\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 \n \n
\n
\n \n \n
\n
\n \n \n
\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

Requesting Fear roll from ${tokens.map((t) => t.name).join(', ')}.

\n
\n \n
\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

Requesting Fear roll from ${tokens.map((t) => t.name).join(', ')}.

\n
\n \n
\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

Requesting roll from ${tokens.map((t) => t.name).join(', ')}.

\n

Requesting a ${traitName} roll...

\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\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

Requesting roll from ${tokens.map((t) => t.name).join(', ')}.

\n

Requesting a ${traitName} roll...

\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\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

Requesting roll from ${tokens.map((t) => t.name).join(', ')}.

\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\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

Requesting roll from ${tokens.map((t) => t.name).join(', ')}.

\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\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

Set token vision

\n

All tokens with vision will be adjusted

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\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

Set token vision

\n

All tokens with vision will be adjusted

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\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,
ActorCurrency
${actor.name}${fmt.format(total)}