From be74c79b354b81c34b17716ec691408942c52904 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Wed, 28 May 2025 22:37:42 -0500 Subject: [PATCH] macro cleanup DialogV2 --- macros/gold-calculator.js | 40 ++++++++--------- macros/quickDamage.js | 42 ++++++++++-------- macros/requestFearRoll.js | 20 +++++---- macros/requestRoll.js | 22 ++++----- ...{requuesRollMATT.js => requestRollMATT.js} | 0 macros/setTokenVision.js | 25 +++++------ src/packs/common-actions/LOG | 10 ++--- src/packs/gear/LOG | 10 ++--- src/packs/helper-actors/LOG | 10 ++--- src/packs/helper-macros/000005.ldb | Bin 21473 -> 16824 bytes src/packs/helper-macros/LOG | 10 ++--- src/packs/helper-macros/MANIFEST-000002 | Bin 138 -> 138 bytes src/packs/module-docs/LOG | 10 ++--- .../Gold_Totals_QMnx9cuyw81kRS2o.json | 6 +-- .../Knockout_Poison_4yXWP6VCi8wsmdVw.json | 36 --------------- .../Lethal_Poison_mMSTm47fgx77GqAO.json | 36 --------------- .../Mild_Poison_McmMNB2mI5xejauq.json | 36 --------------- .../Paralyzing_Poison_P4MNq8EUR8ReFr9C.json | 36 --------------- .../Poison_DbVwJ0fIfuijv8Nu.json | 19 -------- .../Quick_Damage_Roll_NANSnFATVJntUfL7.json | 6 +-- .../Request_Fear_Check_qQLM79NpAuilKFrh.json | 4 +- .../Request_Notice_Roll_pnLnFrfTTJeodFRy.json | 4 +- .../Request_Roll_G9ksuYJo1512PTo9.json | 4 +- .../Set_Token_Vision_arjbjmgKMjyp9tWE.json | 4 +- 24 files changed, 117 insertions(+), 273 deletions(-) rename macros/{requuesRollMATT.js => requestRollMATT.js} (100%) delete mode 100644 src/packsrc/helper-macros/Knockout_Poison_4yXWP6VCi8wsmdVw.json delete mode 100644 src/packsrc/helper-macros/Lethal_Poison_mMSTm47fgx77GqAO.json delete mode 100644 src/packsrc/helper-macros/Mild_Poison_McmMNB2mI5xejauq.json delete mode 100644 src/packsrc/helper-macros/Paralyzing_Poison_P4MNq8EUR8ReFr9C.json delete mode 100644 src/packsrc/helper-macros/Poison_DbVwJ0fIfuijv8Nu.json 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 d80bd734c665fe0e632d8a7f5ba2d4e7b8f42ea0..a456e16e6a33b15513fa468c55a172d805ea3fc1 100644 GIT binary patch delta 11137 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 literal 21473 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 delta 95 zcmeBT>|&f?6j5)}>=wwt$i%|Qz|6)X#m>a~a5+ypRsweL3(n5 rV`i~q86y`17$_*_CMFl<7b{j4xRvDO6{QDeR~7mcRCqFqLKFZ1b5|GE 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)}